From c6c2f78d162bf1ff1f344ba184ef1fd4c2dd7328 Mon Sep 17 00:00:00 2001 From: Juan Felipe Zapata Moreno Date: Tue, 12 Aug 2025 09:36:02 -0600 Subject: [PATCH] Initial Commit --- .editorconfig | 18 + .env.example | 67 + .gitattributes | 11 + .gitignore | 24 + README.md | 74 + app/Actions/Fortify/CreateNewUser.php | 40 + .../Fortify/PasswordValidationRules.php | 16 + app/Actions/Fortify/ResetUserPassword.php | 28 + app/Actions/Fortify/UpdateUserPassword.php | 31 + .../Fortify/UpdateUserProfileInformation.php | 66 + app/Actions/Jetstream/DeleteUser.php | 19 + app/Console/Commands/DownSecure.php | 57 + app/Console/Commands/NotificationGlobal.php | 51 + app/Console/Commands/NotificationStart.php | 42 + app/Console/Commands/NotificationStop.php | 42 + app/Console/Commands/NotsowebInstall.php | 46 + app/Console/Commands/UpdaterStart.php | 42 + app/Console/Commands/UpdaterStop.php | 42 + app/Console/Commands/UserNotification.php | 78 + app/Console/Commands/Uuid.php | 65 + app/Console/Kernel.php | 30 + app/Events/GlobalNotification.php | 49 + app/Exceptions/Handler.php | 48 + app/Http/Controllers/Admin/UserController.php | 211 + app/Http/Controllers/Controller.php | 12 + .../Dashboard/HistoryLogController.php | 67 + .../Controllers/Dashboard/IndexController.php | 32 + .../Dashboard/NotificationController.php | 102 + .../Controllers/Developer/RoleController.php | 113 + .../Controllers/Example/IndexController.php | 32 + app/Http/Controllers/ResourceController.php | 55 + app/Http/Kernel.php | 70 + app/Http/MaintenanceModeBypassCookie.php | 26 + app/Http/Middleware/Authenticate.php | 21 + app/Http/Middleware/EncryptCookies.php | 17 + app/Http/Middleware/HandleInertiaRequests.php | 44 + .../PreventRequestsDuringMaintenance.php | 29 + .../Middleware/RedirectIfAuthenticated.php | 32 + app/Http/Middleware/TrimStrings.php | 19 + app/Http/Middleware/TrustHosts.php | 20 + app/Http/Middleware/TrustProxies.php | 28 + app/Http/Middleware/ValidateSignature.php | 22 + app/Http/Middleware/VerifyCsrfToken.php | 15 + app/Http/Requests/StoreUser.php | 43 + app/Http/Requests/UpdateUser.php | 43 + app/Http/Traits/ModelExtend.php | 58 + app/Http/Traits/ReportAction.php | 107 + app/Http/Traits/UseFetch.php | 54 + app/Http/Webhooks/UpdateAppHook.php | 47 + .../BrodcastUserLoginNotification.php | 46 + .../BrodcastUserLogoutNotification.php | 46 + app/Models/HistoryLog.php | 45 + app/Models/Role.php | 34 + app/Models/User.php | 110 + app/Notifications/UserHeaderNotification.php | 75 + app/Observers/RoleObserver.php | 84 + app/Observers/UserObserver.php | 82 + app/Providers/AppServiceProvider.php | 28 + app/Providers/AuthServiceProvider.php | 28 + app/Providers/BroadcastServiceProvider.php | 21 + app/Providers/EventServiceProvider.php | 61 + app/Providers/FortifyServiceProvider.php | 49 + app/Providers/JetstreamServiceProvider.php | 49 + app/Providers/RouteServiceProvider.php | 56 + app/Services/Logs/LogHandler.php | 46 + app/Services/Logs/LogMonolog.php | 33 + app/Services/Logs/LogProcessor.php | 23 + app/Services/Notify.php | 117 + artisan | 53 + bootstrap/app.php | 55 + bootstrap/cache/.gitignore | 2 + colors.json.example | 26 + composer.json | 111 + composer.lock | 9211 +++++++++++++++++ config/app.php | 257 + config/auth.php | 111 + config/broadcasting.php | 70 + config/cache.php | 110 + config/cors.php | 34 + config/database.php | 151 + config/filesystems.php | 76 + config/fortify.php | 147 + config/hashing.php | 52 + config/jetstream.php | 81 + config/logging.php | 162 + config/mail.php | 118 + config/permission.php | 161 + config/queue.php | 93 + config/sanctum.php | 67 + config/services.php | 34 + config/session.php | 201 + config/view.php | 36 + database/.gitignore | 1 + database/factories/UserFactory.php | 69 + .../2014_10_12_000000_create_users_table.php | 41 + ...12_100000_create_password_resets_table.php | 32 + ..._add_two_factor_columns_to_users_table.php | 50 + ..._08_19_000000_create_failed_jobs_table.php | 36 + ...01_create_personal_access_tokens_table.php | 37 + ..._11_05_234507_create_permission_tables.php | 143 + ...022_11_14_170157_create_sessions_table.php | 35 + ...11_28_120204_create_history_logs_table.php | 42 + ...2_26_094023_create_notifications_table.php | 35 + database/seeders/DatabaseSeeder.php | 27 + database/seeders/DevSeeder.php | 26 + database/seeders/RoleSeeder.php | 84 + database/seeders/UserSeeder.php | 70 + lang/en/auth.php | 20 + lang/en/cache.php | 6 + lang/en/notifications.php | 8 + lang/en/pagination.php | 19 + lang/en/passwords.php | 23 + lang/en/roles.php | 6 + lang/en/users.php | 8 + lang/en/validation.php | 174 + lang/es.json | 13 + lang/es/auth.php | 19 + lang/es/cache.php | 6 + lang/es/notifications.php | 8 + lang/es/pagination.php | 19 + lang/es/passwords.php | 24 + lang/es/roles.php | 6 + lang/es/users.php | 8 + lang/es/validation.php | 172 + package-lock.json | 5683 ++++++++++ package.json | 34 + phpunit.xml | 31 + postcss.config.js | 6 + public/.htaccess | 21 + public/favicon.ico | 0 public/index.php | 55 + public/robots.txt | 2 + resources/css/app.css | 81 + .../flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 | Bin 0 -> 119540 bytes ...22ZXGJpEpjC_1n-q_4MrImHCIJIZrDCvHOej.woff2 | Bin 0 -> 221408 bytes .../js/Components/Dashboard/ActionMessage.vue | 22 + .../js/Components/Dashboard/ActionSection.vue | 22 + .../Dashboard/AuthenticationCard.vue | 11 + .../js/Components/Dashboard/Button/Base.vue | 17 + .../Dashboard/Button/BigPrimary.vue | 32 + .../js/Components/Dashboard/Button/Danger.vue | 19 + .../js/Components/Dashboard/Button/Info.vue | 19 + .../Components/Dashboard/Button/Primary.vue | 19 + .../Components/Dashboard/Button/Secondary.vue | 19 + .../Components/Dashboard/Button/Warning.vue | 19 + .../Dashboard/ConfirmationModal.vue | 66 + .../Components/Dashboard/ConfirmsPassword.vue | 116 + .../js/Components/Dashboard/DialogModal.vue | 47 + .../js/Components/Dashboard/Dropdown.vue | 104 + .../js/Components/Dashboard/DropdownLink.vue | 39 + .../js/Components/Dashboard/Form/Checkbox.vue | 40 + .../Dashboard/Form/Elements/Error.vue | 14 + .../Dashboard/Form/Elements/Label.vue | 23 + .../js/Components/Dashboard/Form/Input.vue | 78 + .../js/Components/Dashboard/Form/Search.vue | 75 + .../js/Components/Dashboard/Form/Select.vue | 59 + .../Components/Dashboard/Form/Selectable.vue | 79 + .../js/Components/Dashboard/Form/Textarea.vue | 68 + .../js/Components/Dashboard/FormSection.vue | 44 + .../js/Components/Dashboard/Help/Item.vue | 36 + resources/js/Components/Dashboard/Inbox.vue | 122 + .../js/Components/Dashboard/Inbox/Item.vue | 64 + .../Components/Dashboard/Inbox/Menu/Item.vue | 45 + .../Dashboard/Inbox/Menu/Static.vue | 38 + .../js/Components/Dashboard/InputLabel.vue | 14 + resources/js/Components/Dashboard/Logo.vue | 18 + .../js/Components/Dashboard/Logs/Item.vue | 13 + resources/js/Components/Dashboard/Modal.vue | 93 + .../js/Components/Dashboard/Modal/Destroy.vue | 53 + .../js/Components/Dashboard/Modal/Edit.vue | 48 + .../Dashboard/Modal/Elements/Header.vue | 20 + .../js/Components/Dashboard/Modal/Show.vue | 50 + .../js/Components/Dashboard/PageHeader.vue | 21 + .../js/Components/Dashboard/Searcher.vue | 58 + .../js/Components/Dashboard/SectionBorder.vue | 9 + .../js/Components/Dashboard/SectionTitle.vue | 17 + .../Components/Dashboard/Skeleton/Header.vue | 172 + .../Skeleton/Header/NotificationLink.vue | 67 + .../Components/Dashboard/Skeleton/Sidebar.vue | 54 + .../Dashboard/Skeleton/Sidebar/Link.vue | 44 + .../Dashboard/Skeleton/Sidebar/Section.vue | 18 + resources/js/Components/Dashboard/Table.vue | 84 + resources/js/Components/Dashboard/Welcome.vue | 254 + resources/js/Components/Shared/AwsIcon.vue | 19 + resources/js/Components/Shared/GoogleIcon.vue | 24 + resources/js/Components/Shared/Logo/Icon.vue | 13 + resources/js/Controllers/DateController.js | 23 + resources/js/Controllers/InboxController.js | 102 + resources/js/Controllers/ModalController.js | 84 + .../js/Controllers/NotificationController.js | 158 + resources/js/Controllers/PrintController.js | 52 + .../js/Controllers/SearcherController.js | 67 + resources/js/Lang/en.js | 205 + resources/js/Lang/es.js | 228 + resources/js/Lang/i18n.js | 22 + resources/js/Layouts/DashboardLayout.vue | 119 + resources/js/Layouts/ExampleLayout.vue | 80 + resources/js/Pages/API/Index.vue | 30 + .../js/Pages/API/Partials/ApiTokenManager.vue | 252 + resources/js/Pages/Admin/User/Component.js | 15 + resources/js/Pages/Admin/User/Create.vue | 112 + resources/js/Pages/Admin/User/Destroy.vue | 43 + resources/js/Pages/Admin/User/Edit.vue | 87 + resources/js/Pages/Admin/User/Index.vue | 180 + resources/js/Pages/Admin/User/Roles.vue | 85 + resources/js/Pages/Admin/User/Settings.vue | 57 + resources/js/Pages/Admin/User/Show.vue | 57 + .../js/Pages/Admin/User/UpdatePassword.vue | 62 + resources/js/Pages/Auth/ForgotPassword.vue | 62 + resources/js/Pages/Auth/Login.vue | 103 + resources/js/Pages/Auth/Register.vue | 136 + resources/js/Pages/Auth/ResetPassword.vue | 75 + .../js/Pages/Auth/TwoFactorChallenge.vue | 105 + resources/js/Pages/Auth/VerifyEmail.vue | 66 + resources/js/Pages/Dashboard/Changelogs.vue | 177 + resources/js/Pages/Dashboard/Help.vue | 41 + resources/js/Pages/Dashboard/HistoryLog.vue | 165 + .../js/Pages/Dashboard/HistoryLog/Show.vue | 106 + resources/js/Pages/Dashboard/Index.vue | 12 + .../Pages/Dashboard/Notifications/Destroy.vue | 50 + .../Pages/Dashboard/Notifications/Index.vue | 207 + .../js/Pages/Dashboard/Notifications/Show.vue | 69 + .../js/Pages/Developer/Roles/Component.js | 15 + resources/js/Pages/Developer/Roles/Create.vue | 67 + .../js/Pages/Developer/Roles/Destroy.vue | 46 + resources/js/Pages/Developer/Roles/Edit.vue | 63 + resources/js/Pages/Developer/Roles/Index.vue | 120 + resources/js/Pages/PrivacyPolicy.vue | 30 + .../Pages/Profile/Partials/DeleteUserForm.vue | 98 + .../LogoutOtherBrowserSessionsForm.vue | 165 + .../Partials/TwoFactorAuthenticationForm.vue | 231 + .../Profile/Partials/UpdatePasswordForm.vue | 94 + .../Partials/UpdateProfileInformationForm.vue | 216 + resources/js/Pages/Profile/Show.vue | 53 + resources/js/Pages/TermsOfService.vue | 30 + resources/js/app.js | 45 + resources/js/bootstrap.js | 37 + resources/js/cookies.js | 56 + resources/js/darkMode.js | 31 + resources/js/notify.js | 82 + resources/js/rolePermission.js | 59 + resources/js/sessionFresh.js | 46 + resources/js/sidebar.js | 27 + resources/js/tailwindScreen.js | 104 + resources/js/useFetch.js | 41 + resources/markdown/policy.md | 3 + resources/markdown/terms.md | 3 + resources/views/app.blade.php | 22 + resources/views/errors/401.blade.php | 5 + resources/views/errors/403.blade.php | 5 + resources/views/errors/404.blade.php | 5 + resources/views/errors/419.blade.php | 5 + resources/views/errors/429.blade.php | 5 + resources/views/errors/500.blade.php | 5 + resources/views/errors/503.blade.php | 5 + resources/views/errors/layout.blade.php | 53 + .../views/errors/minimal-with-home.blade.php | 31 + resources/views/errors/minimal.blade.php | 27 + routes/api.php | 19 + routes/channels.php | 23 + routes/console.php | 19 + routes/hook.php | 9 + routes/jetstream.php | 77 + routes/web.php | 92 + soketi.json.example | 17 + storage/app/.gitignore | 3 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + storagePermission.sh | 7 + stubs/console.stub | 40 + stubs/controller.api.stub | 72 + stubs/controller.invokable.stub | 35 + stubs/controller.model.api.stub | 73 + stubs/controller.model.stub | 94 + stubs/controller.nested.api.stub | 79 + stubs/controller.nested.stub | 102 + stubs/controller.plain.stub | 19 + stubs/controller.stub | 93 + stubs/event.stub | 44 + stubs/factory.stub | 30 + stubs/job.queued.stub | 43 + stubs/job.stub | 38 + stubs/mail.stub | 41 + stubs/markdown-mail.stub | 41 + stubs/markdown-notification.stub | 66 + stubs/middleware.stub | 29 + stubs/migration.stub | 28 + stubs/model.pivot.stub | 18 + stubs/model.stub | 28 + stubs/notification.stub | 69 + stubs/observer.stub | 90 + stubs/provider.stub | 36 + stubs/request.stub | 38 + stubs/rule.stub | 48 + stubs/scope.stub | 30 + stubs/seeder.stub | 27 + stubs/test.stub | 30 + stubs/test.unit.stub | 26 + stubs/view-component.stub | 36 + tailwind.config.js | 35 + tests/CreatesApplication.php | 22 + tests/Feature/ApiTokenPermissionsTest.php | 41 + tests/Feature/AuthenticationTest.php | 45 + tests/Feature/BrowserSessionsTest.php | 23 + tests/Feature/CreateApiTokenTest.php | 35 + tests/Feature/DeleteAccountTest.php | 43 + tests/Feature/DeleteApiTokenTest.php | 33 + tests/Feature/EmailVerificationTest.php | 73 + tests/Feature/ExampleTest.php | 21 + tests/Feature/PasswordConfirmationTest.php | 45 + tests/Feature/PasswordResetTest.php | 94 + tests/Feature/ProfileInformationTest.php | 25 + tests/Feature/RegistrationTest.php | 54 + .../TwoFactorAuthenticationSettingsTest.php | 69 + tests/Feature/UpdatePasswordTest.php | 56 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 18 + updateBuild.sh | 3 + updater.js | 109 + vite.config.js | 28 + 326 files changed, 32495 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/Actions/Fortify/CreateNewUser.php create mode 100644 app/Actions/Fortify/PasswordValidationRules.php create mode 100644 app/Actions/Fortify/ResetUserPassword.php create mode 100644 app/Actions/Fortify/UpdateUserPassword.php create mode 100644 app/Actions/Fortify/UpdateUserProfileInformation.php create mode 100644 app/Actions/Jetstream/DeleteUser.php create mode 100644 app/Console/Commands/DownSecure.php create mode 100644 app/Console/Commands/NotificationGlobal.php create mode 100644 app/Console/Commands/NotificationStart.php create mode 100644 app/Console/Commands/NotificationStop.php create mode 100644 app/Console/Commands/NotsowebInstall.php create mode 100644 app/Console/Commands/UpdaterStart.php create mode 100644 app/Console/Commands/UpdaterStop.php create mode 100644 app/Console/Commands/UserNotification.php create mode 100644 app/Console/Commands/Uuid.php create mode 100644 app/Console/Kernel.php create mode 100644 app/Events/GlobalNotification.php create mode 100644 app/Exceptions/Handler.php create mode 100644 app/Http/Controllers/Admin/UserController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/Dashboard/HistoryLogController.php create mode 100644 app/Http/Controllers/Dashboard/IndexController.php create mode 100644 app/Http/Controllers/Dashboard/NotificationController.php create mode 100644 app/Http/Controllers/Developer/RoleController.php create mode 100644 app/Http/Controllers/Example/IndexController.php create mode 100644 app/Http/Controllers/ResourceController.php create mode 100644 app/Http/Kernel.php create mode 100644 app/Http/MaintenanceModeBypassCookie.php create mode 100644 app/Http/Middleware/Authenticate.php create mode 100644 app/Http/Middleware/EncryptCookies.php create mode 100644 app/Http/Middleware/HandleInertiaRequests.php create mode 100644 app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Http/Middleware/TrimStrings.php create mode 100644 app/Http/Middleware/TrustHosts.php create mode 100644 app/Http/Middleware/TrustProxies.php create mode 100644 app/Http/Middleware/ValidateSignature.php create mode 100644 app/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Http/Requests/StoreUser.php create mode 100644 app/Http/Requests/UpdateUser.php create mode 100644 app/Http/Traits/ModelExtend.php create mode 100644 app/Http/Traits/ReportAction.php create mode 100644 app/Http/Traits/UseFetch.php create mode 100644 app/Http/Webhooks/UpdateAppHook.php create mode 100644 app/Listeners/BrodcastUserLoginNotification.php create mode 100644 app/Listeners/BrodcastUserLogoutNotification.php create mode 100644 app/Models/HistoryLog.php create mode 100644 app/Models/Role.php create mode 100644 app/Models/User.php create mode 100644 app/Notifications/UserHeaderNotification.php create mode 100644 app/Observers/RoleObserver.php create mode 100644 app/Observers/UserObserver.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/BroadcastServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 app/Providers/FortifyServiceProvider.php create mode 100644 app/Providers/JetstreamServiceProvider.php create mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 app/Services/Logs/LogHandler.php create mode 100644 app/Services/Logs/LogMonolog.php create mode 100644 app/Services/Logs/LogProcessor.php create mode 100644 app/Services/Notify.php create mode 100644 artisan create mode 100644 bootstrap/app.php create mode 100755 bootstrap/cache/.gitignore create mode 100644 colors.json.example create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/fortify.php create mode 100644 config/hashing.php create mode 100644 config/jetstream.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/permission.php create mode 100644 config/queue.php create mode 100644 config/sanctum.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/view.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/2014_10_12_000000_create_users_table.php create mode 100644 database/migrations/2014_10_12_100000_create_password_resets_table.php create mode 100644 database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php create mode 100644 database/migrations/2019_08_19_000000_create_failed_jobs_table.php create mode 100644 database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php create mode 100644 database/migrations/2022_11_05_234507_create_permission_tables.php create mode 100644 database/migrations/2022_11_14_170157_create_sessions_table.php create mode 100644 database/migrations/2022_11_28_120204_create_history_logs_table.php create mode 100644 database/migrations/2022_12_26_094023_create_notifications_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/DevSeeder.php create mode 100644 database/seeders/RoleSeeder.php create mode 100644 database/seeders/UserSeeder.php create mode 100644 lang/en/auth.php create mode 100644 lang/en/cache.php create mode 100644 lang/en/notifications.php create mode 100644 lang/en/pagination.php create mode 100644 lang/en/passwords.php create mode 100644 lang/en/roles.php create mode 100644 lang/en/users.php create mode 100644 lang/en/validation.php create mode 100644 lang/es.json create mode 100644 lang/es/auth.php create mode 100644 lang/es/cache.php create mode 100644 lang/es/notifications.php create mode 100644 lang/es/pagination.php create mode 100644 lang/es/passwords.php create mode 100644 lang/es/roles.php create mode 100644 lang/es/users.php create mode 100644 lang/es/validation.php create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 postcss.config.js create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/css/google-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 create mode 100644 resources/css/google-icons/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1n-q_4MrImHCIJIZrDCvHOej.woff2 create mode 100644 resources/js/Components/Dashboard/ActionMessage.vue create mode 100644 resources/js/Components/Dashboard/ActionSection.vue create mode 100644 resources/js/Components/Dashboard/AuthenticationCard.vue create mode 100644 resources/js/Components/Dashboard/Button/Base.vue create mode 100644 resources/js/Components/Dashboard/Button/BigPrimary.vue create mode 100644 resources/js/Components/Dashboard/Button/Danger.vue create mode 100644 resources/js/Components/Dashboard/Button/Info.vue create mode 100644 resources/js/Components/Dashboard/Button/Primary.vue create mode 100644 resources/js/Components/Dashboard/Button/Secondary.vue create mode 100644 resources/js/Components/Dashboard/Button/Warning.vue create mode 100644 resources/js/Components/Dashboard/ConfirmationModal.vue create mode 100644 resources/js/Components/Dashboard/ConfirmsPassword.vue create mode 100644 resources/js/Components/Dashboard/DialogModal.vue create mode 100644 resources/js/Components/Dashboard/Dropdown.vue create mode 100644 resources/js/Components/Dashboard/DropdownLink.vue create mode 100644 resources/js/Components/Dashboard/Form/Checkbox.vue create mode 100644 resources/js/Components/Dashboard/Form/Elements/Error.vue create mode 100644 resources/js/Components/Dashboard/Form/Elements/Label.vue create mode 100644 resources/js/Components/Dashboard/Form/Input.vue create mode 100644 resources/js/Components/Dashboard/Form/Search.vue create mode 100644 resources/js/Components/Dashboard/Form/Select.vue create mode 100644 resources/js/Components/Dashboard/Form/Selectable.vue create mode 100644 resources/js/Components/Dashboard/Form/Textarea.vue create mode 100644 resources/js/Components/Dashboard/FormSection.vue create mode 100644 resources/js/Components/Dashboard/Help/Item.vue create mode 100644 resources/js/Components/Dashboard/Inbox.vue create mode 100644 resources/js/Components/Dashboard/Inbox/Item.vue create mode 100644 resources/js/Components/Dashboard/Inbox/Menu/Item.vue create mode 100644 resources/js/Components/Dashboard/Inbox/Menu/Static.vue create mode 100644 resources/js/Components/Dashboard/InputLabel.vue create mode 100644 resources/js/Components/Dashboard/Logo.vue create mode 100644 resources/js/Components/Dashboard/Logs/Item.vue create mode 100644 resources/js/Components/Dashboard/Modal.vue create mode 100644 resources/js/Components/Dashboard/Modal/Destroy.vue create mode 100644 resources/js/Components/Dashboard/Modal/Edit.vue create mode 100644 resources/js/Components/Dashboard/Modal/Elements/Header.vue create mode 100644 resources/js/Components/Dashboard/Modal/Show.vue create mode 100644 resources/js/Components/Dashboard/PageHeader.vue create mode 100644 resources/js/Components/Dashboard/Searcher.vue create mode 100644 resources/js/Components/Dashboard/SectionBorder.vue create mode 100644 resources/js/Components/Dashboard/SectionTitle.vue create mode 100644 resources/js/Components/Dashboard/Skeleton/Header.vue create mode 100644 resources/js/Components/Dashboard/Skeleton/Header/NotificationLink.vue create mode 100644 resources/js/Components/Dashboard/Skeleton/Sidebar.vue create mode 100644 resources/js/Components/Dashboard/Skeleton/Sidebar/Link.vue create mode 100644 resources/js/Components/Dashboard/Skeleton/Sidebar/Section.vue create mode 100644 resources/js/Components/Dashboard/Table.vue create mode 100644 resources/js/Components/Dashboard/Welcome.vue create mode 100644 resources/js/Components/Shared/AwsIcon.vue create mode 100644 resources/js/Components/Shared/GoogleIcon.vue create mode 100644 resources/js/Components/Shared/Logo/Icon.vue create mode 100644 resources/js/Controllers/DateController.js create mode 100644 resources/js/Controllers/InboxController.js create mode 100644 resources/js/Controllers/ModalController.js create mode 100644 resources/js/Controllers/NotificationController.js create mode 100755 resources/js/Controllers/PrintController.js create mode 100644 resources/js/Controllers/SearcherController.js create mode 100644 resources/js/Lang/en.js create mode 100644 resources/js/Lang/es.js create mode 100644 resources/js/Lang/i18n.js create mode 100644 resources/js/Layouts/DashboardLayout.vue create mode 100644 resources/js/Layouts/ExampleLayout.vue create mode 100644 resources/js/Pages/API/Index.vue create mode 100644 resources/js/Pages/API/Partials/ApiTokenManager.vue create mode 100644 resources/js/Pages/Admin/User/Component.js create mode 100644 resources/js/Pages/Admin/User/Create.vue create mode 100644 resources/js/Pages/Admin/User/Destroy.vue create mode 100644 resources/js/Pages/Admin/User/Edit.vue create mode 100644 resources/js/Pages/Admin/User/Index.vue create mode 100644 resources/js/Pages/Admin/User/Roles.vue create mode 100644 resources/js/Pages/Admin/User/Settings.vue create mode 100644 resources/js/Pages/Admin/User/Show.vue create mode 100644 resources/js/Pages/Admin/User/UpdatePassword.vue create mode 100644 resources/js/Pages/Auth/ForgotPassword.vue create mode 100644 resources/js/Pages/Auth/Login.vue create mode 100644 resources/js/Pages/Auth/Register.vue create mode 100644 resources/js/Pages/Auth/ResetPassword.vue create mode 100644 resources/js/Pages/Auth/TwoFactorChallenge.vue create mode 100644 resources/js/Pages/Auth/VerifyEmail.vue create mode 100644 resources/js/Pages/Dashboard/Changelogs.vue create mode 100644 resources/js/Pages/Dashboard/Help.vue create mode 100644 resources/js/Pages/Dashboard/HistoryLog.vue create mode 100644 resources/js/Pages/Dashboard/HistoryLog/Show.vue create mode 100644 resources/js/Pages/Dashboard/Index.vue create mode 100644 resources/js/Pages/Dashboard/Notifications/Destroy.vue create mode 100644 resources/js/Pages/Dashboard/Notifications/Index.vue create mode 100644 resources/js/Pages/Dashboard/Notifications/Show.vue create mode 100644 resources/js/Pages/Developer/Roles/Component.js create mode 100644 resources/js/Pages/Developer/Roles/Create.vue create mode 100644 resources/js/Pages/Developer/Roles/Destroy.vue create mode 100644 resources/js/Pages/Developer/Roles/Edit.vue create mode 100644 resources/js/Pages/Developer/Roles/Index.vue create mode 100644 resources/js/Pages/PrivacyPolicy.vue create mode 100644 resources/js/Pages/Profile/Partials/DeleteUserForm.vue create mode 100644 resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue create mode 100644 resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue create mode 100644 resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue create mode 100644 resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue create mode 100644 resources/js/Pages/Profile/Show.vue create mode 100644 resources/js/Pages/TermsOfService.vue create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/js/cookies.js create mode 100644 resources/js/darkMode.js create mode 100644 resources/js/notify.js create mode 100644 resources/js/rolePermission.js create mode 100644 resources/js/sessionFresh.js create mode 100644 resources/js/sidebar.js create mode 100644 resources/js/tailwindScreen.js create mode 100644 resources/js/useFetch.js create mode 100644 resources/markdown/policy.md create mode 100644 resources/markdown/terms.md create mode 100644 resources/views/app.blade.php create mode 100644 resources/views/errors/401.blade.php create mode 100644 resources/views/errors/403.blade.php create mode 100644 resources/views/errors/404.blade.php create mode 100644 resources/views/errors/419.blade.php create mode 100644 resources/views/errors/429.blade.php create mode 100644 resources/views/errors/500.blade.php create mode 100644 resources/views/errors/503.blade.php create mode 100644 resources/views/errors/layout.blade.php create mode 100644 resources/views/errors/minimal-with-home.blade.php create mode 100644 resources/views/errors/minimal.blade.php create mode 100644 routes/api.php create mode 100644 routes/channels.php create mode 100644 routes/console.php create mode 100644 routes/hook.php create mode 100644 routes/jetstream.php create mode 100644 routes/web.php create mode 100644 soketi.json.example create mode 100755 storage/app/.gitignore create mode 100755 storage/app/public/.gitignore create mode 100755 storage/framework/.gitignore create mode 100755 storage/framework/cache/.gitignore create mode 100755 storage/framework/cache/data/.gitignore create mode 100755 storage/framework/sessions/.gitignore create mode 100755 storage/framework/testing/.gitignore create mode 100755 storage/framework/views/.gitignore create mode 100755 storage/logs/.gitignore create mode 100755 storagePermission.sh create mode 100644 stubs/console.stub create mode 100644 stubs/controller.api.stub create mode 100644 stubs/controller.invokable.stub create mode 100644 stubs/controller.model.api.stub create mode 100644 stubs/controller.model.stub create mode 100644 stubs/controller.nested.api.stub create mode 100644 stubs/controller.nested.stub create mode 100644 stubs/controller.plain.stub create mode 100644 stubs/controller.stub create mode 100644 stubs/event.stub create mode 100644 stubs/factory.stub create mode 100644 stubs/job.queued.stub create mode 100644 stubs/job.stub create mode 100644 stubs/mail.stub create mode 100644 stubs/markdown-mail.stub create mode 100644 stubs/markdown-notification.stub create mode 100644 stubs/middleware.stub create mode 100644 stubs/migration.stub create mode 100644 stubs/model.pivot.stub create mode 100644 stubs/model.stub create mode 100644 stubs/notification.stub create mode 100644 stubs/observer.stub create mode 100644 stubs/provider.stub create mode 100644 stubs/request.stub create mode 100644 stubs/rule.stub create mode 100644 stubs/scope.stub create mode 100644 stubs/seeder.stub create mode 100644 stubs/test.stub create mode 100644 stubs/test.unit.stub create mode 100644 stubs/view-component.stub create mode 100644 tailwind.config.js create mode 100644 tests/CreatesApplication.php create mode 100644 tests/Feature/ApiTokenPermissionsTest.php create mode 100644 tests/Feature/AuthenticationTest.php create mode 100644 tests/Feature/BrowserSessionsTest.php create mode 100644 tests/Feature/CreateApiTokenTest.php create mode 100644 tests/Feature/DeleteAccountTest.php create mode 100644 tests/Feature/DeleteApiTokenTest.php create mode 100644 tests/Feature/EmailVerificationTest.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/Feature/PasswordConfirmationTest.php create mode 100644 tests/Feature/PasswordResetTest.php create mode 100644 tests/Feature/ProfileInformationTest.php create mode 100644 tests/Feature/RegistrationTest.php create mode 100644 tests/Feature/TwoFactorAuthenticationSettingsTest.php create mode 100644 tests/Feature/UpdatePasswordTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 updateBuild.sh create mode 100644 updater.js create mode 100644 vite.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ba33c52 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3ad3f06 --- /dev/null +++ b/.env.example @@ -0,0 +1,67 @@ +APP_NAME=Template +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost +APP_COPYRIGHT=Notsoweb +APP_PAGINATION=50 +APP_MAINTENANCE_LIFETIME=48 +TELESCOPE_ENABLED=false + +REPOSITORY_BRANCH=main +REPOSITORY_WATCHER_PORT=3001 + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=template +DB_USERNAME=root +DB_PASSWORD= + +BROADCAST_DRIVER=pusher +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=database +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailhog +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID=template +PUSHER_APP_KEY=example +PUSHER_APP_SECRET=my-secret +PUSHER_HOST=localhost +PUSHER_PORT=6001 +PUSHER_SCHEME=http +PUSHER_APP_CLUSTER=mt1 +PUSHER_NOTIFICATIONS=false + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" +VITE_PUSHER_NOTIFICATIONS="${PUSHER_NOTIFICATIONS}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7dbbf41 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eda5516 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +/.fleet +/.idea +/.vscode +/node_modules +/public/build +/public/build.zip +/public/hot +/public/storage +/public/vendor/telescope +/packages +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpunit.result.cache +auth.json +build.zip +colors.json +Homestead.json +Homestead.yaml +npm-debug.log +soketi.json +yarn-error.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..5fa87fa --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ + +## Acerca de Template Laravel Vue +Template es una plantilla que contiene un administrador con elementos simples como formularios, botones, tablas entre otros para acelerar el desarrollo. Permite tener preparada la gestión de usuarios, perfiles, entre otras cosas. + +Este proyecto tiene como núcleo Laravel 10, Intertiajs y Vuejs 3. +## Instalar proyecto +#### Requerimientos +Para instalar este proyecto se requiere tener instalado como mínimo las siguientes dependencias: +- Composer 2.5.7 +- Nodejs 18.17.0 +- NPM 9.6.7 +- La base de datos es a discreción del usuario. +#### Instalación +El proyecto es capas de configurarse a si mismo si todas las dependencias están satisfechas. Para instalar el proyecto corra: +`` +composer env:prod +`` +o si lo prefiere: +`` +composer env:dev +`` +Se instalara el ambiente de producción o desarrollo respectivamente. + +Una vez configurado el archivo .env con la base de datos, puede sembrar la base de datos: +`` +composer db:prod +`` +o si desea instalarla con el modo desarrollo: +`` +composer db:dev +`` + +#### Notificaciones en tiempo real +Si se desea aprovechar el servicio de notificaciones en tiempo real integrado, se requiere instalar SOKETI y PM2. +`` +npm install -g @soketi/soketi +`` +`` +npm install -g pm2 +`` +También puede ejecutar el instalador integrado: +`` +php artisan composer notification:install +`` +En caso de error, procure usar privilegios de super usuario. + +Para iniciar el servicio debe iniciarlo con el comando: +`` +php artisan notification:start +`` +O si desea detenerlo: +`` +php artisan notification:stop +`` +En caso de una desactivación permanente, puede eliminar la instancia: +`` +php artisan notification:destroy +`` + +Puede configurar libremente el servidor de notificaciones como usted desee con el archivo ``soketi.json``. Entre los parámetros editables están: +- Puerto +- ID de la instancia +- KEY de la instancia +- SECRETE de la instancia + +El archivo de configuración se crea automáticamente al instalar el proyecto. Recuerde colocar los datos que edite de ``soketi.json`` en la configuración de PUSHER en el ``.env``. + +El nombre de la instancia del servicio de notificaciones dentro de PM2 sera el mismo que se establezca en PUSHER_APP_KEY dentro del ``.env``. Es posible que sea conveniente modificar este dato si desea correr dos o más instancias de la aplicación dentro del mismo servidor para evitar que las notificaciones se compartan entre instancias. En caso contrario no es necesario modificar nada. + +La aplicación puede funcionar bien con el establecimiento de un proxy inverso mediante NGINX si se requiere establecer un subdominio o dominio como puerta de enlace al servidor de notificaciones. + +Por default las notificaciones están desactivadas. Se activan cambiando la variable de entorno ``PUSHER_NOTIFICATIONS`` de ``false`` a ``true``. +## Autor +Este proyecto fue desarrollado por Moisés de Jesús Cortés Castellanos. Si tiene alguna duda o recomendación, enviar a [ing.moisesdejesuscortesc@notsoweb.com](mailto:ing.moisesdejesuscortesc@notsoweb.com). diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php new file mode 100644 index 0000000..fe250c0 --- /dev/null +++ b/app/Actions/Fortify/CreateNewUser.php @@ -0,0 +1,40 @@ + ['required', 'string', 'max:255'], + 'paternal' => ['required', 'string', 'max:255'], + 'maternal' => ['nullable', 'string', 'max:255'], + 'phone' => ['nullable', 'numeric', 'digits:10', 'unique:users'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => $this->passwordRules(), + 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', + ])->validate(); + + return User::create([ + 'name' => $input['name'], + 'paternal' => $input['paternal'], + 'maternal' => $input['maternal'], + 'phone' => $input['phone'], + 'email' => $input['email'], + 'password' => Hash::make($input['password']), + ]); + } +} diff --git a/app/Actions/Fortify/PasswordValidationRules.php b/app/Actions/Fortify/PasswordValidationRules.php new file mode 100644 index 0000000..fc78ffd --- /dev/null +++ b/app/Actions/Fortify/PasswordValidationRules.php @@ -0,0 +1,16 @@ + $this->passwordRules(), + ])->validate(); + + $user->forceFill([ + 'password' => Hash::make($input['password']), + ])->save(); + } +} diff --git a/app/Actions/Fortify/UpdateUserPassword.php b/app/Actions/Fortify/UpdateUserPassword.php new file mode 100644 index 0000000..4384cb2 --- /dev/null +++ b/app/Actions/Fortify/UpdateUserPassword.php @@ -0,0 +1,31 @@ + ['required', 'string', 'current_password:web'], + 'password' => $this->passwordRules(), + ], [ + 'current_password.current_password' => __('passwords.no_match'), + ])->validateWithBag('updatePassword'); + + $user->forceFill([ + 'password' => Hash::make($input['password']), + ])->save(); + } +} diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php new file mode 100644 index 0000000..c071695 --- /dev/null +++ b/app/Actions/Fortify/UpdateUserProfileInformation.php @@ -0,0 +1,66 @@ + ['required', 'string', 'max:255'], + 'paternal' => ['required', 'string', 'max:255'], + 'maternal' => ['nullable', 'string', 'max:255'], + 'phone' => ['nullable', 'numeric', 'digits:10', Rule::unique('users')->ignore($user->id)], + 'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], + 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], + ])->validateWithBag('updateProfileInformation'); + + if (isset($input['photo'])) { + $user->updateProfilePhoto($input['photo']); + } + + if ($input['email'] !== $user->email && + $user instanceof MustVerifyEmail) { + $this->updateVerifiedUser($user, $input); + } else { + $user->forceFill([ + 'name' => $input['name'], + 'paternal' => $input['paternal'], + 'maternal' => $input['maternal'], + 'phone' => $input['phone'], + 'email' => $input['email'], + ])->save(); + } + } + + /** + * Update the given verified user's profile information. + * + * @param mixed $user + * @param array $input + * @return void + */ + protected function updateVerifiedUser($user, array $input) + { + $user->forceFill([ + 'name' => $input['name'], + 'paternal' => $input['paternal'], + 'maternal' => $input['maternal'], + 'phone' => $input['phone'], + 'email' => $input['email'], + 'email_verified_at' => null, + ])->save(); + + $user->sendEmailVerificationNotification(); + } +} diff --git a/app/Actions/Jetstream/DeleteUser.php b/app/Actions/Jetstream/DeleteUser.php new file mode 100644 index 0000000..4e909db --- /dev/null +++ b/app/Actions/Jetstream/DeleteUser.php @@ -0,0 +1,19 @@ +deleteProfilePhoto(); + $user->tokens->each->delete(); + $user->delete(); + } +} diff --git a/app/Console/Commands/DownSecure.php b/app/Console/Commands/DownSecure.php new file mode 100644 index 0000000..09016f0 --- /dev/null +++ b/app/Console/Commands/DownSecure.php @@ -0,0 +1,57 @@ + + * + * @version 1.0.0 + */ +class DownSecure extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'down:secure'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Modo mantenimiento con un hash seguro'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + $secret = Uuid::uuid4(); + + Artisan::call('down', [ + '--secret' => $secret + ]); + + echo url($secret); + echo "\n"; + + Log::channel('notsoweb')->info("Maintenance Mode Secure. Key: {$secret}"); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/NotificationGlobal.php b/app/Console/Commands/NotificationGlobal.php new file mode 100644 index 0000000..4fea3dc --- /dev/null +++ b/app/Console/Commands/NotificationGlobal.php @@ -0,0 +1,51 @@ + + * + * @version 1.0.0 + */ +class NotificationGlobal extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'notification:global {message}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Enviar notificación a todos los usuarios'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + $message = $this->argument('message'); + + broadcast(new GlobalNotification( + $message, + "info", + 15 + )); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/NotificationStart.php b/app/Console/Commands/NotificationStart.php new file mode 100644 index 0000000..6f7f79d --- /dev/null +++ b/app/Console/Commands/NotificationStart.php @@ -0,0 +1,42 @@ + + * + * @version 1.0.0 + */ +class NotificationStart extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'notification:start'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Iniciar servicio de notificaciones en tiempo real'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + echo shell_exec('pm2 start soketi --name notification-server -- start --config=soketi.json'); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/NotificationStop.php b/app/Console/Commands/NotificationStop.php new file mode 100644 index 0000000..14a09f3 --- /dev/null +++ b/app/Console/Commands/NotificationStop.php @@ -0,0 +1,42 @@ + + * + * @version 1.0.0 + */ +class NotificationStop extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'notification:stop'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Detener servicio de notificaciones en tiempo real'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + echo shell_exec('pm2 delete notification-server'); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/NotsowebInstall.php b/app/Console/Commands/NotsowebInstall.php new file mode 100644 index 0000000..7719e67 --- /dev/null +++ b/app/Console/Commands/NotsowebInstall.php @@ -0,0 +1,46 @@ + + * + * @version 1.0.0 + */ +class NotsowebInstall extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'notsoweb:install'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Instala los servicios necesarios para las notificaciones y actualizaciones en tiempo real'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + echo shell_exec('npm install -g @soketi/soketi'); + echo shell_exec('npm install -g pm2'); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/UpdaterStart.php b/app/Console/Commands/UpdaterStart.php new file mode 100644 index 0000000..136bef1 --- /dev/null +++ b/app/Console/Commands/UpdaterStart.php @@ -0,0 +1,42 @@ + + * + * @version 1.0.0 + */ +class UpdaterStart extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'updater:start'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Iniciar servicio de actualización automática'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + shell_exec("pm2 start --name updater \"node updater.js\""); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/UpdaterStop.php b/app/Console/Commands/UpdaterStop.php new file mode 100644 index 0000000..ce85d4d --- /dev/null +++ b/app/Console/Commands/UpdaterStop.php @@ -0,0 +1,42 @@ + + * + * @version 1.0.0 + */ +class UpdaterStop extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'updater:stop'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Detener servicio de actualización automática'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + shell_exec("pm2 delete updater"); + + return Command::SUCCESS; + } +} diff --git a/app/Console/Commands/UserNotification.php b/app/Console/Commands/UserNotification.php new file mode 100644 index 0000000..a6a2c75 --- /dev/null +++ b/app/Console/Commands/UserNotification.php @@ -0,0 +1,78 @@ + + * + * @version 1.0.0 + */ +class UserNotification extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'notification:user + {--email=developer@notsoweb.com : Correo del usuario} + {--message=Prueba : Mensaje a enviar} + {--type=info : Tipo de notificación} + {--timeout=15 : Tiempo de notificación en segundos}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Notificar algo a un usuario especifico mediante consola'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + $email = $this->option('email'); + $message = $this->option('message'); + $type = $this->option('type'); + $timeout = $this->option('timeout'); + + if($email) { + $user = User::where('email', $email)->first(); + + if ($user) { + $user->notify(new UserHeaderNotification( + message: $message, + icon: $type, + timeout: $timeout + )); + + Log::channel('notify')->info("Mensaje privado enviado por consola a {$user->email}"); + + return Command::SUCCESS; + } else { + $log = "El usuario {$user->email} no existe, mensaje por consola no enviado."; + + echo $log; + Log::channel('notify')->error($log); + } + + } else { + echo "Se necesita escribir un correo"; + } + + return Command::INVALID; + } +} diff --git a/app/Console/Commands/Uuid.php b/app/Console/Commands/Uuid.php new file mode 100644 index 0000000..effaf9f --- /dev/null +++ b/app/Console/Commands/Uuid.php @@ -0,0 +1,65 @@ + + * + * @version 1.0.0 + */ +class Uuid extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'make:uuid {type=uuid4}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Genera un uuid en consola'; + + /** + * Tipos permitidos + */ + protected $types = [ + 'uuid1', + 'uuid2', + 'uuid3', + 'uuid4', + 'uuid5', + 'uuid6', + 'uuid7', + 'uuid8', + ]; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + $type = $this->argument('type'); + + if(in_array($type, $this->types)) { + echo "Type: $type \n"; + echo RamseyUuid::$type(); + return Command::SUCCESS; + } + + return Command::INVALID; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..82c59d7 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,30 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Events/GlobalNotification.php b/app/Events/GlobalNotification.php new file mode 100644 index 0000000..78032ed --- /dev/null +++ b/app/Events/GlobalNotification.php @@ -0,0 +1,49 @@ + + * + * @version 1.0.0 + */ +class GlobalNotification implements ShouldBroadcast +{ + use Dispatchable, + InteractsWithSockets, + SerializesModels; + + /** + * Crear nueva instancia del evento + * + * @param string $message El mensaje a transmitir + * @param string $type El tipo de mensaje + * @param string $timeout Tiempo en segundos + */ + public function __construct( + public $message, + public $type = 'success', + public $timeout = 15 + ) {} + + /** + * Transmitir notificación por canal privado + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel("notifications"); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..6a2faf8 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,48 @@ +, \Psr\Log\LogLevel::*> + */ + protected $levels = [ + // + ]; + + /** + * A list of the exception types that are not reported. + * + * @var array> + */ + protected $dontReport = [ + // + ]; + + /** + * A list of the inputs that are never flashed to the session on validation exceptions. + * + * @var array + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + * + * @return void + */ + public function register() + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php new file mode 100644 index 0000000..1eadd87 --- /dev/null +++ b/app/Http/Controllers/Admin/UserController.php @@ -0,0 +1,211 @@ + + * + * @version 1.0.0 + */ +class UserController extends VueController +{ + use UseFetch, + WithPermission; + + /** + * Constructor + */ + public function __construct() + { + $this->vueRoot('admin.user'); + $this->withDefaultPermissions('users'); + } + + /** + * Listar usuarios + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $q = request()->get('q'); + + return $this->vuew('index', [ + 'users' => User::whereNotIn('id', [1,2]) + ->where(fn($query) => $query + ->where('name', 'LIKE', "%{$q}%") + ->orWhere('email', 'LIKE', "%{$q}%")) + ->select([ + 'id', + 'name', + 'paternal', + 'maternal', + 'email', + 'phone' + ]) + ->paginate(config('app.pagination')), + ]); + } + + /** + * Mostrar formulario crear usuario + */ + public function create() + { + return $this->vuew('create'); + } + + /** + * Almacenar usuario + */ + public function store(StoreUser $request) + { + $data = $request->all(); + // Cifro la contraseña recibida + $data['password'] = bcrypt($data['password']); + + User::create($data); + + return $this->index(); + } + + /** + * Vista configurar usuario + * + * @param User $user Modelo del usuario + */ + public function settings(User $user) + { + return $this->vuew('settings', [ + 'user' => $user, + 'userRoles' => $user->roles, + 'roles'=> Role::orderBy('name', 'ASC') + ->get(), + ]); + } + + /** + * Actualizar usuario + * + * @param \Illuminate\Http\Request $request + * @param User $user Modelo del usuario + */ + public function update(UpdateUser $request, $user) : void + { + $data = $request->all(); + + $model = User::find($user); + $model->update($data); + } + + /** + * Actualizar contraseña usuario + * + * @param Request $request + */ + public function updatePassword(Request $request) : void + { + $data = $this->validate($request, [ + 'password' => ['required', 'string', 'min:8'], + 'user_id' => ['required'], + ]); + + $user = User::find($data['user_id']); + $user->update([ + 'password' => Hash::make($data['password']) + ]); + } + + /** + * Sincronizar roles usuario + * + * @param Request $request + */ + public function syncRoles(Request $request) : void + { + $data = $this->validate($request, [ + 'roles' => ['nullable'], + 'user_id' => ['required'] + ]); + + $roles = []; + + foreach ($data['roles'] as $role) { + $roles[] = $role['id']; + } + + $user = User::find($data['user_id']); + $user->syncRoles($roles); + } + + /** + * Obtener notificaciones + * + * Trae las ultimas 7 notificaciones. + * + * @return JsonResponse + */ + public function getNotifications() : JsonResponse + { + try { + $notifications = auth() + ->user() + ->notifications() + ->limit(7) + ->latest() + ->get(); + + return $this->successFetch([ + 'notifications' => $notifications + ]); + } catch (\Throwable $th) { + $this->reportError($th, __METHOD__); + return $this->errorFetch(__('The user does not have notifications')); + } + } + + /** + * Eliminar usuario + * + * @param integer $user ID del usuario + */ + public function destroy($user) : void + { + try { + $user = User::find($user); + $user->delete(); + + + } catch (\Throwable $th) { + Log::channel('users') + ->error($th->getMessage()); + } + } + + /** + * Log de errores + * + * @param object $th Contiene todos los detalles del error + * @param string $method Función del controlador sobre la que ocurrió el error + */ + private function reportError($th, $method) : void + { + Log::channel('users')->error("Method: $method"); + Log::channel('users')->error($th->getMessage()); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..0e850d0 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ + + * + * @version 1.0.0 + */ +class HistoryLogController extends VueController +{ + /** + * Constructor + */ + public function __construct() + { + $this->vueRoot('dashboard'); + } + + /** + * Listar historial de acciones + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $historyEvent = request()->get('historyEvent'); + $dateStart = request()->get('dateStart'); + $dateEnd = request()->get('dateEnd'); + + if($dateEnd) { + $dateEnd = date('Y-m-d', strtotime("{$dateEnd} + 1 day")); + } + + $searcher = HistoryLog::join('users', 'users.id', '=', 'history_logs.user_id') + ->where(function($query) use ($historyEvent) { + $query->where('history_logs.action', 'LIKE', "%{$historyEvent}%"); + $query->orWhere('history_logs.message', 'LIKE', "%{$historyEvent}%"); + }); + + if($dateStart && $dateEnd) { + $searcher = $searcher->whereBetween('history_logs.created_at', [$dateStart, $dateEnd]); + } elseif($dateStart && !$dateEnd) { + $searcher = $searcher->where('history_logs.created_at', '>=', $dateStart); + } elseif (!$dateStart && $dateEnd) { + $searcher = $searcher->where('history_logs.created_at', '<=', $dateEnd); + } + + return $this->vuew('history-log' , [ + 'histories' => $searcher ->select([ + 'history_logs.*', + 'users.name', + 'users.paternal', + ]) + ->orderBy('created_at', 'Desc') + ->paginate(config('app.pagination')) + ]); + } +} diff --git a/app/Http/Controllers/Dashboard/IndexController.php b/app/Http/Controllers/Dashboard/IndexController.php new file mode 100644 index 0000000..d16d29d --- /dev/null +++ b/app/Http/Controllers/Dashboard/IndexController.php @@ -0,0 +1,32 @@ + + * + * @version 1.0.0 + */ +class IndexController extends VueController +{ + /** + * Constructor + */ + public function __construct() + { + $this->vueRoot('dashboard'); + } + + /** + * Página de inicio + */ + public function index() + { + return $this->vuew('index'); + } +} diff --git a/app/Http/Controllers/Dashboard/NotificationController.php b/app/Http/Controllers/Dashboard/NotificationController.php new file mode 100644 index 0000000..20353f9 --- /dev/null +++ b/app/Http/Controllers/Dashboard/NotificationController.php @@ -0,0 +1,102 @@ + + * + * @version 1.0.0 + */ +class NotificationController extends VueController +{ + /** + * Constructor + */ + public function __construct() + { + $this->vueRoot('dashboard.notifications'); + } + + /** + * Listar notificaciones usuario + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $dateStart = request()->get('dateStart'); + $dateEnd = request()->get('dateEnd'); + + if($dateEnd) { + $dateEnd = date('Y-m-d', strtotime("{$dateEnd} + 1 day")); + } + + $searcher = auth() + ->user() + ->notifications() + ->latest(); + + if($dateStart && $dateEnd) { + $searcher = $searcher->whereBetween('notifications.created_at', [$dateStart, $dateEnd]); + } elseif($dateStart && !$dateEnd) { + $searcher = $searcher->where('notifications.created_at', '>=', $dateStart); + } elseif (!$dateStart && $dateEnd) { + $searcher = $searcher->where('notifications.created_at', '<=', $dateEnd); + } + + return $this->vuew('index', [ + 'notifications' => $searcher->paginate(config('app.pagination')) + ]); + } + + /** + * Marcar notificación como leída + * + * Al entrar a ver los detalles de la notificación esta se marca como leída automáticamente. + * Aprovechando el método post para no mostrar el ID. + * + * @param \Illuminate\Http\Request $request + */ + public function store(Request $request) + { + $data = $request->all(); + + $notification = Notification::find($data['id']); + $notification->markAsRead(); + + return $this->vuew('show', [ + 'notification' => $notification + ]); + } + + /** + * Marcar notificación como leída + * + * Marca directamente una notificación como leída sin siquiera entrar a detalles. + * + * @param \Illuminate\Http\Request $request + * @param Notification $notification Modelo de la notificación + */ + public function update(Request $request, Notification $notification) + { + $notification->markAsRead(); + } + + /** + * Eliminar notificación + * + * @param Notification $notification Modelo de la notificación + * @return \Illuminate\Http\Response + */ + public function destroy(Notification $notification) + { + $notification->delete(); + } +} diff --git a/app/Http/Controllers/Developer/RoleController.php b/app/Http/Controllers/Developer/RoleController.php new file mode 100644 index 0000000..1965108 --- /dev/null +++ b/app/Http/Controllers/Developer/RoleController.php @@ -0,0 +1,113 @@ + + * + * @version 1.0.0 + */ +class RoleController extends VueController +{ + use WithPermission; + + /** + * Constructor + */ + public function __construct() + { + $this->withDefaultPermissions('roles'); + $this->vueRoot('developer.roles'); + } + + /** + * Listar roles + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $q = request()->get('q'); + + return $this->vuew('index', [ + 'roles' => Role::orderBy('name', 'ASC') + ->where('name', 'LIKE', "%{$q}%") + ->select([ + 'id', + 'name', + 'description' + ]) + ->paginate(config('app.pagination')) + ]); + } + + /** + * Vista nuevo rol + * + * @return \Illuminate\Http\Response + */ + public function create() + { + return $this->vuew('create'); + } + + /** + * Almacenar role + * + * @param \Illuminate\Http\Request $request + */ + public function store(Request $request) + { + $data = $request->validate([ + 'name' => ['required', 'string'], + 'description' => ['required', 'string'] + ]); + + Role::create($data); + + return $this->index(); + } + + /** + * Actualizar role + * + * @param \Illuminate\Http\Request $request + * @param Role $role Modelo del Role + */ + public function update(Request $request, $role) : void + { + $data = $request->validate([ + 'name' => ['required', 'string'], + 'description' => ['required', 'string'] + ]); + + $model = Role::find($role); + $model->update($data); + } + + /** + * Eliminar rol + * + * Se debe de tener mucho cuidado en la eliminación de los roles ya que algunos de ellos + * están ligados a nivel código en el sistema, lo que podría limitar a los usuarios o + * bloquear el sistema. + * + * @param Role $role Modelo del Role + * @return \Illuminate\Http\Response + */ + public function destroy(Role $role) : void + { + $role->delete(); + } +} diff --git a/app/Http/Controllers/Example/IndexController.php b/app/Http/Controllers/Example/IndexController.php new file mode 100644 index 0000000..f34939d --- /dev/null +++ b/app/Http/Controllers/Example/IndexController.php @@ -0,0 +1,32 @@ + + * + * @version 1.0.0 + */ +class IndexController extends VueController +{ + /** + * Constructor + */ + public function __construct() + { + $this->vueRoot('example'); + } + + /** + * Página de inicio + */ + public function index() + { + return $this->vuew('index'); + } +} diff --git a/app/Http/Controllers/ResourceController.php b/app/Http/Controllers/ResourceController.php new file mode 100644 index 0000000..979089b --- /dev/null +++ b/app/Http/Controllers/ResourceController.php @@ -0,0 +1,55 @@ + + * + * @version 1.0.0 + */ +class ResourceController extends Controller +{ + use UseFetch; + + /** + * Retornar todos los roles del usuario + * + * @param int $user ID del usuario a buscar roles + */ + public function rolesByUser($user) : JsonResponse + { + try { + $model = User::find($user); + + return $this->successFetch([ + 'roles' => $model->roles + ]); + } catch (\Throwable $th) { + $this->reportError($th, __METHOD__); + + return $this->errorFetch(__('The user does not exist')); + } + } + + /** + * Crear log de errores de este controlador + * + * @param object $th Contiene todos los detalles del error + * @param string $method Función del controlador sobre la que ocurrió el error + */ + private function reportError($th, $method) : void + { + Log::channel('resources')->error("Method: $method"); + Log::channel('resources')->error($th->getMessage()); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..a826c3d --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,70 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\HandleInertiaRequests::class, + \Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + 'throttle:api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, + 'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, + 'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/app/Http/MaintenanceModeBypassCookie.php b/app/Http/MaintenanceModeBypassCookie.php new file mode 100644 index 0000000..989d040 --- /dev/null +++ b/app/Http/MaintenanceModeBypassCookie.php @@ -0,0 +1,26 @@ +addHours(config('app.maintenance.lifetime'));//Time expiration for your cookie + + return new Cookie('laravel_maintenance', base64_encode(json_encode([ + 'expires_at' => $expiresAt->getTimestamp(), + 'mac' => hash_hmac('sha256', $expiresAt->getTimestamp(), $key), + ])), $expiresAt); + } +} \ No newline at end of file diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..704089a --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..867695b --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php new file mode 100644 index 0000000..c93368a --- /dev/null +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -0,0 +1,44 @@ + config('app.copyright'), + 'lang'=> config('app.locale'), + 'shareUserPermissions' => auth()?->user()?->getAllPermissions(), + ]); + } +} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000..28fdd7a --- /dev/null +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,29 @@ + + */ + protected $except = [ + // + ]; + + /** + * Configura el secreto de forma personalizada con una duración de tiempo + * personalizada en las variables de entorno. + */ + protected function bypassResponse(string $secret) + { + return redirect('/')->withCookie( + MaintenanceModeBypassCookie::create($secret) + ); + } +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 0000000..a2813a0 --- /dev/null +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,32 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..88cadca --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php new file mode 100644 index 0000000..7186414 --- /dev/null +++ b/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts() + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..3391630 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 0000000..093bf64 --- /dev/null +++ b/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $except = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..6e3426c --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,15 @@ + + */ + protected $except = [ + '/hook/*' + ]; +} diff --git a/app/Http/Requests/StoreUser.php b/app/Http/Requests/StoreUser.php new file mode 100644 index 0000000..50dab59 --- /dev/null +++ b/app/Http/Requests/StoreUser.php @@ -0,0 +1,43 @@ + + * + * @version 1.0.0 + */ +class StoreUser extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['required', 'string'], + 'paternal' => ['required', 'string'], + 'maternal' => ['nullable', 'string'], + 'email' => ['required', 'email', 'unique:users'], + 'phone' => ['nullable', 'numeric', 'unique:users'], + 'password' => ['required', 'min:8'], + ]; + } +} diff --git a/app/Http/Requests/UpdateUser.php b/app/Http/Requests/UpdateUser.php new file mode 100644 index 0000000..1148d74 --- /dev/null +++ b/app/Http/Requests/UpdateUser.php @@ -0,0 +1,43 @@ + + * + * @version 1.0.0 + */ +class UpdateUser extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + 'name' => ['required', 'string'], + 'paternal' => ['required', 'string'], + 'maternal' => ['nullable', 'string'], + 'email' => ['required', 'email', Rule::unique('users')->ignore($this->id)], + 'phone' => ['nullable', 'numeric', Rule::unique('users')->ignore($this->id)], + ]; + } +} diff --git a/app/Http/Traits/ModelExtend.php b/app/Http/Traits/ModelExtend.php new file mode 100644 index 0000000..84bb678 --- /dev/null +++ b/app/Http/Traits/ModelExtend.php @@ -0,0 +1,58 @@ + + * @version 1.0.0 + */ +trait ModelExtend +{ + /** + * Retorna en un array los atributos rellenados que son rellenables. + * + * @return array + */ + public function fillableToArray() : array + { + if(count($this->fillable) > 0) { + $data = []; + + foreach($this->fillable as $fillable) { + if(!in_array($fillable, $this->hidden)){ + $data[$fillable] = $this->$fillable; + } + } + + return $data; + } + + return $this->toArray(); + } + + /** + * Retorna los cambios de una actualización separandolos como antes y despues + * + * @return array + */ + public function getContrastChanges() : array + { + $new = $old = []; + $changes = $this->getChanges(); + + foreach (array_keys($changes) as $key) { + if(!in_array($key, ['updated_at'])) { + $new[$key] = $changes[$key]; + $old[$key] = $this->getOriginal($key); + } + } + + return [ + 'new' => $new, + 'old' => $old, + ]; + } +} \ No newline at end of file diff --git a/app/Http/Traits/ReportAction.php b/app/Http/Traits/ReportAction.php new file mode 100644 index 0000000..db3aca2 --- /dev/null +++ b/app/Http/Traits/ReportAction.php @@ -0,0 +1,107 @@ + + * @version 1.0.0 + */ +trait ReportAction +{ + /** + * Reporta una cantidad de algo + * + * @version 1.0.0 + * + * @param string $action Accion completa + * @param array $json Array de datos + * @param int $qty Cantidad de datos + * @param string $context Información adicional + */ + public function reportQty(string $action, array $json = [], int $qty = 1, string $attribute = null) : void + { + Log::channel('report')->info($attribute ,[ + 'qty' => $qty, + 'action'=> $action, + 'data' => $json + ]); + } + + /** + * Reporta la duplicación de un registro + * + * @version 1.0.0 + * + * @param string $module Modulo sobre el que se desencadena la acción + * @param array $json Array de datos + * @param string $context Información adicional + */ + public function reportDuplicated(string $module, array $json, string $context = null) : void + { + $this->reportQty( + action:"{$module}.duplicated", + json: $json, + attribute: $context + ); + } + + /** + * Reporta la creación de un registro + * + * @version 1.0.0 + * + * @param string $module Modulo sobre el que se desencadena la acción + * @param array $json Array de datos + * @param string $context Información adicional + */ + public function reportCreate(string $module, array $json, string $context = null) : void + { + $this->reportQty( + action:"{$module}.created", + json: $json, + attribute: $context + ); + } + + /** + * Reporta la actualización de un registro + * + * @version 1.0.0 + * + * @param string $module Modulo sobre el que se desencadena la acción + * @param array $json Array de datos + * @param string $context Información adicional + */ + public function reportUpdate(string $module, array $json, string $context = null) : void + { + $this->reportQty( + action:"{$module}.updated", + json: $json, + attribute: $context + ); + } + + /** + * Reporta la eliminación de un registro + * + * @version 1.0.0 + * + * @param string $module Modulo sobre el que se desencadena la acción + * @param array $json Array de datos + * @param string $context Información adicional + */ + public function reportDestroy(string $module, array $json, string $context = null) : void + { + $this->reportQty( + action:"{$module}.destroyed", + json: $json, + attribute: $context + ); + } +} \ No newline at end of file diff --git a/app/Http/Traits/UseFetch.php b/app/Http/Traits/UseFetch.php new file mode 100644 index 0000000..9433e90 --- /dev/null +++ b/app/Http/Traits/UseFetch.php @@ -0,0 +1,54 @@ + + * @version 1.0.0 + */ +trait UseFetch +{ + /** + * Retorna un mensaje de error para fetch + * + * Para aquellas peticiones realizadas por medio de la función fetch en javascript que + * requieran retornar un error. + * + * @version 1.0.0 + * + * @return \Illuminate\Http\JSONResponse + */ + public function errorFetch($message = null) : JsonResponse + { + if (!$message) { + $message = __("Resource not found"); + } + + return response()->json([ + 'status' => 404, + 'message' => $message + ], 404); + } + + /** + * Retorna un mensaje de error para fetch + * + * Para aquellas peticiones realizadas por medio de la función fetch en javascript que + * requieran retornar un error. + * + * @version 1.0.0 + * + * @return \Illuminate\Http\JSONResponse + */ + public function successFetch(array $data = []) : JsonResponse + { + return response()->json(array_merge([ + 'status' => 200, + ], $data)); + } +} \ No newline at end of file diff --git a/app/Http/Webhooks/UpdateAppHook.php b/app/Http/Webhooks/UpdateAppHook.php new file mode 100644 index 0000000..90ca8d2 --- /dev/null +++ b/app/Http/Webhooks/UpdateAppHook.php @@ -0,0 +1,47 @@ + + * + * @version 1.0.1 + */ +class UpdateAppHook extends Controller +{ + public function __invoke(Request $request) + { + $branch = config('app.repository.branch'); + $data = $request->all(); + + Log::channel('hook:update-app')->info('update:', $data); + Log::channel('app:update')->info("Init updating {$branch} ..."); + + if($data['ref'] == "refs/heads/{$branch}") { + if($data['before'] != $data['after']) { + Artisan::call('app:update'); + + foreach ($data['commits'] as $commit) { + Log::channel('app:update')->info($commit['message']); + } + Log::channel('app:update')->info('¡Updated!'); + } else { + Log::channel('app:update')->info('No was updated'); + } + } else { + Log::channel('app:update')->info('Not is updatable'); + } + + Log::channel('app:update')->info('Exit updating'); + } +} \ No newline at end of file diff --git a/app/Listeners/BrodcastUserLoginNotification.php b/app/Listeners/BrodcastUserLoginNotification.php new file mode 100644 index 0000000..37de10f --- /dev/null +++ b/app/Listeners/BrodcastUserLoginNotification.php @@ -0,0 +1,46 @@ + + * + * @version 1.0.0 + */ +class BrodcastUserLoginNotification +{ + /** + * Create the event listener. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Disparador + * + * Transmite mediante el evento cambio de sesión un mensaje de inicio de sesión + * + * @param object $event + */ + public function handle(Login $event) : void + { + if(config('app.notifications')) { + broadcast(new GlobalNotification( + __('notifications.user.login', [ + 'user' => $event->user->name + ]), + 'info' + )); + } + } +} diff --git a/app/Listeners/BrodcastUserLogoutNotification.php b/app/Listeners/BrodcastUserLogoutNotification.php new file mode 100644 index 0000000..7f3dbcf --- /dev/null +++ b/app/Listeners/BrodcastUserLogoutNotification.php @@ -0,0 +1,46 @@ + + * + * @version 1.0.0 + */ +class BrodcastUserLogoutNotification +{ + /** + * Create the event listener. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Disparador + * + * Transmite mediante el evento cambio de sesión un mensaje de cierre de sesión + * + * @param object $event + */ + public function handle(Logout $event) : void + { + if(config('app.notifications')) { + broadcast(new GlobalNotification( + __('notifications.user.logout', [ + 'user' => $event->user->name + ]), + 'info' + )); + } + } +} diff --git a/app/Models/HistoryLog.php b/app/Models/HistoryLog.php new file mode 100644 index 0000000..6dd2007 --- /dev/null +++ b/app/Models/HistoryLog.php @@ -0,0 +1,45 @@ + + * + * @version 1.0.0 + */ +class HistoryLog extends Model +{ + use HasFactory; + + /** + * Atributos llenables masivamente + */ + protected $fillable = [ + 'action', + 'qty', + 'message', + 'data', + 'user_id' + ]; + + /** + * Los atributos que deben transformarse. + */ + protected $casts = [ + 'data' => 'json' + ]; + + /** + * Un log pertenece a un usuario + */ + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..fabddb2 --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,34 @@ + + * + * @version 1.0.0 + */ +class Role extends ModelsRole +{ + use HasFactory, + ModelExtend; + + /** + * Atributos llenables masivamente + */ + protected $fillable = [ + 'name', + 'guard_name', + 'description' + ]; +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..8b30938 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,110 @@ + + * + * @version 1.0.0 + */ +class User extends Authenticatable +{ + use HasApiTokens; + use HasFactory; + use HasProfilePhoto; + use Notifiable; + use TwoFactorAuthenticatable; + use HasRoles; + use ModelExtend; + + /** + * Atributos llenables masivamente + * + * @var string[] + */ + protected $fillable = [ + 'name', + 'paternal', + 'maternal', + 'phone', + 'email', + 'password', + ]; + + /** + * Los atributos que deben ocultarse para la serialización. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + 'two_factor_recovery_codes', + 'two_factor_secret', + ]; + + /** + * Los atributos que deben transformarse. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + ]; + + /** + * Los atributos calculados que se añadirán a la matriz del modelo. + * + * @var array + */ + protected $appends = [ + 'full_name', + 'full_last_name', + 'profile_photo_url', + ]; + + /** + * Un usuario a realizado muchas acciones + */ + public function logs() + { + return $this->hasMany(HistoryLog::class); + } + + /** + * Retorna nombre completo + */ + public function getFullNameAttribute() + { + return "{$this->name} {$this->paternal} {$this->maternal}"; + } + + /** + * Retornar apellido completo + */ + public function getFullLastNameAttribute() + { + return "{$this->paternal} {$this->maternal}"; + } + + /** + * Retornar nombre con primer apellido + */ + public function getShortNameAttribute() + { + return "{$this->name} {$this->paternal}"; + } +} diff --git a/app/Notifications/UserHeaderNotification.php b/app/Notifications/UserHeaderNotification.php new file mode 100644 index 0000000..56f1efc --- /dev/null +++ b/app/Notifications/UserHeaderNotification.php @@ -0,0 +1,75 @@ + + * + * @version 1.0.0 + */ +class UserHeaderNotification extends Notification +{ + use Queueable; + + /** + * Parámetros para detonar la notificación + * + * @return void + */ + public function __construct( + public string $message, + public string $icon = 'notifications_active', + public string $type = 'info', + public int $timeout = 15 + ) {} + + /** + * Canales de envió de la notificación + * + * @param mixed $notifiable + */ + public function via($notifiable) : array + { + return [ + 'broadcast', + 'database' + ]; + } + + /** + * Obtiene la representación del array de la notificación. + * + * @param mixed $notifiable + * + * @return array + */ + public function toArray($notifiable) : array + { + return [ + 'message' => $this->message, + 'icon' => $this->icon, + 'type' => $this->type, + ]; + } + + /** + * Manda un mensaje por medio de un broadcast privado + */ + public function toBroadcast($notifiable) + { + return new BroadcastMessage([ + 'message' => $this->message, + 'icon' => $this->type, + 'timeout' => $this->timeout + ]); + } +} diff --git a/app/Observers/RoleObserver.php b/app/Observers/RoleObserver.php new file mode 100644 index 0000000..1bf5390 --- /dev/null +++ b/app/Observers/RoleObserver.php @@ -0,0 +1,84 @@ + + * + * @version 1.0.0 + */ +class RoleObserver +{ + use ReportAction; + + /** + * Objeto del evento + */ + protected $event = 'roles'; + + /** + * Handle the Role "created" event. + * + * @param \App\Models\Role $role + */ + public function created(Role $role) : void + { + $this->reportCreate($this->event, $role->fillableToArray(), __("{$this->event}.created", [ + 'role' => $role->name + ])); + } + + /** + * Handle the Role "updated" event. + * + * @param \App\Models\Role $role + */ + public function updated(Role $role) : void + { + $this->reportUpdate($this->event, $role->getContrastChanges(), __("{$this->event}.updated", [ + 'role' => $role->name + ])); + } + + /** + * Handle the Role "deleted" event. + * + * @param \App\Models\Role $role + */ + public function deleted(Role $role) : void + { + $this->reportDestroy($this->event, $role->fillableToArray(), __("{$this->event}.deleted", [ + 'role' => $role->name + ])); + } + + /** + * Handle the Role "restored" event. + * + * @param \App\Models\Role $role + */ + public function restored(Role $role) : void + { + $this->reportUpdate($this->event, $role->fillableToArray(), __("{$this->event}.restored", [ + 'role' => $role->name + ])); + } + + /** + * Handle the Role "force deleted" event. + * + * @param \App\Models\Role $role + */ + public function forceDeleted(Role $role) : void + { + $this->reportDestroy($this->event, $role->fillableToArray(), __("{$this->event}.forceDeleted", [ + 'role' => $role->name + ])); + } +} diff --git a/app/Observers/UserObserver.php b/app/Observers/UserObserver.php new file mode 100644 index 0000000..499b75a --- /dev/null +++ b/app/Observers/UserObserver.php @@ -0,0 +1,82 @@ +reportCreate($this->event, $user->fillableToArray(), __("{$this->event}.created", [ + 'user' => $user->fullName + ])); + } + + /** + * Handle the User "updated" event. + * + * @param \App\Models\User $user + */ + public function updated(User $user) : int + { + $changes = $user->getChanges(); + + if(in_array('remember_token', array_keys($changes)) && count($changes) == 1) { + return false; + } + + $this->reportUpdate($this->event, $user->getContrastChanges(), __("{$this->event}.updated", [ + 'user' => $user->fullName + ])); + + return true; + } + + /** + * Handle the User "deleted" event. + * + * @param \App\Models\User $user + */ + public function deleted(User $user) : void + { + $this->reportDestroy($this->event, $user->fillableToArray(), __("{$this->event}.deleted", [ + 'user' => $user->fullName + ])); + } + + /** + * Handle the User "restored" event. + * + * @param \App\Models\User $user + */ + public function restored(User $user) : void + { + $this->reportUpdate($this->event, $user->fillableToArray(), __("{$this->event}.restored", [ + 'user' => $user->fullName + ])); + } + + /** + * Handle the User "force deleted" event. + * + * @param \App\Models\User $user + */ + public function forceDeleted(User $user) : void + { + $this->reportDestroy($this->event, $user->fillableToArray(), __("{$this->event}.forceDeleted", [ + 'user' => $user->fullName + ])); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..ee8ca5b --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,28 @@ + + */ + protected $policies = [ + // 'App\Models\Model' => 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..395c518 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + Login::class => [ + BrodcastUserLoginNotification::class, + ], + Logout::class => [ + BrodcastUserLogoutNotification::class, + ], + ]; + + protected $observers = [ + User::class => [UserObserver::class], + Role::class => [RoleObserver::class], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + * + * @return bool + */ + public function shouldDiscoverEvents() + { + return false; + } +} diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php new file mode 100644 index 0000000..9f2f3c1 --- /dev/null +++ b/app/Providers/FortifyServiceProvider.php @@ -0,0 +1,49 @@ +email; + + return Limit::perMinute(5)->by($email.$request->ip()); + }); + + RateLimiter::for('two-factor', function (Request $request) { + return Limit::perMinute(5)->by($request->session()->get('login.id')); + }); + } +} diff --git a/app/Providers/JetstreamServiceProvider.php b/app/Providers/JetstreamServiceProvider.php new file mode 100644 index 0000000..491c127 --- /dev/null +++ b/app/Providers/JetstreamServiceProvider.php @@ -0,0 +1,49 @@ +configurePermissions(); + + Jetstream::deleteUsersUsing(DeleteUser::class); + } + + /** + * Configure the permissions that are available within the application. + * + * @return void + */ + protected function configurePermissions() + { + Jetstream::defaultApiTokenPermissions(['read']); + + Jetstream::permissions([ + 'create', + 'read', + 'update', + 'delete', + ]); + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..f5b4862 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,56 @@ +configureRateLimiting(); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + + Route::middleware('web') + ->prefix('hook') + ->group(base_path('routes/hook.php')); + }); + } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + protected function configureRateLimiting() + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); + }); + } +} diff --git a/app/Services/Logs/LogHandler.php b/app/Services/Logs/LogHandler.php new file mode 100644 index 0000000..798036f --- /dev/null +++ b/app/Services/Logs/LogHandler.php @@ -0,0 +1,46 @@ + + * + * @version 1.0.0 + */ +class LogHandler extends AbstractProcessingHandler +{ + /** + * Constructor + */ + public function __construct($level = Level::Debug) + { + parent::__construct($level); + } + + /** + * Escribe el log recibido + * + * @param array $record Array con la información a registrar + */ + protected function write(LogRecord $record) :void + { + // Simple store implementation + $log = new HistoryLog(); + $log->fill($record->context); + $log->fill([ + "message" => $record->message, + "user_id" => auth()->user()->id + ]); + $log->save(); + } +} \ No newline at end of file diff --git a/app/Services/Logs/LogMonolog.php b/app/Services/Logs/LogMonolog.php new file mode 100644 index 0000000..44a54ca --- /dev/null +++ b/app/Services/Logs/LogMonolog.php @@ -0,0 +1,33 @@ + + * + * @version 1.0.0 + */ +class LogMonolog +{ + /** + * Create a custom Monolog instance. + * + * @param array $config + * @return \Monolog\Logger + */ + public function __invoke(array $config) + { + $logger = new Logger('custom'); + $logger->pushProcessor(new LogProcessor()); + $logger->pushHandler(new LogHandler()); + + return $logger; + } +} \ No newline at end of file diff --git a/app/Services/Logs/LogProcessor.php b/app/Services/Logs/LogProcessor.php new file mode 100644 index 0000000..242adda --- /dev/null +++ b/app/Services/Logs/LogProcessor.php @@ -0,0 +1,23 @@ + + * + * @version 1.0.0 + */ +class LogProcessor +{ + public function __invoke(LogRecord $record) + { + return $record; + } +} \ No newline at end of file diff --git a/app/Services/Notify.php b/app/Services/Notify.php new file mode 100644 index 0000000..851b6ff --- /dev/null +++ b/app/Services/Notify.php @@ -0,0 +1,117 @@ + + * + * @version 1.0.0 + */ +class Notify +{ + /** + * Notificación exitosa + */ + const SUCCESS = 'success'; + + /** + * Notificación de error + */ + const ERROR = 'error'; + + /** + * Notificación informativa + */ + const INFO = 'info'; + + /** + * Notificación de advertencia + */ + const WARNING = 'warning'; + + /** + * Inertia Flash + * + * Crea una notificación procesable por INERTIA para la siguiente petición + * realizada en el FRONTEND + * + * @version 1.0.0 + * + * @param string $message Mensaje + * @param string $type Tipo + * @param string $key Llave de guardado + */ + public static function send($message, $type = 'success', $key = 'flash') : void + { + $old = Inertia::getShared($key, null); + + $data = [ + 'type' => $type, + 'message' => $message, + ]; + + if($old) { + Inertia::share($key, array_merge($old, [$data])); + } else { + Inertia::share($key, [$data]); + } + } + + /** + * Notifica algo exitoso + * + * @param string $message Mensaje + */ + public static function success($message) : void + { + self::send( + message: $message, + type: self::SUCCESS + ); + } + + /** + * Notifica un error + * + * @param string $message Mensaje + * @return void + */ + public static function error($message) : void + { + self::send( + message: $message, + type: self::ERROR + ); + } + + /** + * Notifica algo informativo + * + * @param string $message Mensaje + */ + public static function info($message) : void + { + self::send( + message: $message, + type: self::INFO + ); + } + + /** + * Notifica una advertencia + * + * @param string $message Mensaje + */ + public static function warning($message) : void + { + self::send( + message: $message, + type: self::WARNING + ); + } +} \ No newline at end of file diff --git a/artisan b/artisan new file mode 100644 index 0000000..67a3329 --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..037e17d --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/colors.json.example b/colors.json.example new file mode 100644 index 0000000..fd28bbe --- /dev/null +++ b/colors.json.example @@ -0,0 +1,26 @@ +{ + "page":"#E5E7EB", + "page-on":"#4B5563", + "page-dark":"#000", + "page-dark-on":"#fff", + "main":"#fff", + "main-on":"#000", + "main-dark":"#1E1F1C", + "main-dark-on":"#fff", + "primary":"#111827", + "primary-on":"#fff", + "primary-dark":"#000", + "primary-dark-on":"#fff", + "secondary":"#374151", + "secondary-dark":"#989A9C", + "white":"#FFFFFF", + "white-dark":"#FFFFFF", + "success":"#22C55E", + "success-dark":"#22C55E", + "warning":"#EAB308", + "warning-dark":"#EAB308", + "danger":"#EF4444", + "danger-dark":"#EF4444", + "info":"#3B82F6", + "info-dark":"#3B82F6" +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..2715506 --- /dev/null +++ b/composer.json @@ -0,0 +1,111 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "require": { + "php": "^8.1.0", + "guzzlehttp/guzzle": "^7.2", + "inertiajs/inertia-laravel": "^0.6.3", + "laravel/framework": "^10.0", + "laravel/jetstream": "^2.12", + "laravel/sanctum": "^3.2", + "laravel/tinker": "^2.7", + "notsoweb/author": "^0.0", + "notsoweb/core": "^0.1", + "pusher/pusher-php-server": "^7.2", + "spatie/laravel-permission": "^5.5", + "tightenco/ziggy": "^1.0" + }, + "require-dev": { + "laravel/telescope": "^4.10", + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.0.1", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.0", + "spatie/laravel-ignition": "^2.0" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"", + "@php -r \"file_exists('soketi.json') || copy('soketi.json.example', 'soketi.json');\"", + "@php -r \"file_exists('colors.json') || copy('colors.json.example', 'colors.json');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ], + "services:start" : [ + "@php artisan notification:start", + "@php artisan updater:start" + ], + "services:stop" : [ + "@php artisan notification:stop", + "@php artisan updater:stop" + ], + "env:dev": [ + "composer install", + "composer run post-root-package-install", + "composer run post-create-project-cmd", + "npm install", + "npm run build", + "@php artisan storage:link" + ], + "env:prod": [ + "composer install --no-dev", + "composer run post-root-package-install", + "composer run post-create-project-cmd", + "npm install", + "npm run build", + "@php artisan storage:link", + "composer run services:start" + ], + "env:prod-lite": [ + "composer install --no-dev", + "composer run post-root-package-install", + "composer run post-create-project-cmd" + ], + "db:dev": [ + "@php artisan migrate:fresh --seeder=DevSeeder" + ], + "db:prod": [ + "@php artisan migrate:fresh --seed" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..55161cf --- /dev/null +++ b/composer.lock @@ -0,0 +1,9211 @@ +{ + "_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": "7fcbb64f8d8d1ace0cdd633944360863", + "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + }, + "time": "2022-12-07T17:46:57+00:00" + }, + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + }, + "time": "2023-08-25T16:18:39+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.8" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "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.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:20:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-08-03T15:11:55+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:13:57+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/61bf437fc2197f587f6857d3ff903a24f1731b5d", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:19:19+00:00" + }, + { + "name": "inertiajs/inertia-laravel", + "version": "v0.6.11", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "2a1e19048f95c0e4adb2b2733f9119e49c4fc09f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/2a1e19048f95c0e4adb2b2733f9119e49c4fc09f", + "reference": "2a1e19048f95c0e4adb2b2733f9119e49c4fc09f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^6.0|^7.0|^8.74|^9.0|^10.0", + "php": "^7.2|~8.0.0|~8.1.0|~8.2.0|~8.3.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^4.0|^5.0|^6.4|^7.0|^8.0", + "phpunit/phpunit": "^8.0|^9.5.8", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./helpers.php" + ], + "psr-4": { + "Inertia\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" + } + ], + "description": "The Laravel adapter for Inertia.js.", + "keywords": [ + "inertia", + "laravel" + ], + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v0.6.11" + }, + "funding": [ + { + "url": "https://github.com/reinink", + "type": "github" + } + ], + "time": "2023-10-27T10:59:02+00:00" + }, + { + "name": "jaybizzle/crawler-detect", + "version": "v1.2.116", + "source": { + "type": "git", + "url": "https://github.com/JayBizzle/Crawler-Detect.git", + "reference": "97e9fe30219e60092e107651abb379a38b342921" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/97e9fe30219e60092e107651abb379a38b342921", + "reference": "97e9fe30219e60092e107651abb379a38b342921", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jaybizzle\\CrawlerDetect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Beech", + "email": "m@rkbee.ch", + "role": "Developer" + } + ], + "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", + "homepage": "https://github.com/JayBizzle/Crawler-Detect/", + "keywords": [ + "crawler", + "crawler detect", + "crawler detector", + "crawlerdetect", + "php crawler detect" + ], + "support": { + "issues": "https://github.com/JayBizzle/Crawler-Detect/issues", + "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.116" + }, + "time": "2023-07-21T15:49:49+00:00" + }, + { + "name": "jenssegers/agent", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/agent.git", + "reference": "daa11c43729510b3700bc34d414664966b03bffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe", + "reference": "daa11c43729510b3700bc34d414664966b03bffe", + "shasum": "" + }, + "require": { + "jaybizzle/crawler-detect": "^1.2", + "mobiledetect/mobiledetectlib": "^2.7.6", + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.0|^6.0|^7.0" + }, + "suggest": { + "illuminate/support": "Required for laravel service providers" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "laravel": { + "providers": [ + "Jenssegers\\Agent\\AgentServiceProvider" + ], + "aliases": { + "Agent": "Jenssegers\\Agent\\Facades\\Agent" + } + } + }, + "autoload": { + "psr-4": { + "Jenssegers\\Agent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", + "homepage": "https://github.com/jenssegers/agent", + "keywords": [ + "Agent", + "browser", + "desktop", + "laravel", + "mobile", + "platform", + "user agent", + "useragent" + ], + "support": { + "issues": "https://github.com/jenssegers/agent/issues", + "source": "https://github.com/jenssegers/agent/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://github.com/jenssegers", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/jenssegers/agent", + "type": "tidelift" + } + ], + "time": "2020-06-13T08:05:20+00:00" + }, + { + "name": "laravel/fortify", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/fortify.git", + "reference": "a3aaf020ac76cd546658517126ddd58d1627d3d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/fortify/zipball/a3aaf020ac76cd546658517126ddd58d1627d3d0", + "reference": "a3aaf020ac76cd546658517126ddd58d1627d3d0", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0", + "ext-json": "*", + "illuminate/support": "^8.82|^9.0|^10.0", + "php": "^7.3|^8.0", + "pragmarx/google2fa": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^6.34|^7.31|^8.11", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Fortify\\FortifyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Fortify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Backend controllers and scaffolding for Laravel authentication.", + "keywords": [ + "auth", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/fortify/issues", + "source": "https://github.com/laravel/fortify" + }, + "time": "2023-10-18T14:10:08+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.33.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8", + "reference": "4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.3", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.15.1", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-11-21T14:49:31+00:00" + }, + { + "name": "laravel/jetstream", + "version": "v2.16.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/jetstream.git", + "reference": "1b95df05aac85caffdbba9aeb6d22a49fc598dff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/jetstream/zipball/1b95df05aac85caffdbba9aeb6d22a49fc598dff", + "reference": "1b95df05aac85caffdbba9aeb6d22a49fc598dff", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "jenssegers/agent": "^2.6", + "laravel/fortify": "^1.15", + "php": "^8.0.2" + }, + "conflict": { + "laravel/framework": "<9.37.0" + }, + "require-dev": { + "inertiajs/inertia-laravel": "^0.6.5", + "laravel/sanctum": "^3.0", + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.0|^8.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Jetstream\\JetstreamServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Jetstream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Tailwind scaffolding for the Laravel framework.", + "keywords": [ + "auth", + "laravel", + "tailwind" + ], + "support": { + "issues": "https://github.com/laravel/jetstream/issues", + "source": "https://github.com/laravel/jetstream" + }, + "time": "2023-02-14T19:28:38+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.13", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "e1379d8ead15edd6cc4369c22274345982edc95a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/e1379d8ead15edd6cc4369c22274345982edc95a", + "reference": "e1379d8ead15edd6cc4369c22274345982edc95a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.13" + }, + "time": "2023-10-27T13:53:59+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "e1a272893bec13cf135627f7e156030b3afe1e60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/e1a272893bec13cf135627f7e156030b3afe1e60", + "reference": "e1a272893bec13cf135627f7e156030b3afe1e60", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.28.2|^8.8.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2023-11-03T13:42:14+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-11-08T14:08:06+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.8.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.10.4|^0.11.1", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.8.2" + }, + "time": "2023-08-15T14:27:00+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2023-08-30T16:55:00+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.21.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a326d8a2d007e4ca327a57470846e34363789258" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a326d8a2d007e4ca327a57470846e34363789258", + "reference": "a326d8a2d007e4ca327a57470846e34363789258", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.220.0", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.21.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-11-18T13:59:15+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.21.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.21.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-11-18T13:41:42+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2023-10-17T14:13:20+00:00" + }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.45", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36" + }, + "type": "library", + "autoload": { + "psr-0": { + "Detection": "namespaced/" + }, + "classmap": [ + "Mobile_Detect.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "support": { + "issues": "https://github.com/serbanghita/Mobile-Detect/issues", + "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.45" + }, + "funding": [ + { + "url": "https://github.com/serbanghita", + "type": "github" + } + ], + "time": "2023-11-07T21:57:25+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-10-27T15:32:31+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.71.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "98276233188583f2ff845a0f992a235472d9466a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-09-25T11:31:05+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.5", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", + "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": "7.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.5" + }, + "time": "2023-10-05T20:37:59+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.3", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", + "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.3" + }, + "time": "2023-10-29T21:02:13+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.17.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + }, + "time": "2023-08-13T19:53:39+00:00" + }, + { + "name": "notsoweb/author", + "version": "0.0.3", + "source": { + "type": "git", + "url": "https://github.com/NotSoWeb/author.git", + "reference": "5cd9bafaebf9a5cd1feb4ce80101540161bd4972" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/NotSoWeb/author/zipball/5cd9bafaebf9a5cd1feb4ce80101540161bd4972", + "reference": "5cd9bafaebf9a5cd1feb4ce80101540161bd4972", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Notsoweb\\Author\\": "src/app" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Moisés de Jesús Cortés Castellanos", + "email": "ing.moisesdejesuscortesc@notsoweb.com", + "homepage": "https://notsoweb.com" + } + ], + "description": "Contiene una pagina para usarse en aquellos proyectos realizados por Notsoweb. Permite validar que dicho proyecto fue creado por Notsoweb.", + "homepage": "https://notsoweb.com", + "support": { + "issues": "https://github.com/NotSoWeb/author/issues", + "source": "https://github.com/NotSoWeb/author/tree/0.0.3" + }, + "time": "2023-03-14T23:47:36+00:00" + }, + { + "name": "notsoweb/core", + "version": "0.1.9", + "source": { + "type": "git", + "url": "https://github.com/NotSoWeb/core.git", + "reference": "8a4def281d9d298aa4a7461b51351e8fe6984e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/NotSoWeb/core/zipball/8a4def281d9d298aa4a7461b51351e8fe6984e65", + "reference": "8a4def281d9d298aa4a7461b51351e8fe6984e65", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/app/Helpers/Notsoweb.php" + ], + "psr-4": { + "Notsoweb\\Core\\": "src/app" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Moisés de Jesús Cortés Castellanos", + "email": "ing.moisesdejesuscortesc@notsoweb.com", + "homepage": "https://notsoweb.com" + } + ], + "description": "Núcleo de funciones para VUEJS y LIVEWIRE diseñado como complemento para Laravel Jetstream.", + "homepage": "https://notsoweb.com", + "support": { + "issues": "https://github.com/NotSoWeb/core/issues", + "source": "https://github.com/NotSoWeb/core/tree/0.1.9" + }, + "time": "2023-09-12T22:58:46+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "paragonie/sodium_compat", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/sodium_compat.git", + "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/e592a3e06d1fa0d43988c7c7d9948ca836f644b6", + "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6", + "shasum": "" + }, + "require": { + "paragonie/random_compat": ">=1", + "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" + }, + "suggest": { + "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", + "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." + }, + "type": "library", + "autoload": { + "files": [ + "autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com" + }, + { + "name": "Frank Denis", + "email": "jedisct1@pureftpd.org" + } + ], + "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", + "keywords": [ + "Authentication", + "BLAKE2b", + "ChaCha20", + "ChaCha20-Poly1305", + "Chapoly", + "Curve25519", + "Ed25519", + "EdDSA", + "Edwards-curve Digital Signature Algorithm", + "Elliptic Curve Diffie-Hellman", + "Poly1305", + "Pure-PHP cryptography", + "RFC 7748", + "RFC 8032", + "Salpoly", + "Salsa20", + "X25519", + "XChaCha20-Poly1305", + "XSalsa20-Poly1305", + "Xchacha20", + "Xsalsa20", + "aead", + "cryptography", + "ecdh", + "elliptic curve", + "elliptic curve cryptography", + "encryption", + "libsodium", + "php", + "public-key cryptography", + "secret-key cryptography", + "side-channel resistant" + ], + "support": { + "issues": "https://github.com/paragonie/sodium_compat/issues", + "source": "https://github.com/paragonie/sodium_compat/tree/v1.20.0" + }, + "time": "2023-04-30T00:54:53+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "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.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + }, + "time": "2022-06-13T21:57:56+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.11.22", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-0.11": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" + }, + "time": "2023-10-14T21:56:36+00:00" + }, + { + "name": "pusher/pusher-php-server", + "version": "7.2.3", + "source": { + "type": "git", + "url": "https://github.com/pusher/pusher-http-php.git", + "reference": "416e68dd5f640175ad5982131c42a7a666d1d8e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/416e68dd5f640175ad5982131c42a7a666d1d8e9", + "reference": "416e68dd5f640175ad5982131c42a7a666d1d8e9", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.2", + "paragonie/sodium_compat": "^1.6", + "php": "^7.3|^8.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "overtrue/phplint": "^2.3", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Pusher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Library for interacting with the Pusher REST API", + "keywords": [ + "events", + "messaging", + "php-pusher-server", + "publish", + "push", + "pusher", + "real time", + "real-time", + "realtime", + "rest", + "trigger" + ], + "support": { + "issues": "https://github.com/pusher/pusher-http-php/issues", + "source": "https://github.com/pusher/pusher-http-php/tree/7.2.3" + }, + "time": "2023-05-17T16:00:06+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.5", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.5" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-11-08T05:53:05+00:00" + }, + { + "name": "spatie/laravel-permission", + "version": "5.11.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-permission.git", + "reference": "7090824cca57e693b880ce3aaf7ef78362e28bbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/7090824cca57e693b880ce3aaf7ef78362e28bbd", + "reference": "7090824cca57e693b880ce3aaf7ef78362e28bbd", + "shasum": "" + }, + "require": { + "illuminate/auth": "^7.0|^8.0|^9.0|^10.0", + "illuminate/container": "^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^7.0|^8.0|^9.0|^10.0", + "illuminate/database": "^7.0|^8.0|^9.0|^10.0", + "php": "^7.3|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0", + "phpunit/phpunit": "^9.4", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.x-dev", + "dev-master": "5.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\Permission\\PermissionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Permission\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Permission handling for Laravel 6.0 and up", + "homepage": "https://github.com/spatie/laravel-permission", + "keywords": [ + "acl", + "laravel", + "permission", + "permissions", + "rbac", + "roles", + "security", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-permission/issues", + "source": "https://github.com/spatie/laravel-permission/tree/5.11.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-10-25T05:12:01+00:00" + }, + { + "name": "symfony/console", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92", + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T08:09:35+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-12T16:00:22+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "1f69476b64fb47105c06beef757766c376b548c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4", + "reference": "1f69476b64fb47105c06beef757766c376b548c4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-12T06:57:20+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-06T06:56:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-26T12:56:25+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "ce332676de1912c4389222987193c3ef38033df6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6", + "reference": "ce332676de1912c4389222987193c3ef38033df6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-07T10:17:15+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "929202375ccf44a309c34aeca8305408442ebcc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/929202375ccf44a309c34aeca8305408442ebcc1", + "reference": "929202375ccf44a309c34aeca8305408442ebcc1", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^6.3.4", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.3.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/clock": "^6.2", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.3.4", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4.5|^6.0.5", + "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^6.3", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^6.3", + "symfony/var-exporter": "^6.2", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-10T13:47:32+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-06T09:47:15+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "~6.2.13|^6.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-29T06:59:36+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/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.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:30:37+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/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.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-28T09:04:16+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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 backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/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.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-16T06:22:46+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-07T10:39:22+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31", + "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-20T16:05:51+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-30T20:28:31+00:00" + }, + { + "name": "symfony/string", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "13880a87790c76ef994c91e87efb96134522577a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", + "reference": "13880a87790c76ef994c91e87efb96134522577a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-09T08:28:21+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/30212e7c87dcb79c83f6362b00bde0e0b1213499", + "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-28T23:11:45+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dee0c6e5b4c07ce851b462530088e64b255ac9c5", + "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-25T15:08:44+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/819fa5ac210fb7ddda4752b91a82f50be7493dd9", + "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T08:07:48+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a", + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-08T10:42:36+00:00" + }, + { + "name": "tightenco/ziggy", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/tighten/ziggy.git", + "reference": "22dafc51f3f5ae5ed51f7cb6b566e6b9537f6937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/22dafc51f3f5ae5ed51f7cb6b566e6b9537f6937", + "reference": "22dafc51f3f5ae5ed51f7cb6b566e6b9537f6937", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": ">=5.4@dev" + }, + "require-dev": { + "orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "phpunit/phpunit": "^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Tightenco\\Ziggy\\ZiggyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Tightenco\\Ziggy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Coulbourne", + "email": "daniel@tighten.co" + }, + { + "name": "Jake Bathman", + "email": "jake@tighten.co" + }, + { + "name": "Jacob Baker-Kretzmar", + "email": "jacob@tighten.co" + } + ], + "description": "Generates a Blade directive exporting all of your named Laravel routes. Also provides a nice route() helper function in JavaScript.", + "homepage": "https://github.com/tighten/ziggy", + "keywords": [ + "Ziggy", + "javascript", + "laravel", + "routes" + ], + "support": { + "issues": "https://github.com/tighten/ziggy/issues", + "source": "https://github.com/tighten/ziggy/tree/v1.8.1" + }, + "time": "2023-10-12T18:31:26+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.6", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + }, + "time": "2023-01-03T09:29:04+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "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": true + }, + "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.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0" + }, + "time": "2023-06-12T08:44:38+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.15.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-11-03T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.13.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "3e3d2ab01c7d8b484c18e6100ecf53639c744fa7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/3e3d2ab01c7d8b484c18e6100ecf53639c744fa7", + "reference": "3e3d2ab01c7d8b484c18e6100ecf53639c744fa7", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.38.0", + "illuminate/view": "^10.30.1", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.6", + "nunomaduro/larastan": "^2.6.4", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.24.2" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2023-11-07T17:59:57+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.26.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "7a82f5aa364dbee3fd9c52fc464cf0bdd11150ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/7a82f5aa364dbee3fd9c52fc464cf0bdd11150ed", + "reference": "7a82f5aa364dbee3fd9c52fc464cf0bdd11150ed", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.0|^10.0|^11.0", + "illuminate/contracts": "^9.0|^10.0|^11.0", + "illuminate/support": "^9.0|^10.0|^11.0", + "php": "^8.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2023-11-20T15:56:47+00:00" + }, + { + "name": "laravel/telescope", + "version": "v4.17.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/telescope.git", + "reference": "64da53ee46b99ef328458eaed32202b51e325a11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/telescope/zipball/64da53ee46b99ef328458eaed32202b51e325a11", + "reference": "64da53ee46b99ef328458eaed32202b51e325a11", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^8.37|^9.0|^10.0", + "php": "^8.0", + "symfony/var-dumper": "^5.0|^6.0" + }, + "require-dev": { + "ext-gd": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "laravel/octane": "^1.4", + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Telescope\\TelescopeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Telescope\\": "src/", + "Laravel\\Telescope\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mohamed Said", + "email": "mohamed@laravel.com" + } + ], + "description": "An elegant debug assistant for the Laravel framework.", + "keywords": [ + "debugging", + "laravel", + "monitoring" + ], + "support": { + "issues": "https://github.com/laravel/telescope/issues", + "source": "https://github.com/laravel/telescope/tree/v4.17.2" + }, + "time": "2023-11-01T14:01:06+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.6", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.10", + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^4.30" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2023-08-09T00:03:52+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.10.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", + "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.3", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.3.4" + }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.3.0", + "laravel/framework": "^10.28.0", + "laravel/pint": "^1.13.3", + "laravel/sail": "^1.25.0", + "laravel/sanctum": "^3.3.1", + "laravel/tinker": "^2.8.2", + "nunomaduro/larastan": "^2.6.4", + "orchestra/testbench-core": "^8.13.0", + "pestphp/pest": "^2.23.2", + "phpunit/phpunit": "^10.4.1", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.3.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-10-11T15:45:01+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-11-23T12:23:20+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.4.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.4-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-10-26T07:21:45+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-28T11:50:59+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-01T07:48:21+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-24T13:22:09+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-07-19T07:19:23+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T09:25:50+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", + "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.4.3" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-10-17T15:54:07+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.11.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", + "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-10-18T14:09:40+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/bf21cd15aa47fa4ec5d73bbc932005c70261efc8", + "reference": "bf21cd15aa47fa4ec5d73bbc932005c70261efc8", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.9", + "symfony/console": "^6.2.3", + "symfony/var-dumper": "^6.2.3" + }, + "require-dev": { + "livewire/livewire": "^2.11", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.3.4", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^1.22.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-10-09T12:55:26+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92", + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-06T10:58:05+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-11-20T00:12:19+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1.0" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..9bd060f --- /dev/null +++ b/config/app.php @@ -0,0 +1,257 @@ + '1.2.4', + + /* + |-------------------------------------------------------------------------- + | Application Copyright + |-------------------------------------------------------------------------- + | + | This value is the copyright of your application. This value is used when the + | frontend to display the copyright of your application. + | + */ + 'copyright' => env('APP_COPYRIGHT', 'Notsoweb'), + + /* + |-------------------------------------------------------------------------- + | Application Name + |-------------------------------------------------------------------------- + | + | This value is the name of your application. This value is used when the + | framework needs to place the application's name in a notification or + | any other location as required by the application or its packages. + | + */ + + 'name' => env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Notifications + |-------------------------------------------------------------------------- + | + | Notification in real time. + | + */ + 'notifications' => (bool) env('PUSHER_NOTIFICATIONS', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'America/Mexico_City', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'es', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'es', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'es_MX', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + 'lifetime' => env('APP_MAINTENANCE_LIFETIME', 48), // in hours + ], + + /* + |-------------------------------------------------------------------------- + | Other configuration + |-------------------------------------------------------------------------- + */ + 'pagination' => env('APP_PAGINATION', 50), + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Package Service Providers... + */ + Notsoweb\Author\Providers\AuthorServiceProvider::class, + Notsoweb\Core\Providers\CoreServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + App\Providers\FortifyServiceProvider::class, + App\Providers\JetstreamServiceProvider::class, + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'ExampleClass' => App\Example\ExampleClass::class, + ])->toArray(), + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..d8c6cee --- /dev/null +++ b/config/auth.php @@ -0,0 +1,111 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_resets', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..9e4d4aa --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,70 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..33bb295 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,110 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..8a39e6d --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..137ad18 --- /dev/null +++ b/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..e9d9dbd --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/fortify.php b/config/fortify.php new file mode 100644 index 0000000..2513b73 --- /dev/null +++ b/config/fortify.php @@ -0,0 +1,147 @@ + 'web', + + /* + |-------------------------------------------------------------------------- + | Fortify Password Broker + |-------------------------------------------------------------------------- + | + | Here you may specify which password broker Fortify can use when a user + | is resetting their password. This configured value should match one + | of your password brokers setup in your "auth" configuration file. + | + */ + + 'passwords' => 'users', + + /* + |-------------------------------------------------------------------------- + | Username / Email + |-------------------------------------------------------------------------- + | + | This value defines which model attribute should be considered as your + | application's "username" field. Typically, this might be the email + | address of the users but you are free to change this value here. + | + | Out of the box, Fortify expects forgot password and reset password + | requests to have a field named 'email'. If the application uses + | another name for the field you may define it below as needed. + | + */ + + 'username' => 'email', + + 'email' => 'email', + + /* + |-------------------------------------------------------------------------- + | Home Path + |-------------------------------------------------------------------------- + | + | Here you may configure the path where users will get redirected during + | authentication or password reset when the operations are successful + | and the user is authenticated. You are free to change this value. + | + */ + + 'home' => RouteServiceProvider::HOME, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Prefix / Subdomain + |-------------------------------------------------------------------------- + | + | Here you may specify which prefix Fortify will assign to all the routes + | that it registers with the application. If necessary, you may change + | subdomain under which all of the Fortify routes will be available. + | + */ + + 'prefix' => '', + + 'domain' => null, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Middleware + |-------------------------------------------------------------------------- + | + | Here you may specify which middleware Fortify will assign to the routes + | that it registers with the application. If necessary, you may change + | these middleware but typically this provided default is preferred. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Rate Limiting + |-------------------------------------------------------------------------- + | + | By default, Fortify will throttle logins to five requests per minute for + | every email and IP address combination. However, if you would like to + | specify a custom rate limiter to call then you may specify it here. + | + */ + + 'limiters' => [ + 'login' => 'login', + 'two-factor' => 'two-factor', + ], + + /* + |-------------------------------------------------------------------------- + | Register View Routes + |-------------------------------------------------------------------------- + | + | Here you may specify if the routes returning views should be disabled as + | you may not need them when building your own application. This may be + | especially true if you're writing a custom single-page application. + | + */ + + 'views' => true, + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of the Fortify features are optional. You may disable the features + | by removing them from this array. You're free to only remove some of + | these features or you can even remove all of these if you need to. + | + */ + + 'features' => [ + Features::registration(), + Features::resetPasswords(), + Features::emailVerification(), + Features::updateProfileInformation(), + Features::updatePasswords(), + Features::twoFactorAuthentication([ + 'confirm' => true, + 'confirmPassword' => true, + // 'window' => 0, + ]), + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..bcd3be4 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], + +]; diff --git a/config/jetstream.php b/config/jetstream.php new file mode 100644 index 0000000..1868517 --- /dev/null +++ b/config/jetstream.php @@ -0,0 +1,81 @@ + 'inertia', + + /* + |-------------------------------------------------------------------------- + | Jetstream Route Middleware + |-------------------------------------------------------------------------- + | + | Here you may specify which middleware Jetstream will assign to the routes + | that it registers with the application. When necessary, you may modify + | these middleware; however, this default value is usually sufficient. + | + */ + + 'middleware' => ['web'], + + 'auth_session' => AuthenticateSession::class, + + /* + |-------------------------------------------------------------------------- + | Jetstream Guard + |-------------------------------------------------------------------------- + | + | Here you may specify the authentication guard Jetstream will use while + | authenticating users. This value should correspond with one of your + | guards that is already present in your "auth" configuration file. + | + */ + + 'guard' => 'sanctum', + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of Jetstream's features are optional. You may disable the features + | by removing them from this array. You're free to only remove some of + | these features or you can even remove all of these if you need to. + | + */ + + 'features' => [ + Features::termsAndPrivacyPolicy(), + Features::profilePhotos(), + // Features::api(), + // Features::teams(['invitations' => true]), + Features::accountDeletion(), + ], + + /* + |-------------------------------------------------------------------------- + | Profile Photo Disk + |-------------------------------------------------------------------------- + | + | This configuration value determines the default disk that will be used + | when storing profile photos for your application's users. Typically + | this will be the "public" disk but you may adjust this if needed. + | + */ + + 'profile_photo_disk' => 'public', + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..8037b3d --- /dev/null +++ b/config/logging.php @@ -0,0 +1,162 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + 'report' => [ + 'driver' => 'custom', + 'via' => \App\Services\Logs\LogMonolog::class + ], + + // Logs para los recursos obtenidos + 'resources' => [ + 'driver' => 'single', + 'path' => storage_path('logs/resources.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + // Logs de las acciones sobre los usuarios + 'users' => [ + 'driver' => 'single', + 'path' => storage_path('logs/users.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + // Logs para reportar notificaciones + 'notify' => [ + 'driver' => 'single', + 'path' => storage_path('logs/notify.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + // Webhooks + 'hook:update-app' => [ + 'driver' => 'single', + 'path' => storage_path('logs/webhooks/update-app.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + // Logs de las apps + 'app:update' => [ + 'driver' => 'single', + 'path' => storage_path('logs/app/update.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..534395a --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + ], + + 'postmark' => [ + 'transport' => 'postmark', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 0000000..5b6e184 --- /dev/null +++ b/config/permission.php @@ -0,0 +1,161 @@ + [ + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * Eloquent model should be used to retrieve your permissions. Of course, it + * is often just the "Permission" model but you may use whatever you like. + * + * The model you want to use as a Permission model needs to implement the + * `Spatie\Permission\Contracts\Permission` contract. + */ + + 'permission' => Spatie\Permission\Models\Permission::class, + + /* + * When using the "HasRoles" trait from this package, we need to know which + * Eloquent model should be used to retrieve your roles. Of course, it + * is often just the "Role" model but you may use whatever you like. + * + * The model you want to use as a Role model needs to implement the + * `Spatie\Permission\Contracts\Role` contract. + */ + + 'role' => Spatie\Permission\Models\Role::class, + + ], + + 'table_names' => [ + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'roles' => 'roles', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your permissions. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'permissions' => 'permissions', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your models permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_permissions' => 'model_has_permissions', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your models roles. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_roles' => 'model_has_roles', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'role_has_permissions' => 'role_has_permissions', + ], + + 'column_names' => [ + /* + * Change this if you want to name the related pivots other than defaults + */ + 'role_pivot_key' => null, //default 'role_id', + 'permission_pivot_key' => null, //default 'permission_id', + + /* + * Change this if you want to name the related model primary key other than + * `model_id`. + * + * For example, this would be nice if your primary keys are all UUIDs. In + * that case, name this `model_uuid`. + */ + + 'model_morph_key' => 'model_id', + + /* + * Change this if you want to use the teams feature and your related model's + * foreign key is other than `team_id`. + */ + + 'team_foreign_key' => 'team_id', + ], + + /* + * When set to true, the method for checking permissions will be registered on the gate. + * Set this to false, if you want to implement custom logic for checking permissions. + */ + + 'register_permission_check_method' => true, + + /* + * When set to true the package implements teams using the 'team_foreign_key'. If you want + * the migrations to register the 'team_foreign_key', you must set this to true + * before doing the migration. If you already did the migration then you must make a new + * migration to also add 'team_foreign_key' to 'roles', 'model_has_roles', and + * 'model_has_permissions'(view the latest version of package's migration file) + */ + + 'teams' => false, + + /* + * When set to true, the required permission names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_permission_in_exception' => false, + + /* + * When set to true, the required role names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_role_in_exception' => false, + + /* + * By default wildcard permission lookups are disabled. + */ + + 'enable_wildcard_permission' => false, + + 'cache' => [ + + /* + * By default all permissions are cached for 24 hours to speed up performance. + * When permissions or roles are updated the cache is flushed automatically. + */ + + 'expiration_time' => \DateInterval::createFromDateString('24 hours'), + + /* + * The cache key used to store all permissions. + */ + + 'key' => 'spatie.permission.cache', + + /* + * You may optionally indicate a specific cache driver to use for permission and + * role caching using any of the `store` drivers listed in the cache.php config + * file. Using 'default' here means to use the `default` set in cache.php. + */ + + 'store' => 'default', + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..25ea5a8 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,93 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..529cfdc --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,67 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..0ace530 --- /dev/null +++ b/config/services.php @@ -0,0 +1,34 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..cbcaf0b --- /dev/null +++ b/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..8705898 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,69 @@ + $this->faker->name(), + 'email' => $this->faker->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return \Illuminate\Database\Eloquent\Factories\Factory + */ + public function unverified() + { + return $this->state(function (array $attributes) { + return [ + 'email_verified_at' => null, + ]; + }); + } + + /** + * Indicate that the user should have a personal team. + * + * @return $this + */ + public function withPersonalTeam() + { + if (! Features::hasTeamFeatures()) { + return $this->state([]); + } + + return $this->has( + Team::factory() + ->state(function (array $attributes, User $user) { + return ['name' => $user->name.'\'s Team', 'user_id' => $user->id, 'personal_team' => true]; + }), + 'ownedTeams' + ); + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..4629ec6 --- /dev/null +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,41 @@ +id(); + $table->string('name'); + $table->string('paternal'); + $table->string('maternal')->nullable(); + $table->string('email')->unique(); + $table->string('phone')->nullable()->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->foreignId('current_team_id')->nullable(); + $table->string('profile_photo_path', 2048)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +}; diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 0000000..fcacb80 --- /dev/null +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +}; diff --git a/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php new file mode 100644 index 0000000..6acbf7b --- /dev/null +++ b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php @@ -0,0 +1,50 @@ +text('two_factor_secret') + ->after('password') + ->nullable(); + + $table->text('two_factor_recovery_codes') + ->after('two_factor_secret') + ->nullable(); + + if (Fortify::confirmsTwoFactorAuthentication()) { + $table->timestamp('two_factor_confirmed_at') + ->after('two_factor_recovery_codes') + ->nullable(); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn(array_merge([ + 'two_factor_secret', + 'two_factor_recovery_codes', + ], Fortify::confirmsTwoFactorAuthentication() ? [ + 'two_factor_confirmed_at', + ] : [])); + }); + } +}; diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..1719198 --- /dev/null +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 0000000..6c81fd2 --- /dev/null +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,37 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2022_11_05_234507_create_permission_tables.php b/database/migrations/2022_11_05_234507_create_permission_tables.php new file mode 100644 index 0000000..aeee39b --- /dev/null +++ b/database/migrations/2022_11_05_234507_create_permission_tables.php @@ -0,0 +1,143 @@ +bigIncrements('id'); // permission id + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('description')->nullable(); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) { + $table->bigIncrements('id'); // role id + if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing + $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable(); + $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index'); + } + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->string('description')->nullable(); + $table->timestamps(); + if ($teams || config('permission.testing')) { + $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']); + } else { + $table->unique(['name', 'guard_name']); + } + }); + + Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) { + $table->unsignedBigInteger(PermissionRegistrar::$pivotPermission); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index'); + + $table->foreign(PermissionRegistrar::$pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], PermissionRegistrar::$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } else { + $table->primary([PermissionRegistrar::$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } + + }); + + Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) { + $table->unsignedBigInteger(PermissionRegistrar::$pivotRole); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index'); + + $table->foreign(PermissionRegistrar::$pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], PermissionRegistrar::$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } else { + $table->primary([PermissionRegistrar::$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } + }); + + Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) { + $table->unsignedBigInteger(PermissionRegistrar::$pivotPermission); + $table->unsignedBigInteger(PermissionRegistrar::$pivotRole); + + $table->foreign(PermissionRegistrar::$pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->foreign(PermissionRegistrar::$pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary([PermissionRegistrar::$pivotPermission, PermissionRegistrar::$pivotRole], 'role_has_permissions_permission_id_role_id_primary'); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $tableNames = config('permission.table_names'); + + if (empty($tableNames)) { + throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + } + + Schema::drop($tableNames['role_has_permissions']); + Schema::drop($tableNames['model_has_roles']); + Schema::drop($tableNames['model_has_permissions']); + Schema::drop($tableNames['roles']); + Schema::drop($tableNames['permissions']); + } +} diff --git a/database/migrations/2022_11_14_170157_create_sessions_table.php b/database/migrations/2022_11_14_170157_create_sessions_table.php new file mode 100644 index 0000000..06c3e45 --- /dev/null +++ b/database/migrations/2022_11_14_170157_create_sessions_table.php @@ -0,0 +1,35 @@ +string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/2022_11_28_120204_create_history_logs_table.php b/database/migrations/2022_11_28_120204_create_history_logs_table.php new file mode 100644 index 0000000..e729561 --- /dev/null +++ b/database/migrations/2022_11_28_120204_create_history_logs_table.php @@ -0,0 +1,42 @@ +id(); + $table->string('action'); + $table->integer('qty')->nullable(); + $table->longText('message')->nullable(); + $table->json('data')->nullable(); + + $table->foreignId('user_id') // Usuario que realizo la acción + ->nullable() + ->constrained() + ->cascadeOnUpdate() + ->nullOnDelete(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('history_logs'); + } +}; diff --git a/database/migrations/2022_12_26_094023_create_notifications_table.php b/database/migrations/2022_12_26_094023_create_notifications_table.php new file mode 100644 index 0000000..4357c9e --- /dev/null +++ b/database/migrations/2022_12_26_094023_create_notifications_table.php @@ -0,0 +1,35 @@ +uuid('id')->primary(); + $table->string('type'); + $table->morphs('notifiable'); + $table->text('data'); + $table->timestamp('read_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notifications'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..ec8cf4b --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,27 @@ + + * @version 1.0.0 + */ +class DatabaseSeeder extends Seeder +{ + /** + * Seed the application's database. + * + * @return void + */ + public function run() + { + $this->call(RoleSeeder::class); + $this->call(UserSeeder::class); + } +} diff --git a/database/seeders/DevSeeder.php b/database/seeders/DevSeeder.php new file mode 100644 index 0000000..32b50c1 --- /dev/null +++ b/database/seeders/DevSeeder.php @@ -0,0 +1,26 @@ + + * @version 1.0.0 + */ +class DevSeeder extends Seeder +{ + /** + * Seed the application's database. + * + * @return void + */ + public function run() + { + $this->call(RoleSeeder::class); + $this->call(UserSeeder::class); + } +} diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php new file mode 100644 index 0000000..48952e8 --- /dev/null +++ b/database/seeders/RoleSeeder.php @@ -0,0 +1,84 @@ + + * + * @version 1.0.0 + */ +class RoleSeeder extends Seeder +{ + use RolePermission; + + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + Role::withoutEvents(function () { + // Permisos para gestionar roles del sistema + [ + $rolesIndex, + $rolesCreate, + $rolesEdit, + $rolesDestroy + ] = $this->onCRUD('roles', 'Roles'); + + // Permisos para acceder al historial del sistema + $historiesIndex = $this->onIndex('histories', 'Historial global'); + + // Permisos para usuarios + [ + $usersIndex, + $usersCreate, + $usersEdit, + $usersDestroy + ] = $this->onCRUD('users', 'Usuarios:'); + + $usersConfig = $this->onPermission('users.config', 'Usuarios: Configuraciones adicionales'); + + /** + * Roles con asignación de permisos + */ + + // Desarrollador + Role::create([ + 'name' => 'developer', + 'description' => 'Desarrollador' + ])->givePermissionTo(Permission::all()); + + // Role de administrador + Role::create([ + 'name' => 'admin', + 'description' => 'Administrador' + ])->givePermissionTo( + $historiesIndex, + $usersIndex, + $usersCreate, + $usersEdit, + $usersDestroy + ); + + // Role de supervisor (solo lectura) + Role::create([ + 'name' => 'supervisor', + 'description' => 'Supervisor: Solo lectura' + ])->givePermissionTo( + $historiesIndex, + $rolesIndex, + $usersIndex, + ); + }); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..bfd99be --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,70 @@ + + * + * @version 1.0.0 + */ +class UserSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + User::withoutEvents(function () { + // Usuario desarrollador + [ + $developerEmail, + $developerPass + ] = UserSecureSupport::new('developer@notsoweb.com'); + + User::create([ + 'name' => 'Developer', + 'paternal' => 'Notsoweb', + 'email' => $developerEmail, + 'phone' => '5631809090', + 'password' => $developerPass, + ])->assignRole('developer'); + + // Usuario administrador + [ + $adminEmail, + $adminPass + ] = UserSecureSupport::new('admin@notsoweb.com'); + + User::create([ + 'name' => 'Administrador', + 'paternal' => 'Notsoweb', + 'email' => $adminEmail, + 'password' => $adminPass + ])->assignRole('admin'); + + // Usuario de prueba + User::create([ + 'name' => 'Demo', + 'paternal' => 'Notsoweb', + 'email' => 'demo@notsoweb.com', + 'password' => Hash::make('Demo') + ]); + }); + } +} diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..6598e2c --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/en/cache.php b/lang/en/cache.php new file mode 100644 index 0000000..4f882b6 --- /dev/null +++ b/lang/en/cache.php @@ -0,0 +1,6 @@ + ':label ":var" does not exist in the cache', + 'save' => ':label ":var" saved in the cache', +]; \ No newline at end of file diff --git a/lang/en/notifications.php b/lang/en/notifications.php new file mode 100644 index 0000000..4c555bf --- /dev/null +++ b/lang/en/notifications.php @@ -0,0 +1,8 @@ + 'The notification has been created.', + 'deleted' => 'The notification has been deleted.', + 'updated' => 'The notification has been updated.', + 'user.logout' => 'The user :user is logged in.', + 'user.logout' => 'The user :user has logged out' +]; \ No newline at end of file diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..d481411 --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 0000000..e9bd367 --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,23 @@ + 'The provided password does not match your current password.', + 'reset' => 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/lang/en/roles.php b/lang/en/roles.php new file mode 100644 index 0000000..912a290 --- /dev/null +++ b/lang/en/roles.php @@ -0,0 +1,6 @@ + 'The role ":role" has been created.', + 'deleted' => 'The role ":role" has been updated.', + 'updated' => 'The role ":role" has been updated.', +]; \ No newline at end of file diff --git a/lang/en/users.php b/lang/en/users.php new file mode 100644 index 0000000..31e3cd0 --- /dev/null +++ b/lang/en/users.php @@ -0,0 +1,8 @@ + 'The user ":user" has been created.', + 'deleted' => 'The password for user ":user" has been updated.', + 'updated' => 'The ":user" user has been updated.', + 'password.updated' => 'The password for user ":user" has been updated.', + 'roles.updated' => 'The ":user"\'s roles have been updated.', +]; \ No newline at end of file diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..5ea01fa --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,174 @@ + 'The :attribute must be accepted.', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute must only contain letters.', + 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute must only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'array' => 'The :attribute must have between :min and :max items.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'numeric' => 'The :attribute must be between :min and :max.', + 'string' => 'The :attribute must be between :min and :max characters.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_end_with' => 'The :attribute may not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'enum' => 'The selected :attribute is invalid.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'array' => 'The :attribute must have more than :value items.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'numeric' => 'The :attribute must be greater than :value.', + 'string' => 'The :attribute must be greater than :value characters.', + ], + 'gte' => [ + 'array' => 'The :attribute must have :value items or more.', + 'file' => 'The :attribute must be greater than or equal to :value kilobytes.', + 'numeric' => 'The :attribute must be greater than or equal to :value.', + 'string' => 'The :attribute must be greater than or equal to :value characters.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'array' => 'The :attribute must have less than :value items.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'numeric' => 'The :attribute must be less than :value.', + 'string' => 'The :attribute must be less than :value characters.', + ], + 'lte' => [ + 'array' => 'The :attribute must not have more than :value items.', + 'file' => 'The :attribute must be less than or equal to :value kilobytes.', + 'numeric' => 'The :attribute must be less than or equal to :value.', + 'string' => 'The :attribute must be less than or equal to :value characters.', + ], + 'mac_address' => 'The :attribute must be a valid MAC address.', + 'max' => [ + 'array' => 'The :attribute must not have more than :max items.', + 'file' => 'The :attribute must not be greater than :max kilobytes.', + 'numeric' => 'The :attribute must not be greater than :max.', + 'string' => 'The :attribute must not be greater than :max characters.', + ], + 'max_digits' => 'The :attribute must not have more than :max digits.', + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute must have at least :min items.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'numeric' => 'The :attribute must be at least :min.', + 'string' => 'The :attribute must be at least :min characters.', + ], + 'min_digits' => 'The :attribute must have at least :min digits.', + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => [ + 'letters' => 'The :attribute must contain at least one letter.', + 'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.', + 'numbers' => 'The :attribute must contain at least one number.', + 'symbols' => 'The :attribute must contain at least one symbol.', + 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', + ], + 'present' => 'The :attribute field must be present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_array_keys' => 'The :attribute field must contain entries for: :values.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_if_accepted' => 'The :attribute field is required when :other is accepted.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'array' => 'The :attribute must contain :size items.', + 'file' => 'The :attribute must be :size kilobytes.', + 'numeric' => 'The :attribute must be :size.', + 'string' => 'The :attribute must be :size characters.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid timezone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute must be a valid URL.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 0000000..5b4d5c4 --- /dev/null +++ b/lang/es.json @@ -0,0 +1,13 @@ +{ + "Forbidden":"Prohibido", + "Go to home":"Ir al inicio", + "In maintenance":"En mantenimiento", + "Not Found":"No encontrado", + "Page Expired":"Página expirada", + "Resource not found":"Recurso no encontrado", + "Server Error":"A ocurrido un error en el servidor", + "Service Unavailable":"Servicio no disponible", + "Too Many Requests":"Demasiadas peticiones", + "The user does not exist":"El usuario no existe", + "Unauthorized":"No autorizado" +} \ No newline at end of file diff --git a/lang/es/auth.php b/lang/es/auth.php new file mode 100644 index 0000000..f7778a4 --- /dev/null +++ b/lang/es/auth.php @@ -0,0 +1,19 @@ + 'Estas credenciales no coinciden con nuestros registros.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Demasiados intentos de acceso. Por favor inténtelo de nuevo en :seconds segundos.', +]; diff --git a/lang/es/cache.php b/lang/es/cache.php new file mode 100644 index 0000000..90227b2 --- /dev/null +++ b/lang/es/cache.php @@ -0,0 +1,6 @@ + ':label ":var" no existe en la cache', + 'save' => ':label ":var" guardado en la cache', +]; \ No newline at end of file diff --git a/lang/es/notifications.php b/lang/es/notifications.php new file mode 100644 index 0000000..c6d1c74 --- /dev/null +++ b/lang/es/notifications.php @@ -0,0 +1,8 @@ + 'La notificación a sido creada.', + 'deleted' => 'La notificación ha sido eliminada.', + 'updated' => 'La notificación ha sido actualizada.', + 'user.login' => 'El usuario :user a iniciado la sesión', + 'user.logout' => 'El usuario :user a cerrado la sesión' +]; \ No newline at end of file diff --git a/lang/es/pagination.php b/lang/es/pagination.php new file mode 100644 index 0000000..325916d --- /dev/null +++ b/lang/es/pagination.php @@ -0,0 +1,19 @@ + '« Anterior', + 'next' => 'Siguiente »', + +]; diff --git a/lang/es/passwords.php b/lang/es/passwords.php new file mode 100644 index 0000000..d7e5419 --- /dev/null +++ b/lang/es/passwords.php @@ -0,0 +1,24 @@ + 'La contraseña proporcionada no coincide con su contraseña actual.', + 'reset' => '¡Su contraseña ha sido restablecida!', + 'sent' => '¡Recordatorio de contraseña enviado!', + 'token' => 'Este token de restablecimiento de contraseña es inválido.', + 'user' => 'No se ha encontrado un usuario con esa dirección de correo.', + 'throttled' => 'Por favor espere antes de volver a intentarlo.', + 'password' => 'Las contraseñas deben tener al menos seis caracteres y coincidir con la confirmación.', + 'verify' => 'Si el correo :email existe, te enviaremos un correo con el token de recuperación.' +]; diff --git a/lang/es/roles.php b/lang/es/roles.php new file mode 100644 index 0000000..9831769 --- /dev/null +++ b/lang/es/roles.php @@ -0,0 +1,6 @@ + 'El rol ":role" a sido creado.', + 'deleted' => 'El rol ":role" ha sido eliminado.', + 'updated' => 'El rol ":role" ha sido actualizado.', +]; \ No newline at end of file diff --git a/lang/es/users.php b/lang/es/users.php new file mode 100644 index 0000000..c8f7723 --- /dev/null +++ b/lang/es/users.php @@ -0,0 +1,8 @@ + 'El usuario ":user" ha sido creado.', + 'deleted' => 'El usuario ":user" ha sido eliminado.', + 'updated' => 'El usuario ":user" ha sido actualizado.', + 'password.updated' => 'La contraseña del usuario ":user" ha sido actualizada.', + 'roles.updated' => 'Los roles del usuario ":user" han sido actualizados.', +]; \ No newline at end of file diff --git a/lang/es/validation.php b/lang/es/validation.php new file mode 100644 index 0000000..0f3d8c6 --- /dev/null +++ b/lang/es/validation.php @@ -0,0 +1,172 @@ + 'El campo :attribute debe ser aceptado.', + 'active_url' => 'El campo :attribute no es una URL válida.', + 'after' => 'El campo :attribute debe ser una fecha posterior a :date.', + 'after_or_equal' => 'El campo :attribute debe ser una fecha posterior o igual a :date.', + 'alpha' => 'El campo :attribute solo puede contener letras.', + 'alpha_dash' => 'El campo :attribute solo puede contener letras, números, guiones y guiones bajos.', + 'alpha_num' => 'El campo :attribute solo puede contener letras y números.', + 'array' => 'El campo :attribute debe ser un array.', + 'before' => 'El campo :attribute debe ser una fecha anterior a :date.', + 'before_or_equal' => 'El campo :attribute debe ser una fecha anterior o igual a :date.', + 'between' => [ + 'numeric' => 'El campo :attribute debe ser un valor entre :min y :max.', + 'file' => 'El archivo :attribute debe pesar entre :min y :max kilobytes.', + 'string' => 'El campo :attribute debe contener entre :min y :max caracteres.', + 'array' => 'El campo :attribute debe contener entre :min y :max elementos.', + ], + 'boolean' => 'El campo :attribute debe ser verdadero o falso.', + 'confirmed' => 'El campo confirmación de :attribute no coincide.', + 'current_password' => 'La contraseñas son diferentes', + 'date' => 'El campo :attribute no corresponde con una fecha válida.', + 'date_equals' => 'El campo :attribute debe ser una fecha igual a :date.', + 'date_format' => 'El campo :attribute no corresponde con el formato de fecha :format.', + 'different' => 'Los campos :attribute y :other deben ser diferentes.', + 'digits' => 'El campo :attribute debe ser un número de :digits dígitos.', + 'digits_between' => 'El campo :attribute debe contener entre :min y :max dígitos.', + 'dimensions' => 'El campo :attribute tiene dimensiones de imagen inválidas.', + 'distinct' => 'El campo :attribute tiene un valor duplicado.', + 'email' => 'El campo :attribute debe ser una dirección de correo válida.', + 'ends_with' => 'El campo :attribute debe finalizar con alguno de los siguientes valores: :values', + 'exists' => 'El campo :attribute seleccionado no existe.', + 'exist_section' => 'Este :attribute no existe.', + 'file' => 'El campo :attribute debe ser un archivo.', + 'filled' => 'El campo :attribute debe tener un valor.', + 'gt' => [ + 'numeric' => 'El campo :attribute debe ser mayor a :value.', + 'file' => 'El archivo :attribute debe pesar más de :value kilobytes.', + 'string' => 'El campo :attribute debe contener más de :value caracteres.', + 'array' => 'El campo :attribute debe contener más de :value elementos.', + ], + 'gte' => [ + 'numeric' => 'El campo :attribute debe ser mayor o igual a :value.', + 'file' => 'El archivo :attribute debe pesar :value o más kilobytes.', + 'string' => 'El campo :attribute debe contener :value o más caracteres.', + 'array' => 'El campo :attribute debe contener :value o más elementos.', + ], + 'image' => 'El campo :attribute debe ser una imagen.', + 'in' => 'El campo :attribute es inválido.', + 'in_array' => 'El campo :attribute no existe en :other.', + 'integer' => 'El campo :attribute debe ser un número entero.', + 'ip' => 'El campo :attribute debe ser una dirección IP válida.', + 'ipv4' => 'El campo :attribute debe ser una dirección IPv4 válida.', + 'ipv6' => 'El campo :attribute debe ser una dirección IPv6 válida.', + 'json' => 'El campo :attribute debe ser una cadena de texto JSON válida.', + 'lt' => [ + 'numeric' => 'El campo :attribute debe ser menor a :value.', + 'file' => 'El archivo :attribute debe pesar menos de :value kilobytes.', + 'string' => 'El campo :attribute debe contener menos de :value caracteres.', + 'array' => 'El campo :attribute debe contener menos de :value elementos.', + ], + 'lte' => [ + 'numeric' => 'El campo :attribute debe ser menor o igual a :value.', + 'file' => 'El archivo :attribute debe pesar :value o menos kilobytes.', + 'string' => 'El campo :attribute debe contener :value o menos caracteres.', + 'array' => 'El campo :attribute debe contener :value o menos elementos.', + ], + 'max' => [ + 'numeric' => 'El campo :attribute no debe ser mayor a :max.', + 'file' => 'El archivo :attribute no debe pesar más de :max kilobytes.', + 'string' => 'El campo :attribute no debe contener más de :max caracteres.', + 'array' => 'El campo :attribute no debe contener más de :max elementos.', + ], + 'mimes' => 'El campo :attribute debe ser un archivo de tipo: :values.', + 'mimetypes' => 'El campo :attribute debe ser un archivo de tipo: :values.', + 'min' => [ + 'numeric' => 'El campo :attribute debe ser al menos :min.', + 'file' => 'El archivo :attribute debe pesar al menos :min kilobytes.', + 'string' => 'El campo :attribute debe contener al menos :min caracteres.', + 'array' => 'El campo :attribute debe contener al menos :min elementos.', + ], + 'not_in' => 'El campo :attribute seleccionado es inválido.', + 'not_regex' => 'El formato del campo :attribute es inválido.', + 'numeric' => 'El campo :attribute debe ser un número.', + 'password' => 'La contraseña es incorrecta.', + 'present' => 'El campo :attribute debe estar presente.', + 'regex' => 'El formato del campo :attribute es inválido.', + 'required' => 'El campo :attribute es obligatorio.', + 'required_if' => 'El campo :attribute es obligatorio cuando el campo :other es :value.', + 'required_unless' => 'El campo :attribute es requerido a menos que :other se encuentre en :values.', + 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.', + 'required_with_all' => 'El campo :attribute es obligatorio cuando :values están presentes.', + 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.', + 'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de los campos :values están presentes.', + 'same' => 'Los campos :attribute y :other deben coincidir.', + 'size' => [ + 'numeric' => 'El campo :attribute debe ser :size.', + 'file' => 'El archivo :attribute debe pesar :size kilobytes.', + 'string' => 'El campo :attribute debe contener :size caracteres.', + 'array' => 'El campo :attribute debe contener :size elementos.', + ], + 'starts_with' => 'El campo :attribute debe comenzar con uno de los siguientes valores: :values', + 'string' => 'El campo :attribute debe ser una cadena de caracteres.', + 'timezone' => 'El campo :attribute debe ser una zona horaria válida.', + 'unique' => 'El valor del campo :attribute ya está en uso.', + 'uploaded' => 'El campo :attribute no se pudo subir.', + 'url' => 'El formato del campo :attribute es inválido.', + 'uuid' => 'El campo :attribute debe ser un UUID válido.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [ + 'section.number' => 'sección', + 'name' => 'nombre', + 'paternal' => 'apellido paterno', + 'maternal' => 'apellido materno', + 'email' => 'correo', + 'phone' => 'teléfono', + '*.name' => 'nombre', + '*.paternal' => 'apellido paterno', + '*.maternal' => 'apellido materno', + '*.email' => 'correo', + '*.phone' => 'teléfono', + '*.street' => 'calle', + '*.inner_number' => 'número interior', + '*.outer_number' => 'número exterior', + '*.colony' => 'colonia', + '*.zipcode' => 'código postal', + '*.expiration' => 'vencimiento', + '*.section' => 'sección', + '*.voter_identifier' => 'clave de elector' + ], +]; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9fbf9e7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5683 @@ +{ + "name": "template-laravel-vuejs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@inertiajs/vue3": "^1.0.0-beta.2", + "@soketi/soketi": "^1.6.0", + "@vueuse/core": "^9.6.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "laravel-echo": "^1.14.2", + "pusher-js": "^7.5.0", + "sweetalert2": "^11.4.8", + "toastr": "^2.1.4", + "vue-i18n": "^9.2.2", + "vue-multiselect": "^3.0.0-alpha.2" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/typography": "^0.5.2", + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.7", + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.8.0", + "lodash": "^4.17.19", + "postcss": "^8.4.14", + "tailwindcss": "^3.1.0", + "vite": "^4.0.0", + "vue": "^3.2.31" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@inertiajs/core": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.14.tgz", + "integrity": "sha512-S33PU6mWEYbn/s2Op+CJ6MN7ON354vWw8Y+UvtQzPt0r7pVgOuIArrqqsoulf9oQz9sbP1+vp/tCvyBzm4XmpA==", + "dependencies": { + "axios": "^1.2.0", + "deepmerge": "^4.0.0", + "nprogress": "^0.2.0", + "qs": "^6.9.0" + } + }, + "node_modules/@inertiajs/vue3": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.0.14.tgz", + "integrity": "sha512-lKL3Bm9k95Gw1GAq4RxgjfwSMfklkeMbvEfzwmsEBsZ4BbbWwfpC/+KS+4O4faTjjijczvkDPhMKv4duzFxtGw==", + "dependencies": { + "@inertiajs/core": "1.0.14", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@intlify/core-base": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.7.1.tgz", + "integrity": "sha512-jPJTeECEhqQ7g//8g3Fb79j5SzSSRqlFCWD6pcX94uMLXU+L1m07gVZnnvzoJBnaMyJHiiwxOqZVfvu6rQfLvw==", + "dependencies": { + "@intlify/message-compiler": "9.7.1", + "@intlify/shared": "9.7.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.7.1.tgz", + "integrity": "sha512-HfIr2Hn/K7b0Zv4kGqkxAxwtipyxAwhI9a3krN5cuhH/G9gkaik7of1PdzjR3Mix43t2onBiKYQyaU7mo7e0aA==", + "dependencies": { + "@intlify/shared": "9.7.1", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.7.1.tgz", + "integrity": "sha512-CBKnHzlUYGrk5QII9q4nElAQKO5cX1rRx8VmSWXltyOZjbkGHXYQTHULn6KwRi+CypuBCfmPkyPBHMzosypIeg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", + "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", + "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", + "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", + "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", + "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", + "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opencensus/core": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz", + "integrity": "sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==", + "dependencies": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opencensus/core/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@opencensus/core/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@opencensus/propagation-b3": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz", + "integrity": "sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==", + "dependencies": { + "@opencensus/core": "^0.0.8", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opencensus/propagation-b3/node_modules/@opencensus/core": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz", + "integrity": "sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==", + "dependencies": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opencensus/propagation-b3/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@opencensus/propagation-b3/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@pm2/agent": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.3.tgz", + "integrity": "sha512-xkqqCoTf5VsciMqN0vb9jthW7olVAi4KRFNddCc7ZkeJZ3i8QwZANr4NSH2H5DvseRFHq7MiPspRY/EWAFWWTg==", + "dependencies": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.3.1", + "eventemitter2": "~5.0.1", + "fast-json-patch": "^3.0.0-1", + "fclone": "~1.0.11", + "nssocket": "0.6.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "proxy-agent": "~6.3.0", + "semver": "~7.5.0", + "ws": "~7.4.0" + } + }, + "node_modules/@pm2/io": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.2.tgz", + "integrity": "sha512-XAvrNoQPKOyO/jJyCu8jPhLzlyp35MEf7w/carHXmWKddPzeNOFSEpSEqMzPDawsvpxbE+i918cNN+MwgVsStA==", + "dependencies": { + "@opencensus/core": "0.0.9", + "@opencensus/propagation-b3": "0.0.8", + "async": "~2.6.1", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "~7.5.4", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/io/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/io/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "node_modules/@pm2/js-api": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz", + "integrity": "sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==", + "dependencies": { + "async": "^2.6.3", + "axios": "^0.21.0", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "ws": "^7.0.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/js-api/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@pm2/js-api/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/@pm2/pm2-version-check": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", + "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", + "dependencies": { + "debug": "^4.3.1" + } + }, + "node_modules/@soketi/soketi": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@soketi/soketi/-/soketi-1.6.0.tgz", + "integrity": "sha512-g9p41lqL1bWwLdKrZMwfq0ylQJB0d7tQLJPI/pXVHjohfCaqim0ZsjoCPmVahQPadOjbdvPzleA3czNTPx8eUA==", + "dependencies": { + "arraybuffer-to-string": "^1.0.2", + "async": "^3.2.4", + "aws-sdk": "^2.1426.0", + "axios": "^0.27.2", + "boolean": "^3.1.4", + "bullmq": "^1.80.3", + "colors": "1.4.0", + "dot-wild": "^3.0.1", + "dotenv": "^16.0.1", + "ioredis": "^5.0.4", + "knex": "^2.5.1", + "mysql": "^2.18.1", + "mysql2": "^3.5.2", + "nats": "^2.7.1", + "node-discover": "^1.2.1", + "pg": "^8.7.1", + "pm2": "^5.3.0", + "prom-client": "^14.0.1", + "prometheus-query": "^3.2.5", + "pusher": "^5.1.0-beta", + "query-string": "^7.1.0", + "rate-limiter-flexible": "^2.3.8", + "sqs-consumer": "^5.7.0", + "uuid": "^8.3.2", + "uWebSockets.js": "git+https://github.com/uNetworking/uWebSockets.js.git#v20.10.0", + "yargs": "^17.5.1" + }, + "bin": { + "soketi": "bin/server.js", + "soketi-pm2": "bin/pm2.js" + }, + "peerDependencies": { + "@pm2/agent": "^2.0.3" + } + }, + "node_modules/@soketi/soketi/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", + "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/node": { + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz", + "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.9.tgz", + "integrity": "sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.9.tgz", + "integrity": "sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg==", + "dependencies": { + "@vue/compiler-core": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.9.tgz", + "integrity": "sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/compiler-core": "3.3.9", + "@vue/compiler-dom": "3.3.9", + "@vue/compiler-ssr": "3.3.9", + "@vue/reactivity-transform": "3.3.9", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.9.tgz", + "integrity": "sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g==", + "dependencies": { + "@vue/compiler-dom": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.9.tgz", + "integrity": "sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw==", + "dependencies": { + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.9.tgz", + "integrity": "sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/compiler-core": "3.3.9", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.9.tgz", + "integrity": "sha512-xxaG9KvPm3GTRuM4ZyU8Tc+pMVzcu6eeoSRQJ9IE7NmCcClW6z4B3Ij6L4EDl80sxe/arTtQ6YmgiO4UZqRc+w==", + "dependencies": { + "@vue/reactivity": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.9.tgz", + "integrity": "sha512-e7LIfcxYSWbV6BK1wQv9qJyxprC75EvSqF/kQKe6bdZEDNValzeRXEVgiX7AHI6hZ59HA4h7WT5CGvm69vzJTQ==", + "dependencies": { + "@vue/runtime-core": "3.3.9", + "@vue/shared": "3.3.9", + "csstype": "^3.1.2" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.9.tgz", + "integrity": "sha512-w0zT/s5l3Oa3ZjtLW88eO4uV6AQFqU8X5GOgzq7SkQQu6vVr+8tfm+OI2kDBplS/W/XgCBuFXiPw6T5EdwXP0A==", + "dependencies": { + "@vue/compiler-ssr": "3.3.9", + "@vue/shared": "3.3.9" + }, + "peerDependencies": { + "vue": "3.3.9" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.9.tgz", + "integrity": "sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA==" + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==" + }, + "node_modules/amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", + "dependencies": { + "amp": "0.3.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/arraybuffer-to-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer-to-string/-/arraybuffer-to-string-1.0.2.tgz", + "integrity": "sha512-WbIYlLVmvIAyUBdQRRuyGOJRriOQy9OAsWcyURmsRQp9+g647hdMSS2VFKXbJLVw0daUu06hqwLXm9etVrXI9A==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "dependencies": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "engines": { + "node": "<=0.11.8 || >0.11.10" + } + }, + "node_modules/async-listener/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1502.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1502.0.tgz", + "integrity": "sha512-mUXUaWmbIyqE6zyIcbUUQIUgw1evK7gV1vQP7ZZEE0qi6hO2Mw99Nc25Bh+187yvRxamMTsFXvvmBViR0Q75SA==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "node_modules/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/bodec": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", + "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bullmq": { + "version": "1.91.1", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-1.91.1.tgz", + "integrity": "sha512-u7dat9I8ZwouZ651AMZkBSvB6NVUPpnAjd4iokd9DM41whqIBnDjuL11h7+kEjcpiDKj6E+wxZiER00FqirZQg==", + "dependencies": { + "cron-parser": "^4.6.0", + "get-port": "6.1.2", + "glob": "^8.0.3", + "ioredis": "^5.2.2", + "lodash": "^4.17.21", + "msgpackr": "^1.6.2", + "semver": "^7.3.7", + "tslib": "^2.0.0", + "uuid": "^9.0.0" + } + }, + "node_modules/bullmq/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "dependencies": { + "chalk": "3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dependencies": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "dependencies": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/culvert": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", + "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==" + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz", + "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dot-wild": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dot-wild/-/dot-wild-3.0.1.tgz", + "integrity": "sha512-RTiyxwdJncRA+OpSA8Zhi6zNHNf7GDDBmoGlJirh6Jpt2wdBwT3igx4MfV9X+XcZGKH2hecyolvMrzelGpGHHA==", + "dependencies": { + "clone-deep": "^2.0.1", + "is-plain-object": "^2.0.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.594", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.594.tgz", + "integrity": "sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ==", + "dev": true + }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dependencies": { + "shimmer": "^1.2.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz", + "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.0", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" + }, + "node_modules/git-node-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", + "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==" + }, + "node_modules/git-sha1": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", + "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==" + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-base64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-1.1.0.tgz", + "integrity": "sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g==", + "bin": { + "is_base64": "bin/is-base64", + "is-base64": "bin/is-base64" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "node_modules/js-git": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", + "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", + "dependencies": { + "bodec": "^0.1.0", + "culvert": "^0.1.2", + "git-sha1": "^0.1.2", + "pako": "^0.2.5" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "optional": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/knex": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/knex/-/knex-2.5.1.tgz", + "integrity": "sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==", + "dependencies": { + "colorette": "2.0.19", + "commander": "^10.0.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.6.1", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/laravel-echo": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.15.3.tgz", + "integrity": "sha512-SRXzccaat6w4qKgZ4/rjFKr3nJfVxB+ly4V0MEJNIF1/TpERNXepo3uk7NnOjBGsiV/np1fl2XitAzW4Sa1s/w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.1.tgz", + "integrity": "sha512-fxzUDjOA37kOsYq8dP+3oPIlw8/kJVXwu0hOXLun82R1LpV02shGeWGYKx2lbpKffL5I0sfPPjfqbYxuqBluAA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.0.5" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/msgpackr": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.9.tgz", + "integrity": "sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", + "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.7" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/mysql2": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.5.tgz", + "integrity": "sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mysql2/node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nats": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nats/-/nats-2.18.0.tgz", + "integrity": "sha512-zZF004ejzf67Za0Tva+xphxoxBMNc5IMLqbZ7Ho0j9TMuisjpo+qCd1EktXRCLNxmrZ8O6Tbm1dBsZYNF6yR1A==", + "dependencies": { + "nkeys.js": "1.0.5" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nkeys.js": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nkeys.js/-/nkeys.js-1.0.5.tgz", + "integrity": "sha512-u25YnRPHiGVsNzwyHnn+PT90sgAhnS8jUJ1nxmkHMFYCJ6+Ic0lv291w7uhRBpJVJ3PH2GWbYqA151lGCRrB5g==", + "dependencies": { + "tweetnacl": "1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/node-discover": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-discover/-/node-discover-1.2.1.tgz", + "integrity": "sha512-BR2L7KkLMw008UD+yJGg663tavZh6Yq0Vw7HGUIC40/5O/Ms9qTt+fAbAYOicLrlV3pCaNNZBTGYRKxLar7WaA==", + "dependencies": { + "uuid": "^8.3.1" + }, + "engines": { + "node": ">=0.4.1 <0.5.0 || >=0.6.9" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", + "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", + "optional": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nssocket": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", + "integrity": "sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==", + "dependencies": { + "eventemitter2": "~0.4.14", + "lazy": "~1.0.11" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/nssocket/node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dependencies": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", + "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidusage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", + "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pm2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.3.0.tgz", + "integrity": "sha512-xscmQiAAf6ArVmKhjKTeeN8+Td7ZKnuZFFPw1DGkdFPR/0Iyx+m+1+OpCdf9+HQopX3VPc9/wqPQHqVOfHum9w==", + "dependencies": { + "@pm2/agent": "~2.0.0", + "@pm2/io": "~5.0.0", + "@pm2/js-api": "~0.6.7", + "@pm2/pm2-version-check": "latest", + "async": "~3.2.0", + "blessed": "0.1.81", + "chalk": "3.0.0", + "chokidar": "^3.5.3", + "cli-tableau": "^2.0.0", + "commander": "2.15.1", + "croner": "~4.1.92", + "dayjs": "~1.11.5", + "debug": "^4.3.1", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "~3.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.1", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "^2", + "semver": "^7.2", + "source-map-support": "0.5.21", + "sprintf-js": "1.1.2", + "vizion": "~2.2.1", + "yamljs": "0.3.0" + }, + "bin": { + "pm2": "bin/pm2", + "pm2-dev": "bin/pm2-dev", + "pm2-docker": "bin/pm2-docker", + "pm2-runtime": "bin/pm2-runtime" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "pm2-sysmonit": "^1.2.8" + } + }, + "node_modules/pm2-axon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", + "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", + "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", + "dependencies": { + "debug": "^4.3.1" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "dependencies": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", + "dependencies": { + "charm": "~0.1.1" + } + }, + "node_modules/pm2-sysmonit": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", + "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", + "optional": true, + "dependencies": { + "async": "^3.2.0", + "debug": "^4.3.1", + "pidusage": "^2.0.21", + "systeminformation": "^5.7", + "tx2": "~1.0.4" + } + }, + "node_modules/pm2-sysmonit/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "optional": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "node_modules/pm2/node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prom-client": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", + "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", + "dependencies": { + "tdigest": "^0.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prometheus-query": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prometheus-query/-/prometheus-query-3.3.3.tgz", + "integrity": "sha512-BL76MllxFdgaXUw1tOtg1osvgaDpHdq0PjUVvWTMXRr/txRxdY4TvQ4k6il9xxUL+L52qOWr4XZKXGWF3n7GZw==", + "dependencies": { + "axios": "^1.6.0" + } + }, + "node_modules/promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", + "dependencies": { + "read": "^1.0.4" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/pusher": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pusher/-/pusher-5.2.0.tgz", + "integrity": "sha512-F6LNiZyJsIkoHLz+YurjKZ1HH8V1/cMggn4k97kihjP3uTvm0P4mZzSFeHOWIy+PlJ2VInJBhUFJBYLsFR5cjg==", + "dependencies": { + "@types/node-fetch": "^2.5.7", + "abort-controller": "^3.0.0", + "is-base64": "^1.1.0", + "node-fetch": "^2.6.1", + "tweetnacl": "^1.0.0", + "tweetnacl-util": "^0.15.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/pusher-js": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-7.6.0.tgz", + "integrity": "sha512-5CJ7YN5ZdC24E0ETraCU5VYFv0IY5ziXhrS0gS5+9Qrro1E4M1lcZhtr9H1H+6jNSLj1LKKAgcLeE1EH9GxMlw==", + "dependencies": { + "@types/express-serve-static-core": "4.17.28", + "@types/node": "^14.14.31", + "tweetnacl": "^1.0.3" + } + }, + "node_modules/pusher-js/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rate-limiter-flexible": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.2.tgz", + "integrity": "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw==" + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sqs-consumer": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/sqs-consumer/-/sqs-consumer-5.8.0.tgz", + "integrity": "sha512-pJReMEtDM9/xzQTffb7dxMD5MKagBfOW65m+ITsbpNk0oZmJ38tTC4LPmj0/7ZcKSOqi2LrpA1b0qGYOwxlHJg==", + "dependencies": { + "aws-sdk": "^2.1271.0", + "debug": "^4.3.4" + }, + "peerDependencies": { + "aws-sdk": "^2.1271.0" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sweetalert2": { + "version": "11.10.1", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.1.tgz", + "integrity": "sha512-qu145oBuFfjYr5yZW9OSdG6YmRxDf8CnkgT/sXMfrXGe+asFy2imC2vlaLQ/L/naZ/JZna1MPAY56G4qYM0VUQ==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, + "node_modules/systeminformation": { + "version": "5.21.18", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.21.18.tgz", + "integrity": "sha512-PEoWd95nI5170rvIk4fagLH0SmzwfGt18w0+ex1Ljb2bSXvDs9PQdLNexMazL5L6Pzd6wxlpoWUAjX+hNRKN7g==", + "optional": true, + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toastr": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", + "integrity": "sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA==", + "dependencies": { + "jquery": ">=1.12.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "node_modules/tx2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", + "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", + "optional": true, + "dependencies": { + "json-stringify-safe": "^5.0.1" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uWebSockets.js": { + "version": "20.10.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#806df48c9da86af7b3341f3e443388c7cd15c3de" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz", + "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vizion": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", + "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", + "dependencies": { + "async": "^2.6.3", + "git-node-fs": "^1.0.0", + "ini": "^1.3.5", + "js-git": "^0.7.8" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vizion/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/vue": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.9.tgz", + "integrity": "sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==", + "dependencies": { + "@vue/compiler-dom": "3.3.9", + "@vue/compiler-sfc": "3.3.9", + "@vue/runtime-dom": "3.3.9", + "@vue/server-renderer": "3.3.9", + "@vue/shared": "3.3.9" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.7.1.tgz", + "integrity": "sha512-A6DzWqJQMdzBj+392+g3zIgGV0FnFC7o/V+txs5yIALANEZzY6ZV8hM2wvZR3nTbQI7dntAmzBHMeoEteJO0kQ==", + "dependencies": { + "@intlify/core-base": "9.7.1", + "@intlify/shared": "9.7.1", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-multiselect": { + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-beta.3.tgz", + "integrity": "sha512-P7Fx+ovVF7WMERSZ0lw6N3p4H4bnQ3NcaY3ORjzFPv0r/6lpIqvFWmK9Xnwze9mgAvmNV1foI1VWrBmjnfBTLQ==", + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yamljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/yamljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/yamljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cf5cb41 --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "private": true, + "scripts": { + "dev": "vite", + "dev:host": "vite --host", + "build": "vite build" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/typography": "^0.5.2", + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.7", + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.8.0", + "lodash": "^4.17.19", + "postcss": "^8.4.14", + "tailwindcss": "^3.1.0", + "vite": "^4.0.0", + "vue": "^3.2.31" + }, + "dependencies": { + "@inertiajs/vue3": "^1.0.0-beta.2", + "@soketi/soketi": "^1.6.0", + "@vueuse/core": "^9.6.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "laravel-echo": "^1.14.2", + "pusher-js": "^7.5.0", + "sweetalert2": "^11.4.8", + "toastr": "^2.1.4", + "vue-i18n": "^9.2.2", + "vue-multiselect": "^3.0.0-alpha.2" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..2ac86a1 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,31 @@ + + + + + ./tests/Unit + + + ./tests/Feature + + + + + ./app + + + + + + + + + + + + + + diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..67cdf1a --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..1d69f3a --- /dev/null +++ b/public/index.php @@ -0,0 +1,55 @@ +make(Kernel::class); + +$response = $kernel->handle( + $request = Request::capture() +)->send(); + +$kernel->terminate($request, $response); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..e609f68 --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,81 @@ +/* Importación desde librerías */ +@import "toastr"; +@import "vue-multiselect/dist/vue-multiselect.css"; + +/* Importación de recursos externos */ +@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css'); + +@font-face { + font-family: 'Material Symbols Outlined'; + font-style: normal; + font-weight: 400; + src: url(./google-icons/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1n-q_4MrImHCIJIZrDCvHOej.woff2) format('woff2'); +} +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(./google-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2'); +} + +/* Scrollbar */ +::-webkit-scrollbar { + width: 8px; + height: 8px; + } + +::-webkit-scrollbar-thumb { + background: #777777; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #6f6b6b; + box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2); +} + +::-webkit-scrollbar-thumb:active { + background-color: #3c3a3a; +} + +::-webkit-scrollbar-track { + background: #e1e1e1; + border-radius: 4px; +} + +::-webkit-scrollbar-track:hover, +::-webkit-scrollbar-track:active { +background: #d4d4d4; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; + +.btn-icon-primary { + @apply flex w-fit px-1.5 py-0.5 rounded-md font-medium text-white bg-primary dark:bg-primary-dark hover:text-white hover:bg-secondary dark:hover:bg-secondary-dark hover:border-primary transition cursor-pointer; +} + +.btn-icon-secondary { + @apply flex w-fit px-1.5 py-0.5 rounded-md font-medium text-white bg-secondary dark:bg-secondary-dark hover:text-secondary hover:bg-primary dark:hover:bg-primary-dark hover:border-secondary transition cursor-pointer; +} + +.header-icon { + @apply hover:text-yellow-500 focus:text-yellow-600 hover:scale-105 hover:transition hover:duration-300; +} + +.input-primary { + @apply block w-full p-2 rounded-lg border-b-2 border-gray-200 bg-gray-50 text-sm text-black outline-gray-400 +} + +.input-secondary { + @apply block w-full p-2 rounded-lg border-b-2 border-gray-200 bg-gray-50 text-sm text-secondary outline-gray-400 +} + +.table-head { + @apply text-base font-semibold tracking-wide text-left text-white bg-primary dark:bg-primary-dark uppercase border-b border-primary dark:border-primary-dark divide-indigo-50 divide-x; +} + +.table-item { + @apply px-4 py-1 text-sm text-center; +} diff --git a/resources/css/google-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 b/resources/css/google-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5e4a90d8c61038a90ae43a35d9dd391437581f10 GIT binary patch literal 119540 zcmV)MK)AnmPew8T0RR910n+pU4*&oF1sLc60n(QM0RR9100000000000000000000 z0000Q92*QAgTi_SU;yDD2m}!b3Xh{~i_K6A!At-FHUcCAplSpl1%i49AY1zjluXnl z-0b$6yl>G0A_zpC12oB|v{)5I{@F{!+kOdkS8s4l#co<^*ftHQcRTRxnX2bh_W%F? z|NsC0)?^ZEmV{-J>@Elbeu#Qj+ge+D_Pd8b%FW0l0V#X-$SX2~)#PM0Yog|qtZnCA zpW9Ro8H-fWvR`#;P_^2Cl8>amB{a)EdL&e2q{fDcHtrPjMyYqw%6Aqchg9#A6fGZq z9Vex!EDygcZy5wgb z1*fr>+J?H$I`&$+iFy$^=ggek-Ps$Rq_e72sY)-ZMTe(BN+ygq@?Z{mC$GeK5gQp; zb3j!kRh3j#QdIzWHZ#7!d(AV!z>S0d=HTGqV0KR}O{1827AyJ6A3mrqg2FchTML;r z;V&Az4PS@<41WnYBa>ozYjHb{tNZ-KVtM=6(BtNr+Hgi`9aN{88b6xWMoE0 zij6CSZIv0}rmGJ=2kGaVq$-Z#_q3Is0&H;U0fR^oOFGv+Bo}!!p9IhN1BkQqW2NYYH8o1Uw`*uAQrxxD?Ke?I?bWwbd?PIB)fRS^|{O012F z6@cowX!yTQ5tYFz?aOdj+ zwZlQEV4YPfPq(WTTTrX5N^1w9%eS^$EU~rQwq{7TzMr&7n@PxW=g1S0@|(e)TGJ*i zv=IYVVuH%*9kBZMMXsqO!}AMh7!GlJ9Ir=V^hr*!chk74-MQ&qRW99hxk_1=Gz``N z@wIHP6}8?O~JF&wSRMI zmX%b4Nq3XrE2h*%m2Hi_!7+FaSbsWgSdU1sh*+GKXa9G@!WMx-SOCjV5&JP##qit3n5s_T!OK!eRr3$5C!u;uM~FFAN~3P4580S zyvN4QnY59JZYk95nXoO0%Zy;+a-f|D6lz`|Kjv=DWf^C|4cJ4$2Fkt#Rv@%`!2!Ws zSAX~W_m`Wv4EW9NRfZ(=tR%-h>n#7{0Z))}b z*84mJK@g%KijpX)yQimT_Pa07>k>P1Y^RQ5Q`Amw|Do|fF_ZFu0O9|1TJ!I^nY(U4 zvUb_B?BtL-!~w@@98ca;)9$vntwEL&Hc1LEF!g8kx_YO**|c70LJG~&K5xmi_v%VX z`X}v47Yqnda>tSR|7vRgRnG2S`=cxwX4ueR3LDg|_c$w9ik!cN~=S^^|}-z43goWJYR@ee22+0=zp9HaxJG@LU3f2rEHMUj>p zloQoao+$k&b(DYDyZa~q6jpz+o0;{TQ+2BfsCtD0QLj)SP#`1_5G9}(3=~KS07;1m zWP=dfrwCCVns)yq$=!1-b)wYa$mt9SiZTFFZjcn+5@q+7DBB&}Io#t69!+^Ov)n^xQkpL}Rx{_U1d3yz(HQA_ z6Ybe-jeoourS*Cf#f z(FXA*!N!4eLAJ!Z_K-Fs3V*9~gfM&M#D-@AC2~&tol0QJ3{D6&*Ai2|TK0zQW+GUK+ zcUD~vegVkt&6p-X)VmVN5ecJbr|sZtQ$C;OYZEIuBn&~8VM$ZnUPYyP=>E*GZHzWr zD^W^Bi4qYJrL=jTyYr=gUUu2@(|*18-da^LVpLUCR7AuWV~i1X{jQh(|MhII&&r?$-Z@aI<=<%dSIdpb#K}SQ|VtlZ+|+Z6pK+ z2z=_(jm)uNg?li8g}x*P=c7-t3KkxGwsbxKV*#bx#}569r-^LpIfXPrM^-&Rj!AH)B0P}zqFEp7-k zT4elR^7n}SSlieP9kTo_|o~nI^&p&}eYbS49DTFT7s8DsCD=lP?oHi0#d~ikpCyPMG zemre1N&-~Xmn?{ZYvl0s(;AvI5tEbihjOO^NL;M!2W`^Ql8{~_j#i9zfS05)ho{Ri zKxfOsB_{=1x`u^>|HMTDLCqkINh))CyQJVR27AB5%n>Qo9=Ez~V3yimRsaZ@cGf0z=Apk&agHfPz=f1VP`jU=AoF8!vlo~(e%}V?6Z9?xw(L{ zBwKAaCdeSQyBsK}v8pALQppJe`Ti>#^e}iv)-Q?uIvOz`+knIs3oAtzEz&vbjzyV6 z@|{P4zld#}&7Kb0?;TN_kD+D|irewc!$nrr+kkXA*aG;@=@Bek)aeuYR7P|;6Zclg zkq*1IrvUt;Ae@AgU^D4CLqRz~koQe4S6>1YClLQ6*lt;&DnN0l-q!a+w|hfz=T7eM z!r1TDEXQD#XyrI#m%#-!h+3U%Y=g{@%Z_R#2hI(OgMtW@t6>nkh2~~+IFhf|uz$Gn zOvO7Zx{Xs(KuyB?oCg!GbpDs$qbn30N0*2aQr?Zy+ruTR53_xjRxohIh_HlQ&dEiK!DLVO^B=zVkvBZAcQNvrLK^Ic68L{ z`TGOzK@O-x=J~nLT4}jk4B{Z08ckL5C|=|)+(yiv4Kbv?Dp>w5g0$^x$Ge9IwN5d5uuk7W1JKKGTMzNm6G^tl zKsyylQ+ik!JWRn0VF&uCbnOAK&_dcX^MfAY(wI#rspNsrU88Q}sD&}!X8GrgG#R`h z9sJO&c`OI;OciNkWQZImJP-LNNe0k*(hO|So2sIfA@)SM_ z2VojrEY09xl+e^U!~j0Jhq(?eSdg|ZwXAxpWFc99~`b(DcYL=!X)%z zUFBJ0`bz!pGwq^0(jqn(0>P{N>;o@(*bOdox})rX*`qR1aOh!4e7x_JAGI6`?9A(@ zq3&X-fjV9>6Qpi+T8iJfo1IABuSWdns%HW6^9ZCSNO%5iW08_JH%4V^zA5ToKklZO zzz4$`c0mC4qzc2UzO5YtxRuNlTY2#Y3&ODt*%G=VU~dM^E+R=xy3Sk#UNZsy8%2tF)O=K%_JeD%}hJLIsyW zDw6xgDN8_Oh?zc1`1G)2sjxi-g{V8~DG6X18ow*r{DQi>D8wywL|DzDG;W{GH2B4# z;Ysg~(CXxc7Au9EcFSj(1GgC}=w^PiDHwdcAc?ZVCSHcjG>Q}d1=6}^TRF^0FS&|H!*WV-kp0!SgBka(_sFV)ps85e5rhYF?*>gTL?H7I;E6@t_X zi+0j&T&E-;^Lr(74MO)3j=ri*h5;CSb1qmdAo9546|MzJ*$R`(GmuRPkwH6Av5rkZ zWsGY5@7}xAz+G&#M(^q<;~}GdJoUvZomR+~D>NtEfC(m*fG|s}_zEQd*E2S%e~^|# ziWr;~zqoWJs(%!(w#w%VO7YWTNm?dmnLsJ_W2;S%b1n;Qa5l{En}}anYd7ny)iaYo zeHXf`AyDO?Ae$C_EIaeo>`-ldTKhobuN zbR}q;w=K)RH$2EqjNSWH_E(Q1wn(AEQ&-PhTnSu2b(P4T+ntguhD1!LWYaS?K|L{( z#D*jL5|-9;RP{z>lH+zliYJ*0M1+OnE=vxj{Ggkuq@6ETW;cHEas;Z0fiNw%C?#rm z6oudRYK0pWWu4cYeHB#vL;2j+ZMaBgiIfeAbQ67jQR;S%xl68W>t4AW82#+C^O@sYMrUZn>e9<6iGP9RV^dQ9xzgM&PX(+*h*Q(pub`UUtD%?SH zMD*|OSYcw&18?v{I~;4zg+eMRPbMWH)*6GO9)4oQ;` zVtcE~$y=>wYOxcA^QA2d(@|h-@%;S$&#l|vv7r60zJs<^eQK|=6rP9r-M6;J9_>xN z<;pz;`BIY7l}1G|9mr``0%sBkOM_z}^W_=qMkd!O2SG!1q=H9LF4vk#RDdfy9YBGG z!6GeL*;uNdkuEb)%q$wgtyZiwBk@d!M?u&iLK#Sd=36ZgNUM?509xLMxR!~S3J3>} z0zhJb1OQTWMB8+! zyZk$G{*h50SZA0z~hpm3wxc8&nr9!n1u7e^yL@}m`Cup)T7 z1IrUDUw51+ZO3Vey1{|`c^0>s_8yyTA-?Wvb1CuE&2j)4G5xrgb_iTTU4-}qPK=D? zcAjY*2~c+GS0bS@SW}17el|1nOudDO%y|YsBDlNj)7T0GvaS<7b}aE?VdciR_@U=z z0;KkaAg`T)R?@Y>KQ>4to1sc60dK~U{8?wxfmVxgAk2PoeFmQwF3Wj;0G zB+ZmQ(&cDL2xZ_#>dv?vMxR8CXbHp>zP2%480o4*4%DA=x+zqc=|8grh~YCdIFmIb zS|O|}J{kQWjL@I&UQiDv5&@*0h)@RY>70E|jNckDU;q(fIF8?HN}L~-6w0OWdVXT_nz~W)5TZEpuWbVIwL`K zP1`G-DZN-()w-GPRew(_G&=&KaORO%lN3+-gHEfs4v_sH%~_`j21&hVd|_wm4G0%* zhuVIqiqQo7Z4eQ5CH7;^n^%iX=>qWz5-}lOb-zsj@HyrgdLNic zsLeKC)+>exyI;-k8@eJ}i4R(X)pw;%0njy7xf)wu=b5#CMCr@32%eAXSENm|4dF=O z{o+V)_s5sdqT)7xlD1eMqj`l4D9c72(bZURt;Rg(KONFN?~gB=jKp@IivDr870G1g zOJlJU5onpdB}HZ-E|t@-1euuuj4bVsGJSviR#A~zMe5i#3CXD2LffsL`hwoaV~E|3 zfKBH34$A>zky4$9mSub5cG_^u7rcZ{UcX~$U-PbCws+umve>aessx#@X-_1Kx>siu1*i@e@I~!mVl#L>dcg57#@^TiY7k5ho#oD+G=>$(8I;nW4nZQ>^X8|B zEog0g+~(HKR?Y==8D|zmeePF|!oFG_$CGW1JZ zvjw;A%XRRs3(!JMA5^2)L2QvSin_T!o7_@ex&IQ7JWf%@(aOt4?I!HNIsxs{RadE` zK$(!fv`Q3yXKFs`suOg5tdF{yqorauUbwUtYf%^HRgVKezBdrLMWGHJr)%36wq%4$ z>!?$^C%(jAJGVpHqT1N(I<+^N4=P63#U|7v4EA=`wed!zb8lg~7+plb~zKWH?yf0-vewCU}#PW`~T7;Z^3&Hn)#VM+T|gI6tL* zaApH2JR|+CiU?V~Gv=4 zor~ZrrbzpI9bes*JGIE7-P^yMujM0i!V3eUT=7NU>OQg%+MAU=Hv`5$bxucWo}c8$ z3bYRrN6VxUi0 z{=9{*rMR?`ZD3<*n@KN`%~I;lu_RD;D3D`NX>BWxQ}}+>Rf|#fwO;`Io4PoZv=ge; z9Bb-o?P6hWEFsI8f+nmh=6qK;okG@XVIOSZH0mxW)4_~kYiq~zFFm7X{@BL)bpNy@ zH|wUHccV5lZ=p;X)aGhtTBCQ`7^mtVG6}h+JJS+vDY+__sK`*;_JmvZw_Iig1ebd$ zb9C*QVF~xNp~MyyDU^LJP;dayC9n|PbY?~4p%^8X0#d8Ix0xRt8QjvPO}0zLWe^Fg zP0i)j*s`H+Uvqb)eeV}t0O!bU+$35I%Vi7_-+9x)f$=EbgM$PB2oIjZDB!u9mLP0- z!34*($a6a%9vFI$(dE+)b$TtutRGo!*2 zlUUEhtErT9@L$iu2v}J9_*nj-$&iFeDnnkumO&}ml)P#lAo5Ct_AZqaWDCl0(QY({prc6bCF7%e8()&+2yXsVi#FE|; zsktG_JlcJ@QqVBT#CWpUs5=R8a@D31S8i;0+o zhaDR`(WS?MGf8=t{xLIex(HL;%%N_1+yWOkw?}T}dG}0<^i>T7d?fI0a&AW+MJTkI zmCz2r-ot!^>f(D9N~v0Grv7b$v?#8$ah?Ex$9#KeF~+D{L$^I92AS;VC{O}gC@S?# z?=V4Wt{sxGHcFED&I+~hXM(^rW?CY&t&anx0am^)>E2F@FXGZG49=PU!xxDyx7;I8 ztiW=)Azyv00zaaXW_emotu&52V7k5Oa5ikFN&fN8uqV+o9?gR8YUn{g9Dv}mnAL{$ zI5)ELh~Rjx%yorx@&)L)Gc&Q6e8AgASmlsupiBsrTtV1k*e8!6!c*pyT#2*$CbVOz zEeEOc>(2l(mnU$>*F4)w@l!xr8Dfz%Kw4E1%9E9pNd zn;YB3%ES&dQFy+UwafQ)+znhOv4U)D!v({A!=A4b{6?t`}ZL>H|UQ%%@DSKx%) z)?ySPp}R?T1`B9oC!X~aMk)v$Rj^R`pu!{pHN|Jfn zw&PyZ8Ic(W&pMf!Nq#*-j3vCNFPPAj2xJLu-Xhy(QlrX9MZuHJiY9;o8?#LmY{6}X zEsIb|YP}|r#nRMk*b3mTNn5hDj@do6?%`MJjE?TmfHLGpb~$O_&4Hz)fc1xg_KpA3 z=FW5~krKF@Mk&^ok|uaCN=cX2%#0v~_BRYpp~Xj|koF3Xy}87bVgqSUW!q)qgS6u-ToHhVs*?b#t^+U9Xo<4TX}+9 zEg3lg9G_EW%8B~E-MBoWCG9fVp}rmrmN5(~n8k6Fyzq+Y%~6yBSn8^rESfG@=D1L@ zHQ2b+;qHCgP3!y27?pwWeA`P)=+E&w5mTn&BgkbOC{fl)7D%23vI#?=PL|GDs&uM- zsXLKdx9gwfN~Fh3x>)_ieSwT{o(Y#OYiRhsY~R2_&}Xyn!TX)C-~8eGa|QOkgPNKk%&NTxr(e<;u_?UzOlTVM4lo-Aw=mCb@NFsP zV$p2FZyZTddVPnBcVkZxgUBLUATmWj`d4vd1S$Q5|Vi*l3 zCM&VMr9P<_HT_|LrZBBm{04MkgkCy9apZcUVjrZETZXczq=OKp6s@&{5H*Y8p6z4KSgx5 zwZMa3hQrDUL*Jxn+SxI1L{(9|J$doi9CX+z&QL)^UpV0mEfALLEIK0%56rv5Nfd0o zaxW5W_Tab}h-FezEy0cgl3Ke>2OUqi^=XY#0uvTerR$0z0;;nm9jCp;;f>=3uRR>~ z3;pn)*iVR5(~9mAN3RK=QwB5Tm~tz`C^3jMujFmysHaoT?A~KFUJMsTPxlZ48A|-s z*giIk1(5AoGmIt(%Bmr-Xl0`JTBF#vTv(YzutRYr=c48N36E(wMX3E|36CKdbOfx(C z;%rLi#{Hb)sX!}u3&%`^kwDdjCr1Q9 z4783H=+7T3cTT~ip_xkGJ8cE+{r(ER#lx75mgtSGu_~IPASMS{06p#-8VYHw6v<@v8K}f41&87vj^2)Vi^tcUhx=6st@_`;KH2=l zgOF5EaG?DxH%fF?$|W1d@XH``G)Sx!A{`S34#I@vD}-}mLo+2o22!n|Ast|CR=RCE zScv9p97vw$3op6fZLXWFVK7caB8;x|MXXr4g#b~&SMwLQ`8$4h=3>PRF4QP&z18@SG$aj;bBl7eW0Wlf5+$x4oV z%=@9Xhhc%}N8Qm$OW7F97;la|)^;t(Mq=6%vOwdUqxi(d<-VOL+#fI;@7E!=kqSJ% zz=Xstj7fd}79gzK)1Agfp_qSj;wR6>K-vBc<2fYtq3s*pNp04lO;BOq@Sir!H;R9s z$K5m&&~aTN%gkwubVXyqAy5Tx1YD>wmf>CNs?7w_0aWQn66ypA5!-ay0NEt1*U?o_ zb?_GWdA|-&;gk{6P5vCXyA&0O)wgjqA#Fg*z&xmn)~7r^!~4C`gyPAxZnhEz4ROP4 zqCV{_wxzpPqUW|~(u8v)X}eAYS`43qL;_}r61C%A&ZkT#3AaeVpX6>)^dU~w-jo{# z@&@Qq2`LQpXLnw@h$UUY`J;Xwp=&iZ0{^-~f3Lei-IEu$Dve{jt&3n4$RvCDK|4v{ znFd~gydyFa0h{9)?+lFqQ5gTVkP!g_eR6sve41Jr`9!9eqBs)|-?R;w?-ADoHimaM zm)v=?VocSNE#*`{E7JU@PT^iJ^~g0Vl|31J z=K{$>hEl`nF$6_FwV;P$un_8I0#639+1}15@}>eh6d4Pl5KsUl^QhSQ+$$t=HY(F7 zgG`fjT^p&!_0id~Hh%Mm9-D0;@ej$*Dwb=C^h#Tol9(H+UeecX8hPzdd&fu_^5qr9 zj=5p#BYxo$p#}m*+K&@RP=ng$=g7+_L=AnXjogofAw(I+M<8Dk7ziI0VcD;;ZR-oZ zNf?Hjosavjq|Esh50l73#&In8cCJGxk>EG+?Tka>GnrFEFqNSdNf3f>M`1<<&%~kq4JGC1=kwS;o!ti zE3sY5(i?nk@cfd$*}*1a#d*(hJne5Oxuvink`LPE1~x(*Ve!E&)q9r_v8g*2`Zz|f3U)lV=AY|M{8(zOVd8m{`HjZbXH{M6d zZaooT3p-JZ$afPJk}$QFW*@VS;abkuw$YmkM9Dp+7qK5tIw^*Z;aWArki&r+kI6Ts z4Cv`~^7$d9DIt^@yWpPdNecp~faEkh87)jUk;F}%2!#5$O~DiBI*Wj?SrUe`R6aPE z4B@W{cGGu$agU^6!E8{YD7k0LbTQ?2xQqG0mf3Yni!0{JsceH(O)i=@YRJqgp-46YKK-DCISMS0B4JuF@20OR0WuUG^AXh z*)lKRq#+e*D-*8SkKke7WJgXcXdYs4ms}RI@DW%_*=^#99mIOfA#tLy?R9NKRJKyc zQm1C>FF+7&^!$vn)3IFh2Q4x?yteEYLZMQI+TU1FLD7$eELAa$I>G&j%qD{tJ5 zWWLgVIz_S|fyG+Ypu0K4KMgP(`I|zKe4rS_s3tFqPO^Td4hDAHGRATh9AS@Q(;JIo zI2%UgwuDB@o=0`fjNZDf#U_|kRq5;%C|@<2c2g8Jx38kw`gP+TtSUUnLs@4);SWL* zH>z{XJWYx1g_JnKX691x9r7`H2joIceS&ARXQs3#voH}*!HDA4y}1(cl$Fga0DSV{KA1nsM?7pM`M zxG5F-awAyFX!}tI3_{eKjjibvR)eVT1>atlA7pbJ4V<*3W`*JhJ1JV6-8!^+{EL>> zb_MG+E-?5tA5xn#T~2ULt8X|_j~pEMehK&oLfF|b_ZNP=?beFHpLZl3GZ_0t08og8 z^!qGm;>y0^{K1R!D9ufb{}o|f|1~_`fh0&lX6)P;Kr=s$oiZsHp1fybVdEpC!CcVRPe~Zju77=5?>D;EZ377 zKU+(Pu~Xz@O5IkaJoIm#D9&bkZNb?4SN8Yse|=8P6d92I(9&8>3rm2Q7A?^k3nM3j z{D;px;dWO!-{}srL+=dA0c#J?lJrCVGd)EFGwj4`x0Pf zdeVEM>9MG8AJ|V%uyXzFz25cWEIA;3L(0F2Cv5Q>FjnDLCBbqq=cyCT=e#>xKAtve zepXR+qqGmOu_V!28=Gmx*jO8i5nMlBp&f<0D|Q6j%nt-+yAM;TZ_E;JP5fgZxZa@#; z;F5mhkopDZ!0NB;-a3FnKI~>4LHLAlPl#|~Z6h@1P(0i?8w(8)Dn$`vR9KZ1&5?a} z9p>QK9$}7HH}qE@gUP|V^So^OBY#MdbnUI?7^*OK)32~YxSEroR;1!UjUQ$Uip{-} zdevzC8E}s_0R>y3yI*Qs)-yrGP5rEWyk~pP8W&Lup(zYFVQLTQPsc2Ex5AJ@k(Hfmi&&0P_;Tiaq6I z?5nu8AzuIxol^ZqCkv|8@25p}x`LAh7+(}43xSx%tQK4SVFoLL8|yaIpDN&zIyeir zJ;MZqVkjksJA(BPOEE-|5DaGS`=frG7q}Qy7+r+DLV2xZ>UiiZG;P* z{ZcoB;hZc;WG$OLG;z~J7ym3zD)&82Ad6b3e{b6!z&H4y9Qz9U{e!%pf$WL>{>4Cn z#;k5)J>+MBiMP>yDrpCw#;=SXjp0=sZVn^obzXBe<=Ln=a@;*l$rb{?E=3=&S;aiB zkAVv9;hsH9=gU6QK?7hvv<2->_#&x#w(EjrokRxTf-72gELnm0!fF25ybb;S0}$oA zxm;T;BA1<|G1O-BIXA2Pbl_sQ!QHSorqen9@$C6Al5k?5=s6xAPvL>>{+$b6lMDT7 zy3wR{s~xw=!jgmX1E(>Tiz*PY^~O3rwl9+fpXlkgTcBR5sLvnGEPZ{OLQdc*4VO zca1Y0QWZ6=mDf4|+dSovQzZK|8mZb$OD=z#a2PUFHk?6+84IdYt@SqVD= zHs7%ZQvlv#8~E1UO}|k>BF~5);4gnRh@yC*BQfX)P{k;2>n5C|aLRY^6=^X~G=v%1 z9||9ChdpA*w4_kY#M5Z9TLh}@T8{kgg~&3ZdgsiEe@0yIlEENkJ`=Q{*ZG-`O6b63 zW;^Pv;FGN?eZvGD)_NUQ`t@Y21LK;bkS2;GnFW5vrig?>F8SbzzwU%RCL#Ub_5A4E z&|o<9LHW?v_ASM={oLm^<{~Ql^Z~)9^kwj5Y~hwfHG%fx0?i9>#Wfiq!2kpqFBc)l zIn!I0=f<|TYGh&5P3{Njp%^RW<7ENgD~xKNECz`iI*I2N@RbawzyUZN#z;D@=IoI&J|Je`;OoOI_N)uly-OHR4678RkowKFH&0i_39QWa>=>bGj=y z1wYsa20va4xhQP4Dkp1WLed5nlT&2@ign+Sb!Oo(+HIm4runcyoa^p2WcvuboyEun zazPWyh05@H&MKlOUnpikZIRZHMYMPHz{eX;wnnV@)2v@ySKx%Y&07P<1P2`@!vajV z0>O^ODcTc;HPrSDZm)3SGFWzs=gwJfsNvLX3JF+lS?TU4!d7qg(FUF#^e@LtVk!%j z&VcV~z1md<3Q5?!DTIvLB_WxZk3K!|tI#{S&+v%X^UQD`OzNpg~xl9yhgJ0AACc7 ze&{>%h6DhdIVx7}RVs1?KMcEj==wc+IZn7$a?OgB!Y}TlkHdTLeobgh%Y0ChxQQns zl1ee;@qkz#Ag<*ReN96FOyx}8XMmQT?bl6jo&=g&h@erF9tGqSfgdtdgF_-eS(4)44D#xgg}b!i_v(!s=rEOOmaj+T1T#E@_U&X84MBT8mL_1bjj zss%RU@HD%>lj#G-?k1mCGeHMvk{xqeBVC(;08D<}r_c+qzM02pGRf3~+WJk3zC8M# z*$tv`?t|W|pu8VNpM=5U*9Fj+NE4pDX^z^!7XCb2*K-@$1l?L#cYRv)D4l!gG3HdF zg?g>fXqLuRq57A^X>EUC-2Sv4x|+AxKpJBV+1wC82ZYf_yA9nkod}WRFSTp765Wxf zD9D0HyCSypd2?TvikmdbgDz7-PC>tSh?3iy17r+PT9kU^^3WtaHcGDoSG_W2%#uin zWp5RGVPCSDm>6j}IV$deCUDB1mudKRjPTBHn8E|q%hlsSDw+x!=A=OAQ&AR2)y;z8<9yn2#^kb3V+`U5sBT^gUxoqA5d=haW{a z(Q-$_vq^WM{Iu)hXQGZ^u<+iL({gIcW!F&kTK#bVMxoJQr@`Xh1Z4Fm8}h1CjjplL za?DYUL|jJ^wV*~#I-Mbp{ROZ-nfxJjur-JshTpXJ*`XEX_a7Wq?tF@dynM8f4i&Qs z@V{s@_d==^IJQ?nMg2yZ^xn-vma=hC$uda44&TlKlM_>#C#Ot-;}Vp5OiC zb&;7g*wkSxo#eXBm*_o5%OjY zTW>cO$xxDwMG0RB5DA3ytkE|Ee(x@x@mr@;1K`q%a0L{8Kt+yvoGc=zeg3MBDE10E zyH91r0K@;JDT?RMB98MyXlgg2*^0ysc9-VFRwO+Yg8>NN!-qJFWjc0giz#B%u;s5z z{99Q9l042}yqqvBE7!vpi4Dj8rmRUD7GINELatTse1U}3L0wvAv&;FxWI&8 z9KNEYNoZB=NWDJ4ST_gW&~d>2sinko5hXiB@Xy$kQCv0D1GyvgN?mATY(Ds4bPc3p zo1Sl$tbh=KkgSN}YXxK_(oj*)CtVpCWp4M#Z)dWHd{g@Ye=LXfbt)Dal-WJ2b7$Yv zu=Hi9h`L;e;^d5gqeeq}AJiy;VlcaFk_y%@;IJ2Rg&rLZTqRK3lz0#w`AA%hVlUB9 zCsy1R8uyYaaRy=v4OUS|U95>DsWy*}FIiKF{ZTq|JVkdSTZ=^N!p!xZ8CzgR`5T zpXqNY=&Dqk4d?u*vIvw;v*jLw;~2r?ffc(AWov^>sPoV)Smg$pjYyQi2Z=*Cdw5D> zaUzehr)>a(D+RzH-&r9PR21sIQ~7*>Se zY0z8MTRtEh4D4Yww(p8ecJ&!6@neS>zlsxx4qTIt@&{uU+AzdSxI7d z<=Dl1f2G3J-!_K0Addptf8k}pD$kOciixh>p_|qX+ss~*bx_~iBykQqk!gV+ zn+!N5#xGoPGFj9zi%3t*q((TUgqpFf^4j&eJ#SSq<^S2zFKHn25ff9}lXDx0>Bk$X zX~6o0ov>0C8Ma;RCu~dKmfd_ADyc}Gno~-f^ZDED$LJscb68ZyD$9lIgq5+#ux-1y z$u$EUs}-)x>lIWVLq*=SVgv{B7=V5Q#7wn#vgGJtc8~0;A3lp*kuSE2w7dBa!()&D z7gTzvxX*kJel*g6mUcME-T_G&U8^uAV=X(XfwoIMZd2AXMFL?O_LOH(pB;r=q&20% zO=!w({DSF6>K|ar`@YG*{dh9BO8Syi6|MZ_=0Brab0inRa=1;FYI>YC;gM6&J){g_ z4M7eq{eoWMZuR_$^f}I#E>hXZ8k)e~J@$Kvu!oQv<5h9oI@m`csa09LSVs+fJgjWr zpU%u;0a!c4AO)k{IP4<|%|xq8qD9e$VvLp1+z^-&74jY+-;lJbfOOlTJ7{m5n1Rxs zOY(`-_nmff8u#g_S)`Zg)Tx4CvW8AO6&h3TNNUxzWbvJhFXO{#eW(M`27ipus&x9= z;eqny2j@g1X4)*q%;}kipanv;G;_Kmm9_{Nh3^>8*vQ$HDkKO!f?VHz=AVg0j#v+Y zJ-T(@(wRa=v*;irYs{YrFlUC?)apUAPfk$@E~q@A(@PO z-DG;Fixb1MrOI5Qi&S;4GVdIS>a z1pX94OwIM?1`DXLIx(55!9lo=N*f<(r!oaJS*idqK+nH7#F)s|6*AEdO3k3bK}_J^ z1rymH8@E79@r1=eo>G0Vh6bSuwM)&B$6fyGVCLwUFCjI~(O)e zM{%`ALY2~w_z;6lfQ1Bt!W(#-#O+NHrpCYJ@d~&%giV%2?<#1rFlQpzf&@w~7)3zq zbWn;8E*6Ph;ZFMe_(toYg2RA_p33ln`Po_`9n-RdE2=twzmhI>C#rGQb6 zh|mSHY3&fduf)S2_NduT-;`kQU;Ek^@`PI;57t(eknZY;I3(M!J;i%iwC38U@DGD@DO;&yKdn)Auacyc z^AVU#A+?lFq_i}*CW2TAwbNLJ{|Hj zTaL5RB$v3ALK9k#NSrcTtURD){11-bv3M{1abP)-&-S5#AGT7+(ZrJeMKD_R= z8x&07Al>(3w!;Ufzo|W%#QUef+!w?48Dy(YspVOZMdwI;(6=W7B6QFxte|{C<%d`@ zGO45+){ga#mDZ^&YK$Fb`vf696^1H(f&t+Qm1FM{Y~ZD^$fsHT+nAg}<_?Y1Rr5TV zQ3I@X*?m|b(}uaLHSZhA1WoLaax^BSF&`jKs9YicifX94aio%f6G?~xGwGeTkTJlmin~)&+%iajpqne}Tj{ zSs#s|uMgPkCw`tLgw&zyfzClWlx`DqaBG_MegI?${<$?@8>mdH@h?nL&L&+#U+N0b zdZAg%w5xcn^>|k-%m`E3=x@{IFzopivF!L;MBIz1{;i7NQzkH8O$%|__)>Riu#XtG zhVz~|h|*20kmSfPIEpvm43)8&>wLNulRZJSH5+KQ9rHDU7$=p{UkGiYtdWnxzCzHq zSuFS5AY960-K8`1RVFZ}n4^Zs3PTtuhP*bp){|Tcg>qb2&LIZR=7@|HP*ME(^D{LJ zXP{Et>C}3W{0Yo;BzG78@^X>~$MIJudqEO^W2t48OY0&cRG-UY$_c6{D}9hH$|v2} zDpzTH%$ih+IGLep4|0tvP%xiplE)*x_ejC-ZDW^AB_4kCp>Z_lrR>DirK{eG!j2)9 zeVD3NBfi-fLaW+ptqcnV$FcT>MS;;TKHBR40y}7YENe(h2Dp49@%=JqO_XGJs~?;r z=M;-5({N>a%ktE~n(=koXQaxp>S$fSe_NGKYENZ86v-$el#Fml`2D9T218vU(;!hw zm4`!i{KY5HEYk{=zGNn)A-Q41LD&kJ{#SXEST%213Lz2JXfF|VRgmhUl8rUVN4lP? zVFNwO+a10dOb)>b?WX_m$9@=0%vm+aki;FP5`Tl>tr?4mVhqlNP(Cr-3wyW9=@_E} z6{S5J3B9#S&vNeATf>^Vg?!87aXvY1?D)GIHek#}qP{fWNvl=56x7{CdVRu7+22cE zMOB+d?2jtE#+0^qcWA1|Uq|vl9#Q($O&!JLf5S8hEJOaICAA9Ct=k7t*n`G&%V2~p z(2Q&Vzf2YGUXQ9WDae5LNEKzq-e|;#2)2pE3}ehoTf$QaL85Jq43x8aFC;>M&1OjD zva?+gxlJY}C-l#ZIxODE&%xyHoZs63d5BNgbF}$wVeJDP?Kvh){4eMm@#yOFk^ru| z691!dxg(Vt{%_66^U~UzZ6kn{9-T1B4vFltl_n$H5J$x8u?^Gc@d#qoJ-_T5N2fl5l%U68eoQTy^u=e1}PWvaTIwLLf26uuStTDXMiso2SH(g zpEPYf!vqpQ&qq-35EvakAawkBv553?x7+bJuemiH^21rIX+G-81IzXUOBJYOCyBDj zdd2;GhrFCHzI!=QeD8AN`2OW2@q^1r662lTCy1q z5Co9{1)6=dm_uYx2p4Qj7^P4%`?hetBc|pxX$vpZhTFbm`Dj$1t(ssOYE66-qfDcM zN0u;@h`6)7ZO@Xz*d4u4%D*;8-ViVFa)TXNS86B?5Hh`X+H?l9vddc?Lj!rR{X39m zxrSNc563UAkzlk}D}T&NCxvSodnR#DgfpT+1eobfwTQbInHia0$LC&G_oA`1I}N2? zIkhYyI3cGI$&BgE;ACuXrkCnu*0VBpDy6-oDoL?&VLJhCc%)%Cqo-v94Pu?XzWDwB z`-f?l>STGZuUE(3(mwE5g7JQ8f0ysi+lsy(dfJfkNl)4s?} zSc|i>Bml)qM1lxN3IZ&xe60^r{L~>)O==NL6`Ev2g=BqkCbu(2i62zJTN%eE#*sXa zG%kELjKwDBc|Q3N7cjtYL=rug3{n;i(qg7pM17s=O`*MBc8>Ru|K6MfLc*#CDw#p) zM#e1}8sLS^NOD|U*-BV4lSw8<|KrRUW!{*oQz8sUS^KK@1i;B`k$M@#h5qBeiy&o8 zX-kZb3GvLaW!haGk(!B@z6@e^%OP+V3Gcy`_KUZ>!33BXcc_jS#r(VRtd*@rS2jgy=^!5 zY5Nqrtu`yPqf$VwE?R9VFohgNc?>+N@ckB$vFX(VUPBVS-i?|RCV2btxm z0J=k^)T_b+n0>quTxr59G!FOH^c!6WFEh=dV{Cb^Q)Y2!+E+;IX@w(%XX0-+*MlI3 z6eE`u-gQ=C!LFIj`+9xa0kh8mMjPjlq+1HBB8*beFR~@XKz`q2X{%0B6m>58pOY1p z%tPCJuxP8=`xr})_c)54XYO`N4442W)M|$|&>FU9Z;#G}+pk<-+V;9Yb5&{vW~+Oh z(dSM4nN;!(r_bopZJa~Re@iJ1tkknn{4O6lmjI#$KfsbX#XyrNaM^=0tjijgyv=gs zP~;)IHC0b|E?h74k=Y2)sEPFhFNgT48VFb9HUdsEf)VgbY}yJUYcJc-aY)|EIpO@; zR$L?xhmZ*^ z?i_WCgolgqd&KS-uMwRMGRVlcL_Ws3zW|({%0o?AA!#}k<(vM^l0Dlz47|p-rUHXu z`2sl$tI&+IY&Ks-G?UISSWKJk_d@DXl6SE4)QKWj9@~Xo6XqVa^5tF0nwl*SY^6_@ zk+}V4Z*~XODUdL{enRl9c&K@cj!8|rgZ?vQvTa;4(0s?U9 zsY5oD%(S@|22IW)_ds2aYh*P@K=g;PWrv+d>d0S|(1kdYcJHyT2`Y^V2!hG}F3>1D zvtgly$X>YwU5+Fd<~r|s=uLs4B6+u(e(*`~VCJBR$5xnj$ZKj40awB9U`<&5 zz?-%?mf*0^cQ^G3x4Fy(j zL4ny4T0CDXv6p@9gmth|oZ{fP7j#_YJx3p#@rPiq9}^t)A;DQ65nT0gKAw|*&y~LC zes{XXRW5M06CL9qd)NVMVFl1p8X0MhYLjcJZ{8`hB`Ujb_8i*h(DC%GJ|P(DQ-ZNR zBbe$Z1ao~Zu>4*g)?K2q^^q)}t#{FAp%4^~rKddRAdHiRH*kWuFzOA?`FFzAEO4p;i+!0#}e=m^I-)d{X}j!dHOzZK_lImS+SOA%_T>%>}* zUK@jk?2Ndo!~b5$Vh#xsGRT+viK95l9fh2`Bc;Yof=|)m# zI9<^B;~QkTT$!K818<(v4)#T)IMT!Gd3wYwZ+D+n{K3YGJ27 zz5%d>VgJ0}_li}QA%Be+=LrPFH*40jIB)>$&>?;&PEb2_syt^t3!M?Mkhb^%1(5(G zM8qfEdJoxeJJJC9F7yQ+>iU~-zXtA1_&6}&B1I~vHIk;=^%3seIdSjar3Vk5^QeIy zrl;oP>3Q6GUefhYy?S-v&6^MJ-oegCy12@x=Cc|Mv$ZxLm>sRIHOx-aN|V!-o?lz% zqF1lQ`V3lO$dGl0jo4tc#!u@^nAAJlrt2X+3|YEziX6F56pu0sfC`m&)Tq4;-TQh# z^ypn+FM-o&6Mo)en!tt@2{N=!um-^#GCW==FH8u93x_X41X7VAk%$tFQj8cBV#UG| zCl0ZA@$e)|MkAB2vjO8&eR0zM{Gl~}z~(gH7Jz?M+DXGd@EeTJ^GsX*MsDSuj`qBK zOp3G?3fP>I*2Mre=dEpl*kg~NIgqYb?R1?v>7`G6A~;vH^cP@r>L#_%7h3uUu(`Li zP7c`Ij8nD-=>o3dz1DFgnP=rAS3pdIr3G(DI z8*Q{`&wF0H7rY=wzI>AuC=jPmp;+UMH`N3aOfk_!lT9*7qIK3uwcdJ3HrOE9MjKgd zvPp_py(Z0WyJgz0wQ4D;Q%Av=F4_(HPfakn=?np z4k%rF_L$hW&&YuThB>yI59;Flz}DyaK`o2}xWTlsF|c6Khy4gWLPUrdAV$m#$s>U& zR;=vsmGA+Ih_o>VM2WIMxQ{*>JpQt?0t|gq5vs&KISzQ=);fRYvpRI3`D@ZN7F4WQU>Q}FYRBI9ST1@^LDxx)}gMA`c&$-W1yv4F}idnAS z`Pg0G7C+tSYoUiO=%sdRXv|vXvWc&bI!0Zea|&xtJ6yWL0stNap%4Th2oXh*cszzc zfDwr-5{XQqaHv!gosMHL2yC{P!{KtdQXWsv=ko*tnNTDYiv<#iN-9;zWPG_?qEIN6 zN~22Utkrt!bnbe+!C-JP8ck-i-eU2z*<9^*Cx=7hbb7g5TDM#6@#wr>f1l68@Ava? zU9lq9s#TfRtjV!qL$OVp3T@d^VB5BQP`gU(*^}qMfpUiql{s>x!m(qWPMqj)>Qt*U zXX;(J(B;ylT34=AxpuA2jT`N5-D-B{PMdr8sy%p6>CvMGPoA`R_N>W^7d3hH(RlJT z9;*6E7y|@hI6&dVQp>7#>S+rtucFh(+&>$9371~IRQI6>-O-l=jmzJ%gc_p zw>4j1P(MHE@KGo+8qLCB1XwH&heu>GgF<0bX+k;^vRF(u+cj`C9$JM9>A76PikRXo<)+!)mNaH+1TZIuBw!9%igj%1=OeQ0x(2xTFY7oQ#LAdC2ybJ~*CX+0SMUl;>5(oNQ zx)*vp9uq#Fl|aZ=B;p_zbCO8?lF2yB<-8OMK1wA&l}emiCsD7LW-!S#TjX1s+|l=E~I}H*QXpD)j@n7Egq0*(wTaPSNDd zknNnmiwLjFcO?R@y%6^5vlPDyoC>7@gE2r57%~X-TZkAg%q)T=OBF9ox@4JhrO6}7 zVN<3e@zjz~lO?;Qt^<)S!>~-57E`9FFNj-Ja|^lEHT4H^8y-nFQ|ZcoGiF4a zH7nk_b!DKS=A1ee^B85s#M zm<|*w2L@9NhciMT{6r#gpis0ZDEvdCRZ>zir=r4%!I;8g&Ct?<;_)na^JZhMwG6DY zPKot4K-Q*>9btqDr6ydsuOdYFE>ff~qD1*7Qx<&La?r_@i(8&NlJez~R-k~qLWPtS zDdn$BnGog5O{h>|L#0Xws#K9tt=gs z__S&Qa&H@9rafKp)TvXt9zB-y>Ls90A6@ya0!#?vlL|!i)9I$Z8eu`1&?PHUto<;Xt79S zsaR~iL}IyAYNbqOSt?thRx28ftkY?Fy_(T>8!?-0%Bt0z5}pU|>H~cEyyM63GXmB~ z5F`jTBD(mc^g#Y=23+U z;dIfgS0& ztS@z#}H-mTRNpHQ$@0q zqrT|3vQ(&Q)oD6;OCZ67Qa0V7$(Wqco`2Ia5SkgmrMI@cz3uA&hda`-PH>V_oaRht zyU@ihbA_wj;3l`a+kY`Fjr7sb&CO94`mjjJ$KTJ#vnUaEhW&S|m!(nWdMwI!5VW@S}X*Kkk0<^|;q z7R-VrAr)$qOps7f+I5=n%3$#ztui;y#)sQ$e_2g^V{=#E)(_J_KMxpCC=tjBMN15E zB$EM6IJNXJC@!D-yu6Gf^6GCJEh)Z`+`_pou8~_J=;+JNcDHHvhDMD#PQuNqi`QE! zE23g+UTt|^S`DsYJ$ysUwtdw@>vLo!hxI>{rh+xK8f%n^x;ZJ+A4Eze_0b*YX`5-{ zP7I}9@s-1f3?je2l&D+Z;tuz%zor*5R^0?a;JLy6;*^(QVmfJQVqZa z`+Q@sv(pxAL7v_pVprH2TfWQ%!7jf9!=69Sdaa^OT~4tfHl+C4w0YV%Jc5Cpf19qD zwhXybZYriYg(>g98w~9BDHz!4Thj-@Zhts;?Q+ac>7VM_Y2LJET0=e4UiwcMM2*rXA|2K4E5c5-yEwTUKkQxjvuDACkVS5Z=smlX*kj>Tl8>fSTE(A@FnH;sb4 z;Oce2JMt+UrT1)AB67v*;qxudg7$jww3sv~76)0SRcykBnBmlHW~}Be$ry6h`(Y@CE6S@z!Q4WN-d z?%~coRq+jvu#CjdN6zo{TGAPj1zh=TGd>HlD6Kg^yC2~dxhi*Lckaz&hWvvZ=zua* zrV3eMDI&$dP~OoG_hbE>f$r!oY2qw|dUv%M>g#;T^%aX#0bgbwy`_#i@k8jr`|2?J z`j_=EWP(;&Z4-hv1+)2|>d_8t98GGZ8EB`EJVPC+`-M^aYH#hYgLSwLe1j8;;RH$1 z49oF?D9MVd>4s_9j_dhBh<=4Di>WvjTF%w!FaG8q{^dXZ$NyW1NRgvN7d2Y+L~ry( ze+$+n5 z=-QJN&F_li+>KVJH(5mUzsDF@uyitL{bQE-;!~0e7eWRXNA=hi!I6+e??-QT1qH|&EfL+0-;DoR!&|)QAt@vRZU$(Q%hS%S5JR{N<$-K z6H_yD3rj0&8(TYj2S+F8;(U5!`u)}Gs^5S?LxznQHCB1sVunj7Gj75p5HN@-(`L+8 zSTf^WL+kp)yakJvEL*W^&HDb%cCPzv!=^3UcG{_|>FztG?I~aFTGGexGu2H{lqwEON~3gHc|~PabxmzueS-^cp4_?i?AWCT z2cAVF7x2X_0T0m(wvd1lDUDO;(FCV|S#H8euw9KsR{DPvYn%cV7cJTD<%KG-o(0ER$e@M$BEXbcWdAd<)wsyBqUv_-}eXIW*1&r%QzODk&|TRVFP zM*xJv;0PoNjltsZ1R{w-rO_EIHiygO3xp!E1dAgONn{F@MrSZtY%Y&46v@iTD<~?f zsH&-JXliNe=o=Us8Jo-xH8Z!gvaz+Z_x75YnweYJ({IpFF)d@pO_&4%F=g6}IrA1Q zS+-);nsuADY}>I*mQkL3B}%8kRU>{QS&WX4natff%8O!DvMAy0VxylN3jS4^bNY0~ zpyccKFW>O-0tAYbBw1eBKOitDWMbn$W)l+1UmN+W ze<*|Neay_NhNSutRX2SnP&Hi^BG@8#dR(=RD^c?b^}u?R3>lTR7gLQjweOJ}&Wuk@ z+GtrdR==>Z70F(}rdFckDT%Xy#%pa;58@^U@Cyp|Ab?uypS9FOK2alL0c0b9h!jZs&i;7c=i2n|9tzXy#FBwwQFtDOVQ*pC`1ShhE_s_0p22` zUinmozyx}u!qlmjK(*HGPr@TzNLwPMbstd_MNlwUWJn0^_rFVg^anm@Txj+>@e*RU zH1HT;JW5kqVEE{!;qW*fOMkQy9jJ4Tz?*TyXK;xLhH^o}_nFKJ14!WAfJYOW%gOB# z*bqKX=QJHG43AvRM@xnc1;C&S|&IWc2rLZcsR#iuV-ds z1mbv-euU%dhK%@96|J}sZ?5*!e76>?hQz9CXhCQnbT6R3;R&m-ix5H#-m`>QMu=xb zBKgu6uh2w~2*4mAmy_&KQK%lQX}Z9uh+cf$tf_dKLj`lv@Cf#ABKg>^@t81peh84o zT7&dZ46nU%BxXEZXQcG9>tzlcte2@J0_nR35O&16yNG5O9=&+ib8S@u^v!+_=nGgA zD{G+wo50l@#V)#)Zu~ti2tPnoHwMHv14i7(7(B=!Eb~$q zSXuWtEit}rql~vL`%q$=Ev$M$rU~-~yReuN2pGqX;%P8OgxL40T1`T3#D&{9kQsuG z?kKn@t&6w_7|prNX^qVhK3BQ-*8@?#vF#D;@CV|1smai6$6OKe0E%7+W!N5hEur(K z6bAfqfgivN49RkREM|&EW+^nV(SmnajFb7>w&J&Yj>?!0bQ{IM z(f?##%&u;H3DF+KMicyC#F;3f|Dlwdc3NNZd)uiynC`tEX=yHX%wjZ%kt~Vm2r6aDTC> z3{f(~)721>o$Gg)YFiA;BN7a=tmfafoAHL*ndgqct1aT^weI-iuMuDZU(ji#094*! z=hh5s)Ewc-bCY{iwZ6B+PB*4iE!tL#F{ivWMuKPtGn~6r2gQ;G00);!CCDo}#8^W> zcS2eMeqpSv<}6lYB66ldiDnf}Iv}RHICieNdL3%5=fC-we{r)}AnjEZH3u=EsF(xb z?Ltw?8Ris}pMrD&ss;*)W&*V;nXTVttyW9fQmvIbRTS$;I$p(y#C(Ws`B=y;*y$Ri z;B^F9?n0RP0>g~44m`wVpEVqB3;>wIrsRP$Oqf~PF0d+AE=_rEu)vLfhx3X@=Z&k+ zJrc9Rd+RP0|+MccunS+XITZMUg}=s=)7Npa}?_jJSW1k+AE&5%^X{A)RL?G+v@QN(KjO=U)PGS zFM`UfTpHsBWyi7T-Ut;W6Vh}-dJciceGvN4!<1PLWG|2?p+>lh-XgO206wn>2uu42 zOqmA&9;$P6c`^g;jo||f zUVnq_ga)GnBFG(U3DFb@8sVfFZvoG~Eir7cZe-+IR1tBc5zPk)%wmx_Rxmkd_^5#t zmGi2FJUO${qr&E1!AO75QH<9zvGNlz5jA=Fj?x4o0sY7VQQC6AWuOI`%qG)I7kyx_ z{_D6gA~S0^L=)FV!Pgrzp=6hp26sv!Jj6Ge>nU&Z_rPv4_{FO$rm*2TsNT-iLvd;n z*8F^&REcHBSH%aYz-a~hyb)AhaF^BEh%lb@2MSD-=;SW|_^X2h#h@QdnK4Wt7#8dt z%Xtsy1S`e*P7ysskuwD(@}ox@RZ zQavA;y&TEF$c4DphUWWEvVqxB%y&)s8>g%0#5I>Oc5cF}l5pvgh|+RfRxfmDb5w>9hja% zkZkZhs84A$LQ|kYiWjnQ&vSP(O?wlVZ@PGWPPj1yaL>GReZVUr5))t(`zn}bEu3?@ zZH_e@%%weO#=O#L-%plv8jS}1)VPl@#sCxz?FwI zJ~VYS)FezLLl#mnrUdR#B`)c?%#9%kNT!-|%@1ob5gk_E7s#CJTjD?u${);HhUT(D z>(itOnW1bXiHP2cw|S9n-I%RSIGGwuC2^O#I;(%=7c^ua^w21kw)T+}uoyObbErJBmudH(cpF(Iy!;DRo z*5tj2*c{K2p#|-I&%~aR7LFq^;XHAQZ#;1R4p5rYJcZ*Zx;UFNg7ww}*wL2FgI^Vwun1>b{a6 z_l2-}*zBPk zWK!D$FUHkt5`>d4JyCGHK`iV$ECGGqG!3v!6mgLcgv|{V2w@Q|CL|+ytC5zqo`h*$ zUvl%#R&&%x3pfc0gldUQ(SpgUsGsPk`a)!Kf|!U2c0_@5NIy-vfaViYssgs8HP<4g zm^a0`NDCGn+fdtpoTwh+dBksZz0uLcLP5ugIOX;yd45b{m4<_`PgT>bNOV(q?UbYx;2z1)~z~9HnEA`pCfR^6krPuNvAdf z*EHuCIAD`GhFHXNauwCHr{6sj5tUDA;ZNbP^Q2uV-1k*kQRk`eIHhpvK|QeLJ*C9= z*dM3chz8~#uR4jb%cwkndFC^iAAP{6JxWIBY<~fHM;Vf8QkT2VF%O8-Vn5Ahqn3gw z;wvRL>luQV=&o8{w>s$tb7qBe58c-vfMVR6gTc7dN$vexgImmZGS8Uyk3XWt9{E3) zV!dyNst(#6wW-o*`q?yJnWm4%@-Rz$t6Se&57JJHj&cPr9)GQ#XwW)^34j74U0B6| zQ&gUf?0E2-oJ{SW=AuYwiTWA}yKJQc})TV5#yirPuAXcECy)mOjSg=H8S-IuP{J8PDD zl>II9V-Zdbu!i()Yd6vwh3%$#0K{wZ;Y1FBC~1~Gy=A^8B~pKI`087hd!=)6)u4*ef7f4Hk@p#0jC@pET6%Wqc?u&CR0Ff$7YCQ>=(Rs<=U83c zIk5C%4xx6F)`fR`!pyPen2*PUS$sRtR8`gJtfqb1%7*2;)m8nD z|4@Xlq+K4IBC2c#ksM<~?hOFler*Nr5D9+4Mg%o>0p74An;bs7*~il)Ex1yGYJ7jy zefAZ+j(Af2B8ma5dhcrt(G88gidO$ayBQal8r}67W)fV-RjBSflll!O{|^ zc-~P>MKdV>@A+(>bmy>O2i$#cTcc4QR}E&`TCgjk16?%p8h-4{VY`2(Dedi1Vuq&r zK+}}ZJp46Ocq-}FU|c}N+Xt8i(cikGuIM(dOAh5_(X364g`!qkc`CTBWidRTMSZPG z+d6u^E>*pfB-;eZW}!&v1Vv_iR;e@oo4G^0ze;+ol=^(BxaTyjh`8Wvz8)bApkdcx zx0`Xg^LMH^Kv?JO%3nq56#{A%wFXWoGpV-^69S`?@x~IaMCzgndlo5E+;YInQ4?MXU1dR!a{^2KR_zjfg2k_1dsVruXU*Dzl6cA; zVlDG#tw*Bk#G|%i8?h=)ZMfHga!JGtif*gfIVyqSh>%vRO)FvOxfuw9<%MQOi`8`N zWl=9R)UPO|REqzhQf{G%ESx`7w|H~?>GDnO?A)0eb0Owvdg^g_y6a~2V00FZ8JI0| z=%HvljLws~Dp8*E!PA8F>ZDc--`l`8o>gOo8#I`+Qdy5znVIlW%K_FVyBS8h$hXmS?`@8oRy| z#r_2dU=l?Q{7M7ARiNq-KC&jbn3}^}O*-LOYf4a=sMGd$|#1_vd)h(*9ALWFE1Q<6cf^y>XZe4rdb%a}X^9bxtvcnD za=HY5<(!)Jo0Zf1H653}b5dp4w&8M#5TAX~saxVQbv1?z45gq{YTgv4`GBv|r56l` zc32{6BW=q#sqcPio}gqw^VelbM9i&{iC@*;E2>-K821AtebwOQVPugi>$cLHyu_TD zrqVJ7^p8`sxyz-+4Bc-<^+H#p7N(0)pC;W%0{y|?as3=;=UjGbyC}PAgMO{gcXyAx z;2oXedARc?ME@Qf9MxWqi0jarOUl;URuR84}T5Unp$-|iP>OJEmXyK^-!0BN>lg@8lm1-hrVa0ivs)Dlpd`f7tVJ%DBkz29mMB$b&LL z^zH~4S*@Z9lEX9Pw}u2~Ab|Zr_QA-|Dv|T|fbd%hNvO-p!xlubA2k7aI&c5X056l) zq7)WIuAQ8VC0iL@=x}CYjj~!yEn8^n8#QsG+Nf+vZYCsYQ4jV(3_CFs4wz+^!=8Nd zz2^fTBUSurREH4lt(s6%MGQAFZ+FaH11jlLvc&2*IX5`VaF9jZlROTHLJmq2WJv>> zLV>R0`X838$_rW0#ZPs5_uzR1^YPl>u{(El5mO<#ObB~ zd+rCVu;DMHuL{G!E;geDFvSiR7-E?y5~av8-VHfO2vMg>L|_gGgs~8zw3!nhXFW-C zmBK?YVFYUdsWyNb<_z@@%bAp{f!+g zgi|HrYHG&sAPSi;Jq1pEsV5w-JUg#_Gx!6TP~8myI>llggILrM-_E#? z_pcKtF;Y7*(V*_~GBJp$Zy{2`^wYU^AIwWYc3)6aSx{B%p83C6{a8@OR^+DF(z?_O$p(;Db*2JleWqT7aW*4X(FI*y zr;|##)2^5e05ztxyt1KyAB`j_3XtP*}} zEcpGbp8YAY4Czs|k_<>{VE~WnRWkN5Uy_!wLUGh!uPWVBJq}O66-ZaTF{-5YFOwn8 z+y?E`X{zGFS+k-duF~uMU|EcTGFFQ|9hL~c5!$sXt|e{M)(WpT)=I0^u}bwS1wmm$ zWHr{-DD9!%Ifz0|dkdT+UrfRbN%k16_<}Z6ckMl=KU`VsW_4&(#)0|rD?0ME{mC(& zfQtCmVIY*UQ{qanX*g#U6(z=f4QeL*)#^!8yVpw?jw zhBN@1_|m}01Y(=kRY;3V{;Zo@e;Xp~m{42@T!fw%$EjF~A ztw||iB&ed^kI~IDoB~K}9Y*axqIysZE56jHZTuki0$?grQdu{AIyg)VqoDD2vEX;P~432!<87z+^H1N_Km)o zij=x7Qg+E8()sSljfzvi6uo;kmu#@Ur<5!GDg2~7B~PPiZyaWm2;v0+w*zCny@eF8 zkG&fjkYpvu+u=0?9c6$(bt`V74j>FMP-eZ-QBwTdR~PvQy0tVIb;AZAsXvPwFtg%e z2^l<>IVwR{b3G*J!70qZSnEYgCS@14J_#1zgwFtM=byC+Uz3F7H|9mO3u@_%U3?}j zZ}{0@l2?!YsbCW1YqlRXb>(J8+L|_2v^G~q-iH^AjU{bt*s>X>rJxLN7@M0;Uv}oA zN&M*!ri{Mo^mS9zy!x_VWaLUfR<;`6LAnP&VJ-~Dr}E<9nPlP~8uNQXB{+MCZ?(sc zM?GVZzNpR(Hv7Nt)4YFxY^km6oq>HbTfc5!EVZN5(q?=!PttLNVW?3KFtuBgiu&Y% zEXiQqClNku7T~ub)f6*L@)7`f11UcYuLXh*d_GHH0;&C}mm&L}l;o*yRc7V26=hrV zW}2;%=AW=#X(P zNZ&=DD%Rz_7-i4H%U=E}8p6v#u_&~+|CdM--^2IQNwz# zGf~iH;GlupF#eOwG(D1j?&sb&kG!Abl5mWi4z*L$vkK!43>>$ZBrZpD4sJ|Gm0)wT z$5Hi~xgC>~RAyZ9u8Wf|<2q7x;_bM2Z0B2D>Io7b2T}AKc*7586Y-f3mKkK5z>DDJ=TSQCai4xm>?oovx&6jY*`JNB(11 zA$OCWe_J)9bd_NY3o%5B47_E2jnt5n@M+};)4@hxcNMs7*C*x#=Pt1SR(IjBm zw%@_TRuieOVQ!Hk?I+-U@Cm|+D*ldyr_Q$3R~mq0l3~2eC{W$iqy1iaeFJipIA!9^ zv}Dy#!zv2wW`%YgrkxqNy@jldu*wkEy{*JZA59niYKDBGJ#@t>L&_-C-J4ZvYGzwm zHJ`Ky?LF2Lj~bjHLOcSE15=r(wl2HG4%es}*QxQp(RdGAf1;0+eDEGd7-Sw(WE`1F zhiK%y+{j;KK#(fU;Lt&*{-1mlo2SiXN$;am@?>_#L(ROW=E%mk04pu2*ZU=BM@W4^o4(Mv|5z~d6W ziRdxAx5^2HJ@t;rj@5Jm4ak5Yh;^PZC;VH`-5V$>guTgIhn&@_u}I^@1WL6=-TPrv z+zNHos8Y_9cRBi(z_-fZ1cRcp1dP?#NO%vs3QX&?qB%yfEUy0)b!?C*NSnt!Z)NE4 z#S|6PS9?K2JG4x zq5U5PJm435AK6U8SP_SbD)G~+C*0j_Eq|eA+u+&0?D(KSG}jh4!Hty3&c3W%EY+W6 zs>?eGKgW4Fb`9q(qGT{A*JXY7D`TWK4P33NkU|1=d-P9NbeitN$@qrY zU7X$u_jrO1nwM7}kN^%l>kqw%-Pr_UTtt#vXk;zqkLP z3Yn~v68^>fAbUf%h9kprEr4YfIX6gPd^0#Y+0dy?qW~Fkqj1vuEW9%&<(Ig6zdn*Q zpl+h}GUgtwE^Jo*Y)x}nLS=PuKpBh4#TnaYt3&|=H_I(pX39I!4IEdWSF6CrFeALv z>cuNK>o7jpKJjZg!)*^-MU92@XrVwi4x*L`!Kt7-G|Z4Nns2S*2QZ?L);32mY!}Ff`=4MSP!MJ}$Q4`}bTYxP0&9WEyD=PfV_`)~xk@DQ#WkFdqM>}B7as*s zW1DXr<}{-nlEki*wu`WxEDw?H+odIB7n|VOF;GAuG3KzXNh@2*m3Eb3-SpfFJXYy% z;11C=l-(4teSjYDfK*OL=!OcpG^J27=h`>NQ*6d+6h;&nZFN}+hZ2QH!2Ul~!oW`` z#5t_6W+A`|Cb5Zz|TCg0(=3X`pU&C`xbx!{V6f5hz#JDeFw~=g!6sJ3u#aUyfcvPu* z>im|?3?X+jjKiWSP-Qi7cH#0&F;y$$S1PN8<#eh-`&;NM-h-cifCLnGNS}dN&gq5E zC@`qTcbYAdj3^qA5oSq9N9dqTO&RlqDM!+)!fvpqOG-VL^{Kz3VScHLVgjy46cphI zoQIcil24tc6T+u7A*z$!QDOpq9d$X#FyoUs;80Y7Czg~Q6tm*v>J_dE!JS#}b_blx zj>QQI-zYbT0cw}95zG7HM~$%D8`b>dk-CDqqjH2LNH<8Z)w4Y>(OB?U=s~Fl`8ZX7 zf2VTZ9Vj&+&BhH%n?a2~m<~C?0XHW#o)DKQ=cT)4*8HyGG(1*CCc7FnBH4v;=?|E5 z?Fvm35JL&Nlx@`q`ydVIujB)i(9e`WjDZw^6o5wKoE*HAdoR~;H7b!H@^^5I2l zUE-?dq;BgnSRp^`&@!a!9#Rzqq(!7|_8Y-`hGU8g;F{J+br@Ny>>n-)=M>Z-WE^t~ zdQ{?Brqs9a`(k`h*|lUDL|_BBfRNpPS8nX7j7}V#h@obXj4r$AwpUHZo~sSgm9cX( zjHgkVF$nwxzcj%l|6TFq;2c2{ep+>WxC9^kXwyLqOsrB%kc?~xD%2dt%tO<8CO}ZN zM5JUjt%lXo``Afsas3k;!`gTpUbaWKd03!sjZe1zIV}Z)r(HLqdOX-CQrmbzzfx%f zDH}|1zW-!DG8H@@ov!))M@LWhFAIATg`AUZ38CJ$d$IkX?(^kW7hL-p( zW{PD(DJ!PKj~FS+@Ij71+y@66(fH--DQD*jF6&M|&!zeoQgYWp4&!COLg6fCktTlq ztUh>Xxi9^)Vy_Fj|9w;P-l2amyvoGmYZJC-GI>#~m12uc_5k6B^YXP3COdy%gOHxvcqmFoT-;>@YY;o*VGoCtsN+h8tCC( z$N!O?feA4-(D@ltNjq{iRp!xIyg64a34!3HyAAQFr3S-DGDq4I5ws^}j96aRP&~qQ>)jn9&055C$v)Sdgr6zG zX>n-ywFD?dM+WtsQgphvA!%ehLw;MZD})rFCj3u$_L|#1gJTd(-D8=1;u-+Z@-4S;hCjSxr3a&YRS#fS{p{eKU2g#8SuVnPzA-F@DFyJDxYNfYsK0wN+s_eOWd@#Yfe037`{}>S4*mGqwXtuL3-5;TV@$Z4#D)?KXd9?_fSVD%~h$4 zcwR8M4*Mx>N7HAJ_i}p9GXG1ylwmfC_^eJ2t8V8_5}Z>y~`6zE(_<+0d7W`jBY zD42$WI$TO|HLh0()@A-vQIZjUd8KCJCc5Ee%g2dBqqiw zCo@;1UL`SDfJsr=E8)5+4J%4u!sJ)GIX1ZFHH)HWHE-XmniNNTi$&2uuKuHa3Rmd` zFZe|5juC8xwxyvb`lX)qdE1;GbcDINV%Uw#S1(-jKm08)-*9H9x=H4n$Bzlhl6)xRW1Y?zKy=g0nxwt$NxAnN)s%$Gp}iQzH; zYKIx8Z@f5;lNVkeC+s(0Y8-$0trxEk{Zs$Wi->&@+&zcjJkqv1)yS!5zSL`k;iC`4 zYp(oC?~FVcY)FXFovJASlob=#8R5+c^fN*?<^Lk~^xsY4^XxB? zCc+-hv;Cc5JO2!sIq-m}8>*OFn@#@4%~o!t*d2SR%e&L7uE*foQ0-;{FZYXe%YQJe z=u$qsZ42Jw!hrSdm1hz2jH##vdsPqWiqLYVNQGM}pCCZ}jWLod7BVNE>mQE4_7SAs zWj>uEd%NgfGvM{t3$$+rG$jwd=#RcsEntItd()e z@W!X8m1}ilckYmOTssT8{F~IzZ*|dk$+DI7`sSvOII~)nbYjBGHfO?m1`zn;5VPX9 ztj&f0zbwxo2A`nby^g}8K>mvcV&UmBg`#OUGktZTZ9ZvxwS}^EGLGE z*%F9o8wx`VQxuGRr?@b=HMPn%RmPIUW1cIk*5|>_TK2u|I6UoV`cj;2gQ( zRarb6buZP!rf_v1JC*v>u}RxIa*<8yw$>ZzGmwZnUu;eYYaVvMVzCS);sPTJWb%c+ zIqqV2R-$I1J?@;%5mJzM_iQuA)IuTWFwXQ~02f|G^(L+WZ$ya~Hx#)R2(ga@pat~p@l8K~k z?Q>WA^~sJO+gRJ)Sr;FFbok(<4-X|BY3(GRntpw<4?j3~_{zsebpNrv&Gnt_^)qPz z1@TQujFj+p=YYDMnb<>|)L2ITM>lPypGE9Y*Lz5ee6>krtreHQi5sMu`fb&771LGx zP!aM@U4d=DAA6~c!v8vR9M_VqcyGKgAwTI}+ea_Pnw5q+4-B@-oI!}Vx&H|%*W*cH zYi>{wQv|{L9Mnk0)GLj%y}~wNB84grSkspkjj;7+f`8aT-C|ncM)I~4S?(xvGEJT} zCiwL2jvG#FwDp*)>-^|WxW!$Y1Fm@CRM6^_o6R2aMlU9)Kl5bKXn8j>@qi GQH` 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 literal 0 HcmV?d00001 diff --git a/resources/css/google-icons/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1n-q_4MrImHCIJIZrDCvHOej.woff2 b/resources/css/google-icons/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1n-q_4MrImHCIJIZrDCvHOej.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9605da9388ec0e0474584562a09486fffbf1aff2 GIT binary patch literal 221408 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�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

8r+gY&HlI3 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�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

!rNhk zNuWvt#}dQShmh4Go0~053BB_G_YD=u6krCkw@Be2To{OMyzk0I`N68dqTR-t72N2I z*`PrsnxEg3y~?YR2#{*F*Uru)tM>9XLUlHG4R7E~^`3b1HwZh&SoG}by|q#6PM6G3 z>!+QI{DIX;EfI0eWf#S}&I!BM2aBQ2I>5|I2A}DOyX#YHyDV;Xnj5PbtK|bL1Fb^T z#h{i(>Mdrfgz!?p^hZ5sII%tril>mi|2AeGKCqEY4$S=^P2(5 zTfJi+nD?*fp6!$^pO7x8W2fPDQQ37cQBA{rBS+> zC)pzM(?U+9f(w>Rg2$`w6-oI0+=)3x_6FSt9MNy^dn`J6I+v-#YzXO{iMD+0gSHa1 z_+2+Y(7su;s8I=dX2ppL`17X|TAHTqwn@`4#(9Mk+mp&T5^6N_VB~O~*G;`o{~g0o z-Ojqkx$^y*wr4N+7n-91__Gx+kIn2ikGEl3G&@Lp6!!{mO^-jYLLFeQIsXX=kzj}D zi4OzO?gSRXv7~%gk`dR6J)?^2SEF6krA9BzJF0(a>J_7li#7#Ix1^G%-*w&*RR zzvO6T)c6gr2jb994GKnj6CZ2+5KMA@j0JbyAzn!ypYj~ots zX?g2asl2o+VJZ82BI!_QVITu4+A*obWYeP4ppQ22t?k#a%WrBlsYolzijC8b?>!5R z8yUoM9n~t6AzJn+Bjkg> zDxZJeMKdQ#htJ0G88xVNsy6K|%CIj(^@J3%s){oxp1O$uSB#w6elKqRGQZX|oMft2 z?HcGIxaDsr-)CzoGvOjy&;Fr$Xcj|8RI^ZC7(tb9;VqimuO@{qM95yYvm@Cu2jZy~ z%41xNCI`=YRdJ)aG<$8q&1Kzj&Y~n1QuD)i6h>X}@#z|wr|US>ZIQDUI#iTUij=P( zX9$yJ<*LcL@&2?}m5i?;yZdJV2H^5mWaXXL@8OZy3||t1pwn$t&Ox`pmOSw11x17_ zT`0FHiuEy{XRM9TA8^ryM{7q<QU3%f0+X7ET6_F|p;Abxdq%OL8JK-x7GHFgU z@~^a+on0KxP3)tjX*U##GX1qSz@PT}uIj{?Ym_uj02+|!{o`u9t}|Tiwl~7;&etV^ zd-9EmMt?XXSsu7&ybeoGhl5kj5+M64%-{ zq8K}zO$!7rOwMHCpdC6a8WPV8J&5z;8j%xv7SBnH=INX=JoKD_A$x6?7wcmMz0Y2U z>j>sRTd@gkV2oS5+xDEcvZ(IT2E_DS)q=6*CtRJCc~WE4=$zj!kESlz%x@ixr48J)UU6_+SmGyL(8$%SuM3 z&+SJRl*)l@KxykknG%TA(EdGg$HK`1L-|OK9xP zbSuNt(#{7dN;H-bSiGYjpKYGG^s>*(aKAyCJ+z8$k&n0=K*3e$>ySal1kW2_&w;m= z$%(cu0NXRCj;Co06CPea*vpoL4)d3(j%RybEsh)8a_yY3s>gvoR4s`0Z_05>2&(L# zI!9QJ2`2Gc%|hu9XFP}@@&#Qc2MP7C=Z;Qk7tfls1)TmZC@MAPCVr>>_ z4HZ!ZdvDU6&GjcSJmOYAoX6--iw?%aRbQ;jE|J1B1$5%8IO^h4Q∈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 + defineProps({ + on: Boolean + }); + + + diff --git a/resources/js/Components/Dashboard/ActionSection.vue b/resources/js/Components/Dashboard/ActionSection.vue new file mode 100644 index 0000000..49668fa --- /dev/null +++ b/resources/js/Components/Dashboard/ActionSection.vue @@ -0,0 +1,22 @@ + + + diff --git a/resources/js/Components/Dashboard/AuthenticationCard.vue b/resources/js/Components/Dashboard/AuthenticationCard.vue new file mode 100644 index 0000000..36ac7b1 --- /dev/null +++ b/resources/js/Components/Dashboard/AuthenticationCard.vue @@ -0,0 +1,11 @@ + diff --git a/resources/js/Components/Dashboard/Button/Base.vue b/resources/js/Components/Dashboard/Button/Base.vue new file mode 100644 index 0000000..572bbc6 --- /dev/null +++ b/resources/js/Components/Dashboard/Button/Base.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/js/Components/Dashboard/Button/BigPrimary.vue b/resources/js/Components/Dashboard/Button/BigPrimary.vue new file mode 100644 index 0000000..ca3b054 --- /dev/null +++ b/resources/js/Components/Dashboard/Button/BigPrimary.vue @@ -0,0 +1,32 @@ + + + diff --git a/resources/js/Components/Dashboard/Button/Danger.vue b/resources/js/Components/Dashboard/Button/Danger.vue new file mode 100644 index 0000000..ef566b2 --- /dev/null +++ b/resources/js/Components/Dashboard/Button/Danger.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/Components/Dashboard/Button/Info.vue b/resources/js/Components/Dashboard/Button/Info.vue new file mode 100644 index 0000000..855843a --- /dev/null +++ b/resources/js/Components/Dashboard/Button/Info.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/Components/Dashboard/Button/Primary.vue b/resources/js/Components/Dashboard/Button/Primary.vue new file mode 100644 index 0000000..a5aa578 --- /dev/null +++ b/resources/js/Components/Dashboard/Button/Primary.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/Components/Dashboard/Button/Secondary.vue b/resources/js/Components/Dashboard/Button/Secondary.vue new file mode 100644 index 0000000..facc997 --- /dev/null +++ b/resources/js/Components/Dashboard/Button/Secondary.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/Components/Dashboard/Button/Warning.vue b/resources/js/Components/Dashboard/Button/Warning.vue new file mode 100644 index 0000000..9277241 --- /dev/null +++ b/resources/js/Components/Dashboard/Button/Warning.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/Components/Dashboard/ConfirmationModal.vue b/resources/js/Components/Dashboard/ConfirmationModal.vue new file mode 100644 index 0000000..899cf25 --- /dev/null +++ b/resources/js/Components/Dashboard/ConfirmationModal.vue @@ -0,0 +1,66 @@ + + + diff --git a/resources/js/Components/Dashboard/ConfirmsPassword.vue b/resources/js/Components/Dashboard/ConfirmsPassword.vue new file mode 100644 index 0000000..7777caa --- /dev/null +++ b/resources/js/Components/Dashboard/ConfirmsPassword.vue @@ -0,0 +1,116 @@ + + + diff --git a/resources/js/Components/Dashboard/DialogModal.vue b/resources/js/Components/Dashboard/DialogModal.vue new file mode 100644 index 0000000..4ff0d9e --- /dev/null +++ b/resources/js/Components/Dashboard/DialogModal.vue @@ -0,0 +1,47 @@ + + + diff --git a/resources/js/Components/Dashboard/Dropdown.vue b/resources/js/Components/Dashboard/Dropdown.vue new file mode 100644 index 0000000..cb81aa4 --- /dev/null +++ b/resources/js/Components/Dashboard/Dropdown.vue @@ -0,0 +1,104 @@ + + + diff --git a/resources/js/Components/Dashboard/DropdownLink.vue b/resources/js/Components/Dashboard/DropdownLink.vue new file mode 100644 index 0000000..c251d7a --- /dev/null +++ b/resources/js/Components/Dashboard/DropdownLink.vue @@ -0,0 +1,39 @@ + + + diff --git a/resources/js/Components/Dashboard/Form/Checkbox.vue b/resources/js/Components/Dashboard/Form/Checkbox.vue new file mode 100644 index 0000000..c3b0683 --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Checkbox.vue @@ -0,0 +1,40 @@ + + + diff --git a/resources/js/Components/Dashboard/Form/Elements/Error.vue b/resources/js/Components/Dashboard/Form/Elements/Error.vue new file mode 100644 index 0000000..c0a9cb7 --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Elements/Error.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/Components/Dashboard/Form/Elements/Label.vue b/resources/js/Components/Dashboard/Form/Elements/Label.vue new file mode 100644 index 0000000..de22300 --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Elements/Label.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/Components/Dashboard/Form/Input.vue b/resources/js/Components/Dashboard/Form/Input.vue new file mode 100644 index 0000000..0729172 --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Input.vue @@ -0,0 +1,78 @@ + + + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Form/Search.vue b/resources/js/Components/Dashboard/Form/Search.vue new file mode 100644 index 0000000..1b2f01b --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Search.vue @@ -0,0 +1,75 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Form/Select.vue b/resources/js/Components/Dashboard/Form/Select.vue new file mode 100644 index 0000000..fec1044 --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Select.vue @@ -0,0 +1,59 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Form/Selectable.vue b/resources/js/Components/Dashboard/Form/Selectable.vue new file mode 100644 index 0000000..c312f4a --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Selectable.vue @@ -0,0 +1,79 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Form/Textarea.vue b/resources/js/Components/Dashboard/Form/Textarea.vue new file mode 100644 index 0000000..2ae3058 --- /dev/null +++ b/resources/js/Components/Dashboard/Form/Textarea.vue @@ -0,0 +1,68 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/FormSection.vue b/resources/js/Components/Dashboard/FormSection.vue new file mode 100644 index 0000000..0f60f6f --- /dev/null +++ b/resources/js/Components/Dashboard/FormSection.vue @@ -0,0 +1,44 @@ + + + diff --git a/resources/js/Components/Dashboard/Help/Item.vue b/resources/js/Components/Dashboard/Help/Item.vue new file mode 100644 index 0000000..9892590 --- /dev/null +++ b/resources/js/Components/Dashboard/Help/Item.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Inbox.vue b/resources/js/Components/Dashboard/Inbox.vue new file mode 100644 index 0000000..a9a9758 --- /dev/null +++ b/resources/js/Components/Dashboard/Inbox.vue @@ -0,0 +1,122 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Inbox/Item.vue b/resources/js/Components/Dashboard/Inbox/Item.vue new file mode 100644 index 0000000..c602794 --- /dev/null +++ b/resources/js/Components/Dashboard/Inbox/Item.vue @@ -0,0 +1,64 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Inbox/Menu/Item.vue b/resources/js/Components/Dashboard/Inbox/Menu/Item.vue new file mode 100644 index 0000000..76f76f8 --- /dev/null +++ b/resources/js/Components/Dashboard/Inbox/Menu/Item.vue @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Inbox/Menu/Static.vue b/resources/js/Components/Dashboard/Inbox/Menu/Static.vue new file mode 100644 index 0000000..e413f6f --- /dev/null +++ b/resources/js/Components/Dashboard/Inbox/Menu/Static.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/InputLabel.vue b/resources/js/Components/Dashboard/InputLabel.vue new file mode 100644 index 0000000..0b8beef --- /dev/null +++ b/resources/js/Components/Dashboard/InputLabel.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/Components/Dashboard/Logo.vue b/resources/js/Components/Dashboard/Logo.vue new file mode 100644 index 0000000..cda1c0f --- /dev/null +++ b/resources/js/Components/Dashboard/Logo.vue @@ -0,0 +1,18 @@ + + diff --git a/resources/js/Components/Dashboard/Logs/Item.vue b/resources/js/Components/Dashboard/Logs/Item.vue new file mode 100644 index 0000000..be3711c --- /dev/null +++ b/resources/js/Components/Dashboard/Logs/Item.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Modal.vue b/resources/js/Components/Dashboard/Modal.vue new file mode 100644 index 0000000..7f1337f --- /dev/null +++ b/resources/js/Components/Dashboard/Modal.vue @@ -0,0 +1,93 @@ + + + diff --git a/resources/js/Components/Dashboard/Modal/Destroy.vue b/resources/js/Components/Dashboard/Modal/Destroy.vue new file mode 100644 index 0000000..c119371 --- /dev/null +++ b/resources/js/Components/Dashboard/Modal/Destroy.vue @@ -0,0 +1,53 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Modal/Edit.vue b/resources/js/Components/Dashboard/Modal/Edit.vue new file mode 100644 index 0000000..6a71834 --- /dev/null +++ b/resources/js/Components/Dashboard/Modal/Edit.vue @@ -0,0 +1,48 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Modal/Elements/Header.vue b/resources/js/Components/Dashboard/Modal/Elements/Header.vue new file mode 100644 index 0000000..30f69f6 --- /dev/null +++ b/resources/js/Components/Dashboard/Modal/Elements/Header.vue @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Modal/Show.vue b/resources/js/Components/Dashboard/Modal/Show.vue new file mode 100644 index 0000000..cd27b29 --- /dev/null +++ b/resources/js/Components/Dashboard/Modal/Show.vue @@ -0,0 +1,50 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/PageHeader.vue b/resources/js/Components/Dashboard/PageHeader.vue new file mode 100644 index 0000000..ee7a258 --- /dev/null +++ b/resources/js/Components/Dashboard/PageHeader.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Searcher.vue b/resources/js/Components/Dashboard/Searcher.vue new file mode 100644 index 0000000..fc566e1 --- /dev/null +++ b/resources/js/Components/Dashboard/Searcher.vue @@ -0,0 +1,58 @@ + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/SectionBorder.vue b/resources/js/Components/Dashboard/SectionBorder.vue new file mode 100644 index 0000000..baec25d --- /dev/null +++ b/resources/js/Components/Dashboard/SectionBorder.vue @@ -0,0 +1,9 @@ + diff --git a/resources/js/Components/Dashboard/SectionTitle.vue b/resources/js/Components/Dashboard/SectionTitle.vue new file mode 100644 index 0000000..b4760f8 --- /dev/null +++ b/resources/js/Components/Dashboard/SectionTitle.vue @@ -0,0 +1,17 @@ + diff --git a/resources/js/Components/Dashboard/Skeleton/Header.vue b/resources/js/Components/Dashboard/Skeleton/Header.vue new file mode 100644 index 0000000..dba38f1 --- /dev/null +++ b/resources/js/Components/Dashboard/Skeleton/Header.vue @@ -0,0 +1,172 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Skeleton/Header/NotificationLink.vue b/resources/js/Components/Dashboard/Skeleton/Header/NotificationLink.vue new file mode 100644 index 0000000..c51c662 --- /dev/null +++ b/resources/js/Components/Dashboard/Skeleton/Header/NotificationLink.vue @@ -0,0 +1,67 @@ + + + diff --git a/resources/js/Components/Dashboard/Skeleton/Sidebar.vue b/resources/js/Components/Dashboard/Skeleton/Sidebar.vue new file mode 100644 index 0000000..796eb4e --- /dev/null +++ b/resources/js/Components/Dashboard/Skeleton/Sidebar.vue @@ -0,0 +1,54 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Skeleton/Sidebar/Link.vue b/resources/js/Components/Dashboard/Skeleton/Sidebar/Link.vue new file mode 100644 index 0000000..11fe69f --- /dev/null +++ b/resources/js/Components/Dashboard/Skeleton/Sidebar/Link.vue @@ -0,0 +1,44 @@ + + + diff --git a/resources/js/Components/Dashboard/Skeleton/Sidebar/Section.vue b/resources/js/Components/Dashboard/Skeleton/Sidebar/Section.vue new file mode 100644 index 0000000..01510b2 --- /dev/null +++ b/resources/js/Components/Dashboard/Skeleton/Sidebar/Section.vue @@ -0,0 +1,18 @@ + + + diff --git a/resources/js/Components/Dashboard/Table.vue b/resources/js/Components/Dashboard/Table.vue new file mode 100644 index 0000000..63f270c --- /dev/null +++ b/resources/js/Components/Dashboard/Table.vue @@ -0,0 +1,84 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Dashboard/Welcome.vue b/resources/js/Components/Dashboard/Welcome.vue new file mode 100644 index 0000000..de2c0a1 --- /dev/null +++ b/resources/js/Components/Dashboard/Welcome.vue @@ -0,0 +1,254 @@ + + + diff --git a/resources/js/Components/Shared/AwsIcon.vue b/resources/js/Components/Shared/AwsIcon.vue new file mode 100644 index 0000000..4dc3c6b --- /dev/null +++ b/resources/js/Components/Shared/AwsIcon.vue @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/resources/js/Components/Shared/GoogleIcon.vue b/resources/js/Components/Shared/GoogleIcon.vue new file mode 100644 index 0000000..1ae5091 --- /dev/null +++ b/resources/js/Components/Shared/GoogleIcon.vue @@ -0,0 +1,24 @@ + + \ No newline at end of file diff --git a/resources/js/Components/Shared/Logo/Icon.vue b/resources/js/Components/Shared/Logo/Icon.vue new file mode 100644 index 0000000..cfc02c1 --- /dev/null +++ b/resources/js/Components/Shared/Logo/Icon.vue @@ -0,0 +1,13 @@ + + + diff --git a/resources/js/Controllers/DateController.js b/resources/js/Controllers/DateController.js new file mode 100644 index 0000000..2a8009a --- /dev/null +++ b/resources/js/Controllers/DateController.js @@ -0,0 +1,23 @@ +/** + * Permite convertir las fechas en el formato preestablecido deseado + */ +const format = 'sv-SE'; + +/* Obtiene la fecha actual en el formato deseado */ +const getDate = (value = null) => { + const date = (value) + ? new Date(value) + : new Date(); + + return date.toLocaleDateString(format) +} + +/* Obtiene la horaa actual en el formato deseado */ +const getTime = (value = null) => { + const date = (value) + ? new Date(value) + : new Date(); + return date.toLocaleTimeString(format) +} + +export { getDate, getTime }; \ No newline at end of file diff --git a/resources/js/Controllers/InboxController.js b/resources/js/Controllers/InboxController.js new file mode 100644 index 0000000..3b24549 --- /dev/null +++ b/resources/js/Controllers/InboxController.js @@ -0,0 +1,102 @@ +import { ref } from 'vue'; + +/** + * Controlador simple de las bandejas + */ +class InboxController +{ + inboxIdSelected = ref([]); + inboxNumberSelected = ref([]); + selectAll = ref(false); + + constructor() {} + + /** + * Selecciona todas las opciones visibles + */ + onSelectAll = (elements) => { + this.inboxIdSelected.value = []; + this.inboxNumberSelected.value = []; + + this.selectAll.value = !this.selectAll.value; + + if(this.selectAll.value) { + elements.data.forEach(element => { + this.inboxIdSelected.value.push(element.id); + this.inboxNumberSelected.value.push(element.number); + }); + } + } + + /** + * Selecciona solo una opcion + */ + onSelectOne = (invoice) => { + this.inboxIdSelected.value.push(invoice.id); + this.inboxNumberSelected.value.push(invoice.number); + } + + /** + * Permite que siempresea solo una opcion seleccionada + */ + onlyOne = (invoice) => { + this.clear(); + this.onSelectOne(invoice); + } + + /** + * Quita la seleccion + */ + onUnselectOne = (invoice) => { + this.inboxIdSelected.value = this.inboxIdSelected.value.filter(element => { + return element !== invoice.id; + }); + + this.inboxNumberSelected.value = this.inboxNumberSelected.value.filter(element => { + return element !== invoice.number; + }); + } + + /** + * Retorna todos los IDs de los elementos seleccionados + */ + getIdSelections = () => { + return this.inboxIdSelected.value; + } + + /** + * Trata al ID como si fueran muchos + * + * Si no se pasa mimgun ID, se devolveran todos los elementos seleccionados almacenados + */ + getAsMany = (id) => { + return (id) ? [ id ] : this.getIdSelections(); + } + + /** + * Retorna todos los numeros de las facturas/seleccionadas + */ + getNumberSelections = () => { + return this.inboxNumberSelected.value; + } + + /** + * Limpia los valores seleccionados + */ + clear = () => { + this.inboxIdSelected.value = []; + this.inboxNumberSelected.value = []; + this.selectAll.value = false; + } + + /** + * Limpia los valores seleccionados con una notificacion de exito + */ + clearWithSuccess = (message) => { + this.clear(); + + Notify.success(message); + } +} + +export default InboxController; \ No newline at end of file diff --git a/resources/js/Controllers/ModalController.js b/resources/js/Controllers/ModalController.js new file mode 100644 index 0000000..52a1616 --- /dev/null +++ b/resources/js/Controllers/ModalController.js @@ -0,0 +1,84 @@ +import { ref } from 'vue'; + +/** + * Controlador simple de las bandejas + */ +class ModalController +{ + // Modals + confirmModal = ref(false); + destroyModal = ref(false); + editModal = ref(false); + noteModal = ref(false); + manyNotesModal = ref(false); + showModal = ref(false); + + // Models + modelModal = ref({}); + + constructor() {} + + /** + * Controla el cambio entre show y edit + */ + switchShowEditModal = () => { + this.showModal.value = !this.showModal.value + this.editModal.value = !this.editModal.value + }; + + /** + * Controla el switch de eliminar + */ + switchShowModal = (model) => { + this._setModel(model); + this.showModal.value = !this.showModal.value + }; + + /** + * Controla el switch de eliminar + */ + switchEditModal = (model) => { + this._setModel(model); + this.editModal.value = !this.editModal.value + }; + + /** + * Controla el switch de eliminar + */ + switchDestroyModal = (model) => { + this._setModel(model); + this.destroyModal.value = !this.destroyModal.value + }; + + /** + * Controla el switch de nota + */ + switchNoteModal = () => { + this.noteModal.value = !this.noteModal.value + }; + + /** + * Controla el switch de notas aplicadas a muchos + */ + switchManyNotesModal = () => { + this.manyNotesModal.value = !this.manyNotesModal.value + }; + + /** + * Controla el switch de nota + */ + switchConfirmModal = () => { + this.confirmModal.value = !this.confirmModal.value + }; + + /** + * Guarda el modelo + */ + _setModel = (model) => { + if(model) { + this.modelModal.value = model; + } + } +} + +export default ModalController; \ No newline at end of file diff --git a/resources/js/Controllers/NotificationController.js b/resources/js/Controllers/NotificationController.js new file mode 100644 index 0000000..d18d86e --- /dev/null +++ b/resources/js/Controllers/NotificationController.js @@ -0,0 +1,158 @@ +import { ref } from 'vue'; +import { router } from '@inertiajs/vue3'; + +const hasNotifications = import.meta.env.VITE_PUSHER_NOTIFICATIONS; + +/** + * Controlador simple de notificaciones en tiempo real + */ +class NotificationControllerx +{ + userId = ref(0); + counter = ref(0); + notifications = ref([]); + started = ref(false); + + constructor() {} + + /** + * Retorna estado del servicio + */ + isStarted = () => { + return this.started.value; + } + + /** + * Inicia el servicio + */ + start = (userId) => { + if(!this.started.value && hasNotifications == 'true') { + this.userId.value = userId; + + this._suscribeGLobalNotification(); + this._suscribeUserNotification((notification) => { + Notify.flash({ + message: notification.message, + type: notification.icon, + timeout: notification.timeout + }); + this.getUpdates(); + }); + + this.getUpdates(); + this.started.value = true; + + console.log('Notificaciones activas'); + } + } + + /** + * Detiene el servicio + */ + stop = () => { + if(this.started.value) { + this._unsuscribeUserNotification(); + this._unsuscribeGlobalNotification(); + + this.started.value = false; + } + } + + /** + * Marcar notificación como leída + */ + read = id => { + + } + + /** + * Abre la página con los detalles de la notificación + */ + show = id => { + router.post(route('dashboard.notifications.store'), { + id:id + }, { + onSuccess: () => this._subtractCounter() + }); + } + + /** + * Obtener notificaciones actualizadas + */ + getUpdates = () => { + this.counter.value = 0; + + axios.get(route('dashboard.users.notifications')) + .then((r) => { + r.data.notifications.forEach(e => { + if(e.read_at == null) { + this._addCounter(); + } + }); + + this.notifications.value = r.data.notifications; + }) + .catch((e) => { + Notify.error(e.message); + }); + } + + /** + * Suscribe a las notificaciones especificas del usuario + * + * * @param {Callback} callable Callable de la acción a detonar una vez que se recibe la notificación + */ + _suscribeUserNotification = (callable) => { + Echo.private(`App.Models.User.${this.userId.value}`) + .notification(notification => { + callable(notification) + }); + } + + /** + * Cierra la conexión con las notificaciones privadas del usuario + */ + _unsuscribeUserNotification = () => { + Echo.leave(`App.Models.User.${this.userId.value}`); + } + + /** + * SUscribe a las notificaciones globales + * + * Estas no se almacenan, solo se muestran + */ + _suscribeGLobalNotification = () => { + Echo.private('notifications') + .listen('GlobalNotification', e => Notify.info(e.message, e.timeout)); + } + + /** + * DEtiene las notificaciones globales + */ + _unsuscribeGlobalNotification = () => Echo.leave('notifications'); + + /** + * Agregar contador no leídos + */ + _addCounter = () => { + this.counter.value++; + } + + /** + * Restar contador no leídos + */ + _subtractCounter = () => { + if (this.counter.value > 0){ + this.counter.value--; + } + } +} + +/** + * Inicio el controlador desde el archivo, esto permite que cuando lo llame + * en algún otro archivo, la instancia se mantenga siempre y cuando no se reinicie + * la página web. + */ +const NotificationController = new NotificationControllerx(); + +export default NotificationController; \ No newline at end of file diff --git a/resources/js/Controllers/PrintController.js b/resources/js/Controllers/PrintController.js new file mode 100755 index 0000000..043c1f1 --- /dev/null +++ b/resources/js/Controllers/PrintController.js @@ -0,0 +1,52 @@ +import { ref } from 'vue'; +import axios from 'axios'; + +/** + * Controla la generación de impresiones + */ +class PrintController +{ + invoices = ref(false); + + constructor({route, meta, params = {}, name = "Comprobante", type='pdf'}) { + this.route = route; + this.meta = meta; + this.params = params; + this.name = name; + this.type = type; + } + + /** + * Manda la orden de impresión y descarga + */ + + download = (data = {}) => { + Notify.info('Generando archivo, espere ...'); + + axios({ + url: route(this.route, this.params), + method: 'POST', + data: { + meta: this.meta, + data: data + }, + responseType: 'blob' + }).then((response) => { + const href = URL.createObjectURL(response.data); + + const link = document.createElement('a'); + link.href = href; + link.setAttribute('download', `${this.name}.${this.type}`); + document.body.appendChild(link); + link.click(); + + document.body.removeChild(link); + URL.revokeObjectURL(href); + Notify.info('Archivo generado'); + }).catch(err => { + Notify.error('Error al generar'); + }); + } +} + +export default PrintController; \ No newline at end of file diff --git a/resources/js/Controllers/SearcherController.js b/resources/js/Controllers/SearcherController.js new file mode 100644 index 0000000..91afbf9 --- /dev/null +++ b/resources/js/Controllers/SearcherController.js @@ -0,0 +1,67 @@ +import { ref } from 'vue'; +import { router } from '@inertiajs/vue3'; + +/** + * Controlador simple de las bandejas + */ +class SearcherController +{ + query = ref(''); + + constructor(route, params) { + this.route = route; + this.params = params; + } + + /** + * Búsqueda simple + */ + search = (q = '', params) => { + this.query.value = q; + router.get(this._getRoute(), { + q, + ...params + }, {preserveState: true}); + }; + + /** + * Paginación simple + */ + withPagination = (page, params) => { + router.get(this._getRoute(), { + page, + ...params + }, {preserveState: true}); + } + + /** + * Búsqueda con paginación en tablas + */ + searchWithPagination = (page, params) => { + router.get(page, { + q: this.query.value, + ...params + }, {preserveState: true}); + } + + /** + * Búsqueda con páginación en bandejas + */ + searchWithInboxPagination = (page, params) => { + router.get(page, { + q: this.query.value, + ...params + }, {preserveState: true}); + } + + /** + * Obtiene la ruta segun los parametros + */ + _getRoute = () => { + return (this.params) + ? route(this.route, this.params) + : route(this.route); + } +} + +export default SearcherController; \ No newline at end of file diff --git a/resources/js/Lang/en.js b/resources/js/Lang/en.js new file mode 100644 index 0000000..e29c383 --- /dev/null +++ b/resources/js/Lang/en.js @@ -0,0 +1,205 @@ +export default { + '&':'and', + account: { + delete: { + confirm:'Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.', + description: 'Permanently delete your account.', + onDelete:'Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.', + title:'Delete Account', + }, + email: { + notifySendVerification:'A new verification link has been sent to your email address.', + sendVerification:'Click here to re-send the verification email', + unverify: 'Your email address is unverified.', + }, + manage:'Manage Account', + password: { + description:'Ensure your account is using a long, random password to stay secure.', + new:'New password', + reset:'Reset password', + secure:'This is a secure area of the application. Please confirm your password before continuing.', + update: 'Update Password', + verify:'For your security, please confirm your password to continue.', + }, + profile: { + description:'Update your account\'s profile information and email address.', + title:'Profile Information', + }, + sessions: { + confirm:'Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.', + description: 'Manage and log out your active sessions on other browsers and devices.', + last:'Last active', + logout:'Log Out Other Browser Sessions', + onLogout:'If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.', + this: 'This device', + title: 'Browser Sessions', + }, + twoFactor: { + codes:{ + regenerate:'Regenerate Recovery Codes', + show:'Show Recovery Codes', + store:'Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.', + }, + description:'Add additional security to your account using two factor authentication.', + isEnable:'You have enabled two factor authentication.', + isNotEnable:{ + title:'You have not enabled two factor authentication.', + description:'When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone\'s Google Authenticator application.', + }, + key:'Setup Key', + login: { + onAuth: 'Please confirm access to your account by entering the authentication code provided by your authenticator application.', + onRecovery: 'Please confirm access to your account by entering one of your emergency recovery codes.', + }, + onFinish:'Finish enabling two factor authentication.', + qr: { + isConfirmed: 'Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application or enter the setup key.', + onConfirmed: 'To finish enabling two factor authentication, scan the following QR code using your phone\'s authenticator application or enter the setup key and provide the generated OTP code.', + }, + recovery: { + code: 'Recovery code', + useAuth: 'Use an authentication code', + useCode: 'Use a recovery code', + }, + title:'Two Factor Authentication', + }, + }, + actions:'Actions', + auth: { + forgotPassword: { + ask: 'Forgot your password?', + description: 'Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.', + sendLink: 'Email Password Reset Link', + title: 'Forgot Password', + }, + login: 'Log In', + logout: 'Log Out', + register: { + already: 'Already registered?', + me: 'Register me', + }, + remember: 'Remember me', + }, + code:'Code', + cancel:'Cancel', + changelogs: { + title:'Changelogs', + description: 'List of changes made to the system.', + }, + close:"Close", + confirm:'Confirm', + copyright:'All rights reserved.', + contact:'Contact', + description:'Description', + date:'Date', + delete: { + confirm:"By pressing DELETE the record will be permanently deleted and cannot be recovered.", + title:'Deleted', + }, + deleted:'Deleted', + details:'Details', + disable:'Disable', + disabled:'Disable', + done:'Done.', + edit:'Edit', + email:'Email', + enable:'Enable', + endDate:'End date', + event:'Event', + help: { + description:'The following is a list of iconography to understand how the system works.', + home: 'Back to home page.', + title:'Help', + }, + history: { + title:'Stock history', + description:'History of actions performed by users in chronological order.', + }, + home:'Home', + hour:'Hour', + icon:'Icon', + maternal:'Mother\'s last name', + name:'Name', + noRecords:'No records', + notifications: { + deleted:'Notification deleted', + description:'User notifications', + notFound:'Notification not found', + title:'Notifications', + }, + password:'Password', + passwordConfirmation:'Confirm Password', + passwordCurrent:'Current Password', + paternal:'Paternal surname', + phone:'Phone Number', + photo: { + new: 'Select A New Photo', + remove:'Remove Photo', + title:'Photo', + }, + profile:'Profile', + readed:'Readed', + register: { + agree:'I agree to the', + privacy:'Privacy Policy', + signUp:'Sign Up', + terms:'Terms of Service', + }, + role:'Role', + roles:{ + create: { + title: 'Create role', + description: 'These roles will be used to give permissions in the system.', + onSuccess: 'Role successfully created', + onError: 'Error when creating the role', + }, + deleted:'Role deleted', + title: 'Roles', + }, + save:'Save', + saved:'Saved!', + search:'Search', + show: { + all:'Show All', + title:'Show', + }, + startDate:'Start date', + status:'Status', + terms: { + agree:'I agree to the', + privacy:'Privacy Policy', + service:'Terms of Service', + }, + unknown:'Unknown', + update:'Update', + updated:'Updated', + updateFail:'Error while updating', + unreaded:'Unreaded', + user:'User', + users:{ + create:{ + title:'Create user', + description:'Allows you to create new users. Don\'t forget to give them roles so that they can access the desired parts of the system.', + onSuccess:'User created', + onError:'An error occurred while creating the user', + }, + deleted:'User deleted', + notFount:'User not found', + password: { + description:'Allows users\' passwords to be updated', + title:'Update password', + }, + roles: { + description:'Updates user roles, allowing or denying access to certain areas.', + error:{ + min:'Select at least one role' + }, + title:'Roles', + }, + select:'Select a user', + settings:'User setting', + system:'System users', + title:'Users', + }, + version:'Version', +} \ No newline at end of file diff --git a/resources/js/Lang/es.js b/resources/js/Lang/es.js new file mode 100644 index 0000000..ac1cb5b --- /dev/null +++ b/resources/js/Lang/es.js @@ -0,0 +1,228 @@ +export default { + '&':'y', + account: { + delete: { + confirm:'¿Está seguro de que quiere eliminar su cuenta? Una vez eliminada su cuenta, todos sus recursos y datos se borrarán permanentemente. Por favor, introduzca su contraseña para confirmar que desea eliminar permanentemente su cuenta.', + description:'Eliminar permanentemente su cuenta.', + onDelete:'Una vez eliminada su cuenta, todos sus recursos y datos se borrarán permanentemente. Antes de eliminar su cuenta, descargue los datos o la información que desee conservar.', + title:'Eliminar cuenta', + }, + email: { + notifySendVerification:'Se ha enviado un nuevo enlace de verificación a su dirección de correo electrónico.', + sendVerification:'Haga clic aquí para volver a enviar el correo electrónico de verificación.', + unverify: 'Su dirección de correo electrónico no está verificada.', + }, + manage:'Administrar cuenta', + password: { + description:'Asegúrese de que su cuenta utiliza una contraseña larga y aleatoria para estar seguro.', + new:'Nueva contraseña', + reset:'Restaurar contraseña', + secure:'Esta es una zona segura de la aplicación. Confirme su contraseña antes de continuar.', + update: 'Actualizar contraseña', + verify:'Por su seguridad, confirme su contraseña para continuar.', + }, + profile: { + description:'Actualice la información del perfil de su cuenta y su dirección de correo electrónico.', + title:'Información del perfil', + }, + sessions: { + confirm:'Por favor, introduzca su contraseña para confirmar que desea salir de sus otras sesiones de navegación en todos sus dispositivos.', + description: 'Gestiona y cierra tus sesiones activas en otros navegadores y dispositivos.', + last:'Último activo', + logout:'Cerrar otras sesiones del navegador', + onLogout:'Si es necesario, puede cerrar la sesión de todos sus otros navegadores en todos sus dispositivos. A continuación se enumeran algunas de sus sesiones recientes; sin embargo, esta lista puede no ser exhaustiva. Si crees que tu cuenta ha sido comprometida, también deberías actualizar tu contraseña.', + this: 'Dispositivo actual', + title: 'Sesiones del navegador', + }, + twoFactor: { + codes:{ + regenerate:'Regenerar los códigos de recuperación', + show:'Mostrar códigos de recuperación', + store:'Guarde estos códigos de recuperación en un gestor de contraseñas seguro. Pueden utilizarse para recuperar el acceso a su cuenta si se pierde su dispositivo de autenticación de dos factores.', + }, + description:'Añada seguridad adicional a su cuenta mediante la autenticación de dos factores.', + isEnable:'Ha activado la autenticación de dos factores.', + isNotEnable:{ + title:'No ha activado la autenticación de dos factores.', + description:'Cuando la autenticación de dos factores está activada, se le pedirá un token seguro y aleatorio durante la autenticación. Puedes recuperar este token desde la aplicación Google Authenticator de tu teléfono.', + }, + key:'Llave de configuración', + login: { + onAuth: 'Por favor, confirme el acceso a su cuenta introduciendo el código de autentificación proporcionado por su aplicación de autentificación.', + onRecovery: 'Confirme el acceso a su cuenta introduciendo uno de sus códigos de recuperación de emergencia.', + }, + onFinish:'Termina de habilitar la autenticación de dos factores.', + qr: { + isConfirmed: 'La autenticación de dos factores ya está activada. Escanee el siguiente código QR con la aplicación de autenticación de su teléfono o introduzca la clave de configuración.', + onConfirmed: 'Para terminar de habilitar la autenticación de dos factores, escanea el siguiente código QR utilizando la aplicación de autenticación de tu teléfono o introduce la clave de configuración y proporciona el código OTP generado.', + }, + recovery: { + code: 'Código de recuperación', + useAuth: 'Utilizar un código de autentificación', + useCode: 'Utiliza un código de recuperación', + }, + title:'Autenticación de dos factores', + }, + }, + actions:'Acciones', + auth: { + forgotPassword: { + ask: '¿Olvidaste tu contraseña?', + description: '¿Ha olvidado su contraseña? No hay problema. Sólo tienes que indicarnos tu dirección de correo electrónico y te enviaremos un enlace para restablecer la contraseña que te permitirá elegir una nueva.', + sendLink: 'Enviar enlace de recuperación por correo', + title: 'Contraseña olvidada', + }, + login: 'Iniciar sesión', + logout: 'Cerrar sesión', + register: { + already: '¿Ya estas registrado?', + me: 'Registrarme', + }, + remember: 'Recuerdame', + }, + code:'Código', + cancel:'Cancelar', + changes:'Cambios', + changelogs: { + title:'Historial de cambios', + description: 'Lista de los cambios realizados al sistema.', + }, + close:"Cerrar", + confirm:'Confirmar', + copyright:'Todos los derechos reservados.', + contact:'Contacto', + crud: { + create: 'Nuevo registro', + edit: 'Editar registro', + destroy: 'Eliminar registro', + show: 'Más detalles', + }, + date: 'Fecha', + delete:{ + confirm: 'Al presionar ELIMINAR el registro se eliminará permanentemente y no podrá recuperarse.', + title: 'Eliminar', + }, + deleted:'Eliminado', + description:'Descripción', + details:'Detalles', + disable:'Deshabilitar', + disabled:'Deshabilitado', + done:'Hecho.', + edit:'Editar', + email:{ + title:'Correo', + verification:'Verificar correo' + }, + enable:'Habilitar', + endDate:'Fecha Fin', + event:'Evento', + help: { + description:'A continuación se lista la iconografía para entender el funcionamiento del sistema.', + home: 'Volver a la pagina de inicio.', + title:'Ayuda', + }, + history: { + title:'Historial de acciones', + description:'Historial de acciones realizadas por los usuarios en orden cronológico.' + }, + home:'Inicio', + hour:'Hora', + icon:'Icono', + maternal:'Apellido materno', + menu:'Menú', + name:'Nombre', + noRecords:'Sin registros', + notifications: { + readed:'Marcar como leído', + deleted:'Notificación eliminada', + description:'Notificaciones del usuario', + notFound:'Notificación no encontrada', + title:'Notificaciones', + }, + password:'Contraseña', + passwordConfirmation:'Confirmar contraseña', + passwordCurrent:'Contraseña actual', + passwordReset:'Restaurar contraseña', + paternal:'Apellido paterno', + phone:'Teléfono', + photo: { + new: 'Seleccionar una nueva foto', + remove:'Remover foto', + title:'Foto', + }, + profile:'Perfil', + readed:'Leído', + register: { + agree:'Estoy de acuerdo con los', + privacy:'Política de Privacidad', + signUp:'Registrarme', + terms:'Términos de Servicio', + }, + registers:{ + title:'Registros', + empty:'Sin registros', + }, + remove: 'Remover', + return: 'Regresar', + role:'Rol', + roles:{ + create: { + title: 'Crear rol', + description: 'Estos roles serán usados para dar permisos en el sistema.', + onSuccess: 'Rol creado exitosamente', + onError: 'Error al crear el role', + }, + deleted:'Rol eliminado', + title: 'Roles', + }, + save:'Guardar', + saved:'¡Guardado!', + search:'Buscar', + selected: 'Seleccionado', + select: 'Seleccionar', + setting: 'Configuración', + show: { + all:'Mostrar todo', + title:'Mostrar', + }, + startDate:'Fecha de inicio', + status:'Estado', + terms: { + agree:'Estoy de acuerdo con los', + privacy:'Política de privacidad', + service:'Términos de servicio', + }, + unknown:'Desconocido', + update:'Actualizar', + updated:'Actualizado', + updateFail:'Error al actualizar', + unreaded:'No leído', + user:'Usuario', + users:{ + create:{ + title:'Crear usuario', + description:'Permite crear nuevos usuarios. No olvides otorgarle roles para que pueda acceder a las partes del sistema deseados.', + onSuccess:'Usuario creado', + onError:'Ocurrió un error al crear el usuario' + }, + deleted:'Usuario eliminado', + notFount:'Usuario no encontrado', + password: { + description:'Permite actualizar las contraseñas de los usuarios sobreescribiendola.', + title:'Actualizar contraseña', + }, + roles: { + description:'Actualiza los roles de los usuarios, permitiendo o denegando los accesos a determinadas áreas.', + error:{ + min:'Seleccionar mínimo un role' + }, + title:'Roles de usuario', + }, + menu:'Menú de usuario', + select:'Seleccionar un usuario', + settings:'Ajustes del usuario', + system:'Usuarios del sistema', + title:'Usuarios', + }, + version:'Versión', +} \ No newline at end of file diff --git a/resources/js/Lang/i18n.js b/resources/js/Lang/i18n.js new file mode 100644 index 0000000..b24bd95 --- /dev/null +++ b/resources/js/Lang/i18n.js @@ -0,0 +1,22 @@ +import { createI18n } from 'vue-i18n'; +import en from './en.js'; +import es from './es.js'; + +const lang = document.documentElement.lang; + +const messages = { + en, + es +} + +const i18n = createI18n({ + locale: lang, + fallbackLocale:lang, + messages +}); + +const t = (text) => { + return i18n.global.t(text); +} + +export {i18n, t}; \ No newline at end of file diff --git a/resources/js/Layouts/DashboardLayout.vue b/resources/js/Layouts/DashboardLayout.vue new file mode 100644 index 0000000..0b72714 --- /dev/null +++ b/resources/js/Layouts/DashboardLayout.vue @@ -0,0 +1,119 @@ + + + diff --git a/resources/js/Layouts/ExampleLayout.vue b/resources/js/Layouts/ExampleLayout.vue new file mode 100644 index 0000000..7159af5 --- /dev/null +++ b/resources/js/Layouts/ExampleLayout.vue @@ -0,0 +1,80 @@ + + + diff --git a/resources/js/Pages/API/Index.vue b/resources/js/Pages/API/Index.vue new file mode 100644 index 0000000..8d8d354 --- /dev/null +++ b/resources/js/Pages/API/Index.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/Pages/API/Partials/ApiTokenManager.vue b/resources/js/Pages/API/Partials/ApiTokenManager.vue new file mode 100644 index 0000000..5f1fcb6 --- /dev/null +++ b/resources/js/Pages/API/Partials/ApiTokenManager.vue @@ -0,0 +1,252 @@ + + + diff --git a/resources/js/Pages/Admin/User/Component.js b/resources/js/Pages/Admin/User/Component.js new file mode 100644 index 0000000..d6c5b21 --- /dev/null +++ b/resources/js/Pages/Admin/User/Component.js @@ -0,0 +1,15 @@ +import { t } from '@/Lang/i18n'; +import { hasPermission } from '@/rolePermission.js'; + +// Obtener ruta +const goTo = (route) => `admin.users.${route}` +// Obtener traducción del componente +const transl = (lang) => t(`users.${lang}`) +// Determina si un usuario puede hacer algo no en base a los permisos +const can = (permission) => hasPermission(`users.${permission}`) + +export { + can, + goTo, + transl +} \ No newline at end of file diff --git a/resources/js/Pages/Admin/User/Create.vue b/resources/js/Pages/Admin/User/Create.vue new file mode 100644 index 0000000..b83f902 --- /dev/null +++ b/resources/js/Pages/Admin/User/Create.vue @@ -0,0 +1,112 @@ + + + diff --git a/resources/js/Pages/Admin/User/Destroy.vue b/resources/js/Pages/Admin/User/Destroy.vue new file mode 100644 index 0000000..2280743 --- /dev/null +++ b/resources/js/Pages/Admin/User/Destroy.vue @@ -0,0 +1,43 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/User/Edit.vue b/resources/js/Pages/Admin/User/Edit.vue new file mode 100644 index 0000000..63a6a23 --- /dev/null +++ b/resources/js/Pages/Admin/User/Edit.vue @@ -0,0 +1,87 @@ + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/User/Index.vue b/resources/js/Pages/Admin/User/Index.vue new file mode 100644 index 0000000..e7acf4f --- /dev/null +++ b/resources/js/Pages/Admin/User/Index.vue @@ -0,0 +1,180 @@ + + + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/User/Roles.vue b/resources/js/Pages/Admin/User/Roles.vue new file mode 100644 index 0000000..3de30d6 --- /dev/null +++ b/resources/js/Pages/Admin/User/Roles.vue @@ -0,0 +1,85 @@ + + + diff --git a/resources/js/Pages/Admin/User/Settings.vue b/resources/js/Pages/Admin/User/Settings.vue new file mode 100644 index 0000000..0e158e8 --- /dev/null +++ b/resources/js/Pages/Admin/User/Settings.vue @@ -0,0 +1,57 @@ + + + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/User/Show.vue b/resources/js/Pages/Admin/User/Show.vue new file mode 100644 index 0000000..037637d --- /dev/null +++ b/resources/js/Pages/Admin/User/Show.vue @@ -0,0 +1,57 @@ + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/User/UpdatePassword.vue b/resources/js/Pages/Admin/User/UpdatePassword.vue new file mode 100644 index 0000000..d0531af --- /dev/null +++ b/resources/js/Pages/Admin/User/UpdatePassword.vue @@ -0,0 +1,62 @@ + + + diff --git a/resources/js/Pages/Auth/ForgotPassword.vue b/resources/js/Pages/Auth/ForgotPassword.vue new file mode 100644 index 0000000..a73192d --- /dev/null +++ b/resources/js/Pages/Auth/ForgotPassword.vue @@ -0,0 +1,62 @@ + + + diff --git a/resources/js/Pages/Auth/Login.vue b/resources/js/Pages/Auth/Login.vue new file mode 100644 index 0000000..36ce378 --- /dev/null +++ b/resources/js/Pages/Auth/Login.vue @@ -0,0 +1,103 @@ + + + diff --git a/resources/js/Pages/Auth/Register.vue b/resources/js/Pages/Auth/Register.vue new file mode 100644 index 0000000..5e608b1 --- /dev/null +++ b/resources/js/Pages/Auth/Register.vue @@ -0,0 +1,136 @@ + + + diff --git a/resources/js/Pages/Auth/ResetPassword.vue b/resources/js/Pages/Auth/ResetPassword.vue new file mode 100644 index 0000000..a024f33 --- /dev/null +++ b/resources/js/Pages/Auth/ResetPassword.vue @@ -0,0 +1,75 @@ + + + diff --git a/resources/js/Pages/Auth/TwoFactorChallenge.vue b/resources/js/Pages/Auth/TwoFactorChallenge.vue new file mode 100644 index 0000000..9e63390 --- /dev/null +++ b/resources/js/Pages/Auth/TwoFactorChallenge.vue @@ -0,0 +1,105 @@ + + + diff --git a/resources/js/Pages/Auth/VerifyEmail.vue b/resources/js/Pages/Auth/VerifyEmail.vue new file mode 100644 index 0000000..af90e30 --- /dev/null +++ b/resources/js/Pages/Auth/VerifyEmail.vue @@ -0,0 +1,66 @@ + + + diff --git a/resources/js/Pages/Dashboard/Changelogs.vue b/resources/js/Pages/Dashboard/Changelogs.vue new file mode 100644 index 0000000..0149a23 --- /dev/null +++ b/resources/js/Pages/Dashboard/Changelogs.vue @@ -0,0 +1,177 @@ + + + diff --git a/resources/js/Pages/Dashboard/Help.vue b/resources/js/Pages/Dashboard/Help.vue new file mode 100644 index 0000000..908c29b --- /dev/null +++ b/resources/js/Pages/Dashboard/Help.vue @@ -0,0 +1,41 @@ + + + + \ No newline at end of file diff --git a/resources/js/Pages/Dashboard/HistoryLog.vue b/resources/js/Pages/Dashboard/HistoryLog.vue new file mode 100644 index 0000000..538aa47 --- /dev/null +++ b/resources/js/Pages/Dashboard/HistoryLog.vue @@ -0,0 +1,165 @@ + + + diff --git a/resources/js/Pages/Dashboard/HistoryLog/Show.vue b/resources/js/Pages/Dashboard/HistoryLog/Show.vue new file mode 100644 index 0000000..9608f41 --- /dev/null +++ b/resources/js/Pages/Dashboard/HistoryLog/Show.vue @@ -0,0 +1,106 @@ + + \ No newline at end of file diff --git a/resources/js/Pages/Dashboard/Index.vue b/resources/js/Pages/Dashboard/Index.vue new file mode 100644 index 0000000..b92c07d --- /dev/null +++ b/resources/js/Pages/Dashboard/Index.vue @@ -0,0 +1,12 @@ + + + diff --git a/resources/js/Pages/Dashboard/Notifications/Destroy.vue b/resources/js/Pages/Dashboard/Notifications/Destroy.vue new file mode 100644 index 0000000..cbbe51f --- /dev/null +++ b/resources/js/Pages/Dashboard/Notifications/Destroy.vue @@ -0,0 +1,50 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Dashboard/Notifications/Index.vue b/resources/js/Pages/Dashboard/Notifications/Index.vue new file mode 100644 index 0000000..d7bccc7 --- /dev/null +++ b/resources/js/Pages/Dashboard/Notifications/Index.vue @@ -0,0 +1,207 @@ + + + diff --git a/resources/js/Pages/Dashboard/Notifications/Show.vue b/resources/js/Pages/Dashboard/Notifications/Show.vue new file mode 100644 index 0000000..eff266d --- /dev/null +++ b/resources/js/Pages/Dashboard/Notifications/Show.vue @@ -0,0 +1,69 @@ + + + diff --git a/resources/js/Pages/Developer/Roles/Component.js b/resources/js/Pages/Developer/Roles/Component.js new file mode 100644 index 0000000..4b998c4 --- /dev/null +++ b/resources/js/Pages/Developer/Roles/Component.js @@ -0,0 +1,15 @@ +import { t } from '@/Lang/i18n'; +import { hasPermission } from '@/rolePermission.js'; + +// Obtener ruta +const goTo = (route) => `developer.roles.${route}` +// Obtener traducción del componente +const transl = (lang) => t(`roles.${lang}`) +// Determina si un usuario puede hacer algo no en base a los permisos +const can = (permission) => hasPermission(`roles.${permission}`) + +export { + can, + goTo, + transl +} \ No newline at end of file diff --git a/resources/js/Pages/Developer/Roles/Create.vue b/resources/js/Pages/Developer/Roles/Create.vue new file mode 100644 index 0000000..82ad75f --- /dev/null +++ b/resources/js/Pages/Developer/Roles/Create.vue @@ -0,0 +1,67 @@ + + + diff --git a/resources/js/Pages/Developer/Roles/Destroy.vue b/resources/js/Pages/Developer/Roles/Destroy.vue new file mode 100644 index 0000000..468a8a7 --- /dev/null +++ b/resources/js/Pages/Developer/Roles/Destroy.vue @@ -0,0 +1,46 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Developer/Roles/Edit.vue b/resources/js/Pages/Developer/Roles/Edit.vue new file mode 100644 index 0000000..5788a2d --- /dev/null +++ b/resources/js/Pages/Developer/Roles/Edit.vue @@ -0,0 +1,63 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Developer/Roles/Index.vue b/resources/js/Pages/Developer/Roles/Index.vue new file mode 100644 index 0000000..e8c710d --- /dev/null +++ b/resources/js/Pages/Developer/Roles/Index.vue @@ -0,0 +1,120 @@ + + + + \ No newline at end of file diff --git a/resources/js/Pages/PrivacyPolicy.vue b/resources/js/Pages/PrivacyPolicy.vue new file mode 100644 index 0000000..6317a71 --- /dev/null +++ b/resources/js/Pages/PrivacyPolicy.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/Pages/Profile/Partials/DeleteUserForm.vue b/resources/js/Pages/Profile/Partials/DeleteUserForm.vue new file mode 100644 index 0000000..66fe82e --- /dev/null +++ b/resources/js/Pages/Profile/Partials/DeleteUserForm.vue @@ -0,0 +1,98 @@ + + + diff --git a/resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue b/resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue new file mode 100644 index 0000000..fb108fa --- /dev/null +++ b/resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue @@ -0,0 +1,165 @@ + + + diff --git a/resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue b/resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue new file mode 100644 index 0000000..4072948 --- /dev/null +++ b/resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue @@ -0,0 +1,231 @@ + + + diff --git a/resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue b/resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue new file mode 100644 index 0000000..90c299c --- /dev/null +++ b/resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue @@ -0,0 +1,94 @@ + + + diff --git a/resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue b/resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue new file mode 100644 index 0000000..9dc456c --- /dev/null +++ b/resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue @@ -0,0 +1,216 @@ + + + diff --git a/resources/js/Pages/Profile/Show.vue b/resources/js/Pages/Profile/Show.vue new file mode 100644 index 0000000..a7e89b2 --- /dev/null +++ b/resources/js/Pages/Profile/Show.vue @@ -0,0 +1,53 @@ + + + diff --git a/resources/js/Pages/TermsOfService.vue b/resources/js/Pages/TermsOfService.vue new file mode 100644 index 0000000..2322d9e --- /dev/null +++ b/resources/js/Pages/TermsOfService.vue @@ -0,0 +1,30 @@ + + + diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 0000000..4670131 --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1,45 @@ +import '../css/app.css'; +import './bootstrap'; + +import { createApp, h } from 'vue'; +import { createInertiaApp } from '@inertiajs/vue3'; +import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; +import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m'; + +import Notify from './notify'; +import Swal from 'sweetalert2' +import { SessionFresh } from './sessionFresh'; +import { TailwindScreen } from './tailwindScreen'; +import { i18n, t } from '@/Lang/i18n'; +import { bootSidebar } from '@/sidebar' +import { bootTheme, darkMode } from './darkMode'; + +const appName = window.document.getElementsByTagName('title')[0]?.innerText || 'Laravel'; + +window.appName = appName; +window.lang = t; +window.Notify = new Notify(); +window.sessionFresh = new SessionFresh(); +window.Swal = Swal; +window.TwScreen = new TailwindScreen(); +window.darkMode = darkMode; + +bootTheme(); +bootSidebar(); + +createInertiaApp({ + progress: { + color: '#4B5563' + }, + title: (title) => `${title} - ${appName}`, + resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')), + setup({ el, App, props, plugin }) { + return createApp({ + render: () => h(App, props) + }) + .use(plugin) + .use(ZiggyVue, Ziggy) + .use(i18n) + .mount(el); + } +}); diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 0000000..71732b7 --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,37 @@ +import _ from 'lodash'; +window._ = _; + +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +import Echo from 'laravel-echo'; +import Pusher from 'pusher-js'; + +if(import.meta.env.VITE_PUSHER_NOTIFICATIONS == 'true') { + window.Pusher = Pusher; + window.Echo = new Echo({ + broadcaster: 'pusher', + key: import.meta.env.VITE_PUSHER_APP_KEY, + wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, + wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, + wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, + forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', + encrypted: true, + disableStats: true, + enabledTransports: ['ws', 'wss'], + }); +} diff --git a/resources/js/cookies.js b/resources/js/cookies.js new file mode 100644 index 0000000..537e7f9 --- /dev/null +++ b/resources/js/cookies.js @@ -0,0 +1,56 @@ +/** + * Crea una nueva cookie + * @param {*} cname Nombre + * @param {*} cvalue Valor + * @param {*} exdays Duración en días + */ +function setCookie(cname, cvalue, exdays) { + const d = new Date(); + d.setTime(d.getTime() + (exdays*24*60*60*1000)); + let expires = "expires="+ d.toUTCString(); + document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; +} + +/** + * Retorna una cookie + * @param {*} cname Nombre + * @returns + */ +function getCookie(cname) { + let name = cname + "="; + + let decodedCookie = decodeURIComponent(document.cookie); + + let ca = decodedCookie.split(';'); + + for(let i = 0; i localStorage.theme === 'dark' || (!('theme' in localStorage)); + +const verifyDarkMode = () => { + (statusTheme()) + ? mainPage.classList.add('dark') + : mainPage.classList.remove('dark') +} + +const darkMode = (active = true) => { + theme.value = (active) + ? 'dark' + : 'light' + + localStorage.theme = theme.value; + + verifyDarkMode(); +} + +const bootTheme = () => darkMode(statusTheme()); + +export { + bootTheme, + darkMode, + theme, + verifyDarkMode +} \ No newline at end of file diff --git a/resources/js/notify.js b/resources/js/notify.js new file mode 100644 index 0000000..1c25af8 --- /dev/null +++ b/resources/js/notify.js @@ -0,0 +1,82 @@ +import toastr from 'toastr'; +import { router } from '@inertiajs/vue3'; + +class Notify { + constructor() {} + + flash({message = 'Successful registration', type = 'success', timeout = 5}) { + + toastr.options = { + "closeButton": true, + "debug": false, + "newestOnTop": false, + "progressBar": true, + "positionClass": "toast-bottom-right", + "preventDuplicates": false, + "onclick": null, + "showDuration": "300", + "hideDuration": "1000", + "timeOut": timeout * 1000, + "extendedTimeOut": "1000", + "showEasing": "swing", + "hideEasing": "linear", + "showMethod": "fadeIn", + "hideMethod": "fadeOut" + } + + toastr[type](message); + } + + success(message, timeout) { + this.flash({ + message, + timeout + }); + } + + error(message, timeout) { + this.flash({ + message, + type:'error', + timeout + }); + } + + info(message, timeout) { + this.flash({ + message, + type:'info', + timeout + }); + } + + warning(message, timeout) { + this.flash({ + message, + type:'warning', + timeout + }); + } + + verifyLaravelNotifyFlash() { + if(router.page.props.flash) { + router.page.props.flash.forEach(element => { + this.flash({ + message: element.message, + icon: element.type + }); + }); + } + + if (router.page.props.jetstream.flash.length != 0) { + router.page.props.jetstream.flash.forEach(element => { + this.flash({ + message: element.message, + icon: element.type + }); + }); + } + } +} + +export default Notify; diff --git a/resources/js/rolePermission.js b/resources/js/rolePermission.js new file mode 100644 index 0000000..1fc1077 --- /dev/null +++ b/resources/js/rolePermission.js @@ -0,0 +1,59 @@ +import { router } from '@inertiajs/vue3'; + +let startRoles = false; +let startPermissions = false; +let userRoles = []; +let userPermissions = []; + +/** + * Permite consultar si un usuario tiene un role +*/ +const hasRole = (roles) => { + if(!startRoles) { + let userRolesModel = router.page.props.user.roles; + + userRolesModel.forEach((model) => { + userRoles.push(model.name); + }); + } + + let verifyRoles = roles.split('|'); + + for (let role in verifyRoles) { + if(userRoles.length != 0) { + if(userRoles.indexOf(verifyRoles[role]) != -1) { + return true; + } + } + } + + return false; +} + +/** + * Permite consultar si un usuario tiene un permiso especifico + */ +const hasPermission = (permisions) => { + if(!startPermissions) { + let userPermissionsModel = router.page.props.shareUserPermissions; + + userPermissionsModel.forEach((model) => { + userPermissions.push(model.name); + }); + } + + let verifyPermissions = permisions.split('|'); + + + for (let permision in verifyPermissions) { + if(userPermissions.length != 0) { + if(userPermissions.indexOf(verifyPermissions[permision]) != -1) { + return true; + } + } + } + + return false; +} + +export { hasRole, hasPermission }; \ No newline at end of file diff --git a/resources/js/sessionFresh.js b/resources/js/sessionFresh.js new file mode 100644 index 0000000..675b98a --- /dev/null +++ b/resources/js/sessionFresh.js @@ -0,0 +1,46 @@ +import { ref } from "vue"; + +/** + * Debido a la propia naturaleza reactiva de vue, hay datos que solo existen mientras se + * este en un componente o pagina. + * + * Este elemento permite mantener datos en todas las paginas siempre y cuando no se recargue la pagina. + */ +class SessionFresh { + layout = false; + header = false; + sidebar = ref(true); + + constructor() {} + + isLayoutInitialized() { + return this.init; + } + + isHeaderInitialized() { + return this.header; + } + + startLayout() { + this.init = true; + } + + startHeader() { + this.header = true; + } + + stop() { + this.layout = false; + this.header = false; + } + + switchSidebar() { + this.sidebar.value = !this.sidebar.value; + } + + getSidebar() { + return this.sidebar; + } +} + +export { SessionFresh } \ No newline at end of file diff --git a/resources/js/sidebar.js b/resources/js/sidebar.js new file mode 100644 index 0000000..2dc1368 --- /dev/null +++ b/resources/js/sidebar.js @@ -0,0 +1,27 @@ +import { ref } from 'vue'; + +const statusTheme = () => localStorage.sidebarIsOpen === 'true' || !('sidebarIsOpen' in localStorage); + +const sidebar = ref(); + +const sidebarOpen = (active = true) => { + sidebar.value = (active) + localStorage.sidebarIsOpen = sidebar.value; +} + +const sidebarSwitch = (value = null) => { + sidebar.value = (value) + ? value + : !sidebar.value; + + localStorage.sidebarIsOpen = sidebar.value; +} + +const bootSidebar = () => sidebarOpen(statusTheme()); + +export { + bootSidebar, + sidebarOpen, + sidebarSwitch, + sidebar +} \ No newline at end of file diff --git a/resources/js/tailwindScreen.js b/resources/js/tailwindScreen.js new file mode 100644 index 0000000..3cff905 --- /dev/null +++ b/resources/js/tailwindScreen.js @@ -0,0 +1,104 @@ +/** + * Calcula u obtiene el tamaño de pantalla del dispositivo actual + */ +class TailwindScreen { + constructor(){} + + isXs = () => (screen.width < 640) ? true : false; + + isSm = () => (screen.width >= 640 && screen.width < 768) ? true : false; + + isMd = () => (screen.width >= 768 && screen.width < 1024) ? true : false; + + isLg = () => (screen.width >= 1024 && screen.width < 1280) ? true : false; + + isXl = () => (screen.width >= 1280 && screen.width < 1536) ? true : false; + + is2Xl = () => (screen.width >= 1536) ? true : false; + + /** + * Obtiene el tamaño de pantalla que usa tailwind + */ + getScreen = () => { + if(this.isXs()) { + return 'xs'; + } + + if(this.isSm()) { + return 'sm'; + } + + if(this.isMd()) { + return 'md'; + } + + if(this.isLg()) { + return 'lg'; + } + + if(this.isXl()) { + return 'xl'; + } + + if(this.is2Xl()) { + return '2xl'; + } + } + + /** + * Pregunta si es un tipo de dispositivo + * + * @param {*} device Tipo de dispositivo + */ + isDevice(device) { + switch (device) { + case 'phone': + if(this.isXs() || this.isSm()) { + return true; + } + break; + case 'tablet': + if(this.isMd()) { + return true; + } + break; + case 'pc': + if(this.isLg() || this.isXl() || this.is2Xl()) { + return true; + } + break; + + default: + break; + } + + return false; + } + + /** + * Obtiene el tipo de dispositivo y la variante + */ + getDevice() { + if(this.isXs() || this.isSm()) { + return 'phone'; + } + + if(this.isMd()) { + return 'tablet'; + } + + if(this.isLg()) { + return 'pc-sm'; + } + + if(this.isXl()) { + return 'pc-md'; + } + + if(this.is2Xl()) { + return 'pc-lg'; + } + } +} + +export { TailwindScreen } \ No newline at end of file diff --git a/resources/js/useFetch.js b/resources/js/useFetch.js new file mode 100644 index 0000000..d154c92 --- /dev/null +++ b/resources/js/useFetch.js @@ -0,0 +1,41 @@ +const getToken = () => { + return document.head.querySelector("[name~=csrf-token][content]").content; +} + +/** + * Fetch personalizado para recibir respuestas y errores desde laravel + * + * Es necesario enviar la información con las funciones successFetch o errorFetch + * provistas en el controlador padre en laravel. + */ +export default async function useFetch(url, data = {}, method = 'get') { + let response = null; + + let options = (method == 'get') ? + { + method: method, + cache: 'no-cache' + } : { + method: method, + cache: 'no-cache', + credentials: "same-origin", + headers: { + 'Content-Type': 'application/json', + "X-CSRF-Token": getToken() + }, + body: JSON.stringify(data) + } + + await fetch(url, options) + .then((res) => res.json()) + .then((res) => { + if(res.status != 200) { + Notify.error(res.message); + throw new Error(res.message); + } else { + response = res; + } + }); + + return response; +} \ No newline at end of file diff --git a/resources/markdown/policy.md b/resources/markdown/policy.md new file mode 100644 index 0000000..ff7dbea --- /dev/null +++ b/resources/markdown/policy.md @@ -0,0 +1,3 @@ +# Privacy Policy + +Edit this file to define the privacy policy for your application. diff --git a/resources/markdown/terms.md b/resources/markdown/terms.md new file mode 100644 index 0000000..bf2ace7 --- /dev/null +++ b/resources/markdown/terms.md @@ -0,0 +1,3 @@ +# Terms of Service + +Edit this file to define the terms of service for your application. diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php new file mode 100644 index 0000000..8896a06 --- /dev/null +++ b/resources/views/app.blade.php @@ -0,0 +1,22 @@ + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + @routes + @vite(['resources/js/app.js', "resources/js/Pages/{$page['component']}.vue"]) + @inertiaHead + + + @inertia + + diff --git a/resources/views/errors/401.blade.php b/resources/views/errors/401.blade.php new file mode 100644 index 0000000..fd921f5 --- /dev/null +++ b/resources/views/errors/401.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal-with-home') + +@section('title', __('Unauthorized')) +@section('code', '401') +@section('message', __('Unauthorized')) diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php new file mode 100644 index 0000000..31e6217 --- /dev/null +++ b/resources/views/errors/403.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal-with-home') + +@section('title', __('Forbidden')) +@section('code', '403') +@section('message', __($exception->getMessage() ?: 'Forbidden')) diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php new file mode 100644 index 0000000..ef25011 --- /dev/null +++ b/resources/views/errors/404.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal-with-home') + +@section('title', __('Not Found')) +@section('code', '404') +@section('message', __('Not Found')) diff --git a/resources/views/errors/419.blade.php b/resources/views/errors/419.blade.php new file mode 100644 index 0000000..a060b04 --- /dev/null +++ b/resources/views/errors/419.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal-with-home') + +@section('title', __('Page Expired')) +@section('code', '419') +@section('message', __('Page Expired')) diff --git a/resources/views/errors/429.blade.php b/resources/views/errors/429.blade.php new file mode 100644 index 0000000..f01b07b --- /dev/null +++ b/resources/views/errors/429.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal') + +@section('title', __('Too Many Requests')) +@section('code', '429') +@section('message', __('Too Many Requests')) diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php new file mode 100644 index 0000000..6fe0ba6 --- /dev/null +++ b/resources/views/errors/500.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal-with-home') + +@section('title', __('Server Error')) +@section('code', '500') +@section('message', __('Server Error')) diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php new file mode 100644 index 0000000..1d5bebc --- /dev/null +++ b/resources/views/errors/503.blade.php @@ -0,0 +1,5 @@ +@extends('errors::minimal') + +@section('title', __('Service Unavailable')) +@section('code', '503') +@section('message', __('In maintenance')) diff --git a/resources/views/errors/layout.blade.php b/resources/views/errors/layout.blade.php new file mode 100644 index 0000000..019c2cd --- /dev/null +++ b/resources/views/errors/layout.blade.php @@ -0,0 +1,53 @@ + + + + + + + @yield('title') + + + + + +

+
+
+ @yield('message') +
+
+
+ + diff --git a/resources/views/errors/minimal-with-home.blade.php b/resources/views/errors/minimal-with-home.blade.php new file mode 100644 index 0000000..ed8cd3e --- /dev/null +++ b/resources/views/errors/minimal-with-home.blade.php @@ -0,0 +1,31 @@ + + + + + + + @yield('title') + + + + @vite('resources/css/app.css') + + +
+
+

@yield('code')

+

@yield('message')

+ + + + + + {{__('Go to home')}} + + +
+
+ + diff --git a/resources/views/errors/minimal.blade.php b/resources/views/errors/minimal.blade.php new file mode 100644 index 0000000..0443fb8 --- /dev/null +++ b/resources/views/errors/minimal.blade.php @@ -0,0 +1,27 @@ + + + + + + + @yield('title') + + + + @vite('resources/css/app.css') + + +
+
+

+ @yield('code') +

+

+ @yield('message') +

+
+
+ + diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..eb6fa48 --- /dev/null +++ b/routes/api.php @@ -0,0 +1,19 @@ +get('/user', function (Request $request) { + return $request->user(); +}); diff --git a/routes/channels.php b/routes/channels.php new file mode 100644 index 0000000..b887f18 --- /dev/null +++ b/routes/channels.php @@ -0,0 +1,23 @@ +id === (int) $id; +}); + +Broadcast::channel('notifications', function ($user) { + return $user != null; +}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 0000000..e05f4c9 --- /dev/null +++ b/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/hook.php b/routes/hook.php new file mode 100644 index 0000000..97ce942 --- /dev/null +++ b/routes/hook.php @@ -0,0 +1,9 @@ + config('jetstream.middleware', ['web'])], function () { + if (Jetstream::hasTermsAndPrivacyPolicyFeature()) { + Route::get('/terms-of-service', [TermsOfServiceController::class, 'show'])->name('terms.show'); + Route::get('/privacy-policy', [PrivacyPolicyController::class, 'show'])->name('policy.show'); + } + + $authMiddleware = config('jetstream.guard') + ? 'auth:'.config('jetstream.guard') + : 'auth'; + + $authSessionMiddleware = config('jetstream.auth_session', false) + ? config('jetstream.auth_session') + : null; + + Route::group(['middleware' => array_values(array_filter([$authMiddleware, $authSessionMiddleware]))], function () { + // User & Profile... + Route::get('/user/profile', [UserProfileController::class, 'show']) + ->name('profile.show'); + + Route::delete('/user/other-browser-sessions', [OtherBrowserSessionsController::class, 'destroy']) + ->name('other-browser-sessions.destroy'); + + Route::delete('/user/profile-photo', [ProfilePhotoController::class, 'destroy']) + ->name('current-user-photo.destroy'); + + if (Jetstream::hasAccountDeletionFeatures()) { + Route::delete('/user', [CurrentUserController::class, 'destroy']) + ->name('current-user.destroy'); + } + + Route::group(['middleware' => 'verified'], function () { + // API... + if (Jetstream::hasApiFeatures()) { + Route::get('/user/api-tokens', [ApiTokenController::class, 'index'])->name('api-tokens.index'); + Route::post('/user/api-tokens', [ApiTokenController::class, 'store'])->name('api-tokens.store'); + Route::put('/user/api-tokens/{token}', [ApiTokenController::class, 'update'])->name('api-tokens.update'); + Route::delete('/user/api-tokens/{token}', [ApiTokenController::class, 'destroy'])->name('api-tokens.destroy'); + } + + // Teams... + if (Jetstream::hasTeamFeatures()) { + Route::get('/teams/create', [TeamController::class, 'create'])->name('teams.create'); + Route::post('/teams', [TeamController::class, 'store'])->name('teams.store'); + Route::get('/teams/{team}', [TeamController::class, 'show'])->name('teams.show'); + Route::put('/teams/{team}', [TeamController::class, 'update'])->name('teams.update'); + Route::delete('/teams/{team}', [TeamController::class, 'destroy'])->name('teams.destroy'); + Route::put('/current-team', [CurrentTeamController::class, 'update'])->name('current-team.update'); + Route::post('/teams/{team}/members', [TeamMemberController::class, 'store'])->name('team-members.store'); + Route::put('/teams/{team}/members/{user}', [TeamMemberController::class, 'update'])->name('team-members.update'); + Route::delete('/teams/{team}/members/{user}', [TeamMemberController::class, 'destroy'])->name('team-members.destroy'); + + Route::get('/team-invitations/{invitation}', [TeamInvitationController::class, 'accept']) + ->middleware(['signed']) + ->name('team-invitations.accept'); + + Route::delete('/team-invitations/{invitation}', [TeamInvitationController::class, 'destroy']) + ->name('team-invitations.destroy'); + } + }); + }); +}); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..2ad00e1 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,92 @@ +name('dashboard.')->middleware([ + 'auth:sanctum', + 'verified', + config('jetstream.auth_session') +])->group(function () { + Route::get('/welcome', [IndexController::class, 'index'])->name('index'); + Route::inertia('/changelogs', 'Dashboard/Changelogs')->name('changelogs'); + Route::inertia('/help', 'Dashboard/Help')->name('help'); + + # Log de Acciones + Route::resource('histories', HistoryLogController::class)->only([ + 'index', + 'store' + ]); + + Route::resource('notifications', NotificationController::class); + Route::prefix('/users')->name('users.')->group(function() + { + Route::get('/notifications', [UserController::class, 'getNotifications'])->name('notifications'); + }); +}); + +/** + * Rutas de administrador + * + * Estas ubicaciones son del administrador, sin embargo el desarrollador + * puede acceder a ellas. + */ +Route::prefix('admin')->name('admin.')->middleware([ + 'auth:sanctum', + config('jetstream.auth_session') +])->group(function () { + Route::resource('users', UserController::class); + + Route::prefix('/users')->name('users.')->group(function() + { + Route::get('{user}/settings', [UserController::class, 'settings'])->name('settings'); + Route::post('/password', [UserController::class, 'updatePassword'])->name('password'); + Route::post('/syncRoles', [UserController::class, 'syncRoles'])->name('syncRoles'); + }); +}); + +/** + * Rutas solo del desarrollador + * + * Son ubicaciones o funciones que pueden llegar a ser muy sensibles en el sistema, por lo que + * solo el desarrollador debe de ser capaz de modificarlas o actualizarlas. + */ +Route::prefix('developer')->name('developer.')->middleware([ + 'auth:sanctum', + config('jetstream.auth_session') +])->group(function () { + Route::resource('roles', RoleController::class); +}); + +/** + * Elementos de la plantilla + * + * Estos son elementos que existen y pueden ser usados en la plantilla, vienen ejemplos de uso. + * + * Estas rutas pueden ser comentadas o eliminadas cuando se finalice un proyecto. Por default estan ocultas + * en el dashboard. + */ +Route::prefix('examples')->name('examples.')->middleware([ + 'auth:sanctum', + 'verified', + config('jetstream.auth_session') +])->group(function () { + Route::get('/', [ExampleIndexController::class, 'index'])->name('index'); +}); \ No newline at end of file diff --git a/soketi.json.example b/soketi.json.example new file mode 100644 index 0000000..89ef4e2 --- /dev/null +++ b/soketi.json.example @@ -0,0 +1,17 @@ +{ + "debug": false, + "port": 6001, + "appManager.array.apps": [ + { + "id": "template", + "key": "example", + "secret": "my-secret", + "webhooks": [ + { + "url": "https://...", + "event_types": ["channel_occupied"] + } + ] + } + ] +} diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100755 index 0000000..8f4803c --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100755 index 0000000..05c4471 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100755 index 0000000..01e4a6c --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storagePermission.sh b/storagePermission.sh new file mode 100755 index 0000000..a44db75 --- /dev/null +++ b/storagePermission.sh @@ -0,0 +1,7 @@ +#!/bin/bash +read -p "Usuario del sistema: " myuser + +chown -R $myuser:www-data storage/ +chown -R $myuser:www-data bootstrap/cache/ +chmod -R 775 storage/ +chmod -R 775 bootstrap/cache/ \ No newline at end of file diff --git a/stubs/console.stub b/stubs/console.stub new file mode 100644 index 0000000..2dc52f4 --- /dev/null +++ b/stubs/console.stub @@ -0,0 +1,40 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = '{{ command }}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Command description'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + return Command::SUCCESS; + } +} diff --git a/stubs/controller.api.stub b/stubs/controller.api.stub new file mode 100644 index 0000000..dfc1033 --- /dev/null +++ b/stubs/controller.api.stub @@ -0,0 +1,72 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Controller +{ + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/stubs/controller.invokable.stub b/stubs/controller.invokable.stub new file mode 100644 index 0000000..c45d3c7 --- /dev/null +++ b/stubs/controller.invokable.stub @@ -0,0 +1,35 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends VueController +{ + use Vuew; + + /** + * Ruta Vista Padre + */ + protected $vueView = '{{ class }}'; + + /** + * Handle the incoming request. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function __invoke(Request $request) + { + // + } +} diff --git a/stubs/controller.model.api.stub b/stubs/controller.model.api.stub new file mode 100644 index 0000000..278b661 --- /dev/null +++ b/stubs/controller.model.api.stub @@ -0,0 +1,73 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Controller +{ + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \{{ namespacedStoreRequest }} $request + * @return \Illuminate\Http\Response + */ + public function store({{ storeRequest }} $request) + { + // + } + + /** + * Display the specified resource. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function show({{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \{{ namespacedUpdateRequest }} $request + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function update({{ updateRequest }} $request, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function destroy({{ model }} ${{ modelVariable }}) + { + // + } +} diff --git a/stubs/controller.model.stub b/stubs/controller.model.stub new file mode 100644 index 0000000..571ffd4 --- /dev/null +++ b/stubs/controller.model.stub @@ -0,0 +1,94 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends VueController +{ + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \{{ namespacedStoreRequest }} $request + * @return \Illuminate\Http\Response + */ + public function store({{ storeRequest }} $request) + { + // + } + + /** + * Display the specified resource. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function show({{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function edit({{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \{{ namespacedUpdateRequest }} $request + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function update({{ updateRequest }} $request, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function destroy({{ model }} ${{ modelVariable }}) + { + // + } +} diff --git a/stubs/controller.nested.api.stub b/stubs/controller.nested.api.stub new file mode 100644 index 0000000..54af63d --- /dev/null +++ b/stubs/controller.nested.api.stub @@ -0,0 +1,79 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Controller +{ + /** + * Display a listing of the resource. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @return \Illuminate\Http\Response + */ + public function index({{ parentModel }} ${{ parentModelVariable }}) + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @return \Illuminate\Http\Response + */ + public function store(Request $request, {{ parentModel }} ${{ parentModelVariable }}) + { + // + } + + /** + * Display the specified resource. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function show({{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function update(Request $request, {{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function destroy({{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } +} diff --git a/stubs/controller.nested.stub b/stubs/controller.nested.stub new file mode 100644 index 0000000..63676e3 --- /dev/null +++ b/stubs/controller.nested.stub @@ -0,0 +1,102 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends VueController +{ + /** + * Display a listing of the resource. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @return \Illuminate\Http\Response + */ + public function index({{ parentModel }} ${{ parentModelVariable }}) + { + // + } + + /** + * Show the form for creating a new resource. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @return \Illuminate\Http\Response + */ + public function create({{ parentModel }} ${{ parentModelVariable }}) + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @return \Illuminate\Http\Response + */ + public function store(Request $request, {{ parentModel }} ${{ parentModelVariable }}) + { + // + } + + /** + * Display the specified resource. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function show({{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function edit({{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function update(Request $request, {{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \{{ namespacedParentModel }} ${{ parentModelVariable }} + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return \Illuminate\Http\Response + */ + public function destroy({{ parentModel }} ${{ parentModelVariable }}, {{ model }} ${{ modelVariable }}) + { + // + } +} diff --git a/stubs/controller.plain.stub b/stubs/controller.plain.stub new file mode 100644 index 0000000..1c668a8 --- /dev/null +++ b/stubs/controller.plain.stub @@ -0,0 +1,19 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends VueController +{ + // +} diff --git a/stubs/controller.stub b/stubs/controller.stub new file mode 100644 index 0000000..a73082d --- /dev/null +++ b/stubs/controller.stub @@ -0,0 +1,93 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends VueController +{ + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/stubs/event.stub b/stubs/event.stub new file mode 100644 index 0000000..a3e21bb --- /dev/null +++ b/stubs/event.stub @@ -0,0 +1,44 @@ + + * + * @version 1.0.0 + */ +class {{ class }} +{ + use Dispatchable, InteractsWithSockets, SerializesModels; + + /** + * Create a new event instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/stubs/factory.stub b/stubs/factory.stub new file mode 100644 index 0000000..e1e208b --- /dev/null +++ b/stubs/factory.stub @@ -0,0 +1,30 @@ + + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\{{ namespacedModel }}> + * + * @version 1.0.0 + */ +class {{ factory }}Factory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + // + ]; + } +} diff --git a/stubs/job.queued.stub b/stubs/job.queued.stub new file mode 100644 index 0000000..fedfea3 --- /dev/null +++ b/stubs/job.queued.stub @@ -0,0 +1,43 @@ + + * + * @version 1.0.0 + */ +class {{ class }} implements ShouldQueue +{ + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + + /** + * Create a new job instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + // + } +} diff --git a/stubs/job.stub b/stubs/job.stub new file mode 100644 index 0000000..4488436 --- /dev/null +++ b/stubs/job.stub @@ -0,0 +1,38 @@ + + * + * @version 1.0.0 + */ +class {{ class }} +{ + use Dispatchable; + + /** + * Create a new job instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + // + } +} diff --git a/stubs/mail.stub b/stubs/mail.stub new file mode 100644 index 0000000..b2ece84 --- /dev/null +++ b/stubs/mail.stub @@ -0,0 +1,41 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Mailable +{ + use Queueable, SerializesModels; + + /** + * Create a new message instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('view.name'); + } +} diff --git a/stubs/markdown-mail.stub b/stubs/markdown-mail.stub new file mode 100644 index 0000000..0b5a37a --- /dev/null +++ b/stubs/markdown-mail.stub @@ -0,0 +1,41 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Mailable +{ + use Queueable, SerializesModels; + + /** + * Create a new message instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->markdown('{{ view }}'); + } +} diff --git a/stubs/markdown-notification.stub b/stubs/markdown-notification.stub new file mode 100644 index 0000000..7315228 --- /dev/null +++ b/stubs/markdown-notification.stub @@ -0,0 +1,66 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Notification +{ + use Queueable; + + /** + * Create a new notification instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage)->markdown('{{ view }}'); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/stubs/middleware.stub b/stubs/middleware.stub new file mode 100644 index 0000000..d455d92 --- /dev/null +++ b/stubs/middleware.stub @@ -0,0 +1,29 @@ + + * + * @version 1.0.0 + */ +class {{ class }} +{ + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse + */ + public function handle(Request $request, Closure $next) + { + return $next($request); + } +} diff --git a/stubs/migration.stub b/stubs/migration.stub new file mode 100644 index 0000000..41dd1c8 --- /dev/null +++ b/stubs/migration.stub @@ -0,0 +1,28 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Pivot +{ + // +} diff --git a/stubs/model.stub b/stubs/model.stub new file mode 100644 index 0000000..ae2ae39 --- /dev/null +++ b/stubs/model.stub @@ -0,0 +1,28 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Model +{ + use HasFactory, + ModelExtend; + + /** + * Atributos llenables masivamente + */ + protected $fillable = [ + + ]; +} diff --git a/stubs/notification.stub b/stubs/notification.stub new file mode 100644 index 0000000..919cf5b --- /dev/null +++ b/stubs/notification.stub @@ -0,0 +1,69 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Notification +{ + use Queueable; + + /** + * Create a new notification instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage) + ->line('The introduction to the notification.') + ->action('Notification Action', url('/')) + ->line('Thank you for using our application!'); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/stubs/observer.stub b/stubs/observer.stub new file mode 100644 index 0000000..87034cb --- /dev/null +++ b/stubs/observer.stub @@ -0,0 +1,90 @@ + + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\{{ namespacedModel }}> + * + * @version 1.0.0 + */ +class {{ class }} +{ + use ReportAction; + + /** + * Objeto del evento + */ + protected $event = '{{ modelVariable }}s'; + + /** + * Handle the {{ model }} "created" event. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return void + */ + public function created({{ model }} ${{ modelVariable }}) + { + $this->reportCreate($this->event, ${{ modelVariable }}->toArray(), __("{$this->event}.created", [ + '{{ modelVariable }}' => ${{ modelVariable }}->name + ])); + } + + /** + * Handle the {{ model }} "updated" event. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return void + */ + public function updated({{ model }} ${{ modelVariable }}) + { + $this->reportUpdate($this->event, ${{ modelVariable }}->getContrastChanges(), __("{$this->event}.updated", [ + '{{ modelVariable }}' => ${{ modelVariable }}->name + ])); + } + + /** + * Handle the {{ model }} "deleted" event. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return void + */ + public function deleted({{ model }} ${{ modelVariable }}) + { + $this->reportDestroy($this->event, ${{ modelVariable }}->toArray(), __("{$this->event}.deleted", [ + '{{ modelVariable }}' => ${{ modelVariable }}->name + ])); + } + + /** + * Handle the {{ model }} "restored" event. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return void + */ + public function restored({{ model }} ${{ modelVariable }}) + { + $this->reportUpdate($this->event, ${{ modelVariable }}->toArray(), __("{$this->event}.restored", [ + '{{ modelVariable }}' => ${{ modelVariable }}->name + ])); + } + + /** + * Handle the {{ model }} "force deleted" event. + * + * @param \{{ namespacedModel }} ${{ modelVariable }} + * @return void + */ + public function forceDeleted({{ model }} ${{ modelVariable }}) + { + $this->reportDestroy($this->event, ${{ modelVariable }}->toArray(), __("{$this->event}.forceDeleted", [ + '{{ modelVariable }}' => ${{ modelVariable }}->name + ])); + } +} diff --git a/stubs/provider.stub b/stubs/provider.stub new file mode 100644 index 0000000..d9e8450 --- /dev/null +++ b/stubs/provider.stub @@ -0,0 +1,36 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends ServiceProvider +{ + /** + * Register services. + * + * @return void + */ + public function register() + { + // + } + + /** + * Bootstrap services. + * + * @return void + */ + public function boot() + { + // + } +} diff --git a/stubs/request.stub b/stubs/request.stub new file mode 100644 index 0000000..c04425e --- /dev/null +++ b/stubs/request.stub @@ -0,0 +1,38 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends FormRequest +{ + /** + * Determinar si el usuario esta autorizado + * + * @return bool + */ + public function authorize() + { + return false; + } + + /** + * Reglas de validación + * + * @return array + */ + public function rules() + { + return [ + // + ]; + } +} diff --git a/stubs/rule.stub b/stubs/rule.stub new file mode 100644 index 0000000..0b5b183 --- /dev/null +++ b/stubs/rule.stub @@ -0,0 +1,48 @@ + + * + * @version 1.0.0 + */ +class {{ class }} implements {{ ruleType }} +{ + /** + * Create a new rule instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + // + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return 'The validation error message.'; + } +} diff --git a/stubs/scope.stub b/stubs/scope.stub new file mode 100644 index 0000000..770ce63 --- /dev/null +++ b/stubs/scope.stub @@ -0,0 +1,30 @@ + + * + * @version 1.0.0 + */ +class {{ class }} implements Scope +{ + /** + * Apply the scope to a given Eloquent query builder. + * + * @param \Illuminate\Database\Eloquent\Builder $builder + * @param \Illuminate\Database\Eloquent\Model $model + * @return void + */ + public function apply(Builder $builder, Model $model) + { + // + } +} diff --git a/stubs/seeder.stub b/stubs/seeder.stub new file mode 100644 index 0000000..e4e02f9 --- /dev/null +++ b/stubs/seeder.stub @@ -0,0 +1,27 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + // + } +} diff --git a/stubs/test.stub b/stubs/test.stub new file mode 100644 index 0000000..f831db3 --- /dev/null +++ b/stubs/test.stub @@ -0,0 +1,30 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends TestCase +{ + /** + * A basic feature test example. + * + * @return void + */ + public function test_example() + { + $response = $this->get('/'); + + $response->assertStatus(200); + } +} diff --git a/stubs/test.unit.stub b/stubs/test.unit.stub new file mode 100644 index 0000000..c5863a7 --- /dev/null +++ b/stubs/test.unit.stub @@ -0,0 +1,26 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends TestCase +{ + /** + * A basic unit test example. + * + * @return void + */ + public function test_example() + { + $this->assertTrue(true); + } +} diff --git a/stubs/view-component.stub b/stubs/view-component.stub new file mode 100644 index 0000000..0365a14 --- /dev/null +++ b/stubs/view-component.stub @@ -0,0 +1,36 @@ + + * + * @version 1.0.0 + */ +class {{ class }} extends Component +{ + /** + * Create a new component instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Get the view / contents that represent the component. + * + * @return \Illuminate\Contracts\View\View|\Closure|string + */ + public function render() + { + return {{ view }}; + } +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..aa7b36d --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,35 @@ +const defaultTheme = require('tailwindcss/defaultTheme') +const colorsConfig = require('./colors.json') + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', + content: [ + './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', + './vendor/laravel/jetstream/**/*.blade.php', + './storage/framework/views/*.php', + './resources/views/**/*.blade.php', + './resources/js/**/*.vue', + './colors.json', + ], + + theme: { + extend: { + fontFamily: { + sans: ['Nunito', ...defaultTheme.fontFamily.sans], + 'google-icon':['Material Icons'], + 'google-icon-outlined':['Material Symbols Outlined'] + }, + colors: colorsConfig, + spacing: { + '18': '4.5rem', + '22': '5.5rem', + '26': '6.5rem', + '30': '7.5rem', + '128': '32rem', + } + }, + }, + + plugins: [require('@tailwindcss/typography')], +}; diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php new file mode 100644 index 0000000..547152f --- /dev/null +++ b/tests/CreatesApplication.php @@ -0,0 +1,22 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } +} diff --git a/tests/Feature/ApiTokenPermissionsTest.php b/tests/Feature/ApiTokenPermissionsTest.php new file mode 100644 index 0000000..d086e74 --- /dev/null +++ b/tests/Feature/ApiTokenPermissionsTest.php @@ -0,0 +1,41 @@ +markTestSkipped('API support is not enabled.'); + } + + $this->actingAs($user = User::factory()->withPersonalTeam()->create()); + + $token = $user->tokens()->create([ + 'name' => 'Test Token', + 'token' => Str::random(40), + 'abilities' => ['create', 'read'], + ]); + + $response = $this->put('/user/api-tokens/'.$token->id, [ + 'name' => $token->name, + 'permissions' => [ + 'delete', + 'missing-permission', + ], + ]); + + $this->assertTrue($user->fresh()->tokens->first()->can('delete')); + $this->assertFalse($user->fresh()->tokens->first()->can('read')); + $this->assertFalse($user->fresh()->tokens->first()->can('missing-permission')); + } +} diff --git a/tests/Feature/AuthenticationTest.php b/tests/Feature/AuthenticationTest.php new file mode 100644 index 0000000..2dbceac --- /dev/null +++ b/tests/Feature/AuthenticationTest.php @@ -0,0 +1,45 @@ +get('/login'); + + $response->assertStatus(200); + } + + public function test_users_can_authenticate_using_the_login_screen() + { + $user = User::factory()->create(); + + $response = $this->post('/login', [ + 'email' => $user->email, + 'password' => 'password', + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(RouteServiceProvider::HOME); + } + + public function test_users_can_not_authenticate_with_invalid_password() + { + $user = User::factory()->create(); + + $this->post('/login', [ + 'email' => $user->email, + 'password' => 'wrong-password', + ]); + + $this->assertGuest(); + } +} diff --git a/tests/Feature/BrowserSessionsTest.php b/tests/Feature/BrowserSessionsTest.php new file mode 100644 index 0000000..9ba664e --- /dev/null +++ b/tests/Feature/BrowserSessionsTest.php @@ -0,0 +1,23 @@ +actingAs($user = User::factory()->create()); + + $response = $this->delete('/user/other-browser-sessions', [ + 'password' => 'password', + ]); + + $response->assertSessionHasNoErrors(); + } +} diff --git a/tests/Feature/CreateApiTokenTest.php b/tests/Feature/CreateApiTokenTest.php new file mode 100644 index 0000000..11846fa --- /dev/null +++ b/tests/Feature/CreateApiTokenTest.php @@ -0,0 +1,35 @@ +markTestSkipped('API support is not enabled.'); + } + + $this->actingAs($user = User::factory()->withPersonalTeam()->create()); + + $response = $this->post('/user/api-tokens', [ + 'name' => 'Test Token', + 'permissions' => [ + 'read', + 'update', + ], + ]); + + $this->assertCount(1, $user->fresh()->tokens); + $this->assertEquals('Test Token', $user->fresh()->tokens->first()->name); + $this->assertTrue($user->fresh()->tokens->first()->can('read')); + $this->assertFalse($user->fresh()->tokens->first()->can('delete')); + } +} diff --git a/tests/Feature/DeleteAccountTest.php b/tests/Feature/DeleteAccountTest.php new file mode 100644 index 0000000..a8110db --- /dev/null +++ b/tests/Feature/DeleteAccountTest.php @@ -0,0 +1,43 @@ +markTestSkipped('Account deletion is not enabled.'); + } + + $this->actingAs($user = User::factory()->create()); + + $response = $this->delete('/user', [ + 'password' => 'password', + ]); + + $this->assertNull($user->fresh()); + } + + public function test_correct_password_must_be_provided_before_account_can_be_deleted() + { + if (! Features::hasAccountDeletionFeatures()) { + return $this->markTestSkipped('Account deletion is not enabled.'); + } + + $this->actingAs($user = User::factory()->create()); + + $response = $this->delete('/user', [ + 'password' => 'wrong-password', + ]); + + $this->assertNotNull($user->fresh()); + } +} diff --git a/tests/Feature/DeleteApiTokenTest.php b/tests/Feature/DeleteApiTokenTest.php new file mode 100644 index 0000000..a21b48f --- /dev/null +++ b/tests/Feature/DeleteApiTokenTest.php @@ -0,0 +1,33 @@ +markTestSkipped('API support is not enabled.'); + } + + $this->actingAs($user = User::factory()->withPersonalTeam()->create()); + + $token = $user->tokens()->create([ + 'name' => 'Test Token', + 'token' => Str::random(40), + 'abilities' => ['create', 'read'], + ]); + + $response = $this->delete('/user/api-tokens/'.$token->id); + + $this->assertCount(0, $user->fresh()->tokens); + } +} diff --git a/tests/Feature/EmailVerificationTest.php b/tests/Feature/EmailVerificationTest.php new file mode 100644 index 0000000..f240e12 --- /dev/null +++ b/tests/Feature/EmailVerificationTest.php @@ -0,0 +1,73 @@ +markTestSkipped('Email verification not enabled.'); + } + + $user = User::factory()->withPersonalTeam()->unverified()->create(); + + $response = $this->actingAs($user)->get('/email/verify'); + + $response->assertStatus(200); + } + + public function test_email_can_be_verified() + { + if (! Features::enabled(Features::emailVerification())) { + return $this->markTestSkipped('Email verification not enabled.'); + } + + Event::fake(); + + $user = User::factory()->unverified()->create(); + + $verificationUrl = URL::temporarySignedRoute( + 'verification.verify', + now()->addMinutes(60), + ['id' => $user->id, 'hash' => sha1($user->email)] + ); + + $response = $this->actingAs($user)->get($verificationUrl); + + Event::assertDispatched(Verified::class); + + $this->assertTrue($user->fresh()->hasVerifiedEmail()); + $response->assertRedirect(RouteServiceProvider::HOME.'?verified=1'); + } + + public function test_email_can_not_verified_with_invalid_hash() + { + if (! Features::enabled(Features::emailVerification())) { + return $this->markTestSkipped('Email verification not enabled.'); + } + + $user = User::factory()->unverified()->create(); + + $verificationUrl = URL::temporarySignedRoute( + 'verification.verify', + now()->addMinutes(60), + ['id' => $user->id, 'hash' => sha1('wrong-email')] + ); + + $this->actingAs($user)->get($verificationUrl); + + $this->assertFalse($user->fresh()->hasVerifiedEmail()); + } +} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..1eafba6 --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,21 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/Feature/PasswordConfirmationTest.php b/tests/Feature/PasswordConfirmationTest.php new file mode 100644 index 0000000..a31fbab --- /dev/null +++ b/tests/Feature/PasswordConfirmationTest.php @@ -0,0 +1,45 @@ +withPersonalTeam()->create(); + + $response = $this->actingAs($user)->get('/user/confirm-password'); + + $response->assertStatus(200); + } + + public function test_password_can_be_confirmed() + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/user/confirm-password', [ + 'password' => 'password', + ]); + + $response->assertRedirect(); + $response->assertSessionHasNoErrors(); + } + + public function test_password_is_not_confirmed_with_invalid_password() + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/user/confirm-password', [ + 'password' => 'wrong-password', + ]); + + $response->assertSessionHasErrors(); + } +} diff --git a/tests/Feature/PasswordResetTest.php b/tests/Feature/PasswordResetTest.php new file mode 100644 index 0000000..13b94b2 --- /dev/null +++ b/tests/Feature/PasswordResetTest.php @@ -0,0 +1,94 @@ +markTestSkipped('Password updates are not enabled.'); + } + + $response = $this->get('/forgot-password'); + + $response->assertStatus(200); + } + + public function test_reset_password_link_can_be_requested() + { + if (! Features::enabled(Features::resetPasswords())) { + return $this->markTestSkipped('Password updates are not enabled.'); + } + + Notification::fake(); + + $user = User::factory()->create(); + + $response = $this->post('/forgot-password', [ + 'email' => $user->email, + ]); + + Notification::assertSentTo($user, ResetPassword::class); + } + + public function test_reset_password_screen_can_be_rendered() + { + if (! Features::enabled(Features::resetPasswords())) { + return $this->markTestSkipped('Password updates are not enabled.'); + } + + Notification::fake(); + + $user = User::factory()->create(); + + $response = $this->post('/forgot-password', [ + 'email' => $user->email, + ]); + + Notification::assertSentTo($user, ResetPassword::class, function ($notification) { + $response = $this->get('/reset-password/'.$notification->token); + + $response->assertStatus(200); + + return true; + }); + } + + public function test_password_can_be_reset_with_valid_token() + { + if (! Features::enabled(Features::resetPasswords())) { + return $this->markTestSkipped('Password updates are not enabled.'); + } + + Notification::fake(); + + $user = User::factory()->create(); + + $response = $this->post('/forgot-password', [ + 'email' => $user->email, + ]); + + Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { + $response = $this->post('/reset-password', [ + 'token' => $notification->token, + 'email' => $user->email, + 'password' => 'password', + 'password_confirmation' => 'password', + ]); + + $response->assertSessionHasNoErrors(); + + return true; + }); + } +} diff --git a/tests/Feature/ProfileInformationTest.php b/tests/Feature/ProfileInformationTest.php new file mode 100644 index 0000000..33a4262 --- /dev/null +++ b/tests/Feature/ProfileInformationTest.php @@ -0,0 +1,25 @@ +actingAs($user = User::factory()->create()); + + $response = $this->put('/user/profile-information', [ + 'name' => 'Test Name', + 'email' => 'test@example.com', + ]); + + $this->assertEquals('Test Name', $user->fresh()->name); + $this->assertEquals('test@example.com', $user->fresh()->email); + } +} diff --git a/tests/Feature/RegistrationTest.php b/tests/Feature/RegistrationTest.php new file mode 100644 index 0000000..aae144f --- /dev/null +++ b/tests/Feature/RegistrationTest.php @@ -0,0 +1,54 @@ +markTestSkipped('Registration support is not enabled.'); + } + + $response = $this->get('/register'); + + $response->assertStatus(200); + } + + public function test_registration_screen_cannot_be_rendered_if_support_is_disabled() + { + if (Features::enabled(Features::registration())) { + return $this->markTestSkipped('Registration support is enabled.'); + } + + $response = $this->get('/register'); + + $response->assertStatus(404); + } + + public function test_new_users_can_register() + { + if (! Features::enabled(Features::registration())) { + return $this->markTestSkipped('Registration support is not enabled.'); + } + + $response = $this->post('/register', [ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => 'password', + 'password_confirmation' => 'password', + 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature(), + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(RouteServiceProvider::HOME); + } +} diff --git a/tests/Feature/TwoFactorAuthenticationSettingsTest.php b/tests/Feature/TwoFactorAuthenticationSettingsTest.php new file mode 100644 index 0000000..6a0eaf4 --- /dev/null +++ b/tests/Feature/TwoFactorAuthenticationSettingsTest.php @@ -0,0 +1,69 @@ +markTestSkipped('Two factor authentication is not enabled.'); + } + + $this->actingAs($user = User::factory()->create()); + + $this->withSession(['auth.password_confirmed_at' => time()]); + + $response = $this->post('/user/two-factor-authentication'); + + $this->assertNotNull($user->fresh()->two_factor_secret); + $this->assertCount(8, $user->fresh()->recoveryCodes()); + } + + public function test_recovery_codes_can_be_regenerated() + { + if (! Features::canManageTwoFactorAuthentication()) { + return $this->markTestSkipped('Two factor authentication is not enabled.'); + } + + $this->actingAs($user = User::factory()->create()); + + $this->withSession(['auth.password_confirmed_at' => time()]); + + $this->post('/user/two-factor-authentication'); + $this->post('/user/two-factor-recovery-codes'); + + $user = $user->fresh(); + + $this->post('/user/two-factor-recovery-codes'); + + $this->assertCount(8, $user->recoveryCodes()); + $this->assertCount(8, array_diff($user->recoveryCodes(), $user->fresh()->recoveryCodes())); + } + + public function test_two_factor_authentication_can_be_disabled() + { + if (! Features::canManageTwoFactorAuthentication()) { + return $this->markTestSkipped('Two factor authentication is not enabled.'); + } + + $this->actingAs($user = User::factory()->create()); + + $this->withSession(['auth.password_confirmed_at' => time()]); + + $this->post('/user/two-factor-authentication'); + + $this->assertNotNull($user->fresh()->two_factor_secret); + + $this->delete('/user/two-factor-authentication'); + + $this->assertNull($user->fresh()->two_factor_secret); + } +} diff --git a/tests/Feature/UpdatePasswordTest.php b/tests/Feature/UpdatePasswordTest.php new file mode 100644 index 0000000..6f4fb4e --- /dev/null +++ b/tests/Feature/UpdatePasswordTest.php @@ -0,0 +1,56 @@ +actingAs($user = User::factory()->create()); + + $response = $this->put('/user/password', [ + 'current_password' => 'password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ]); + + $this->assertTrue(Hash::check('new-password', $user->fresh()->password)); + } + + public function test_current_password_must_be_correct() + { + $this->actingAs($user = User::factory()->create()); + + $response = $this->put('/user/password', [ + 'current_password' => 'wrong-password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ]); + + $response->assertSessionHasErrors(); + + $this->assertTrue(Hash::check('password', $user->fresh()->password)); + } + + public function test_new_passwords_must_match() + { + $this->actingAs($user = User::factory()->create()); + + $response = $this->put('/user/password', [ + 'current_password' => 'password', + 'password' => 'new-password', + 'password_confirmation' => 'wrong-password', + ]); + + $response->assertSessionHasErrors(); + + $this->assertTrue(Hash::check('password', $user->fresh()->password)); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..2932d4a --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/updateBuild.sh b/updateBuild.sh new file mode 100644 index 0000000..6cee588 --- /dev/null +++ b/updateBuild.sh @@ -0,0 +1,3 @@ +rm -r ./public/build +unzip ./build.zip -d ./public +rm ./build.zip diff --git a/updater.js b/updater.js new file mode 100644 index 0000000..291327a --- /dev/null +++ b/updater.js @@ -0,0 +1,109 @@ +/** + * Dependencias + */ +const env = require('dotenv') +const util = require('util') +const express = require('express') +const { exec } = require('child_process'); +const Pusher = require("pusher"); + +/** + * Importar configuraciones + */ +env.config() +const notifySettings = { + appId: process.env.PUSHER_APP_ID, + key: process.env.PUSHER_APP_KEY, + secret: process.env.PUSHER_APP_SECRET, + cluster: process.env.PUSHER_APP_CLUSTER, + host: process.env.PUSHER_HOST, + port: process.env?.PUSHER_PORT ?? 80, + forceTLS: (process.env.PUSHER_SCHEME == 'https') ? true : false, + useTLS: (process.env.PUSHER_SCHEME == 'https') ? true : false, + enableStats: false, + enabledTransports: ['ws', 'wss'], +} + +/** + * Iniciar objetos + */ +const app = express() +const shell = util.promisify(exec) +const client = new Pusher(notifySettings); + +/** + * Configuraciones + */ +app.use(express.json()); + +/** + * Rutas + */ +app.get('/', async(req, res) => { + res.send({ + status: 200, + message: 'Welcome' + }) +}) + +app.post('/update', async(req, res) => { + const body = req.body; + const branch = process.env?.REPOSITORY_BRANCH ?? 'main' + const ref = `refs/heads/${branch}` + + if(body.ref == ref) { + notify({message: 'Iniciando actualización.'}) + notify({message: 'Descargando cambios...'}) + + exec(`git pull origin ${branch}`, async(error, stdout, stderr) => { + if (error) { + console.error(`error: ${error.message}`); + return; + } + + if (stderr) { + console.error(`stderr: ${stderr}`); + + notify({message: 'Copilando aplicación...'}) + + await shell(`npm run build`) + + notify({message: 'Actualización terminada, recargue la página.'}) + + return; + } + }); + + res.send({ + 'status':200, + 'message':'Init process' + }); + } else { + res.send({ + 'status':200, + 'message':'No ref match' + }); + } + +}); + +app.listen(process.env?.REPOSITORY_WATCHER_PORT ?? 3001, '127.0.0.1', () => { + console.log(`Server started`) +}); + +function notify({ + channel = 'private-notifications', + event = 'App\\Events\\GlobalNotification', + message = 'Success.', + type = 'success' +}) { + if(process.env.PUSHER_NOTIFICATIONS == 'true') { + try { + client.trigger(channel, event, { message, type, timeout: 15 }).then((e) => { + + }); + } catch (error) { + console.error(error); + } + } +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..3c6da88 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,28 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; +import vue from '@vitejs/plugin-vue'; + +export default defineConfig({ + define: { + __VUE_I18N_FULL_INSTALL__: true, + __VUE_I18N_LEGACY_API__: false, + __INTLIFY_PROD_DEVTOOLS__: false, + }, + plugins: [ + laravel({ + input: [ + 'resources/css/app.css', + 'resources/js/app.js' + ], + refresh: true, + }), + vue({ + template: { + transformAssetUrls: { + base: null, + includeAbsolute: false, + }, + }, + }), + ], +});