From 1640ab29a943ef2e4f96a0d53d5174da29ef1ce5 Mon Sep 17 00:00:00 2001 From: Jorick Schram Date: Wed, 11 Dec 2024 11:16:15 +0100 Subject: [PATCH] Update PoC to Pilot version --- .env.example | 10 + README.md | 26 +- app/Actions/ContentPage/CreateAction.php | 19 + app/Actions/ContentPage/DeleteAction.php | 18 + app/Actions/ContentPage/UpdateAction.php | 18 + app/Actions/CustomField/CreateAction.php | 31 + app/Actions/CustomField/DeleteAction.php | 18 + app/Actions/CustomField/UpdateAction.php | 18 + .../EditHomepageInformationAction.php | 24 + app/Actions/Institute/ImpersonateAction.php | 17 + .../Institute/StopImpersonatingAction.php | 16 + app/Actions/Institute/Tag/CreateAction.php | 26 + app/Actions/Institute/Tag/DeleteAction.php | 18 + app/Actions/Institute/Tag/UpdateAction.php | 26 + app/Actions/Institute/Tool/AddAction.php | 29 +- .../Institute/Tool/Concept/CreateAction.php | 53 + .../Institute/Tool/Concept/DiscardAction.php | 24 + .../Institute/Tool/Concept/PublishAction.php | 64 + .../Tool/Concept/SafelyDiscardAction.php | 34 + .../Institute/Tool/Concept/UpdateAction.php | 77 + app/Actions/Institute/Tool/PublishAction.php | 3 +- .../Institute/Tool/SendNotificationAction.php | 44 + .../Institute/Tool/UnpublishAction.php | 3 +- app/Actions/Institute/Tool/UpdateAction.php | 25 +- app/Actions/PendingToolEdit/ClearAction.php | 24 + app/Actions/PendingToolEdit/CreateAction.php | 27 + app/Actions/Tag/CreateAction.php | 18 + app/Actions/Tag/DeleteAction.php | 18 + app/Actions/Tag/UpdateAction.php | 21 + .../Tool/ChangeFollowingStatusAction.php | 22 + app/Actions/Tool/Concept/CreateAction.php | 39 + app/Actions/Tool/Concept/DiscardAction.php | 28 + app/Actions/Tool/Concept/PublishAction.php | 76 + .../Tool/Concept/SafelyDiscardAction.php | 32 + .../Tool/Concept/StoreImagesAction.php | 34 + app/Actions/Tool/Concept/UpdateAction.php | 50 + app/Actions/Tool/CreateAction.php | 31 +- app/Actions/Tool/NotifyStakeholdersAction.php | 24 + app/Actions/Tool/StoreImagesAction.php | 5 +- .../Tool/SubmitRequestForChangeAction.php | 26 + app/Actions/ToolLog/CreateAction.php | 27 + app/Console/Commands/Bootstrap/Institutes.php | 107 +- app/Console/Kernel.php | 3 +- app/Enums/BaseEnum.php | 5 + .../InstituteTool/DataClassification.php | 17 + app/Enums/InstituteTool/Sort.php | 15 + app/Enums/InstituteTool/Status.php | 27 +- app/Enums/Tags/TagTypes.php | 56 + app/Enums/Tool/Tabs.php | 18 + .../CustomHandlers/SurfConextException.php | 33 + app/Exceptions/Handler.php | 7 +- app/Exceptions/SurfConextException.php | 11 + .../Http/Controllers/AuthController.php | 5 +- app/External/Auth/SURF/Manager.php | 65 +- app/Helpers/Country.php | 35 + app/Helpers/File.php | 38 +- app/Helpers/Format.php | 2 +- app/Helpers/Locale.php | 36 + app/Helpers/LoginRedirect.php | 5 +- app/Helpers/ToolPrefillData.php | 38 + app/Helpers/WYSIWYG.php | 26 + app/Http/Controllers/AccountController.php | 13 +- .../Admin/InstitutesController.php | 37 + .../ContentManager/TagController.php | 100 + .../ContentManager/ToolController.php | 154 +- .../Controllers/ContentPageController.php | 94 + app/Http/Controllers/Controller.php | 1 + app/Http/Controllers/HomeController.php | 9 +- .../CustomFieldController.php | 100 + .../HomepageInformationController.php | 39 + .../NotificationController.php | 53 + .../InformationManager/TagController.php | 100 + .../InformationManager/ToolController.php | 210 +- app/Http/Controllers/LocaleController.php | 31 + app/Http/Controllers/Other/ToolController.php | 39 +- app/Http/Controllers/Our/ToolController.php | 43 +- app/Http/Controllers/ToolController.php | 127 + app/Http/Kernel.php | 8 +- app/Http/Middleware/EncryptCookies.php | 2 +- app/Http/Middleware/HandleInertiaRequests.php | 15 +- .../PreventRequestsDuringMaintenance.php | 2 +- app/Http/Middleware/TrimStrings.php | 2 +- app/Http/Middleware/TrustProxies.php | 11 +- app/Http/Middleware/VerifyCsrfToken.php | 2 +- app/Http/Requests/ContentPage/BaseRequest.php | 36 + .../Requests/ContentPage/StoreRequest.php | 15 + .../Requests/ContentPage/UpdateRequest.php | 13 + app/Http/Requests/CustomField/BaseRequest.php | 46 + .../Requests/CustomField/StoreRequest.php | 15 + .../Requests/CustomField/UpdateRequest.php | 13 + app/Http/Requests/Experience/BaseRequest.php | 4 +- .../HomepageInformation/BaseRequest.php | 22 + .../HomepageInformation/EditRequest.php | 15 + .../Requests/InstituteTag/BaseRequest.php | 42 + .../Requests/InstituteTag/StoreRequest.php | 15 + .../Requests/InstituteTag/UpdateRequest.php | 13 + .../Requests/InstituteTool/BaseRequest.php | 79 +- .../Requests/InstituteTool/UpdateRequest.php | 6 +- app/Http/Requests/RequestForChangeRequest.php | 22 + app/Http/Requests/Tag/BaseRequest.php | 29 + app/Http/Requests/Tag/StoreRequest.php | 15 + app/Http/Requests/Tag/UpdateRequest.php | 13 + app/Http/Requests/Tool/BaseRequest.php | 89 +- .../Requests/Tool/SendNotificationRequest.php | 32 + app/Http/Requests/Tool/StoreRequest.php | 8 + app/Http/Resources/BaseToolIndexResource.php | 52 + .../ContentManager/ConceptToolResource.php | 63 + .../ContentManager/ToolIndexResource.php | 31 +- .../Resources/ContentManager/ToolResource.php | 18 +- app/Http/Resources/ContentPageResource.php | 40 + app/Http/Resources/CustomFieldResource.php | 36 + app/Http/Resources/ExperienceResource.php | 20 +- .../CustomFieldResource.php | 25 + .../CustomFieldValueResource.php | 51 + .../InstituteToolResource.php | 99 +- .../InformationManager/TagResource.php | 42 + .../InformationManager/ToolIndexResource.php | 65 +- app/Http/Resources/InstituteResource.php | 18 +- app/Http/Resources/LocaleResource.php | 24 + app/Http/Resources/Other/ToolResource.php | 45 +- .../Resources/Our/AlternativeToolResource.php | 22 +- app/Http/Resources/Our/ToolResource.php | 193 +- app/Http/Resources/PaginationResource.php | 1 + .../Resources/PendingToolEditResource.php | 24 + app/Http/Resources/TagResource.php | 29 + app/Http/Resources/ToolIndexResource.php | 34 +- app/Http/Resources/ToolLogResource.php | 24 + app/Http/Resources/ToolResource.php | 85 +- app/Http/Resources/UserResource.php | 22 +- app/Http/ViewComposers/AppComposer.php | 4 +- app/Mail/BaseMailable.php | 20 + app/Mail/InstituteToolNotificationMail.php | 53 + app/Mail/RequestForChange.php | 50 + app/Mail/ToolUpdated.php | 36 + app/Models/ConceptCustomFieldValue.php | 21 + app/Models/ConceptInstituteTool.php | 131 + app/Models/ConceptTool.php | 129 + app/Models/ContentPage.php | 21 + app/Models/CustomField.php | 39 + app/Models/CustomFieldValue.php | 29 + app/Models/Experience.php | 25 +- app/Models/Institute.php | 89 +- app/Models/InstituteTool.php | 164 +- app/Models/PendingToolEdit.php | 66 + app/Models/Scopes/DefaultSortScope.php | 24 + app/Models/Tag.php | 53 + app/Models/Tool.php | 427 +- app/Models/ToolLog.php | 48 + app/Models/User.php | 103 +- app/Policies/ContentPagePolicy.php | 15 + app/Policies/CustomFieldPolicy.php | 33 + app/Policies/ExperiencePolicy.php | 9 + app/Policies/InstitutePolicy.php | 30 + app/Policies/TagPolicy.php | 53 + app/Policies/TagTypePolicy.php | 21 + app/Policies/ToolPolicy.php | 64 +- app/Policies/TranslationPolicy.php | 10 - app/Providers/AuthServiceProvider.php | 16 +- app/Providers/EventServiceProvider.php | 2 +- app/Providers/ValidationServiceProvider.php | 4 + app/Rules/DbString.php | 1 - app/Rules/DbText.php | 50 + app/Rules/ExistsInTags.php | 33 + app/Rules/UniqueTagRule.php | 62 + app/Rules/UriRule.php | 42 + app/Traits/Models/SearchesLocalizedFields.php | 24 + app/Traits/Resources/WithImage.php | 9 +- bootstrap/app.php | 4 +- buildHook.sh | 10 +- composer.json | 48 +- composer.lock | 7704 +++++----- config/bootstrap.php | 120 +- config/constants.php | 3 +- config/filesystems.php | 59 +- config/ignition.php | 10 +- config/laravellocalization.php | 578 +- config/mail.php | 6 + config/tags.php | 26 + config/validation.php | 11 +- database/factories/ContentPageFactory.php | 26 + database/factories/CustomFieldFactory.php | 28 + .../factories/CustomFieldValueFactory.php | 26 + database/factories/ExperienceFactory.php | 9 +- database/factories/InstituteFactory.php | 25 +- database/factories/InstituteToolFactory.php | 105 +- database/factories/LanguageFactory.php | 38 + database/factories/PendingToolEditFactory.php | 29 + database/factories/TagFactory.php | 33 + database/factories/ToolFactory.php | 97 +- database/factories/ToolLogFactory.php | 43 + database/factories/UserFactory.php | 12 +- ...add_event_column_to_activity_log_table.php | 26 + ...atch_uuid_column_to_activity_log_table.php | 26 + ..._18_104859_make_tools_fields_bilingual.php | 33 + ...8_111639_make_institute_tool_bilingual.php | 40 + ...134852_create_pending_tool_edits_table.php | 39 + ...9_19_155728_create_concept_tools_table.php | 52 + ...023_09_21_135831_add_language_to_users.php | 16 + ...0_create_concept_institute_tools_table.php | 74 + ...7_create_concept_tool_categories_table.php | 31 + ...655_create_concept_tool_features_table.php | 31 + ...23_09_25_104637_create_tool_logs_table.php | 37 + ...09_25_130911_make_categories_bilingual.php | 22 + ..._10_03_095207_add_email_to_users_table.php | 16 + ...0_12_140026_create_custom_fields_table.php | 30 + ...40401_create_custom_field_values_table.php | 36 + ...635_create_concept_custom_field_values.php | 36 + .../2023_10_23_112730_create_tag_tables.php | 32 + ...3135_change_tools_by_information_model.php | 71 + ...nge_concept_tools_by_information_model.php | 70 + ...ge_institute_tool_by_information_model.php | 76 + ...t_institute_tools_by_information_model.php | 76 + ...0_125726_add_description_to_tags_table.php | 16 + ...023_10_31_155528_remove_feature_tables.php | 14 + ..._10_31_161213_remove_categories_tables.php | 14 + ...and_home_page_body_to_institutes_table.php | 17 + ...558_add_extended_fields_to_experiences.php | 18 + ...07_065449_fix_tool_tables_column_types.php | 19 + ...130100_add_pros_and_cons_to_experience.php | 17 + ...0_change_wysiwyg_fields_to_medium_text.php | 51 + ...sh_homepage_fields_to_institutes_table.php | 20 + ...0_092737_add_personal_data_en_to_tools.php | 22 + ...0_133425_add_tab_type_to_custom_fields.php | 16 + ...1_11_152535_create_content_pages_table.php | 22 + ...19_change_personal_data_nl_column_type.php | 20 + ...932_drop_rating_colum_from_experiences.php | 16 + ..._06_123006_create_tool_followers_table.php | 31 + ...05_add_impersonated_institute_to_users.php | 21 + ...2_26_141649_simplify_experiences_table.php | 23 + ...6_change_size_of_conditions_textfields.php | 22 + ...620_change_request_access_to_rich_text.php | 36 + ...ake_full_name_bilingual_for_institutes.php | 17 + ...ags_for_classifications_by_institution.php | 13 + ...ernative_concept_institute_tools_table.php | 47 + ...alternative_institute_tool_tools_table.php | 47 + database/seeders/ContentPageSeeder.php | 21 + database/seeders/DatabaseSeeder.php | 8 +- database/seeders/ExperienceSeeder.php | 2 + database/seeders/LanguageSeeder.php | 22 + database/seeders/PendingToolEditSeeder.php | 40 + database/seeders/PredefinedToolSeeder.php | 10 +- database/seeders/TagSeeder.php | 78 + database/seeders/TaggableSeeder.php | 52 + database/seeders/ToolLogSeeder.php | 40 + database/seeders/ToolSeeder.php | 5 +- lang/en/action.php | 37 + lang/en/alert.php | 10 + lang/en/aria.php | 7 + lang/en/auth.php | 7 + lang/en/confirm.php | 20 + lang/en/content-page.php | 26 + lang/en/custom-field.php | 26 + lang/en/email.php | 8 + lang/en/experience.php | 15 + lang/en/footer.php | 31 + lang/en/institute.php | 192 + lang/en/log.php | 11 + lang/en/mailable.php | 24 + lang/en/message.php | 54 + lang/en/modal.php | 71 + lang/en/notification.php | 11 + lang/en/page.php | 436 + lang/en/pagination.php | 8 + lang/en/tag.php | 43 + lang/en/tool.php | 109 + lang/en/validation.php | 210 + lintHook.sh | 6 +- .../Way2Translate/Config/way2translate.php | 4 +- .../Commands/ExportTranslationsJsCommand.php | 3 +- .../Commands/ImportTranslationsCommand.php | 3 +- .../Controllers/TranslationsController.php | 10 +- .../Way2Translate/Generators/JsGenerator.php | 36 +- modules/Way2Translate/Helpers/Route.php | 20 + .../Middleware/NonEditableLanguages.php | 1 - modules/Way2Translate/Models/Language.php | 20 +- modules/Way2Translate/Models/Locale.php | 4 +- modules/Way2Translate/Models/Translation.php | 8 +- .../Providers/Way2TranslateProvider.php | 41 +- .../components/buttons/disable.blade.php | 12 + .../components/buttons/enable.blade.php | 12 + .../components/buttons/link.blade.php | 13 + .../components/buttons/primary.blade.php | 12 + .../components/buttons/submit.blade.php | 19 + .../components/form/error.blade.php | 3 + .../components/form/group.blade.php | 3 + .../components/list/group-heading.blade.php | 1 + .../components/list/group-item.blade.php | 10 + .../components/list/group.blade.php | 3 + .../components/progress/bar.blade.php | 10 + .../components/table/row.blade.php | 3 + .../components/table/table.blade.php | 3 + .../components/table/tbody.blade.php | 3 + .../bootstrap-3/components/table/td.blade.php | 3 + .../bootstrap-3/components/table/th.blade.php | 3 + .../components/table/thead.blade.php | 3 + .../Views/themes/bootstrap-3/master.blade.php | 20 + .../themes/bootstrap-3/pages/error.blade.php | 7 + .../themes/bootstrap-3/pages/group.blade.php | 21 + .../themes/bootstrap-3/pages/index.blade.php | 16 + modules/Way2Translate/breadcrumbs.php | 50 + modules/Way2Translate/routes.php | 31 + phpstan.neon | 29 +- public/dist/admin/images/surf-logo.svg | 1 + {public_html => public}/favicon.ico | Bin {public_html => public}/index.php | 0 {public_html => public}/robots.txt | 0 {public_html => public}/svg/403.svg | 0 {public_html => public}/svg/404.svg | 0 {public_html => public}/svg/500.svg | 0 {public_html => public}/svg/503.svg | 0 {public_html => public}/svg/support-icon.svg | 0 {public_html => public}/uploads/.gitignore | 0 public_html/vendor/telescope/app-dark.css | 7 - public_html/vendor/telescope/app.css | 7 - public_html/vendor/telescope/app.js | 2 - public_html/vendor/telescope/favicon.ico | Bin 26622 -> 0 bytes .../vendor/telescope/mix-manifest.json | 5 - public_html/vendor/web-tinker/app.css | 1 - public_html/vendor/web-tinker/app.js | 1 - public_html/vendor/web-tinker/github.css | 57 - .../vendor/web-tinker/mix-manifest.json | 4 - resources/assets/admin/.eslintrc | 37 +- resources/assets/admin/.npmrc | 2 + resources/assets/admin/.prettierrc | 1 + .../Nunito-Italic-VariableFont_wght.ttf | Bin 0 -> 282472 bytes .../fonts/Nunito/Nunito-VariableFont_wght.ttf | Bin 0 -> 277844 bytes .../SourceSansPro/SourceSansPro-Black.ttf | Bin 0 -> 247608 bytes .../SourceSansPro-BlackItalic.ttf | Bin 0 -> 108420 bytes .../SourceSansPro/SourceSansPro-Bold.ttf | Bin 0 -> 247412 bytes .../SourceSansPro-BoldItalic.ttf | Bin 0 -> 109148 bytes .../SourceSansPro-ExtraLight.ttf | Bin 0 -> 247212 bytes .../SourceSansPro-ExtraLightItalic.ttf | Bin 0 -> 109552 bytes .../SourceSansPro/SourceSansPro-Italic.ttf | Bin 0 -> 109456 bytes .../SourceSansPro/SourceSansPro-Light.ttf | Bin 0 -> 246624 bytes .../SourceSansPro-LightItalic.ttf | Bin 0 -> 110176 bytes .../SourceSansPro/SourceSansPro-Regular.ttf | Bin 0 -> 248132 bytes .../SourceSansPro/SourceSansPro-SemiBold.ttf | Bin 0 -> 247892 bytes .../SourceSansPro-SemiBoldItalic.ttf | Bin 0 -> 109264 bytes resources/assets/admin/package.json | 123 +- resources/assets/admin/pnpm-lock.yaml | 11743 ++++++++++++++++ resources/assets/admin/src/bootstrap.js | 11 +- .../assets/admin/src/components/AlertBox.vue | 47 + .../assets/admin/src/components/ArrowIcon.vue | 8 +- .../admin/src/components/BaseDropdown.vue | 30 +- .../assets/admin/src/components/BaseModal.vue | 20 +- .../assets/admin/src/components/BrandLogo.vue | 5 +- resources/assets/admin/src/components/Btn.vue | 22 +- .../admin/src/components/CategoryTile.vue | 24 +- .../admin/src/components/ChevronDropdown.vue | 24 +- .../admin/src/components/CloseButton.vue | 10 +- .../admin/src/components/ConfirmDialog.vue | 40 +- .../assets/admin/src/components/DataTable.vue | 174 +- .../admin/src/components/DefaultSearch.vue | 2 +- .../admin/src/components/DropdownItem.vue | 27 +- .../admin/src/components/EntityIcon.vue | 6 +- .../src/components/ExpandableTagList.vue | 24 +- .../admin/src/components/FollowToolButton.vue | 81 + .../admin/src/components/FormFooter.vue | 5 +- .../assets/admin/src/components/FormGroup.vue | 6 +- .../src/components/InertiaPagination.vue | 16 +- .../admin/src/components/InstituteBox.vue | 11 +- .../assets/admin/src/components/LightBox.vue | 58 + .../assets/admin/src/components/ListIcon.vue | 8 +- .../admin/src/components/LocaleChanger.vue | 69 + .../assets/admin/src/components/ModalIcon.vue | 6 +- .../admin/src/components/Notification.vue | 23 +- .../src/components/NotificationBadge.vue | 5 +- .../admin/src/components/ProseParagraph.vue | 19 + .../src/components/RequestForChangeBtn.vue | 67 + .../admin/src/components/ReviewComponent.vue | 86 +- .../admin/src/components/ReviewList.vue | 38 +- .../admin/src/components/SearchIcon.vue | 8 +- .../admin/src/components/SidebarToolCard.vue | 49 + .../admin/src/components/StatusPill.vue | 4 +- .../admin/src/components/TabHeading.vue | 17 + .../admin/src/components/TabSubheading.vue | 29 + .../assets/admin/src/components/TagPill.vue | 58 +- .../assets/admin/src/components/ToolCard.vue | 51 +- .../admin/src/components/ToolStatus.vue | 36 +- .../admin/src/components/ToolStatusInfo.vue | 47 +- .../assets/admin/src/components/ToolTip.vue | 62 + resources/assets/admin/src/components/Url.vue | 61 + .../assets/admin/src/components/Wysiwyg.vue | 221 + .../admin/src/components/WysiwygOutput.vue | 19 + .../components/attribute/AttributeItem.vue | 8 +- .../components/attribute/AttributeList.vue | 7 +- .../src/components/filter/FilterList.vue | 5 +- .../src/components/form/CheckGroupInput.vue | 80 +- .../src/components/form/CheckInlineInput.vue | 60 +- .../admin/src/components/form/CheckInput.vue | 29 +- .../src/components/form/CurrencyInput.vue | 41 +- .../admin/src/components/form/DateInput.vue | 37 +- .../admin/src/components/form/FileInput.vue | 81 +- .../src/components/form/InputDisplay.vue | 13 +- .../admin/src/components/form/NumberInput.vue | 35 +- .../admin/src/components/form/RadioInput.vue | 59 +- .../components/form/RadioInputToolStatus.vue | 75 +- .../admin/src/components/form/RichText.vue | 108 + .../admin/src/components/form/SelectInput.vue | 43 +- .../src/components/form/StaticDisplay.vue | 12 +- .../admin/src/components/form/TagInput.vue | 162 + .../admin/src/components/form/TextInput.vue | 36 +- .../src/components/form/TextareaInput.vue | 40 +- .../src/components/form/shared/HelpText.vue | 5 +- .../src/components/form/shared/InputLabel.vue | 17 +- .../src/components/form/shared/IsRequired.vue | 7 +- .../admin/src/components/manager/EditLog.vue | 84 + .../components/modal/EditExperienceModal.vue | 47 +- .../modal/RequestForChangeModal.vue | 140 + .../components/modal/ShareExperienceModal.vue | 39 +- .../components/modal/StatusLegendModal.vue | 22 +- .../admin/src/components/modal/UrlModal.vue | 136 + .../modal/components/ExperienceForm.vue | 14 +- .../src/components/page/BannerHeader.vue | 135 +- .../admin/src/components/page/PageHeader.vue | 16 +- .../admin/src/components/svg/FlagEN.vue | 50 + .../admin/src/components/svg/FlagNL.vue | 39 + .../src/components/svg/icons/surf/AddIcon.vue | 17 + .../svg/icons/surf/CardViewIcon.vue | 17 + .../svg/icons/surf/ELearningMonitorIcon.vue | 17 + .../svg/icons/surf/MultipleCircleIcon.vue | 17 + .../src/components/table/FilterColumn.vue | 18 +- .../admin/src/helpers/filter-custom-fields.js | 11 + .../admin/src/helpers/tool-filter-url.js | 73 + resources/assets/admin/src/icons.js | 16 + .../assets/admin/src/layouts/AdminLayout.vue | 8 +- .../assets/admin/src/layouts/AuthLayout.vue | 17 +- .../admin/src/layouts/DefaultLayout.vue | 5 +- .../admin/src/layouts/SidebarLayout.vue | 5 +- .../src/layouts/components/AdminSideBar.vue | 70 +- .../src/layouts/components/FilterSideBar.vue | 107 +- .../admin/src/layouts/components/MainMenu.vue | 262 +- .../src/layouts/components/PageFooter.vue | 56 +- resources/assets/admin/src/main.js | 20 +- .../assets/admin/src/pages/ErrorPage.vue | 5 +- .../admin/src/pages/about/IndexPage.vue | 6 + .../admin/src/pages/account/LoginPage.vue | 10 +- .../pages/content-manager/tag/CreatePage.vue | 98 + .../pages/content-manager/tag/EditPage.vue | 102 + .../pages/content-manager/tag/IndexPage.vue | 140 + .../tag/components/TagForm.vue | 56 + .../pages/content-manager/tool/CreatePage.vue | 204 +- .../pages/content-manager/tool/EditPage.vue | 240 +- .../pages/content-manager/tool/IndexPage.vue | 113 +- .../pages/content-manager/tool/LogPage.vue | 42 + .../tool/components/ToolForm.vue | 598 +- .../src/pages/content-page/CreatePage.vue | 92 + .../admin/src/pages/content-page/EditPage.vue | 98 + .../src/pages/content-page/IndexPage.vue | 148 + .../admin/src/pages/content-page/ShowPage.vue | 50 + .../components/ContentPageForm.vue | 62 + .../assets/admin/src/pages/home/IndexPage.vue | 34 +- .../components/HomepageInformationBox.vue | 37 + .../custom-field/CreatePage.vue | 100 + .../custom-field/EditPage.vue | 107 + .../custom-field/IndexPage.vue | 141 + .../components/CustomFieldForm.vue | 73 + .../homepage-information/EditPage.vue | 112 + .../notifications/CreatePage.vue | 102 + .../components/NotificationForm.vue | 58 + .../information-manager/tag/CreatePage.vue | 99 + .../information-manager/tag/EditPage.vue | 103 + .../information-manager/tag/IndexPage.vue | 127 + .../tag/components/TagForm.vue | 52 + .../information-manager/tools/CreatePage.vue | 168 +- .../information-manager/tools/EditPage.vue | 199 +- .../information-manager/tools/IndexPage.vue | 150 +- .../information-manager/tools/LogPage.vue | 42 + .../tools/components/InfoLabelAndBoolean.vue | 48 + .../tools/components/InfoLabelAndHtml.vue | 42 + .../tools/components/InfoLabelAndText.vue | 40 + .../tools/components/InfoTagGroup.vue | 44 + .../tools/components/OriginalToolInfo.vue | 294 + .../tools/components/OriginalToolInfoTag.vue | 18 + .../tools/components/ToolForm.vue | 615 +- .../admin/src/pages/institutes/IndexPage.vue | 103 + .../admin/src/pages/other/tool/ShowPage.vue | 90 +- .../pages/other/tool/components/InfoBox.vue | 36 +- .../other/tool/components/ToolHeader.vue | 78 +- .../pages/other/tool/components/ToolTabs.vue | 36 +- .../tool/components/tabs/EducationTab.vue | 43 + .../components/tabs/PrivacyAndSecurityTab.vue | 147 + .../other/tool/components/tabs/ProductTab.vue | 126 + .../other/tool/components/tabs/SupportTab.vue | 60 + .../tool/components/tabs/TechnicalTab.vue | 103 + .../admin/src/pages/our/tool/ShowPage.vue | 168 +- .../our/tool/components/ExternalLink.vue | 13 +- .../pages/our/tool/components/SupportBox.vue | 17 +- .../pages/our/tool/components/ToolHeader.vue | 96 +- .../pages/our/tool/components/ToolTabs.vue | 42 +- .../our/tool/components/tabs/EducationTab.vue | 85 + .../components/tabs/PrivacyAndSecurityTab.vue | 206 + .../our/tool/components/tabs/ProductTab.vue | 153 + .../our/tool/components/tabs/SupportTab.vue | 145 + .../our/tool/components/tabs/TechnicalTab.vue | 139 + .../assets/admin/src/pages/tool/IndexPage.vue | 249 + .../src/pages/tool/components/TipCard.vue | 30 + .../assets/admin/src/stores/tool-filter.js | 46 + resources/assets/admin/styles/_dropdown.scss | 8 + .../assets/admin/styles/_information-box.scss | 5 + resources/assets/admin/styles/_tag-input.scss | 47 + resources/assets/admin/styles/_tiptap.scss | 216 + .../assets/admin/styles/generic/_base.scss | 4 + .../assets/admin/styles/generic/_text.scss | 55 +- resources/assets/admin/styles/main.scss | 4 +- .../assets/admin/styles/utilities/_font.scss | 86 +- resources/assets/admin/tailwind.config.js | 51 +- resources/assets/admin/webpack.config.js | 10 + resources/assets/admin/webpack.mix.js | 15 +- .../seeding/institutes/banner/EUR-banner.jpg | Bin 0 -> 2023705 bytes .../institutes/banner/Fontys-banner.jpg | Bin 0 -> 24049 bytes .../institutes/banner/Hanze-banner.png | Bin 0 -> 652810 bytes .../institutes/banner/Inholland-banner.jpg | Bin 0 -> 150612 bytes .../seeding/institutes/banner/SURF_banner.jpg | Bin 0 -> 38511 bytes .../institutes/banner/artez-banner.jpg | Bin 0 -> 195748 bytes .../banner/hsleiden-202409-banner.jpg | Bin 0 -> 622055 bytes .../seeding/institutes/banner/hz-banner.jpg | Bin 0 -> 66887 bytes .../seeding/institutes/full/EUR-logo.jpg | Bin 0 -> 3390 bytes .../seeding/institutes/full/Fontys-logo.jpg | Bin 0 -> 2864 bytes resources/seeding/institutes/full/Hanze.png | Bin 18002 -> 4610 bytes .../seeding/institutes/full/Inholland.png | Bin 0 -> 4246 bytes resources/seeding/institutes/full/SURF.png | Bin 0 -> 1014 bytes .../seeding/institutes/full/artez-logo.png | Bin 0 -> 6343 bytes .../seeding/institutes/full/hsleiden-logo.jpg | Bin 0 -> 7700 bytes resources/seeding/institutes/full/hz-logo.jpg | Bin 0 -> 7363 bytes resources/seeding/institutes/square/SURF.png | Bin 0 -> 1014 bytes .../seeding/institutes/square/artez-logo.png | Bin 0 -> 6343 bytes .../institute-tool-notification.blade.php | 17 + resources/views/error.blade.php | 4 + .../layouts/admin/page-wrapper.blade.php | 1 + .../layouts/shared/piwik/script.blade.php | 15 + .../mailable/request-for-change.blade.php | 30 + .../views/mailable/tool-updated.blade.php | 13 + .../views/vendor/mail/html/message.blade.php | 2 +- routes/web/admin.php | 19 + routes/web/admin/institutes.php | 20 + routes/web/content-manager/tag.php | 9 + routes/web/content-manager/tool.php | 20 +- routes/web/content-page.php | 14 + .../web/information-manager/custom-field.php | 9 + .../homepage-information.php | 8 + .../web/information-manager/notifications.php | 19 + routes/web/information-manager/tag.php | 9 + routes/web/information-manager/tool.php | 23 +- routes/web/locale.php | 18 + routes/web/other/tool.php | 2 +- routes/web/our/tool.php | 2 +- routes/web/tool.php | 19 + server.php | 4 +- stubs/migration.create.stub | 10 +- stubs/migration.stub | 10 +- stubs/migration.update.stub | 12 +- testHook.sh | 6 +- tests/Feature/About/IndexTest.php | 2 +- tests/Feature/Account/LoginTest.php | 15 +- .../Admin/Institutes/ImpersonationTest.php | 59 + tests/Feature/Admin/Institutes/IndexTest.php | 37 + tests/Feature/Auth/SURF/BaseSURFTestCase.php | 41 + tests/Feature/Auth/SURF/CallbackTestCase.php | 51 + tests/Feature/Bootstrapper/Application.php | 27 + .../Bootstrapper/BaseBootstrapperTestCase.php | 35 + tests/Feature/Bootstrapper/Institute.php | 28 + .../Feature/ContentManager/Tag/CreateTest.php | 45 + .../Feature/ContentManager/Tag/DeleteTest.php | 52 + tests/Feature/ContentManager/Tag/EditTest.php | 54 + .../Feature/ContentManager/Tag/IndexTest.php | 68 + .../Feature/ContentManager/Tag/StoreTest.php | 92 + .../Feature/ContentManager/Tag/UpdateTest.php | 76 + .../ContentManager/Tool/CancelEditTest.php | 78 + .../Tool/Concept/DiscardTest.php | 42 + .../Tool/Concept/PublishTest.php | 97 + .../ContentManager/Tool/CreateTest.php | 2 +- .../Feature/ContentManager/Tool/EditTest.php | 248 +- .../Feature/ContentManager/Tool/IndexTest.php | 39 +- tests/Feature/ContentManager/Tool/LogTest.php | 157 + .../ContentManager/Tool/PublishTest.php | 176 +- .../Feature/ContentManager/Tool/StoreTest.php | 349 +- .../ContentManager/Tool/UpdateTest.php | 458 +- tests/Feature/ContentPage/CreateTest.php | 56 + tests/Feature/ContentPage/DeleteTest.php | 65 + tests/Feature/ContentPage/EditTest.php | 68 + tests/Feature/ContentPage/IndexTest.php | 69 + tests/Feature/ContentPage/ShowTest.php | 46 + tests/Feature/ContentPage/StoreTest.php | 101 + tests/Feature/ContentPage/UpdateTest.php | 111 + .../Handler/ValidationExceptionTest.php | 4 +- tests/Feature/Home/IndexTest.php | 16 +- .../CustomField/CreateTest.php | 36 + .../CustomField/DeleteTest.php | 41 + .../CustomField/EditTest.php | 41 + .../CustomField/IndexTest.php | 92 + .../CustomField/StoreTest.php | 101 + .../CustomField/UpdateTest.php | 78 + .../HomepageInformation/EditTest.php | 48 + .../HomepageInformation/UpdateTest.php | 103 + .../InformationManager/Tag/CreateTest.php | 35 + .../InformationManager/Tag/DeleteTest.php | 53 + .../InformationManager/Tag/EditTest.php | 56 + .../InformationManager/Tag/IndexTest.php | 87 + .../InformationManager/Tag/StoreTest.php | 92 + .../InformationManager/Tag/UpdateTest.php | 76 + .../Tool/CancelEditTest.php | 96 + .../Tool/Concept/DiscardTest.php | 52 + .../Tool/Concept/PublishTest.php | 61 + .../InformationManager/Tool/CreateTest.php | 2 +- .../InformationManager/Tool/EditTest.php | 175 +- .../InformationManager/Tool/IndexTest.php | 111 +- .../InformationManager/Tool/LogTest.php | 163 + .../InformationManager/Tool/PublishTest.php | 82 +- .../Tool/RequestForChangeTest.php | 223 + .../Tool/SendNotificationTest.php | 108 + .../InformationManager/Tool/StoreTest.php | 135 +- .../InformationManager/Tool/UnpublishTest.php | 78 +- .../InformationManager/Tool/UpdateTest.php | 196 +- tests/Feature/Locale/SetTest.php | 41 + .../Middleware/HandleInertiaRequestsTest.php | 5 +- tests/Feature/Other/Tool/CanSupportTest.php | 14 +- .../Other/Tool/InstitutesThatUseToolTest.php | 23 +- tests/Feature/Other/Tool/ShowTest.php | 284 +- tests/Feature/Our/Tool/ShowTest.php | 377 +- .../Feature/Teacher/Experience/StoreTest.php | 56 +- .../Feature/Teacher/Experience/UpdateTest.php | 61 +- tests/Feature/Tool/FollowTest.php | 81 + tests/Feature/Tool/IndexTest.php | 518 + tests/Fixtures/SURF/BaseSURFUser.php | 24 +- tests/Fixtures/SURF/UserWithRoles.php | 4 +- .../SURF/UserWithoutEmployeeAffiliation.php | 19 + tests/Helpers/ToolHelper.php | 37 + .../Tool/NotifyStakeholdersActionTest.php | 353 + .../Tool/SubmitRequestForChangeActionTest.php | 233 + tests/Unit/Enums/InstituteTool/StatusTest.php | 1 - tests/Unit/Models/Tool/OverviewTest.php | 398 + tests/Unit/Models/UserModelTest.php | 2 + tests/Unit/Policy/TranslationTest.php | 12 +- 634 files changed, 43522 insertions(+), 7283 deletions(-) create mode 100644 app/Actions/ContentPage/CreateAction.php create mode 100644 app/Actions/ContentPage/DeleteAction.php create mode 100644 app/Actions/ContentPage/UpdateAction.php create mode 100644 app/Actions/CustomField/CreateAction.php create mode 100644 app/Actions/CustomField/DeleteAction.php create mode 100644 app/Actions/CustomField/UpdateAction.php create mode 100644 app/Actions/HomepageInformation/EditHomepageInformationAction.php create mode 100644 app/Actions/Institute/ImpersonateAction.php create mode 100644 app/Actions/Institute/StopImpersonatingAction.php create mode 100644 app/Actions/Institute/Tag/CreateAction.php create mode 100644 app/Actions/Institute/Tag/DeleteAction.php create mode 100644 app/Actions/Institute/Tag/UpdateAction.php create mode 100644 app/Actions/Institute/Tool/Concept/CreateAction.php create mode 100644 app/Actions/Institute/Tool/Concept/DiscardAction.php create mode 100644 app/Actions/Institute/Tool/Concept/PublishAction.php create mode 100644 app/Actions/Institute/Tool/Concept/SafelyDiscardAction.php create mode 100644 app/Actions/Institute/Tool/Concept/UpdateAction.php create mode 100644 app/Actions/Institute/Tool/SendNotificationAction.php create mode 100644 app/Actions/PendingToolEdit/ClearAction.php create mode 100644 app/Actions/PendingToolEdit/CreateAction.php create mode 100644 app/Actions/Tag/CreateAction.php create mode 100644 app/Actions/Tag/DeleteAction.php create mode 100644 app/Actions/Tag/UpdateAction.php create mode 100644 app/Actions/Tool/ChangeFollowingStatusAction.php create mode 100644 app/Actions/Tool/Concept/CreateAction.php create mode 100644 app/Actions/Tool/Concept/DiscardAction.php create mode 100644 app/Actions/Tool/Concept/PublishAction.php create mode 100644 app/Actions/Tool/Concept/SafelyDiscardAction.php create mode 100644 app/Actions/Tool/Concept/StoreImagesAction.php create mode 100644 app/Actions/Tool/Concept/UpdateAction.php create mode 100644 app/Actions/Tool/NotifyStakeholdersAction.php create mode 100644 app/Actions/Tool/SubmitRequestForChangeAction.php create mode 100644 app/Actions/ToolLog/CreateAction.php create mode 100644 app/Enums/InstituteTool/DataClassification.php create mode 100644 app/Enums/InstituteTool/Sort.php create mode 100644 app/Enums/Tags/TagTypes.php create mode 100644 app/Enums/Tool/Tabs.php create mode 100644 app/Exceptions/CustomHandlers/SurfConextException.php create mode 100644 app/Exceptions/SurfConextException.php create mode 100644 app/Helpers/Country.php create mode 100644 app/Helpers/Locale.php create mode 100644 app/Helpers/ToolPrefillData.php create mode 100644 app/Helpers/WYSIWYG.php create mode 100644 app/Http/Controllers/Admin/InstitutesController.php create mode 100644 app/Http/Controllers/ContentManager/TagController.php create mode 100644 app/Http/Controllers/ContentPageController.php create mode 100644 app/Http/Controllers/InformationManager/CustomFieldController.php create mode 100644 app/Http/Controllers/InformationManager/HomepageInformationController.php create mode 100644 app/Http/Controllers/InformationManager/NotificationController.php create mode 100644 app/Http/Controllers/InformationManager/TagController.php create mode 100644 app/Http/Controllers/LocaleController.php create mode 100644 app/Http/Controllers/ToolController.php create mode 100644 app/Http/Requests/ContentPage/BaseRequest.php create mode 100644 app/Http/Requests/ContentPage/StoreRequest.php create mode 100644 app/Http/Requests/ContentPage/UpdateRequest.php create mode 100644 app/Http/Requests/CustomField/BaseRequest.php create mode 100644 app/Http/Requests/CustomField/StoreRequest.php create mode 100644 app/Http/Requests/CustomField/UpdateRequest.php create mode 100644 app/Http/Requests/HomepageInformation/BaseRequest.php create mode 100644 app/Http/Requests/HomepageInformation/EditRequest.php create mode 100644 app/Http/Requests/InstituteTag/BaseRequest.php create mode 100644 app/Http/Requests/InstituteTag/StoreRequest.php create mode 100644 app/Http/Requests/InstituteTag/UpdateRequest.php create mode 100644 app/Http/Requests/RequestForChangeRequest.php create mode 100644 app/Http/Requests/Tag/BaseRequest.php create mode 100644 app/Http/Requests/Tag/StoreRequest.php create mode 100644 app/Http/Requests/Tag/UpdateRequest.php create mode 100644 app/Http/Requests/Tool/SendNotificationRequest.php create mode 100644 app/Http/Resources/BaseToolIndexResource.php create mode 100644 app/Http/Resources/ContentManager/ConceptToolResource.php create mode 100644 app/Http/Resources/ContentPageResource.php create mode 100644 app/Http/Resources/CustomFieldResource.php create mode 100644 app/Http/Resources/InformationManager/CustomFieldResource.php create mode 100644 app/Http/Resources/InformationManager/CustomFieldValueResource.php create mode 100644 app/Http/Resources/InformationManager/TagResource.php create mode 100644 app/Http/Resources/LocaleResource.php create mode 100644 app/Http/Resources/PendingToolEditResource.php create mode 100644 app/Http/Resources/TagResource.php create mode 100644 app/Http/Resources/ToolLogResource.php create mode 100644 app/Mail/BaseMailable.php create mode 100644 app/Mail/InstituteToolNotificationMail.php create mode 100644 app/Mail/RequestForChange.php create mode 100644 app/Mail/ToolUpdated.php create mode 100644 app/Models/ConceptCustomFieldValue.php create mode 100644 app/Models/ConceptInstituteTool.php create mode 100644 app/Models/ConceptTool.php create mode 100644 app/Models/ContentPage.php create mode 100644 app/Models/CustomField.php create mode 100644 app/Models/CustomFieldValue.php create mode 100644 app/Models/PendingToolEdit.php create mode 100644 app/Models/Scopes/DefaultSortScope.php create mode 100644 app/Models/Tag.php create mode 100644 app/Models/ToolLog.php create mode 100644 app/Policies/ContentPagePolicy.php create mode 100644 app/Policies/CustomFieldPolicy.php create mode 100644 app/Policies/InstitutePolicy.php create mode 100644 app/Policies/TagPolicy.php create mode 100644 app/Policies/TagTypePolicy.php create mode 100644 app/Rules/DbText.php create mode 100644 app/Rules/ExistsInTags.php create mode 100644 app/Rules/UniqueTagRule.php create mode 100644 app/Rules/UriRule.php create mode 100644 app/Traits/Models/SearchesLocalizedFields.php create mode 100644 config/tags.php create mode 100644 database/factories/ContentPageFactory.php create mode 100644 database/factories/CustomFieldFactory.php create mode 100644 database/factories/CustomFieldValueFactory.php create mode 100644 database/factories/LanguageFactory.php create mode 100644 database/factories/PendingToolEditFactory.php create mode 100644 database/factories/TagFactory.php create mode 100644 database/factories/ToolLogFactory.php create mode 100644 database/migrations/2023_08_29_100117_add_event_column_to_activity_log_table.php create mode 100644 database/migrations/2023_08_29_100118_add_batch_uuid_column_to_activity_log_table.php create mode 100644 database/migrations/2023_09_18_104859_make_tools_fields_bilingual.php create mode 100644 database/migrations/2023_09_18_111639_make_institute_tool_bilingual.php create mode 100644 database/migrations/2023_09_18_134852_create_pending_tool_edits_table.php create mode 100644 database/migrations/2023_09_19_155728_create_concept_tools_table.php create mode 100644 database/migrations/2023_09_21_135831_add_language_to_users.php create mode 100644 database/migrations/2023_09_21_142700_create_concept_institute_tools_table.php create mode 100644 database/migrations/2023_09_21_210137_create_concept_tool_categories_table.php create mode 100644 database/migrations/2023_09_21_210655_create_concept_tool_features_table.php create mode 100644 database/migrations/2023_09_25_104637_create_tool_logs_table.php create mode 100644 database/migrations/2023_09_25_130911_make_categories_bilingual.php create mode 100644 database/migrations/2023_10_03_095207_add_email_to_users_table.php create mode 100644 database/migrations/2023_10_12_140026_create_custom_fields_table.php create mode 100644 database/migrations/2023_10_12_140401_create_custom_field_values_table.php create mode 100644 database/migrations/2023_10_12_140635_create_concept_custom_field_values.php create mode 100644 database/migrations/2023_10_23_112730_create_tag_tables.php create mode 100644 database/migrations/2023_10_23_133135_change_tools_by_information_model.php create mode 100644 database/migrations/2023_10_25_131029_change_concept_tools_by_information_model.php create mode 100644 database/migrations/2023_10_25_131108_change_institute_tool_by_information_model.php create mode 100644 database/migrations/2023_10_27_084119_change_concept_institute_tools_by_information_model.php create mode 100644 database/migrations/2023_10_30_125726_add_description_to_tags_table.php create mode 100644 database/migrations/2023_10_31_155528_remove_feature_tables.php create mode 100644 database/migrations/2023_10_31_161213_remove_categories_tables.php create mode 100644 database/migrations/2023_11_01_152839_add_homepage_title_and_home_page_body_to_institutes_table.php create mode 100644 database/migrations/2023_11_02_161558_add_extended_fields_to_experiences.php create mode 100644 database/migrations/2023_11_07_065449_fix_tool_tables_column_types.php create mode 100644 database/migrations/2023_11_09_130100_add_pros_and_cons_to_experience.php create mode 100644 database/migrations/2024_01_09_102140_change_wysiwyg_fields_to_medium_text.php create mode 100644 database/migrations/2024_01_09_145242_add_english_homepage_fields_to_institutes_table.php create mode 100644 database/migrations/2024_01_10_092737_add_personal_data_en_to_tools.php create mode 100644 database/migrations/2024_01_10_133425_add_tab_type_to_custom_fields.php create mode 100644 database/migrations/2024_01_11_152535_create_content_pages_table.php create mode 100644 database/migrations/2024_01_16_155719_change_personal_data_nl_column_type.php create mode 100644 database/migrations/2024_02_01_111932_drop_rating_colum_from_experiences.php create mode 100644 database/migrations/2024_02_06_123006_create_tool_followers_table.php create mode 100644 database/migrations/2024_02_08_085005_add_impersonated_institute_to_users.php create mode 100644 database/migrations/2024_02_26_141649_simplify_experiences_table.php create mode 100644 database/migrations/2024_02_26_155436_change_size_of_conditions_textfields.php create mode 100644 database/migrations/2024_02_26_160620_change_request_access_to_rich_text.php create mode 100644 database/migrations/2024_03_07_093348_make_full_name_bilingual_for_institutes.php create mode 100644 database/migrations/2024_03_19_114016_delete_tags_for_classifications_by_institution.php create mode 100644 database/migrations/2024_03_25_114211_create_alternative_concept_institute_tools_table.php create mode 100644 database/migrations/2024_03_25_115242_create_alternative_institute_tool_tools_table.php create mode 100644 database/seeders/ContentPageSeeder.php create mode 100644 database/seeders/LanguageSeeder.php create mode 100644 database/seeders/PendingToolEditSeeder.php create mode 100644 database/seeders/TagSeeder.php create mode 100644 database/seeders/TaggableSeeder.php create mode 100644 database/seeders/ToolLogSeeder.php create mode 100644 lang/en/action.php create mode 100644 lang/en/alert.php create mode 100644 lang/en/aria.php create mode 100644 lang/en/auth.php create mode 100644 lang/en/confirm.php create mode 100644 lang/en/content-page.php create mode 100644 lang/en/custom-field.php create mode 100644 lang/en/email.php create mode 100644 lang/en/experience.php create mode 100644 lang/en/footer.php create mode 100644 lang/en/institute.php create mode 100644 lang/en/log.php create mode 100644 lang/en/mailable.php create mode 100644 lang/en/message.php create mode 100644 lang/en/modal.php create mode 100644 lang/en/notification.php create mode 100644 lang/en/page.php create mode 100644 lang/en/pagination.php create mode 100644 lang/en/tag.php create mode 100644 lang/en/tool.php create mode 100644 lang/en/validation.php create mode 100644 modules/Way2Translate/Helpers/Route.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/disable.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/enable.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/link.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/primary.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/submit.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/form/error.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/form/group.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-heading.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-item.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/list/group.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/progress/bar.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/table/row.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/table/table.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/table/tbody.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/table/td.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/table/th.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/components/table/thead.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/master.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/pages/error.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/pages/group.blade.php create mode 100644 modules/Way2Translate/Views/themes/bootstrap-3/pages/index.blade.php create mode 100644 modules/Way2Translate/breadcrumbs.php create mode 100644 public/dist/admin/images/surf-logo.svg rename {public_html => public}/favicon.ico (100%) rename {public_html => public}/index.php (100%) rename {public_html => public}/robots.txt (100%) rename {public_html => public}/svg/403.svg (100%) rename {public_html => public}/svg/404.svg (100%) rename {public_html => public}/svg/500.svg (100%) rename {public_html => public}/svg/503.svg (100%) rename {public_html => public}/svg/support-icon.svg (100%) rename {public_html => public}/uploads/.gitignore (100%) delete mode 100644 public_html/vendor/telescope/app-dark.css delete mode 100644 public_html/vendor/telescope/app.css delete mode 100644 public_html/vendor/telescope/app.js delete mode 100644 public_html/vendor/telescope/favicon.ico delete mode 100644 public_html/vendor/telescope/mix-manifest.json delete mode 100644 public_html/vendor/web-tinker/app.css delete mode 100644 public_html/vendor/web-tinker/app.js delete mode 100644 public_html/vendor/web-tinker/github.css delete mode 100644 public_html/vendor/web-tinker/mix-manifest.json create mode 100644 resources/assets/admin/.npmrc create mode 100644 resources/assets/admin/fonts/Nunito/Nunito-Italic-VariableFont_wght.ttf create mode 100644 resources/assets/admin/fonts/Nunito/Nunito-VariableFont_wght.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-Black.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-BlackItalic.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-Bold.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-BoldItalic.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-ExtraLight.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-ExtraLightItalic.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-Italic.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-Light.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-LightItalic.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-Regular.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-SemiBold.ttf create mode 100644 resources/assets/admin/fonts/SourceSansPro/SourceSansPro-SemiBoldItalic.ttf create mode 100644 resources/assets/admin/pnpm-lock.yaml create mode 100644 resources/assets/admin/src/components/AlertBox.vue create mode 100644 resources/assets/admin/src/components/FollowToolButton.vue create mode 100644 resources/assets/admin/src/components/LightBox.vue create mode 100644 resources/assets/admin/src/components/LocaleChanger.vue create mode 100644 resources/assets/admin/src/components/ProseParagraph.vue create mode 100644 resources/assets/admin/src/components/RequestForChangeBtn.vue create mode 100644 resources/assets/admin/src/components/SidebarToolCard.vue create mode 100644 resources/assets/admin/src/components/TabHeading.vue create mode 100644 resources/assets/admin/src/components/TabSubheading.vue create mode 100644 resources/assets/admin/src/components/ToolTip.vue create mode 100644 resources/assets/admin/src/components/Url.vue create mode 100644 resources/assets/admin/src/components/Wysiwyg.vue create mode 100644 resources/assets/admin/src/components/WysiwygOutput.vue create mode 100644 resources/assets/admin/src/components/form/RichText.vue create mode 100644 resources/assets/admin/src/components/form/TagInput.vue create mode 100644 resources/assets/admin/src/components/manager/EditLog.vue create mode 100644 resources/assets/admin/src/components/modal/RequestForChangeModal.vue create mode 100644 resources/assets/admin/src/components/modal/UrlModal.vue create mode 100644 resources/assets/admin/src/components/svg/FlagEN.vue create mode 100644 resources/assets/admin/src/components/svg/FlagNL.vue create mode 100644 resources/assets/admin/src/components/svg/icons/surf/AddIcon.vue create mode 100644 resources/assets/admin/src/components/svg/icons/surf/CardViewIcon.vue create mode 100644 resources/assets/admin/src/components/svg/icons/surf/ELearningMonitorIcon.vue create mode 100644 resources/assets/admin/src/components/svg/icons/surf/MultipleCircleIcon.vue create mode 100644 resources/assets/admin/src/helpers/filter-custom-fields.js create mode 100644 resources/assets/admin/src/helpers/tool-filter-url.js create mode 100644 resources/assets/admin/src/pages/content-manager/tag/CreatePage.vue create mode 100644 resources/assets/admin/src/pages/content-manager/tag/EditPage.vue create mode 100644 resources/assets/admin/src/pages/content-manager/tag/IndexPage.vue create mode 100644 resources/assets/admin/src/pages/content-manager/tag/components/TagForm.vue create mode 100644 resources/assets/admin/src/pages/content-manager/tool/LogPage.vue create mode 100644 resources/assets/admin/src/pages/content-page/CreatePage.vue create mode 100644 resources/assets/admin/src/pages/content-page/EditPage.vue create mode 100644 resources/assets/admin/src/pages/content-page/IndexPage.vue create mode 100644 resources/assets/admin/src/pages/content-page/ShowPage.vue create mode 100644 resources/assets/admin/src/pages/content-page/components/ContentPageForm.vue create mode 100644 resources/assets/admin/src/pages/home/components/HomepageInformationBox.vue create mode 100644 resources/assets/admin/src/pages/information-manager/custom-field/CreatePage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/custom-field/EditPage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/custom-field/IndexPage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/custom-field/components/CustomFieldForm.vue create mode 100644 resources/assets/admin/src/pages/information-manager/homepage-information/EditPage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/notifications/CreatePage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/notifications/components/NotificationForm.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tag/CreatePage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tag/EditPage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tag/IndexPage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tag/components/TagForm.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/LogPage.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/components/InfoLabelAndBoolean.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/components/InfoLabelAndHtml.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/components/InfoLabelAndText.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/components/InfoTagGroup.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/components/OriginalToolInfo.vue create mode 100644 resources/assets/admin/src/pages/information-manager/tools/components/OriginalToolInfoTag.vue create mode 100644 resources/assets/admin/src/pages/institutes/IndexPage.vue create mode 100644 resources/assets/admin/src/pages/other/tool/components/tabs/EducationTab.vue create mode 100644 resources/assets/admin/src/pages/other/tool/components/tabs/PrivacyAndSecurityTab.vue create mode 100644 resources/assets/admin/src/pages/other/tool/components/tabs/ProductTab.vue create mode 100644 resources/assets/admin/src/pages/other/tool/components/tabs/SupportTab.vue create mode 100644 resources/assets/admin/src/pages/other/tool/components/tabs/TechnicalTab.vue create mode 100644 resources/assets/admin/src/pages/our/tool/components/tabs/EducationTab.vue create mode 100644 resources/assets/admin/src/pages/our/tool/components/tabs/PrivacyAndSecurityTab.vue create mode 100644 resources/assets/admin/src/pages/our/tool/components/tabs/ProductTab.vue create mode 100644 resources/assets/admin/src/pages/our/tool/components/tabs/SupportTab.vue create mode 100644 resources/assets/admin/src/pages/our/tool/components/tabs/TechnicalTab.vue create mode 100644 resources/assets/admin/src/pages/tool/IndexPage.vue create mode 100644 resources/assets/admin/src/pages/tool/components/TipCard.vue create mode 100644 resources/assets/admin/src/stores/tool-filter.js create mode 100644 resources/assets/admin/styles/_information-box.scss create mode 100644 resources/assets/admin/styles/_tag-input.scss create mode 100644 resources/assets/admin/styles/_tiptap.scss create mode 100644 resources/assets/admin/webpack.config.js create mode 100644 resources/seeding/institutes/banner/EUR-banner.jpg create mode 100644 resources/seeding/institutes/banner/Fontys-banner.jpg create mode 100644 resources/seeding/institutes/banner/Hanze-banner.png create mode 100644 resources/seeding/institutes/banner/Inholland-banner.jpg create mode 100644 resources/seeding/institutes/banner/SURF_banner.jpg create mode 100644 resources/seeding/institutes/banner/artez-banner.jpg create mode 100644 resources/seeding/institutes/banner/hsleiden-202409-banner.jpg create mode 100644 resources/seeding/institutes/banner/hz-banner.jpg create mode 100644 resources/seeding/institutes/full/EUR-logo.jpg create mode 100644 resources/seeding/institutes/full/Fontys-logo.jpg create mode 100644 resources/seeding/institutes/full/Inholland.png create mode 100644 resources/seeding/institutes/full/SURF.png create mode 100644 resources/seeding/institutes/full/artez-logo.png create mode 100644 resources/seeding/institutes/full/hsleiden-logo.jpg create mode 100644 resources/seeding/institutes/full/hz-logo.jpg create mode 100644 resources/seeding/institutes/square/SURF.png create mode 100644 resources/seeding/institutes/square/artez-logo.png create mode 100644 resources/views/emails/institute-tool-notification.blade.php create mode 100644 resources/views/layouts/shared/piwik/script.blade.php create mode 100644 resources/views/mailable/request-for-change.blade.php create mode 100644 resources/views/mailable/tool-updated.blade.php create mode 100644 routes/web/admin.php create mode 100644 routes/web/admin/institutes.php create mode 100644 routes/web/content-manager/tag.php create mode 100644 routes/web/content-page.php create mode 100644 routes/web/information-manager/custom-field.php create mode 100644 routes/web/information-manager/homepage-information.php create mode 100644 routes/web/information-manager/notifications.php create mode 100644 routes/web/information-manager/tag.php create mode 100644 routes/web/locale.php create mode 100644 routes/web/tool.php create mode 100644 tests/Feature/Admin/Institutes/ImpersonationTest.php create mode 100644 tests/Feature/Admin/Institutes/IndexTest.php create mode 100644 tests/Feature/Auth/SURF/BaseSURFTestCase.php create mode 100644 tests/Feature/Auth/SURF/CallbackTestCase.php create mode 100644 tests/Feature/Bootstrapper/Application.php create mode 100644 tests/Feature/Bootstrapper/BaseBootstrapperTestCase.php create mode 100644 tests/Feature/Bootstrapper/Institute.php create mode 100644 tests/Feature/ContentManager/Tag/CreateTest.php create mode 100644 tests/Feature/ContentManager/Tag/DeleteTest.php create mode 100644 tests/Feature/ContentManager/Tag/EditTest.php create mode 100644 tests/Feature/ContentManager/Tag/IndexTest.php create mode 100644 tests/Feature/ContentManager/Tag/StoreTest.php create mode 100644 tests/Feature/ContentManager/Tag/UpdateTest.php create mode 100644 tests/Feature/ContentManager/Tool/CancelEditTest.php create mode 100644 tests/Feature/ContentManager/Tool/Concept/DiscardTest.php create mode 100644 tests/Feature/ContentManager/Tool/Concept/PublishTest.php create mode 100644 tests/Feature/ContentManager/Tool/LogTest.php create mode 100644 tests/Feature/ContentPage/CreateTest.php create mode 100644 tests/Feature/ContentPage/DeleteTest.php create mode 100644 tests/Feature/ContentPage/EditTest.php create mode 100644 tests/Feature/ContentPage/IndexTest.php create mode 100644 tests/Feature/ContentPage/ShowTest.php create mode 100644 tests/Feature/ContentPage/StoreTest.php create mode 100644 tests/Feature/ContentPage/UpdateTest.php create mode 100644 tests/Feature/InformationManager/CustomField/CreateTest.php create mode 100644 tests/Feature/InformationManager/CustomField/DeleteTest.php create mode 100644 tests/Feature/InformationManager/CustomField/EditTest.php create mode 100644 tests/Feature/InformationManager/CustomField/IndexTest.php create mode 100644 tests/Feature/InformationManager/CustomField/StoreTest.php create mode 100644 tests/Feature/InformationManager/CustomField/UpdateTest.php create mode 100644 tests/Feature/InformationManager/HomepageInformation/EditTest.php create mode 100644 tests/Feature/InformationManager/HomepageInformation/UpdateTest.php create mode 100644 tests/Feature/InformationManager/Tag/CreateTest.php create mode 100644 tests/Feature/InformationManager/Tag/DeleteTest.php create mode 100644 tests/Feature/InformationManager/Tag/EditTest.php create mode 100644 tests/Feature/InformationManager/Tag/IndexTest.php create mode 100644 tests/Feature/InformationManager/Tag/StoreTest.php create mode 100644 tests/Feature/InformationManager/Tag/UpdateTest.php create mode 100644 tests/Feature/InformationManager/Tool/CancelEditTest.php create mode 100644 tests/Feature/InformationManager/Tool/Concept/DiscardTest.php create mode 100644 tests/Feature/InformationManager/Tool/Concept/PublishTest.php create mode 100644 tests/Feature/InformationManager/Tool/LogTest.php create mode 100644 tests/Feature/InformationManager/Tool/RequestForChangeTest.php create mode 100644 tests/Feature/InformationManager/Tool/SendNotificationTest.php create mode 100644 tests/Feature/Locale/SetTest.php create mode 100644 tests/Feature/Tool/FollowTest.php create mode 100644 tests/Feature/Tool/IndexTest.php create mode 100644 tests/Fixtures/SURF/UserWithoutEmployeeAffiliation.php create mode 100644 tests/Helpers/ToolHelper.php create mode 100644 tests/Unit/Actions/Tool/NotifyStakeholdersActionTest.php create mode 100644 tests/Unit/Actions/Tool/SubmitRequestForChangeActionTest.php create mode 100644 tests/Unit/Models/Tool/OverviewTest.php diff --git a/.env.example b/.env.example index 3991862..ab496f9 100644 --- a/.env.example +++ b/.env.example @@ -78,3 +78,13 @@ SURFCONEXT_TEST=true SURFCONEXT_ROLE_TEACHER=urn:collab:group:test.surfconext.nl:nl:surfnet:diensten:edutools_test_docent SURFCONEXT_ROLE_INFORMATION_MANAGER=urn:collab:group:test.surfconext.nl:nl:surfnet:diensten:edutools_test_informatiemanager SURFCONEXT_ROLE_CONTENT_MANAGER=urn:collab:group:test.surfconext.nl:nl:surfnet:diensten:edutools_test_contentmanager + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION= +AWS_BUCKET_PUBLIC= +AWS_URL= +AWS_ENDPOINT= +AWS_USE_PATH_STYLE_ENDPOINT=true + +PIWIK_KEY= diff --git a/README.md b/README.md index c18e793..5add470 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PEA +# PEA - Platform Educational Applications (Pilot Phase) ## Setting up the application @@ -6,14 +6,18 @@ - PHP 8.0 - Composer 2 -- NVM with Node 14 +- NVM with Node 20 +- PNPM >=8.7.6 && <9 + - Run `curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=8.15.8 sh -` to install pnpm + - Run `pnpm add -g pnpm@8` if you need to update to a newer version of pnpm 8 for some reason - MySQL 5.7 +- S3 (or compatible) storage ### Set up #### Production - Create a database -- Copy the `.env.example` to `.env` +- Copy the `.env.example` to `.env` and configure the variables - Install dependencies: `composer install --no-dev` - Set up a new key for the application: `artisan key:generate` - Properly fill in the `.env` file @@ -26,7 +30,7 @@ #### Development - Create a database -- Copy the `.env.example` to `.env` +- Copy the `.env.example` to `.env` and configure the variables - Install dependencies: `composer install` - Set up a new key for the application: `artisan key:generate` - Properly fill in the `.env` file @@ -35,9 +39,18 @@ - Export the translations for Javascript: `artisan w2w:export-translations` ## Storage +Storage is assumed to run from a S3 service, or anything that's compatible with S3 (like Minio, Wasabisys, etc.). +A public bucket is required from which images are served, and an Access Key + Secret should be entered into the .env file: -If running in a Docker environment, always ensure that the symbolic links are created from Docker and not the host OS. -Otherwise the path will not be correct and files can not be found by nginx. +```dotenv +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION= +AWS_BUCKET_PUBLIC= +AWS_URL= +AWS_ENDPOINT= +AWS_USE_PATH_STYLE_ENDPOINT=true +``` ## SURFconext authentication To be able to login with SURFconext you need to configure valid oAuth credentials in your .env file: @@ -68,4 +81,3 @@ Perform the following steps to login with SURFconext: * Choose the EduID provider * Log in with an existing EduID account, or [create your own free account](https://wiki.surfnet.nl/display/conextsupport/eduID+gasttoegang) * After the login, you are redirect back into the application and a user account is either created, or updated with the latest information from SURFconext - diff --git a/app/Actions/ContentPage/CreateAction.php b/app/Actions/ContentPage/CreateAction.php new file mode 100644 index 0000000..77090f4 --- /dev/null +++ b/app/Actions/ContentPage/CreateAction.php @@ -0,0 +1,19 @@ +save(); + } +} diff --git a/app/Actions/ContentPage/DeleteAction.php b/app/Actions/ContentPage/DeleteAction.php new file mode 100644 index 0000000..a79c9c0 --- /dev/null +++ b/app/Actions/ContentPage/DeleteAction.php @@ -0,0 +1,18 @@ +delete(); + } +} diff --git a/app/Actions/ContentPage/UpdateAction.php b/app/Actions/ContentPage/UpdateAction.php new file mode 100644 index 0000000..7e987f0 --- /dev/null +++ b/app/Actions/ContentPage/UpdateAction.php @@ -0,0 +1,18 @@ +update($data); + } +} diff --git a/app/Actions/CustomField/CreateAction.php b/app/Actions/CustomField/CreateAction.php new file mode 100644 index 0000000..e8dceca --- /dev/null +++ b/app/Actions/CustomField/CreateAction.php @@ -0,0 +1,31 @@ +getHighestSortkey($institute) + 1; + } + + $customField = new CustomField($data); + + $customField->institute()->associate($institute); + $customField->save(); + } + + private function getHighestSortkey(Institute $institute): int + { + return $institute->customFields()->max('sortkey') ?? 0; + } +} diff --git a/app/Actions/CustomField/DeleteAction.php b/app/Actions/CustomField/DeleteAction.php new file mode 100644 index 0000000..7fc5006 --- /dev/null +++ b/app/Actions/CustomField/DeleteAction.php @@ -0,0 +1,18 @@ +delete(); + } +} diff --git a/app/Actions/CustomField/UpdateAction.php b/app/Actions/CustomField/UpdateAction.php new file mode 100644 index 0000000..6e0419d --- /dev/null +++ b/app/Actions/CustomField/UpdateAction.php @@ -0,0 +1,18 @@ +update($data); + } +} diff --git a/app/Actions/HomepageInformation/EditHomepageInformationAction.php b/app/Actions/HomepageInformation/EditHomepageInformationAction.php new file mode 100644 index 0000000..be6848f --- /dev/null +++ b/app/Actions/HomepageInformation/EditHomepageInformationAction.php @@ -0,0 +1,24 @@ +update([ + 'homepage_title_en' => $data['homepage_title_en'], + 'homepage_body_en' => WYSIWYG::isEmpty($data['homepage_body_en']) ? null : $data['homepage_body_en'], + 'homepage_title_nl' => $data['homepage_title_nl'], + 'homepage_body_nl' => WYSIWYG::isEmpty($data['homepage_body_nl']) ? null : $data['homepage_body_nl'], + ]); + } +} diff --git a/app/Actions/Institute/ImpersonateAction.php b/app/Actions/Institute/ImpersonateAction.php new file mode 100644 index 0000000..84dda7f --- /dev/null +++ b/app/Actions/Institute/ImpersonateAction.php @@ -0,0 +1,17 @@ +impersonatedInstitute()->associate($institute); + $user->save(); + } +} diff --git a/app/Actions/Institute/StopImpersonatingAction.php b/app/Actions/Institute/StopImpersonatingAction.php new file mode 100644 index 0000000..e560091 --- /dev/null +++ b/app/Actions/Institute/StopImpersonatingAction.php @@ -0,0 +1,16 @@ +impersonatedInstitute()->disassociate(); + $user->save(); + } +} diff --git a/app/Actions/Institute/Tag/CreateAction.php b/app/Actions/Institute/Tag/CreateAction.php new file mode 100644 index 0000000..e21350e --- /dev/null +++ b/app/Actions/Institute/Tag/CreateAction.php @@ -0,0 +1,26 @@ + $data['name'], 'type' => $data['type']]); + $tag->institute()->associate($institute); + + if (isset($data['description']['en']) || isset($data['description']['nl'])) { + $tag->setTranslations('description', $data['description']); + } + + $tag->save(); + } +} diff --git a/app/Actions/Institute/Tag/DeleteAction.php b/app/Actions/Institute/Tag/DeleteAction.php new file mode 100644 index 0000000..b186752 --- /dev/null +++ b/app/Actions/Institute/Tag/DeleteAction.php @@ -0,0 +1,18 @@ +delete(); + } +} diff --git a/app/Actions/Institute/Tag/UpdateAction.php b/app/Actions/Institute/Tag/UpdateAction.php new file mode 100644 index 0000000..52b98d6 --- /dev/null +++ b/app/Actions/Institute/Tag/UpdateAction.php @@ -0,0 +1,26 @@ +setTranslations('name', $data['name']); + + if (isset($data['description'])) { + $tag->setTranslations('description', $data['description']); + } + + $tag->type = $data['type']; + + $tag->save(); + } +} diff --git a/app/Actions/Institute/Tool/AddAction.php b/app/Actions/Institute/Tool/AddAction.php index 646bb99..3168fd4 100644 --- a/app/Actions/Institute/Tool/AddAction.php +++ b/app/Actions/Institute/Tool/AddAction.php @@ -5,17 +5,42 @@ namespace App\Actions\Institute\Tool; use App\Models\Institute; +use App\Models\InstituteTool; use App\Models\Tool; +use App\Models\User; use Spatie\QueueableAction\QueueableAction; class AddAction { use QueueableAction; - public function execute(Tool $tool, Institute $institute, array $data): void + public function execute(Tool $tool, Institute $institute, array $data, User $user): void { $tool->institutes()->attach($institute); - (new UpdateAction())->execute($tool, $institute, $data); + (new UpdateAction())->execute($tool, $institute, $data, $user); + + $this->setCustomFields($tool, $institute, $data); + } + + private function setCustomFields(Tool $tool, Institute $institute, array $data): void + { + if (!isset($data['custom_fields'])) { + return; + } + + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->firstOrFail(); + + $instituteTool->customFields()->sync([]); + foreach ($data['custom_fields'] as $customField) { + if ($customField['value_en'] === null) { + continue; + } + + $instituteTool->customFields()->attach($customField['id'], [ + 'value_en' => $customField['value_en'], + 'value_nl' => $customField['value_nl'], + ]); + } } } diff --git a/app/Actions/Institute/Tool/Concept/CreateAction.php b/app/Actions/Institute/Tool/Concept/CreateAction.php new file mode 100644 index 0000000..d90bec8 --- /dev/null +++ b/app/Actions/Institute/Tool/Concept/CreateAction.php @@ -0,0 +1,53 @@ +forInstitute($institute)->firstOrFail(); + + $concept = new ConceptInstituteTool(); + + $concept->fill(Arr::only($instituteTool->toArray(), $concept->getFillable())); + + $concept->originalVersion()->associate($instituteTool); + + $concept->save(); + + $concept->alternativeTools()->sync($instituteTool->alternativeTools()->pluck('id')); + + $this->syncTags($instituteTool, $concept); + + $this->copyCustomFields($instituteTool, $concept); + } + + private function syncTags(InstituteTool $instituteTool, ConceptInstituteTool $concept): void + { + $concept->syncTagsWithType( + $instituteTool->categories(), + TagTypes::CATEGORIES + ); + } + + private function copyCustomFields(InstituteTool $instituteTool, ConceptInstituteTool $concept): void + { + $instituteTool->customFields()->each(function (CustomField $customField) use ($concept): void { + $concept->customFields()->attach($customField, [ + 'value_en' => $customField->pivot->value_en, + 'value_nl' => $customField->pivot->value_nl, + ]); + }); + } +} diff --git a/app/Actions/Institute/Tool/Concept/DiscardAction.php b/app/Actions/Institute/Tool/Concept/DiscardAction.php new file mode 100644 index 0000000..430f637 --- /dev/null +++ b/app/Actions/Institute/Tool/Concept/DiscardAction.php @@ -0,0 +1,24 @@ +forInstitute($institute)->firstOrFail(); + $concept = $instituteTool->concept; + + if (!$concept) { + return; + } + + $concept->delete(); + } +} diff --git a/app/Actions/Institute/Tool/Concept/PublishAction.php b/app/Actions/Institute/Tool/Concept/PublishAction.php new file mode 100644 index 0000000..ed8ffb5 --- /dev/null +++ b/app/Actions/Institute/Tool/Concept/PublishAction.php @@ -0,0 +1,64 @@ +forInstitute($institute)->firstOrFail(); + $concept = $instituteTool->concept; + + $instituteTool->fill(Arr::only($concept->toArray(), $instituteTool->getFillable())); + $instituteTool->updated_at = Carbon::now(); + + $instituteTool->save(); + + $instituteTool->alternativeTools()->sync($concept->alternativeTools()->pluck('id')); + + $this->syncTags($concept, $instituteTool); + + $this->copyCustomFields($concept, $instituteTool); + + $this->discardAction->execute($tool, $institute); + } + + private function syncTags(ConceptInstituteTool $concept, InstituteTool $instituteTool): void + { + $instituteTool->syncTagsWithType( + $concept->categories(), + TagTypes::CATEGORIES + ); + } + + private function copyCustomFields(ConceptInstituteTool $concept, InstituteTool $instituteTool): void + { + $instituteTool->customFields()->sync([]); + + $concept->customFields()->each(function (CustomField $customField) use ($instituteTool): void { + $instituteTool->customFields()->attach($customField, [ + 'value_en' => $customField->pivot->value_en, + 'value_nl' => $customField->pivot->value_nl, + ]); + }); + } +} diff --git a/app/Actions/Institute/Tool/Concept/SafelyDiscardAction.php b/app/Actions/Institute/Tool/Concept/SafelyDiscardAction.php new file mode 100644 index 0000000..eddc069 --- /dev/null +++ b/app/Actions/Institute/Tool/Concept/SafelyDiscardAction.php @@ -0,0 +1,34 @@ +forInstitute($institute)->first()?->concept; + if ($concept === null) { + return false; + } + + if ($this->conceptWasChangedAfterCreating($concept)) { + return false; + } + + (new DiscardAction())->execute($tool, $institute); + + return true; + } + + private function conceptWasChangedAfterCreating(ConceptInstituteTool $concept): bool + { + return $concept->updated_at->isAfter($concept->created_at); + } +} diff --git a/app/Actions/Institute/Tool/Concept/UpdateAction.php b/app/Actions/Institute/Tool/Concept/UpdateAction.php new file mode 100644 index 0000000..9b48df8 --- /dev/null +++ b/app/Actions/Institute/Tool/Concept/UpdateAction.php @@ -0,0 +1,77 @@ +institute; + + (new ClearAction())->execute($tool, $user, $institute); + + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->firstOrFail(); + + $concept = $instituteTool->getOrCreateConceptVersion(); + + if ($newStatus !== null) { + $concept->status = $newStatus; + } + + $concept->update(Arr::except($data, 'custom_fields')); + + if (isset($data['alternative_tools_ids'])) { + $concept->alternativeTools()->sync($data['alternative_tools_ids']); + } + + $this->setCustomFields($concept, $data); + $this->syncTags($concept, $data); + + (new CreateToolLogAction())->execute($tool, $user, $institute); + } + + private function setCustomFields(ConceptInstituteTool $concept, array $data): void + { + if (!isset($data['custom_fields'])) { + return; + } + + $concept->customFields()->sync([]); + foreach ($data['custom_fields'] as $customField) { + if (WYSIWYG::isEmpty($customField['value_en'])) { + continue; + } + + $concept->customFields()->attach($customField['id'], [ + 'value_en' => $customField['value_en'], + 'value_nl' => WYSIWYG::isEmpty($customField['value_nl']) ? null : $customField['value_nl'], + ]); + } + } + + private function syncTags(ConceptInstituteTool $concept, array $data): void + { + if (isset($data['categories'])) { + $concept->syncTagsWithType( + Tag::whereIn('id', $data['categories'])->get(), + TagTypes::CATEGORIES + ); + } + } +} diff --git a/app/Actions/Institute/Tool/PublishAction.php b/app/Actions/Institute/Tool/PublishAction.php index 8b04541..9501740 100644 --- a/app/Actions/Institute/Tool/PublishAction.php +++ b/app/Actions/Institute/Tool/PublishAction.php @@ -5,6 +5,7 @@ namespace App\Actions\Institute\Tool; use App\Models\Institute; +use App\Models\InstituteTool; use App\Models\Tool; use Carbon\Carbon; use Spatie\QueueableAction\QueueableAction; @@ -15,7 +16,7 @@ class PublishAction public function execute(Tool $tool, Institute $institute): void { - $instituteTool = $institute->tools()->find($tool)->pivot; + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->firstOrFail(); $instituteTool->published_at = Carbon::now(); $instituteTool->save(); } diff --git a/app/Actions/Institute/Tool/SendNotificationAction.php b/app/Actions/Institute/Tool/SendNotificationAction.php new file mode 100644 index 0000000..0cba150 --- /dev/null +++ b/app/Actions/Institute/Tool/SendNotificationAction.php @@ -0,0 +1,44 @@ +sender = Auth::user(); + } + + public function execute(Tool $tool, array $data): void + { + $tool + ->followers() + ->fromInstitute($this->sender->institute) + ->withEmail() + ->each(fn (User $follower) => $this->sendNotificationTo($follower, $tool, $data)); + + $this->sendNotificationTo($this->sender, $tool, $data); + } + + private function sendNotificationTo(User $recipient, Tool $tool, array $data): void + { + $toolUpdateMail = new InstituteToolNotificationMail( + $this->sender, + $tool, + $data['subject'], + $data['message'] + ); + + Mail::to($recipient)->queue($toolUpdateMail); + } +} diff --git a/app/Actions/Institute/Tool/UnpublishAction.php b/app/Actions/Institute/Tool/UnpublishAction.php index 5295b35..a79e488 100644 --- a/app/Actions/Institute/Tool/UnpublishAction.php +++ b/app/Actions/Institute/Tool/UnpublishAction.php @@ -5,6 +5,7 @@ namespace App\Actions\Institute\Tool; use App\Models\Institute; +use App\Models\InstituteTool; use App\Models\Tool; use Spatie\QueueableAction\QueueableAction; @@ -14,7 +15,7 @@ class UnpublishAction public function execute(Tool $tool, Institute $institute): void { - $instituteTool = $institute->tools()->find($tool)->pivot; + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->firstOrFail(); $instituteTool->published_at = null; $instituteTool->save(); } diff --git a/app/Actions/Institute/Tool/UpdateAction.php b/app/Actions/Institute/Tool/UpdateAction.php index 5a4718d..ea1be66 100644 --- a/app/Actions/Institute/Tool/UpdateAction.php +++ b/app/Actions/Institute/Tool/UpdateAction.php @@ -4,22 +4,39 @@ namespace App\Actions\Institute\Tool; +use App\Actions\PendingToolEdit\ClearAction; +use App\Actions\ToolLog\CreateAction as CreateToolLogAction; +use App\Enums\Tags\TagTypes; use App\Models\Institute; +use App\Models\InstituteTool; +use App\Models\Tag; use App\Models\Tool; +use App\Models\User; use Spatie\QueueableAction\QueueableAction; class UpdateAction { use QueueableAction; - public function execute(Tool $tool, Institute $institute, array $data): void + public function execute(Tool $tool, Institute $institute, array $data, User $user): void { - $instituteTool = $institute->tools()->find($tool)->pivot; + (new ClearAction())->execute($tool, $user, $institute); + + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->firstOrFail(); $instituteTool->update($data); - (new StoreImagesAction())->execute($instituteTool, $data); + if (isset($data['alternative_tools_ids'])) { + $instituteTool->alternativeTools()->sync($data['alternative_tools_ids']); + } + + if (isset($data['categories'])) { + $instituteTool->syncTagsWithType( + Tag::whereIn('id', $data['categories'])->get(), + TagTypes::CATEGORIES + ); + } - (new SetCategoriesAction())->execute($tool, $institute, $data['categories'] ?? []); + (new CreateToolLogAction())->execute($tool, $user, $institute); } } diff --git a/app/Actions/PendingToolEdit/ClearAction.php b/app/Actions/PendingToolEdit/ClearAction.php new file mode 100644 index 0000000..a3fd843 --- /dev/null +++ b/app/Actions/PendingToolEdit/ClearAction.php @@ -0,0 +1,24 @@ +forUser($user); + $query = $institute ? $query->forInstitute($institute) : $query->missingInstitute(); + + $query->delete(); + } +} diff --git a/app/Actions/PendingToolEdit/CreateAction.php b/app/Actions/PendingToolEdit/CreateAction.php new file mode 100644 index 0000000..7f2f732 --- /dev/null +++ b/app/Actions/PendingToolEdit/CreateAction.php @@ -0,0 +1,27 @@ +tool()->associate($tool); + $edit->user()->associate($user); + $edit->institute()->associate($institute); + + $edit->save(); + } +} diff --git a/app/Actions/Tag/CreateAction.php b/app/Actions/Tag/CreateAction.php new file mode 100644 index 0000000..2d7dc06 --- /dev/null +++ b/app/Actions/Tag/CreateAction.php @@ -0,0 +1,18 @@ + $data['name'], 'type' => $data['type']]); + } +} diff --git a/app/Actions/Tag/DeleteAction.php b/app/Actions/Tag/DeleteAction.php new file mode 100644 index 0000000..1e8a1b3 --- /dev/null +++ b/app/Actions/Tag/DeleteAction.php @@ -0,0 +1,18 @@ +delete(); + } +} diff --git a/app/Actions/Tag/UpdateAction.php b/app/Actions/Tag/UpdateAction.php new file mode 100644 index 0000000..7d39d19 --- /dev/null +++ b/app/Actions/Tag/UpdateAction.php @@ -0,0 +1,21 @@ +update([ + 'name' => $data['name'], + 'type' => $data['type'], + ]); + } +} diff --git a/app/Actions/Tool/ChangeFollowingStatusAction.php b/app/Actions/Tool/ChangeFollowingStatusAction.php new file mode 100644 index 0000000..bae4588 --- /dev/null +++ b/app/Actions/Tool/ChangeFollowingStatusAction.php @@ -0,0 +1,22 @@ +isFollowingTool($tool)) { + $tool->followers()->detach($user); + + return; + } + + $tool->followers()->attach($user); + } +} diff --git a/app/Actions/Tool/Concept/CreateAction.php b/app/Actions/Tool/Concept/CreateAction.php new file mode 100644 index 0000000..8d692e0 --- /dev/null +++ b/app/Actions/Tool/Concept/CreateAction.php @@ -0,0 +1,39 @@ +fill(Arr::only($tool->toArray(), $concept->getFillable())); + + foreach (ConceptTool::$images as $imageField) { + $concept->$imageField = $tool->$imageField; + } + + $concept->originalVersion()->associate($tool); + + $concept->save(); + + $concept->syncTagsWithType($tool->features(), TagTypes::FEATURES); + $concept->syncTagsWithType($tool->softwareType(), TagTypes::SOFTWARE_TYPES); + $concept->syncTagsWithType($tool->devices(), TagTypes::DEVICES); + $concept->syncTagsWithType($tool->standards(), TagTypes::STANDARDS); + $concept->syncTagsWithType($tool->operatingSystem(), TagTypes::OPERATING_SYSTEMS); + $concept->syncTagsWithType($tool->dataProcessingLocation(), TagTypes::DATA_PROCESSING_LOCATIONS); + $concept->syncTagsWithType($tool->certification(), TagTypes::CERTIFICATIONS); + $concept->syncTagsWithType($tool->workingMethods(), TagTypes::WORKING_METHODS); + $concept->syncTagsWithType($tool->targetGroup(), TagTypes::TARGET_GROUPS); + $concept->syncTagsWithType($tool->complexity(), TagTypes::COMPLEXITY); + } +} diff --git a/app/Actions/Tool/Concept/DiscardAction.php b/app/Actions/Tool/Concept/DiscardAction.php new file mode 100644 index 0000000..d9718a2 --- /dev/null +++ b/app/Actions/Tool/Concept/DiscardAction.php @@ -0,0 +1,28 @@ +concept; + if (!$concept) { + return; + } + + foreach (Tool::$images as $imageField) { + if ($concept->$imageField && $concept->$imageField !== $tool->$imageField) { + Storage::disk(ConceptTool::$disk)->delete($concept->$imageField); + } + } + + $concept->delete(); + } +} diff --git a/app/Actions/Tool/Concept/PublishAction.php b/app/Actions/Tool/Concept/PublishAction.php new file mode 100644 index 0000000..283f044 --- /dev/null +++ b/app/Actions/Tool/Concept/PublishAction.php @@ -0,0 +1,76 @@ +replicate(); + + $tool->fill(Arr::only($tool->concept->toArray(), $tool->getFillable())); + + foreach (Tool::$images as $imageField) { + $tool->$imageField = $tool->concept->$imageField; + } + + $tool->updated_at = Carbon::now(); + + $tool->save(); + + $tool->syncTagsWithType($tool->concept->features(), TagTypes::FEATURES); + $tool->syncTagsWithType($tool->concept->softwareType(), TagTypes::SOFTWARE_TYPES); + $tool->syncTagsWithType($tool->concept->devices(), TagTypes::DEVICES); + $tool->syncTagsWithType($tool->concept->standards(), TagTypes::STANDARDS); + $tool->syncTagsWithType($tool->concept->operatingSystem(), TagTypes::OPERATING_SYSTEMS); + $tool->syncTagsWithType($tool->concept->dataProcessingLocation(), TagTypes::DATA_PROCESSING_LOCATIONS); + $tool->syncTagsWithType($tool->concept->certification(), TagTypes::CERTIFICATIONS); + $tool->syncTagsWithType($tool->concept->workingMethods(), TagTypes::WORKING_METHODS); + $tool->syncTagsWithType($tool->concept->targetGroup(), TagTypes::TARGET_GROUPS); + $tool->syncTagsWithType($tool->concept->complexity(), TagTypes::COMPLEXITY); + + $tool->refresh(); + + if ($this->hasDataChanged($dataBeforePublish, $tool)) { + $this->emailStakeholdersAction->execute($tool); + } + + $this->discardAction->execute($tool); + } + + private function hasDataChanged(Tool $toolBefore, Tool $toolAfter): bool + { + $attributes = [ + ...$toolBefore->getFillable(), + ...Tool::$images, + ]; + + foreach ($attributes as $attribute) { + if ($toolBefore->{$attribute} !== $toolAfter->{$attribute}) { + return true; + } + } + + $tagsBefore = $toolBefore->tags()->orderBy('id')->pluck('id')->toArray(); + $tagsAfter = $toolAfter->tags()->orderBy('id')->pluck('id')->toArray(); + + return $tagsBefore !== $tagsAfter; + } +} diff --git a/app/Actions/Tool/Concept/SafelyDiscardAction.php b/app/Actions/Tool/Concept/SafelyDiscardAction.php new file mode 100644 index 0000000..17d4f6a --- /dev/null +++ b/app/Actions/Tool/Concept/SafelyDiscardAction.php @@ -0,0 +1,32 @@ +concept; + if ($concept === null) { + return false; + } + + if ($this->conceptWasChangedAfterCreating($concept)) { + return false; + } + + (new DiscardAction())->execute($tool); + + return true; + } + + private function conceptWasChangedAfterCreating(ConceptTool $concept): bool + { + return $concept->updated_at->isAfter($concept->created_at); + } +} diff --git a/app/Actions/Tool/Concept/StoreImagesAction.php b/app/Actions/Tool/Concept/StoreImagesAction.php new file mode 100644 index 0000000..98a2a23 --- /dev/null +++ b/app/Actions/Tool/Concept/StoreImagesAction.php @@ -0,0 +1,34 @@ +concept; + + foreach (Tool::$images as $imageField) { + if (!isset($data[$imageField])) { + continue; + } + + if ($concept->$imageField && $concept->$imageField !== $tool->$imageField) { + Storage::disk(Tool::$disk)->delete($concept->$imageField); + } + + $concept->$imageField = File::store($data[$imageField], Tool::$disk); + } + + $concept->save(); + } +} diff --git a/app/Actions/Tool/Concept/UpdateAction.php b/app/Actions/Tool/Concept/UpdateAction.php new file mode 100644 index 0000000..9287fbd --- /dev/null +++ b/app/Actions/Tool/Concept/UpdateAction.php @@ -0,0 +1,50 @@ +execute($tool, $user); + + $concept = $tool->getOrCreateConceptVersion(); + + ToolPrefillData::replaceWithNull($data); + + $concept->update($data); + + $dataKeysWithTagTypes = [ + 'features' => TagTypes::FEATURES, + 'software_types' => TagTypes::SOFTWARE_TYPES, + 'devices' => TagTypes::DEVICES, + 'standards' => TagTypes::STANDARDS, + 'operating_systems' => TagTypes::OPERATING_SYSTEMS, + 'data_processing_locations' => TagTypes::DATA_PROCESSING_LOCATIONS, + 'certifications' => TagTypes::CERTIFICATIONS, + 'working_methods' => TagTypes::WORKING_METHODS, + 'target_groups' => TagTypes::TARGET_GROUPS, + 'complexity' => TagTypes::COMPLEXITY, + ]; + + foreach ($dataKeysWithTagTypes as $dataKey => $tagType) { + $concept->syncTagsWithType(Tag::whereIn('id', $data[$dataKey] ?? [])->get(), $tagType); + } + + (new StoreImagesAction())->execute($tool, $data); + (new CreateToolLogAction())->execute($tool, $user); + } +} diff --git a/app/Actions/Tool/CreateAction.php b/app/Actions/Tool/CreateAction.php index b425857..d58f6e5 100644 --- a/app/Actions/Tool/CreateAction.php +++ b/app/Actions/Tool/CreateAction.php @@ -4,19 +4,46 @@ namespace App\Actions\Tool; +use App\Actions\ToolLog\CreateAction as CreateToolLogAction; +use App\Enums\Tags\TagTypes; +use App\Helpers\ToolPrefillData; +use App\Models\Tag; use App\Models\Tool; +use App\Models\User; use Spatie\QueueableAction\QueueableAction; class CreateAction { use QueueableAction; - public function execute(array $data): void + public function execute(array $data, User $user): Tool { + ToolPrefillData::replaceWithNull($data); + $tool = Tool::create($data); - $tool->features()->sync($data['features'] ?? []); + $tagTypeMapping = [ + 'features' => TagTypes::FEATURES, + 'software_types' => TagTypes::SOFTWARE_TYPES, + 'devices' => TagTypes::DEVICES, + 'standards' => TagTypes::STANDARDS, + 'operating_systems' => TagTypes::OPERATING_SYSTEMS, + 'data_processing_locations' => TagTypes::DATA_PROCESSING_LOCATIONS, + 'certifications' => TagTypes::CERTIFICATIONS, + 'working_methods' => TagTypes::WORKING_METHODS, + 'target_groups' => TagTypes::TARGET_GROUPS, + 'complexity' => TagTypes::COMPLEXITY, + ]; + + foreach ($tagTypeMapping as $key => $tagType) { + if (isset($data[$key])) { + $tool->syncTagsWithType(Tag::whereIn('id', $data[$key])->get(), $tagType); + } + } (new StoreImagesAction())->execute($tool, $data); + (new CreateToolLogAction())->execute($tool, $user); + + return $tool; } } diff --git a/app/Actions/Tool/NotifyStakeholdersAction.php b/app/Actions/Tool/NotifyStakeholdersAction.php new file mode 100644 index 0000000..3783866 --- /dev/null +++ b/app/Actions/Tool/NotifyStakeholdersAction.php @@ -0,0 +1,24 @@ +queue(new ToolUpdated($tool)); + } + } +} diff --git a/app/Actions/Tool/StoreImagesAction.php b/app/Actions/Tool/StoreImagesAction.php index ecd7263..6e6b3e2 100644 --- a/app/Actions/Tool/StoreImagesAction.php +++ b/app/Actions/Tool/StoreImagesAction.php @@ -4,6 +4,7 @@ namespace App\Actions\Tool; +use App\Helpers\File; use App\Models\Tool; use Illuminate\Support\Facades\Storage; use Spatie\QueueableAction\QueueableAction; @@ -23,9 +24,7 @@ public function execute(Tool $tool, array $data): void Storage::disk(Tool::$disk)->delete($tool->$imageField); } - $tool->$imageField = basename( - $data[$imageField]->store(Tool::$disk) - ); + $tool->$imageField = File::store($data[$imageField], Tool::$disk); } $tool->save(); diff --git a/app/Actions/Tool/SubmitRequestForChangeAction.php b/app/Actions/Tool/SubmitRequestForChangeAction.php new file mode 100644 index 0000000..1af2bbc --- /dev/null +++ b/app/Actions/Tool/SubmitRequestForChangeAction.php @@ -0,0 +1,26 @@ +email !== null) { + $mailable->bcc($user); + } + + $mailable->queue($mail); + } +} diff --git a/app/Actions/ToolLog/CreateAction.php b/app/Actions/ToolLog/CreateAction.php new file mode 100644 index 0000000..5471fc7 --- /dev/null +++ b/app/Actions/ToolLog/CreateAction.php @@ -0,0 +1,27 @@ +tool()->associate($tool); + $edit->user()->associate($user); + $edit->institute()->associate($institute); + + $edit->save(); + } +} diff --git a/app/Console/Commands/Bootstrap/Institutes.php b/app/Console/Commands/Bootstrap/Institutes.php index f9fb190..c0786f5 100644 --- a/app/Console/Commands/Bootstrap/Institutes.php +++ b/app/Console/Commands/Bootstrap/Institutes.php @@ -4,9 +4,10 @@ namespace App\Console\Commands\Bootstrap; +use App\Helpers\File; use App\Models\Institute; use Illuminate\Console\Command; -use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Facades\App; class Institutes extends Command { @@ -20,36 +21,90 @@ public function handle(): void { $this->info('Bootstrapping institutes...'); - foreach (config('bootstrap.institutes') as $institute) { - if (Institute::where('domain', $institute['domain'])->exists()) { + $institutes = $this->getInstitutesToBootstrap(); + + foreach ($institutes as $bootstrapInstitute) { + if (Institute::where('domain', $bootstrapInstitute['domain'])->exists()) { + $this->updateInstitute($bootstrapInstitute); + continue; } - $logoFullFilename = basename(Storage::putFile( - Institute::$disk, - resource_path('seeding/institutes/full/' . $institute['logo']) - )); - - $logoSquareFilename = basename(Storage::putFile( - Institute::$disk, - resource_path('seeding/institutes/square/' . $institute['logo']) - )); - - $bannerFilename = basename(Storage::putFile( - Institute::$disk, - resource_path('seeding/institutes/banner/' . $institute['banner']) - )); - - Institute::create([ - 'full_name' => $institute['full_name'], - 'short_name' => $institute['short_name'], - 'domain' => $institute['domain'], - 'logo_full_filename' => $logoFullFilename, - 'logo_square_filename' => $logoSquareFilename, - 'banner_filename' => $bannerFilename, - ]); + $this->createNewInstitute($bootstrapInstitute); } $this->info('Bootstrapping institutes done'); } + + /** @return array> $institutes */ + private function getInstitutesToBootstrap(): array + { + $institutes = config('bootstrap.institutes'); + + $allowedEnvironments = array_merge( + config('constants.environment.development'), + config('constants.environment.staging'), + config('constants.environment.testing'), + ); + + if (App::environment($allowedEnvironments)) { + $institutes = array_merge($institutes, config('bootstrap.test-institutes')); + } + + return $institutes; + } + + private function updateInstitute(array $bootstrapInstitute): void + { + $institute = Institute::where('domain', $bootstrapInstitute['domain'])->first(); + + // Get current set of pictures + $replacedImages = [ + 'logo_full_filename' => $institute->logo_full_filename, + 'logo_square_filename' => $institute->logo_square_filename, + 'banner_filename' => $institute->banner_filename, + ]; + + // Store new set of pictures + $logoPath = resource_path('seeding/institutes/full/' . $bootstrapInstitute['logo']); + $bannerPath = resource_path('seeding/institutes/banner/' . $bootstrapInstitute['banner']); + + $logoFullFilename = File::storeFromPath($logoPath, Institute::$disk); + $logoSquareFilename = File::storeFromPath($logoPath, Institute::$disk); + $bannerFilename = File::storeFromPath($bannerPath, Institute::$disk); + + $institute->update([ + 'full_name_en' => $bootstrapInstitute['full_name_en'], + 'full_name_nl' => $bootstrapInstitute['full_name_nl'], + 'short_name' => $bootstrapInstitute['short_name'], + 'logo_full_filename' => $logoFullFilename, + 'logo_square_filename' => $logoSquareFilename, + 'banner_filename' => $bannerFilename, + ]); + + // Finally, delete old pictures + foreach ($replacedImages as $fileName) { + File::delete($fileName); + } + } + + private function createNewInstitute(array $bootstrapInstitute): void + { + $logoPath = resource_path('seeding/institutes/full/' . $bootstrapInstitute['logo']); + $bannerPath = resource_path('seeding/institutes/banner/' . $bootstrapInstitute['banner']); + + $logoFullFilename = File::storeFromPath($logoPath, Institute::$disk); + $logoSquareFilename = File::storeFromPath($logoPath, Institute::$disk); + $bannerFilename = File::storeFromPath($bannerPath, Institute::$disk); + + Institute::create([ + 'full_name_en' => $bootstrapInstitute['full_name_en'], + 'full_name_nl' => $bootstrapInstitute['full_name_nl'], + 'short_name' => $bootstrapInstitute['short_name'], + 'domain' => $bootstrapInstitute['domain'], + 'logo_full_filename' => $logoFullFilename, + 'logo_square_filename' => $logoSquareFilename, + 'banner_filename' => $bannerFilename, + ]); + } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index cbf4373..e0e02ed 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -18,8 +18,7 @@ protected function schedule(Schedule $schedule): void { $schedule ->command('activitylog:clean') - ->daily() - ->thenPing(config('heartbeat.activity-log-clean')); + ->daily(); } protected function commands(): void diff --git a/app/Enums/BaseEnum.php b/app/Enums/BaseEnum.php index 513967a..9118eec 100644 --- a/app/Enums/BaseEnum.php +++ b/app/Enums/BaseEnum.php @@ -27,4 +27,9 @@ public static function asSelect(): array return $options; } + + public static function getTranslation(string $option): string + { + return trans(static::$translationKey . $option); + } } diff --git a/app/Enums/InstituteTool/DataClassification.php b/app/Enums/InstituteTool/DataClassification.php new file mode 100644 index 0000000..69f381c --- /dev/null +++ b/app/Enums/InstituteTool/DataClassification.php @@ -0,0 +1,17 @@ +expectsJson()) { + return response()->json(['error' => $exception->getMessage()], 403); + } + + return response()->view('error', [ + 'message' => trans('message.error.unauthorized'), + 'reason' => $exception->getMessage(), + ], 403); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index ad289d5..14139e5 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -23,7 +23,7 @@ class Handler extends ExceptionHandler /** * A list of the exception types that are not reported. * - * @var array + * @var array> */ protected $dontReport = [ HttpException::class, @@ -35,17 +35,18 @@ class Handler extends ExceptionHandler /** * A list of the exception types that should be logged at info level. * - * @var array + * @var array */ protected $reportAsInfo = [ AuthorizationException::class, TokenMismatchException::class, + SurfConextException::class, ]; /** * A list of the inputs that are never flashed for validation exceptions. * - * @var array + * @var array */ protected $dontFlash = [ 'password', diff --git a/app/Exceptions/SurfConextException.php b/app/Exceptions/SurfConextException.php new file mode 100644 index 0000000..e5579f3 --- /dev/null +++ b/app/Exceptions/SurfConextException.php @@ -0,0 +1,11 @@ +stateless()->user(); $user = $manager->createOrUpdateUser($externalUser); + (new StopImpersonatingAction())->execute($user); + Auth::login($user); return LoginRedirect::doRedirect(); diff --git a/app/External/Auth/SURF/Manager.php b/app/External/Auth/SURF/Manager.php index 3979281..938b887 100644 --- a/app/External/Auth/SURF/Manager.php +++ b/app/External/Auth/SURF/Manager.php @@ -5,31 +5,32 @@ namespace App\External\Auth\SURF; use App\Enums\Auth\Role; +use App\Exceptions\SurfConextException; use App\Models\Institute; use App\Models\User; -use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Log; use Laravel\Socialite\Contracts\User as SURFUser; class Manager { public function createOrUpdateUser(SURFUser $externalUser): User { - $user = $this->findUser($externalUser); + $this->enforceAffiliation($externalUser, ['employee', 'affiliate']); - // TODO Refactor after socialiteproviders/surfconext gets new version (beyond 4.1.2) - $roles = $this->parseSURFRoles(Arr::get($externalUser->user, 'edumember_is_member_of')); + $roles = $this->parseSURFRolesOrFail($externalUser); - if (empty($roles)) { - throw new AuthorizationException(); - } + $institute = $this->parseInstituteOrFail($externalUser); + + $user = $this->findUser($externalUser); if (!$user) { $user = new User(); $user->external_id = $externalUser->getId(); } - $user->institute()->associate($this->findInstitute($externalUser->schac_home_organization)); + $user->institute()->associate($institute); + $user->email = $externalUser->getEmail(); $user->name = $externalUser->getName(); $user->roles = $roles; @@ -43,15 +44,39 @@ private function findUser(SURFUser $user): ?User return User::where('external_id', $user->getId())->first(); } - private function findInstitute(string $domain): Institute + private function enforceAffiliation(SURFUser $externalUser, array $affiliations): void { - return Institute::where('domain', $domain)->firstOrFail(); + foreach ($affiliations as $affiliation) { + if (in_array($affiliation, $externalUser->eduperson_affiliation ?? [])) { + return; + } + } + + $this->throwSurfConextException(trans('message.error.login.invalid_affiliation'), $externalUser); + } + + private function parseInstituteOrFail(SURFUser $externalUser): ?Institute + { + $institute = Institute::where('domain', $externalUser->schac_home_organization)->first(); + + if (!$institute) { + $this->throwSurfConextException(trans('message.error.login.unknown_institute'), $externalUser); + } + + return $institute; } - private function parseSURFRoles(?array $roles): array + private function parseSURFRolesOrFail(SURFUser $externalUser): array { - if (empty($roles)) { - return []; + // TODO Refactor after socialiteproviders/surfconext finally gets tagged beyond 4.1.2 + $roles = Arr::get($externalUser->user, 'edumember_is_member_of'); + + if (!is_array($roles)) { + $roles = []; + } + + if (!in_array(config('services.surfconext.roles.' . Role::TEACHER), $roles, true)) { + $roles[] = config('services.surfconext.roles.teacher'); } $translatedRoles = []; @@ -61,6 +86,20 @@ private function parseSURFRoles(?array $roles): array } } + if (empty($translatedRoles)) { + $this->throwSurfConextException(trans('message.error.login.invalid_roles'), $externalUser); + } + return $translatedRoles; } + + private function throwSurfConextException(string $message, SURFUser $externalUser): void + { + Log::error($message, [ + 'externalUser.user' => $externalUser->user, + 'externalUser.attributes' => $externalUser->attributes, + ]); + + throw new SurfConextException($message); + } } diff --git a/app/Helpers/Country.php b/app/Helpers/Country.php new file mode 100644 index 0000000..73b9bfa --- /dev/null +++ b/app/Helpers/Country.php @@ -0,0 +1,35 @@ +getClientOriginalExtension()); + $newFilename = self::generateFilename($extension); + + Storage::disk($disk)->putFileAs('/', $file, $newFilename); + return $newFilename; + } + + public static function storeFromPath(string $path, string $disk): string + { + $extension = Str::afterLast($path, '.'); $newFilename = self::generateFilename($extension); - $file->move(config('filesystems.disks.' . $disk . '.root'), $newFilename); + Storage::disk($disk)->put($newFilename, file_get_contents($path)); return $newFilename; } @@ -56,4 +69,23 @@ public static function put(string $filename, string $content, string $disk = 'lo { Storage::disk($disk)->put($filename, $content); } + + public static function getPublicUrl( + string $disk, + string $fileName, + ?DateTimeInterface $expiration = null + ): string { + /** @var FilesystemAdapter $storage */ + $storage = Storage::disk($disk); + + if (App::environment(config('constants.environment.development'))) { + return $storage->url($fileName); + } + + if ($expiration === null) { + $expiration = now()->addDay(); + } + + return $storage->temporaryUrl($fileName, $expiration); + } } diff --git a/app/Helpers/Format.php b/app/Helpers/Format.php index 5b80355..7b8b35b 100644 --- a/app/Helpers/Format.php +++ b/app/Helpers/Format.php @@ -82,7 +82,7 @@ private static function reverseSeparators(string $string): bool return false; } - public static function stripTagsAndConvertNewlineToHtml(?string $string): string + public static function asSimpleHtml(?string $string): string { return is_null($string) ? '' : strip_tags(nl2br($string), ['
']); } diff --git a/app/Helpers/Locale.php b/app/Helpers/Locale.php new file mode 100644 index 0000000..516f9e0 --- /dev/null +++ b/app/Helpers/Locale.php @@ -0,0 +1,36 @@ +{$localizedAttribute}; + + if (!empty($value)) { + return $value; + } + + return $model->{$fieldName . '_en'}; + } + + public static function getLocalizedTranslation(string $key): ?string + { + $localizedKey = self::getValueWithLocaleSuffix($key); + + return trans($localizedKey); + } + + private static function getValueWithLocaleSuffix(string $value): string + { + return $value . '_' . App::getLocale(); + } +} diff --git a/app/Helpers/LoginRedirect.php b/app/Helpers/LoginRedirect.php index 752a75f..8dea50e 100644 --- a/app/Helpers/LoginRedirect.php +++ b/app/Helpers/LoginRedirect.php @@ -7,6 +7,7 @@ use Illuminate\Auth\AuthenticationException; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Route; +use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Symfony\Component\Routing\Exception\RouteNotFoundException; class LoginRedirect @@ -24,6 +25,8 @@ public static function doRedirect(): RedirectResponse throw new RouteNotFoundException('Default route specified in config does not exist.'); } - return redirect()->route($route); + $url = LaravelLocalization::localizeUrl(route($route), $user->language); + + return redirect($url); } } diff --git a/app/Helpers/ToolPrefillData.php b/app/Helpers/ToolPrefillData.php new file mode 100644 index 0000000..a5f05f2 --- /dev/null +++ b/app/Helpers/ToolPrefillData.php @@ -0,0 +1,38 @@ + trans('tool.prefills.privacy_analysis'), + 'use_for_education_en' => trans('tool.prefills.use_for_education', [], 'en'), + 'use_for_education_nl' => trans('tool.prefills.use_for_education', [], 'nl'), + ]; + } + + public static function replaceWithNull(array &$data): void + { + if (isset($data['privacy_analysis']) && + $data['privacy_analysis'] === trans('tool.prefills.privacy_analysis') + ) { + $data['privacy_analysis'] = null; + } + + if (isset($data['use_for_education_en']) && + $data['use_for_education_en'] === trans('tool.prefills.use_for_education', [], 'en') + ) { + $data['use_for_education_en'] = null; + } + + if (isset($data['use_for_education_nl']) && + $data['use_for_education_nl'] === trans('tool.prefills.use_for_education', [], 'nl') + ) { + $data['use_for_education_nl'] = null; + } + } +} diff --git a/app/Helpers/WYSIWYG.php b/app/Helpers/WYSIWYG.php new file mode 100644 index 0000000..1ce0898 --- /dev/null +++ b/app/Helpers/WYSIWYG.php @@ -0,0 +1,26 @@ +firstOrFail()); + $user = User::where('name', 'PAQT Admin')->firstOrFail(); + Auth::login($user); + + (new StopImpersonatingAction())->execute(Auth::user()); return LoginRedirect::doRedirect(); } public function logout(): RedirectResponse { + $user = Auth::user(); + if ($user->isImpersonating()) { + (new StopImpersonatingAction())->execute($user); + + return redirect()->route('home.index'); + } + Auth::logout(); return redirect()->route('account.login'); diff --git a/app/Http/Controllers/Admin/InstitutesController.php b/app/Http/Controllers/Admin/InstitutesController.php new file mode 100644 index 0000000..a5f6203 --- /dev/null +++ b/app/Http/Controllers/Admin/InstitutesController.php @@ -0,0 +1,37 @@ +authorize('impersonate', Institute::class); + + $institutes = Institute::orderBy('short_name')->whereNot('id', Auth::user()->institute_id)->get(); + + return Inertia::render('institutes/Index', [ + 'institutes' => InstituteResource::collection($institutes), + ]); + } + + public function impersonate(Institute $institute): RedirectResponse + { + $this->authorize('impersonate', $institute); + + (new ImpersonateAction())->execute(Auth::user(), $institute); + + return redirect()->route('home.index'); + } +} diff --git a/app/Http/Controllers/ContentManager/TagController.php b/app/Http/Controllers/ContentManager/TagController.php new file mode 100644 index 0000000..1c6a52c --- /dev/null +++ b/app/Http/Controllers/ContentManager/TagController.php @@ -0,0 +1,100 @@ +authorize('viewAll', Tag::class); + + $tags = QueryBuilder::for(Tag::withoutInstitute()) + ->allowedFilters([ + AllowedFilter::callback('name_en', function (Builder $query, $value): void { + $query->whereRaw("LOWER(JSON_EXTRACT(name, '$.en')) LIKE '%" . strtolower($value) . "%'"); + }), + AllowedFilter::callback('name_nl', function (Builder $query, $value): void { + $query->whereRaw("LOWER(JSON_EXTRACT(name, '$.nl')) LIKE '%" . strtolower($value) . "%'"); + }), + AllowedFilter::exact('type'), + ]); + + $tags = Index::forTable($tags, $request); + + return Inertia::render('content-manager/tag/Index', [ + 'tags' => TagResource::collection($tags)->additional([ + 'pagination' => new PaginationResource($tags), + ]), + 'typesSelect' => TagTypes::getTagsTypesAsSelectExcept([TagTypes::CATEGORIES]), + ]); + } + + public function create(): Response + { + $this->authorize('create', Tag::class); + + return Inertia::render('content-manager/tag/Create', [ + 'tagTypes' => TagTypes::getTagsTypesAsSelectExcept([TagTypes::CATEGORIES]), + ]); + } + + public function store(StoreRequest $storeRequest): RedirectResponse + { + (new CreateAction())->execute($storeRequest->validated()); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('content-manager.tag.index'); + } + + public function edit(Tag $tag): Response + { + $this->authorize('update', $tag); + + return Inertia::render('content-manager/tag/Edit', [ + 'tag' => new TagResource($tag), + 'tagTypes' => TagTypes::getTagsTypesAsSelectExcept([TagTypes::CATEGORIES]), + ]); + } + + public function update(UpdateRequest $request, Tag $tag): RedirectResponse + { + (new UpdateAction())->execute($tag, $request->validated()); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('content-manager.tag.index'); + } + + public function destroy(Tag $tag): RedirectResponse + { + $this->authorize('delete', $tag); + + (new DeleteAction())->execute($tag); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('content-manager.tag.index'); + } +} diff --git a/app/Http/Controllers/ContentManager/ToolController.php b/app/Http/Controllers/ContentManager/ToolController.php index 60e9545..d96d281 100644 --- a/app/Http/Controllers/ContentManager/ToolController.php +++ b/app/Http/Controllers/ContentManager/ToolController.php @@ -4,25 +4,37 @@ namespace App\Http\Controllers\ContentManager; +use App\Actions\PendingToolEdit\ClearAction; +use App\Actions\PendingToolEdit\CreateAction as CreatePendingEditAction; +use App\Actions\Tool\Concept\DiscardAction; +use App\Actions\Tool\Concept\PublishAction as PublishConceptAction; +use App\Actions\Tool\Concept\SafelyDiscardAction; +use App\Actions\Tool\Concept\UpdateAction as UpdateConceptAction; use App\Actions\Tool\CreateAction; use App\Actions\Tool\PublishAction; -use App\Actions\Tool\UpdateAction; -use App\Enums\Tool\AuthenticationMethod; +use App\Enums\Tags\TagTypes; use App\Enums\Tool\Status; -use App\Enums\Tool\StoredData; -use App\Enums\Tool\SupportedStandard; +use App\Helpers\Auth; +use App\Helpers\Country; use App\Helpers\Index; +use App\Helpers\ToolPrefillData; use App\Http\Controllers\Controller; use App\Http\Requests\IndexRequest; use App\Http\Requests\Tool\PublishRequest; use App\Http\Requests\Tool\StoreRequest; use App\Http\Requests\Tool\UpdateRequest; +use App\Http\Resources\ContentManager\ConceptToolResource; use App\Http\Resources\ContentManager\ToolIndexResource; use App\Http\Resources\ContentManager\ToolResource; use App\Http\Resources\PaginationResource; -use App\Models\Feature; +use App\Http\Resources\PendingToolEditResource; +use App\Http\Resources\TagResource; +use App\Http\Resources\ToolLogResource; +use App\Models\Tag; use App\Models\Tool; +use App\Models\ToolLog; use Illuminate\Http\RedirectResponse; +use Illuminate\Support\Facades\App; use Inertia\Inertia; use Inertia\Response; use Spatie\QueryBuilder\AllowedFilter; @@ -34,20 +46,26 @@ public function index(IndexRequest $request): Response { $this->authorize('viewAll', Tool::class); - $tools = QueryBuilder::for(Tool::query()->with('features')) + $tools = QueryBuilder::for(Tool::query()) ->allowedFilters([ - 'name', - AllowedFilter::partial('feature', 'features.name'), + AllowedFilter::partial('name'), AllowedFilter::scope('status', 'forStatus'), + AllowedFilter::scope('feature', 'forFeature'), ]) ->orderBy('name'); - $tools = Index::forTable($tools, $request, 10); + $tools = Index::forTable($tools, $request); + + $featuresAsSelect = []; + foreach (Tag::whereType(TagTypes::FEATURES)->get() as $feature) { + $featuresAsSelect[$feature->id] = $feature->getTranslation('name', App::getLocale()); + } return Inertia::render('content-manager/tool/Index', [ 'tools' => ToolIndexResource::collection($tools)->additional([ 'pagination' => new PaginationResource($tools), ]), + 'features' => $featuresAsSelect, 'statusOptions' => Status::asSelect(), ]); } @@ -57,19 +75,22 @@ public function create(): Response $this->authorize('create', Tool::class); return Inertia::render('content-manager/tool/Create', [ - 'features' => Feature::pluck('name', 'id'), - 'authenticationMethods' => AuthenticationMethod::asSelect(), - 'storedData' => StoredData::asSelect(), - 'supportedStandards' => SupportedStandard::asSelect(), + ...$this->getToolTagResources(), + 'countries' => Country::getAsSelect(false), + 'prefills' => ToolPrefillData::get(), ]); } - public function store(StoreRequest $request): RedirectResponse + public function store(StoreRequest $request, bool $continue = false): RedirectResponse { - (new CreateAction())->execute($request->validated()); + $tool = (new CreateAction())->execute($request->validated(), Auth::user()); flash(trans('message.data-saved'), 'success'); + if ($continue) { + return redirect()->route('content-manager.tool.edit', $tool); + } + return redirect()->route('content-manager.tool.index'); } @@ -77,29 +98,40 @@ public function edit(Tool $tool): Response { $this->authorize('update', $tool); - $tool->load('features'); + $concept = $tool->getOrCreateConceptVersion(); + + $user = Auth::user(); + $pendingEdit = $tool->getCurrentPendingEdit(ignoreUser: $user); + + (new ClearAction())->execute($tool, $user); + (new CreatePendingEditAction())->execute($tool, $user); return Inertia::render('content-manager/tool/Edit', [ - 'tool' => new ToolResource($tool), - 'features' => Feature::pluck('name', 'id'), - 'authenticationMethods' => AuthenticationMethod::asSelect(), - 'storedData' => StoredData::asSelect(), - 'supportedStandards' => SupportedStandard::asSelect(), + 'tool' => new ConceptToolResource($concept), + ...$this->getToolTagResources(), + 'countries' => Country::getAsSelect(false), + 'pendingEdit' => $pendingEdit ? new PendingToolEditResource($pendingEdit) : null, ]); } - public function update(UpdateRequest $request, Tool $tool): RedirectResponse + public function update(UpdateRequest $request, Tool $tool, bool $continue = false): RedirectResponse { - (new UpdateAction())->execute($tool, $request->validated()); + (new UpdateConceptAction())->execute($tool, Auth::user(), $request->validated()); flash(trans('message.data-saved'), 'success'); + if ($continue) { + return redirect()->route('content-manager.tool.edit', $tool); + } + return redirect()->route('content-manager.tool.index'); } - public function publish(PublishRequest $request, Tool $tool): RedirectResponse + public function publish(PublishRequest $request, PublishConceptAction $publishAction, Tool $tool): RedirectResponse { - (new UpdateAction())->execute($tool, $request->validated()); + (new UpdateConceptAction())->execute($tool, Auth::user(), $request->validated()); + + $publishAction->execute($tool); (new PublishAction())->execute($tool); @@ -107,4 +139,76 @@ public function publish(PublishRequest $request, Tool $tool): RedirectResponse return redirect()->route('content-manager.tool.index'); } + + public function publishConcept(PublishConceptAction $publishAction, Tool $tool): RedirectResponse + { + $this->authorize('publishConcept', $tool); + + $publishAction->execute($tool); + + flash(trans('message.concept-published', ['entity' => $tool->name]), 'success'); + + return redirect()->route('content-manager.tool.index'); + } + + public function discardConcept(Tool $tool): RedirectResponse + { + $this->authorize('discardConcept', $tool); + + (new DiscardAction())->execute($tool); + + flash(trans('message.concept-discarded', ['entity' => $tool->name]), 'success'); + + return redirect()->route('content-manager.tool.index'); + } + + public function log(Tool $tool, IndexRequest $request): Response + { + $this->authorize('update', $tool); + + $logQuery = ToolLog::forTool($tool)->missingInstitute()->latest(); + $logs = Index::forTable($logQuery, $request); + + return Inertia::render('content-manager/tool/Log', [ + 'tool' => new ToolResource($tool), + 'logs' => ToolLogResource::collection($logs)->additional([ + 'pagination' => new PaginationResource($logs), + ]), + ]); + } + + public function cancelEdit(Tool $tool, ClearAction $clearAction): RedirectResponse + { + $this->authorize('update', $tool); + + $user = Auth::user(); + + $clearAction->execute($tool, $user, null); + + if ((new SafelyDiscardAction())->execute($tool)) { + flash(trans('message.concept-discarded', [ + 'entity' => $tool->name, + ]), 'success'); + } + + return redirect()->route('content-manager.tool.index'); + } + + private function getToolTagResources(): array + { + return [ + 'features' => TagResource::collection(Tag::whereType(TagTypes::FEATURES)->get()), + 'softwareTypes' => TagResource::collection(Tag::whereType(TagTypes::SOFTWARE_TYPES)->get()), + 'devices' => TagResource::collection(Tag::whereType(TagTypes::DEVICES)->get()), + 'standards' => TagResource::collection(Tag::whereType(TagTypes::STANDARDS)->get()), + 'operatingSystems' => TagResource::collection(Tag::whereType(TagTypes::OPERATING_SYSTEMS)->get()), + 'dataProcessingLocations' => TagResource::collection( + Tag::whereType(TagTypes::DATA_PROCESSING_LOCATIONS)->get() + ), + 'certifications' => TagResource::collection(Tag::whereType(TagTypes::CERTIFICATIONS)->get()), + 'workingMethods' => TagResource::collection(Tag::whereType(TagTypes::WORKING_METHODS)->get()), + 'targetGroups' => TagResource::collection(Tag::whereType(TagTypes::TARGET_GROUPS)->get()), + 'complexities' => TagResource::collection(Tag::whereType(TagTypes::COMPLEXITY)->get()), + ]; + } } diff --git a/app/Http/Controllers/ContentPageController.php b/app/Http/Controllers/ContentPageController.php new file mode 100644 index 0000000..163a166 --- /dev/null +++ b/app/Http/Controllers/ContentPageController.php @@ -0,0 +1,94 @@ +authorize('canManage', ContentPage::class); + + $contentPages = QueryBuilder::for(ContentPage::class) + ->allowedFilters(['id', 'title_en', 'title_nl', 'slug']); + + $contentPages = Index::forTable($contentPages, $request); + + return Inertia::render('content-page/Index', [ + 'contentPages' => ContentPageResource::collection($contentPages)->additional([ + 'pagination' => new PaginationResource($contentPages), + ]), + ]); + } + + public function create(): Response + { + $this->authorize('create', ContentPage::class); + + return Inertia::render('content-page/Create'); + } + + public function store(StoreRequest $request, CreateAction $createAction): RedirectResponse + { + $createAction->execute($request->validated()); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('content-page.index'); + } + + public function show(ContentPage $contentPage): Response + { + return Inertia::render('content-page/Show', [ + 'contentPage' => new ContentPageResource($contentPage), + ]); + } + + public function update( + UpdateRequest $request, + ContentPage $contentPage, + UpdateAction $updateAction + ): RedirectResponse { + $updateAction->execute($request->validated(), $contentPage); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('content-page.index'); + } + + public function destroy(ContentPage $contentPage, DeleteAction $deleteAction): RedirectResponse + { + $this->authorize('delete', $contentPage); + + $deleteAction->execute($contentPage); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('content-page.index'); + } + + public function edit(ContentPage $contentPage): Response + { + $this->authorize('update', $contentPage); + + return Inertia::render('content-page/Edit', [ + 'contentPage' => $contentPage, + ]); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index e734806..fd543da 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -9,6 +9,7 @@ use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; +/** @SuppressWarnings(PHPMD.NumberOfChildren) */ class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 7d48f3d..844717b 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -5,7 +5,8 @@ namespace App\Http\Controllers; use App\Helpers\Auth; -use App\Http\Resources\CategoryResource; +use App\Helpers\Locale; +use App\Http\Resources\TagResource; use App\Models\Institute; use Inertia\Inertia; use Inertia\Response; @@ -18,7 +19,11 @@ public function index(): Response $institute = Auth::user()->institute; return Inertia::render('home/Index', [ - 'categories' => CategoryResource::collection($institute->categories), + 'categories' => TagResource::collection($institute->categories()), + 'homepageInformation' => [ + 'title' => Locale::getLocalizedFieldValue($institute, 'homepage_title'), + 'body' => Locale::getLocalizedFieldValue($institute, 'homepage_body'), + ], ]); } } diff --git a/app/Http/Controllers/InformationManager/CustomFieldController.php b/app/Http/Controllers/InformationManager/CustomFieldController.php new file mode 100644 index 0000000..cfe42d4 --- /dev/null +++ b/app/Http/Controllers/InformationManager/CustomFieldController.php @@ -0,0 +1,100 @@ +authorize('viewAll', CustomField::class); + + $customFields = QueryBuilder::for(Auth::user()->institute->customFields()) + ->allowedFilters([ + AllowedFilter::callback('title', function (Builder $query, string $value): void { + $query->searchLocalizedField('title', $value); + }), + AllowedFilter::callback('tab_type', function (Builder $query, string $value): void { + $query->whereLike('tab_type', $value); + }), + ]); + + $customFields = Index::forTable($customFields, $request); + + return Inertia::render('information-manager/custom-field/Index', [ + 'customFields' => CustomFieldResource::collection($customFields)->additional([ + 'pagination' => new PaginationResource($customFields), + ]), + 'tabTypes' => Tabs::asSelect(), + ]); + } + + public function create(): Response + { + $this->authorize('create', CustomField::class); + + return Inertia::render('information-manager/custom-field/Create', [ + 'tabTypes' => Tabs::asSelect(), + ]); + } + + public function store(StoreRequest $request): RedirectResponse + { + (new CreateAction())->execute($request->validated(), Auth::user()->institute); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.custom-field.index'); + } + + public function edit(CustomField $customField): Response + { + $this->authorize('update', $customField); + + return Inertia::render('information-manager/custom-field/Edit', [ + 'customField' => new CustomFieldResource($customField), + 'tabTypes' => Tabs::asSelect(), + ]); + } + + public function update(UpdateRequest $request, CustomField $customField): RedirectResponse + { + (new UpdateAction())->execute($customField, $request->validated()); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.custom-field.index'); + } + + public function destroy(CustomField $customField): RedirectResponse + { + $this->authorize('delete', $customField); + + (new DeleteAction())->execute($customField); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.custom-field.index'); + } +} diff --git a/app/Http/Controllers/InformationManager/HomepageInformationController.php b/app/Http/Controllers/InformationManager/HomepageInformationController.php new file mode 100644 index 0000000..f8ad0d5 --- /dev/null +++ b/app/Http/Controllers/InformationManager/HomepageInformationController.php @@ -0,0 +1,39 @@ +institute; + + $this->authorize('editHomepage', $institute); + + return Inertia::render('information-manager/homepage-information/Edit', [ + 'institute' => new InstituteResource($institute), + ]); + } + + public function update(EditRequest $request): RedirectResponse + { + $institute = Auth::user()->institute; + + (new EditHomepageInformationAction())->execute($request->validated(), $institute); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.homepage-information.edit'); + } +} diff --git a/app/Http/Controllers/InformationManager/NotificationController.php b/app/Http/Controllers/InformationManager/NotificationController.php new file mode 100644 index 0000000..5f1e7a0 --- /dev/null +++ b/app/Http/Controllers/InformationManager/NotificationController.php @@ -0,0 +1,53 @@ +institute; + $tools = Tool::query() + ->select('tools.id', 'tools.name') + ->withCount(['followers' => function (Builder $query) use ($institute): void { + $query->where('institute_id', $institute->id); + }]) + ->orderBy('name') + ->get() + ->mapWithKeys(function (Tool $tool): array { + $name = trans_choice('institute.notifications.attributes.tool_name', $tool->followers_count, [ + 'tool' => $tool->name, + ]); + + return [$tool->id => $name]; + }); + + return Inertia::render('information-manager/notifications/Create', [ + 'tools' => $tools, + 'tool' => $tool, + ]); + } + + public function send(SendNotificationRequest $request, SendNotificationAction $action): RedirectResponse + { + $tool = Tool::find($request->validated('tool')); + + $action->execute($tool, $request->validated()); + + flash(trans('message.update-sent'), 'success'); + + return redirect()->route('information-manager.notifications.create'); + } +} diff --git a/app/Http/Controllers/InformationManager/TagController.php b/app/Http/Controllers/InformationManager/TagController.php new file mode 100644 index 0000000..3cb95b3 --- /dev/null +++ b/app/Http/Controllers/InformationManager/TagController.php @@ -0,0 +1,100 @@ +authorize('manageOur', Tag::class); + + $tags = QueryBuilder::for(Tag::forInstitute(Auth::user()->institute)->where('type', TagTypes::CATEGORIES)) + ->allowedFilters([ + AllowedFilter::callback('name_en', function (Builder $query, $value): void { + $query->where('name->en', 'LIKE', '%' . $value . '%'); + }), + AllowedFilter::callback('name_nl', function (Builder $query, $value): void { + $query->where('name->nl', 'LIKE', '%' . $value . '%'); + }), + ]); + + $tags = Index::forTable($tags, $request); + + return Inertia::render('information-manager/tag/Index', [ + 'tags' => TagResource::collection($tags)->additional([ + 'pagination' => new PaginationResource($tags), + ]), + 'typesSelect' => TagTypes::asSelect(), + ]); + } + + public function create(): Response + { + $this->authorize('createForInstitute', Tag::class); + + return Inertia::render('information-manager/tag/Create', [ + 'tagTypes' => TagTypes::asSelect(), + ]); + } + + public function store(StoreRequest $storeRequest): RedirectResponse + { + (new CreateAction())->execute($storeRequest->validated(), Auth::user()->institute); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.tag.index'); + } + + public function edit(Tag $tag): Response + { + $this->authorize('updateForInstitute', $tag); + + return Inertia::render('information-manager/tag/Edit', [ + 'tag' => new TagResource($tag), + 'tagTypes' => TagTypes::asSelect(), + ]); + } + + public function update(UpdateRequest $request, Tag $tag): RedirectResponse + { + (new UpdateAction())->execute($tag, $request->validated()); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.tag.index'); + } + + public function destroy(Tag $tag): RedirectResponse + { + $this->authorize('deleteForInstitute', $tag); + + (new DeleteAction())->execute($tag); + + flash(trans('message.data-saved'), 'success'); + + return redirect()->route('information-manager.tag.index'); + } +} diff --git a/app/Http/Controllers/InformationManager/ToolController.php b/app/Http/Controllers/InformationManager/ToolController.php index 1acfeb2..70274dd 100644 --- a/app/Http/Controllers/InformationManager/ToolController.php +++ b/app/Http/Controllers/InformationManager/ToolController.php @@ -5,9 +5,17 @@ namespace App\Http\Controllers\InformationManager; use App\Actions\Institute\Tool\AddAction; +use App\Actions\Institute\Tool\Concept\DiscardAction as DiscardConceptAction; +use App\Actions\Institute\Tool\Concept\PublishAction as PublishConceptAction; +use App\Actions\Institute\Tool\Concept\SafelyDiscardAction; +use App\Actions\Institute\Tool\Concept\UpdateAction as UpdateConceptAction; use App\Actions\Institute\Tool\PublishAction; use App\Actions\Institute\Tool\UnpublishAction; -use App\Actions\Institute\Tool\UpdateAction; +use App\Actions\PendingToolEdit\ClearAction; +use App\Actions\PendingToolEdit\CreateAction as CreatePendingEditAction; +use App\Actions\Tool\SubmitRequestForChangeAction; +use App\Enums\InstituteTool\DataClassification; +use App\Enums\InstituteTool\Sort; use App\Enums\InstituteTool\Status; use App\Helpers\Auth; use App\Helpers\Index; @@ -16,17 +24,26 @@ use App\Http\Requests\InstituteTool\PublishRequest; use App\Http\Requests\InstituteTool\StoreRequest; use App\Http\Requests\InstituteTool\UpdateRequest; +use App\Http\Requests\RequestForChangeRequest; +use App\Http\Resources\InformationManager\CustomFieldValueResource; use App\Http\Resources\InformationManager\InstituteToolResource; use App\Http\Resources\InformationManager\ToolIndexResource; -use App\Http\Resources\InstituteResource; use App\Http\Resources\Our\ToolResource; use App\Http\Resources\PaginationResource; +use App\Http\Resources\PendingToolEditResource; +use App\Http\Resources\TagResource; +use App\Http\Resources\ToolLogResource; +use App\Models\InstituteTool; use App\Models\Tool; +use App\Models\ToolLog; use App\QueryBuilder\Filters\InstituteToolStatusFilter; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\RedirectResponse; +use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; use Spatie\QueryBuilder\AllowedFilter; +use Spatie\QueryBuilder\AllowedSort; use Spatie\QueryBuilder\QueryBuilder; class ToolController extends Controller @@ -36,47 +53,75 @@ public function index(IndexRequest $request): Response $this->authorize('manageOur', Tool::class); $currentInstitute = Auth::user()->institute; - $tools = QueryBuilder::for($currentInstitute->toolsWithCategories()) + + $tools = QueryBuilder::for($currentInstitute->tools()) ->allowedFilters([ - 'name', - 'description_short', + AllowedFilter::partial('name'), + AllowedFilter::callback('description_short', function (Builder $query, string $value): void { + $query->searchLocalizedField('description_short', $value); + }), AllowedFilter::scope('category', 'forCategory'), AllowedFilter::callback('status', new InstituteToolStatusFilter()), ]) - ->orderBy('name'); + ->allowedSorts(AllowedSort::field('updated_at', 'pivot_updated_at')) + ->defaultSort('name'); + + $tools = Index::forTable($tools, $request); - $tools = Index::forTable($tools, $request, 10); + $categories = []; + foreach ($currentInstitute->categories() as $category) { + $categories[$category->id] = $category['name']; + } return Inertia::render('information-manager/tools/Index', [ 'tools' => ToolIndexResource::collection($tools)->additional([ 'pagination' => new PaginationResource($tools), ]), - 'categoryOptions' => $currentInstitute->categories->pluck('name', 'id'), - 'statusOptions' => Status::asFilterSelect(), + 'statusOptions' => Status::asFilterSelect(), + 'sortOptions' => Sort::asSelect(), + 'categories' => $categories, ]); } - public function create(Tool $tool): Response + public function create(Tool $tool, Request $request): Response { $this->authorize('addToInstitute', $tool); $institute = Auth::user()->institute; + $defaultStatus = null; + if ($request->get('status') && in_array($request->get('status'), Status::toArray())) { + $defaultStatus = $request->get('status'); + } + return Inertia::render('information-manager/tools/Create', [ - 'categories' => $institute->categories->pluck('name', 'id'), - 'institute' => new InstituteResource($institute), - 'statusOptions' => Status::asSelect(), - 'tool' => new ToolResource($tool), - 'backUrl' => route('other.tool.show', $tool), + 'categories' => TagResource::collection($institute->categories()), + 'statusOptions' => Status::asSelect(), + 'dataClassifications' => DataClassification::asSelect(), + 'tool' => new ToolResource($tool), + 'customFields' => CustomFieldValueResource::collection($institute->customFields), + 'backUrl' => route('other.tool.show', $tool), 'alternativeTools' => ToolResource::collection( + InstituteTool::forInstitute($institute) + ->whereIn('status', [Status::ALLOWED_UNDER_CONDITIONS, Status::ALLOWED]) + ->get() + ->pluck('tool') + ), + 'defaultStatus' => $defaultStatus, ]); } - public function store(StoreRequest $request, Tool $tool): RedirectResponse + public function store(StoreRequest $request, Tool $tool, bool $continue = false): RedirectResponse { - (new AddAction())->execute($tool, Auth::user()->institute, $request->validated()); + $user = Auth::user(); + + (new AddAction())->execute($tool, $user->institute, $request->validated(), $user); flash(trans('message.data-saved'), 'success'); + if ($continue) { + return redirect()->route('information-manager.tool.edit', $tool); + } + return redirect()->route('information-manager.tool.index'); } @@ -84,50 +129,149 @@ public function edit(Tool $tool): Response { $this->authorize('updateForInstitute', $tool); - $institute = Auth::user()->institute; + $user = Auth::user(); + $institute = $user->institute; + + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->firstOrFail(); + $concept = $instituteTool->getOrCreateConceptVersion(); + + $pendingEdit = $tool->getCurrentPendingEdit(ignoreUser: $user, forInstitute: $institute); + + (new ClearAction())->execute($tool, $user, $institute); + (new CreatePendingEditAction())->execute($tool, $user, $institute); return Inertia::render('information-manager/tools/Edit', [ - 'categories' => $institute->categories->pluck('name', 'id'), - 'institute' => new InstituteResource($institute), - 'statusOptions' => Status::asSelect(), - 'tool' => new ToolResource($tool), - 'instituteTool' => new InstituteToolResource($institute->tools()->find($tool)->pivot), - 'backUrl' => route('information-manager.tool.index'), + 'categories' => TagResource::collection($institute->categories()), + 'statusOptions' => Status::asSelect(), + 'dataClassifications' => DataClassification::asSelect(), + 'instituteTool' => new InstituteToolResource($concept), + 'tool' => new ToolResource($tool), + 'backUrl' => route('information-manager.tool.index'), + 'pendingEdit' => $pendingEdit + ? new PendingToolEditResource($pendingEdit) : null, 'alternativeTools' => ToolResource::collection( + InstituteTool::forInstitute($institute) + ->whereIn('status', [Status::ALLOWED_UNDER_CONDITIONS, Status::ALLOWED]) + ->get() + ->pluck('tool') + ), ]); } - public function update(UpdateRequest $request, Tool $tool): RedirectResponse + public function update(UpdateRequest $request, Tool $tool, bool $continue = false): RedirectResponse { - (new UpdateAction())->execute($tool, Auth::user()->institute, $request->validated()); + $user = Auth::user(); + (new UpdateConceptAction())->execute($tool, $user, $request->validated()); flash(trans('message.data-saved'), 'success'); + if ($continue) { + return redirect()->route('information-manager.tool.edit', $tool); + } + return redirect()->route('information-manager.tool.index'); } - public function publish(PublishRequest $request, Tool $tool): RedirectResponse + public function publish(PublishRequest $request, PublishConceptAction $publishAction, Tool $tool): RedirectResponse { - $institute = Auth::user()->institute; + $user = Auth::user(); + $institute = $user->institute; + + (new UpdateConceptAction())->execute($tool, $user, $request->validated()); - (new UpdateAction())->execute($tool, $institute, $request->validated()); + $publishAction->execute($tool, $institute); (new PublishAction())->execute($tool, $institute); - flash(trans('message.entity-published', ['entity' => $tool->name]), 'success'); + flash(trans('message.entity-published', [ + 'entity' => $tool->name, + ]), 'success'); return redirect()->route('information-manager.tool.index'); } public function unpublish(PublishRequest $request, Tool $tool): RedirectResponse { - $institute = Auth::user()->institute; + $user = Auth::user(); + $institute = $user->institute; - (new UpdateAction())->execute($tool, $institute, $request->validated()); + (new UpdateConceptAction())->execute($tool, $user, $request->validated()); (new UnpublishAction())->execute($tool, $institute); - flash(trans('message.entity-unpublished', ['entity' => $tool->name]), 'success'); + flash(trans('message.entity-unpublished', [ + 'entity' => $tool->name, + ]), 'success'); + + return redirect()->route('information-manager.tool.index'); + } + + public function publishConcept(PublishConceptAction $publishAction, Tool $tool): RedirectResponse + { + $this->authorize('publishConceptForInstitute', $tool); + + $publishAction->execute($tool, Auth::user()->institute); + + flash(trans('message.concept-published', [ + 'entity' => $tool->name, + ]), 'success'); + + return redirect()->route('information-manager.tool.index'); + } + + public function discardConcept(Tool $tool): RedirectResponse + { + $this->authorize('discardConceptForInstitute', $tool); + + (new DiscardConceptAction())->execute($tool, Auth::user()->institute); + + flash(trans('message.concept-discarded', [ + 'entity' => $tool->name, + ]), 'success'); + + return redirect()->route('information-manager.tool.index'); + } + + public function log(Tool $tool, IndexRequest $request): Response + { + $this->authorize('updateForInstitute', $tool); + + $logQuery = ToolLog::forTool($tool)->forInstitute(Auth::user()->institute)->latest(); + $logs = Index::forTable($logQuery, $request); + + return Inertia::render('information-manager/tools/Log', [ + 'tool' => new ToolResource($tool), + 'logs' => ToolLogResource::collection($logs)->additional([ + 'pagination' => new PaginationResource($logs), + ]), + ]); + } + + public function cancelEdit(Tool $tool, ClearAction $clearAction): RedirectResponse + { + $this->authorize('updateForInstitute', $tool); + + $user = Auth::user(); + + $clearAction->execute($tool, $user, $user->institute); + + if ((new SafelyDiscardAction())->execute($tool, $user->institute)) { + flash(trans('message.concept-discarded', [ + 'entity' => $tool->name, + ]), 'success'); + } return redirect()->route('information-manager.tool.index'); } + + public function requestForChange( + RequestForChangeRequest $request, + Tool $tool, + SubmitRequestForChangeAction $action + ): RedirectResponse { + $action->execute($tool, $request->user(), $request->request_for_change); + + flash(trans('message.request_for_change_sent'), 'success'); + + return redirect()->back(); + } } diff --git a/app/Http/Controllers/LocaleController.php b/app/Http/Controllers/LocaleController.php new file mode 100644 index 0000000..2548234 --- /dev/null +++ b/app/Http/Controllers/LocaleController.php @@ -0,0 +1,31 @@ +previous(); + + if (empty($originalUrl) || !Locale::getActive()->pluck('code')->contains($locale)) { + return LoginRedirect::doRedirect(); + } + + $user = Auth::user(); + $user->language = $locale; + $user->update(); + + $localizedUrl = LaravelLocalization::localizeUrl($originalUrl, $locale); + + return redirect($localizedUrl); + } +} diff --git a/app/Http/Controllers/Other/ToolController.php b/app/Http/Controllers/Other/ToolController.php index ec54043..1b122c6 100644 --- a/app/Http/Controllers/Other/ToolController.php +++ b/app/Http/Controllers/Other/ToolController.php @@ -6,57 +6,32 @@ use App\Http\Controllers\Controller; use App\Http\Resources\ExperienceResource; -use App\Http\Resources\FeatureResource; use App\Http\Resources\InstituteResource; -use App\Http\Resources\Other\ToolIndexResource; use App\Http\Resources\Other\ToolResource; -use App\Models\Feature; +use App\Models\Institute; use App\Models\Tool; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; class ToolController extends Controller { - public function index(Request $request): Response - { - $this->authorize('viewAllOther', Tool::class); - - $filter = $request->get('filter'); - $searchTerm = $request->get('search'); - - $tools = Tool::forOtherThan($request->user()->institute) - ->with('experiences') - ->when($filter['features'] ?? false, fn (Builder $query) => $query->forFeatures($filter['features'])) - ->when($searchTerm, fn (Builder $query) => $query->search($searchTerm)) - ->orderBy('name') - ->get(); - - return Inertia::render('other/tool/Index', [ - 'tools' => ToolIndexResource::collection($tools), - - 'sidebar' => [ - 'features' => FeatureResource::collection(Feature::all()->sortBy('name')), - 'categories' => null, - ], - ]); - } - - public function show(Tool $tool): Response + public function show(Request $request, Tool $tool): Response { $this->authorize('viewOther', $tool); - $tool->load(['features', 'institutes']); + $tool->load(['institutes']); return Inertia::render('other/tool/Show', [ 'tool' => new ToolResource($tool), 'experiences' => ExperienceResource::collection($tool->experiences()->latest()->get()), 'institutes' => InstituteResource::collection( - $tool->institutesThatUseTool()->orderBy('full_name')->get() + Institute::usingTool($tool)->orderBy('short_name')->get() ), - 'backUrl' => route('other.tool.index'), + 'following' => $request->user()->isFollowingTool($tool), + + 'backUrl' => route('tool.index'), ]); } } diff --git a/app/Http/Controllers/Our/ToolController.php b/app/Http/Controllers/Our/ToolController.php index 8118659..ada7158 100644 --- a/app/Http/Controllers/Our/ToolController.php +++ b/app/Http/Controllers/Our/ToolController.php @@ -4,63 +4,34 @@ namespace App\Http\Controllers\Our; -use App\Enums\InstituteTool\Status; use App\Http\Controllers\Controller; -use App\Http\Resources\CategoryResource; use App\Http\Resources\ExperienceResource; -use App\Http\Resources\FeatureResource; -use App\Http\Resources\Our\ToolIndexResource; +use App\Http\Resources\InstituteResource; use App\Http\Resources\Our\ToolResource; -use App\Models\Feature; +use App\Models\Institute; use App\Models\Tool; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; class ToolController extends Controller { - public function index(Request $request): Response - { - $this->authorize('viewAllOur', Tool::class); - - $institute = $request->user()->institute; - $filter = $request->get('filter'); - $searchTerm = $request->get('search'); - - $tools = Tool::forOur($institute) - ->with('experiences') - ->when($filter['features'] ?? false, fn (Builder $query) => $query->forFeatures($filter['features'])) - ->when($filter['categories'] ?? false, fn (Builder $query) => $query->forCategories($filter['categories'])) - ->when($searchTerm, fn (Builder $query) => $query->search($searchTerm)) - ->orderByArray('status', Status::customOrder()) - ->orderBy('name') - ->get(); - - return Inertia::render('our/tool/Index', [ - 'tools' => ToolIndexResource::collection($tools), - - 'sidebar' => [ - 'features' => FeatureResource::collection(Feature::all()->sortBy('name')), - 'categories' => CategoryResource::collection($institute->categories), - ], - ]); - } - public function show(Request $request, Tool $tool): Response { $this->authorize('viewOur', $tool); - $tool->load('features'); - return Inertia::render('our/tool/Show', [ 'permissions' => [ 'get-support' => $request->user()->can('getSupport', [Tool::class, $tool]), ], 'tool' => new ToolResource($tool), 'experiences' => ExperienceResource::collection($tool->experiences()->latest()->get()), + 'institutes' => InstituteResource::collection( + Institute::usingTool($tool)->orderBy('short_name')->get() + ), + 'following' => $request->user()->isFollowingTool($tool), - 'backUrl' => route('our.tool.index'), + 'backUrl' => route('tool.index'), ]); } } diff --git a/app/Http/Controllers/ToolController.php b/app/Http/Controllers/ToolController.php new file mode 100644 index 0000000..8a5f156 --- /dev/null +++ b/app/Http/Controllers/ToolController.php @@ -0,0 +1,127 @@ +authorize('viewAllWithinInstitute', Tool::class); + + $user = $request->user(); + $institute = $user->institute; + $searchTerm = $request->get('search'); + $filterableTagTypes = $this->getFilterableTagTypes($user); + $tagIds = $tags ? $this->getTagIdsToFilter($tags, $filterableTagTypes, $institute) : []; + + $toolQuery = Tool::getToolsQueryForOverview($institute, $tagIds, $searchTerm ?? ''); + $totalCount = $toolQuery->count(); + $toolCountWithoutFilterOrSearch = Tool::getToolsQueryForOverview($institute, [], '')->count(); + + $tools = Index::forTable($toolQuery, $request); + + return Inertia::render('tool/Index', [ + 'tools' => ToolIndexResource::collection($tools)->additional([ + 'pagination' => new PaginationResource($tools), + ]), + 'totalToolCount' => $totalCount, + 'toolCountWithoutFilterOrSearch' => $toolCountWithoutFilterOrSearch, + 'selectedTagFilters' => $this->getGroupedTagList( + $filterableTagTypes, + Tag::whereIn('id', $tagIds) + ), + + 'sidebar' => [ + 'tags' => $this->getGroupedTagList($filterableTagTypes, Tag::accessibleForInstitute($institute)), + ], + ]); + } + + public function changeFollowingStatus( + Request $request, + Tool $tool, + ChangeFollowingStatusAction $action + ): RedirectResponse { + $user = $request->user(); + + $action->execute($tool, $user); + + $following = $user->fresh()->isFollowingTool($tool); + + flash(trans($following ? 'message.following-tool' : 'message.stopped-following-tool'), 'success'); + + return redirect()->back(); + } + + private function getGroupedTagList(array $tagTypes, Builder $tagQuery): array + { + $groupedTags = []; + foreach ($tagTypes as $tagType) { + $tagsForType = $tagQuery->clone()->where('type', $tagType)->get(); + + if ($tagsForType->isEmpty()) { + continue; + } + + $groupedTags[$tagType] = TagResource::collection($tagsForType); + } + + return $groupedTags; + } + + private function getTagIdsToFilter(string $tagsFromUrl, array $tagTypes, Institute $institute): array + { + $locale = LaravelLocalization::getCurrentLocale(); + $tagIds = []; + + foreach (explode('/', $tagsFromUrl) as $tagTypePart) { + if (!str_contains($tagTypePart, ':')) { + continue; + } + + [$tagType, $tagSlugsCsv] = explode(':', $tagTypePart); + if (!in_array($tagType, $tagTypes)) { + continue; + } + + $tagSlugs = explode(',', $tagSlugsCsv); + + $tagIds = [ + ...$tagIds, + ...Tag::select('id') + ->whereSlugIn($tagSlugs, $locale) + ->where('type', $tagType) + ->accessibleForInstitute($institute) + ->pluck('id') + ->toArray(), + ]; + } + + return $tagIds; + } + + private function getFilterableTagTypes(User $user): array + { + return array_filter(TagTypes::toArray(), fn ($tagType) => $user->can('filter-by-tag-type', $tagType)); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 5b109dd..fb4f0fb 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -13,11 +13,11 @@ class Kernel extends HttpKernel * * These middleware are run during every request to your application. * - * @var array + * @var array */ protected $middleware = [ \App\Http\Middleware\TrustProxies::class, - \Fruitcake\Cors\HandleCors::class, + \Illuminate\Http\Middleware\HandleCors::class, \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, @@ -27,7 +27,7 @@ class Kernel extends HttpKernel /** * The application's route middleware groups. * - * @var array + * @var array> */ protected $middlewareGroups = [ 'web' => [ @@ -52,7 +52,7 @@ class Kernel extends HttpKernel * * These middleware may be assigned to groups or used individually. * - * @var array + * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php index 8e13f24..4e80e5a 100644 --- a/app/Http/Middleware/EncryptCookies.php +++ b/app/Http/Middleware/EncryptCookies.php @@ -11,7 +11,7 @@ class EncryptCookies extends Middleware /** * The names of the cookies that should not be encrypted. * - * @var array + * @var array */ protected $except = [ // diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 3df7fc4..a4f6889 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -6,12 +6,14 @@ use App\Enums\InstituteTool\Status; use App\Helpers\Auth; +use App\Http\Resources\LocaleResource; use App\Http\Resources\UserResource; use Illuminate\Http\Request; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Session; use Inertia\Middleware; +use Modules\Way2Translate\Models\Locale; class HandleInertiaRequests extends Middleware { @@ -52,8 +54,14 @@ public function share(Request $request): array { return array_merge(parent::share($request), [ 'app' => [ - 'name' => config('app.name'), - 'isDev' => App::environment(config('constants.environment.development')), + 'name' => config('app.name'), + 'isDev' => App::environment(config('constants.environment.development')), + 'locale' => config('app.locale'), + 'activeLocales' => function () { + $locales = Locale::getActive()->sortBy('native')->values(); + + return LocaleResource::collection($locales); + }, ], 'flashNotifications' => function () { return Session::get('flash_notification'); @@ -65,12 +73,15 @@ public function share(Request $request): array return new UserResource(Auth::user()); }, + 'isImpersonating' => Auth::user()?->isImpersonating(), 'currentRouteName' => function () { return Route::currentRouteName(); }, 'instituteTool' => [ 'legendStatuses' => Status::forLegend(), ], + 'initialFilter' => $request->get('filter'), + 'initialSort' => $request->get('sort'), ]); } } diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php index 9e1565e..1184e71 100644 --- a/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -11,7 +11,7 @@ class PreventRequestsDuringMaintenance extends Middleware /** * The URIs that should be reachable while maintenance mode is enabled. * - * @var array + * @var array */ protected $except = [ // diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php index ecbaa83..3bfc674 100644 --- a/app/Http/Middleware/TrimStrings.php +++ b/app/Http/Middleware/TrimStrings.php @@ -11,7 +11,7 @@ class TrimStrings extends Middleware /** * The names of the attributes that should not be trimmed. * - * @var array + * @var array */ protected $except = [ 'password', diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index de7d9be..4f55a68 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -4,7 +4,7 @@ namespace App\Http\Middleware; -use Fideloper\Proxy\TrustProxies as Middleware; +use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware @@ -12,7 +12,7 @@ class TrustProxies extends Middleware /** * The trusted proxies for this application. * - * @var array|string|null + * @var array|string|null */ protected $proxies; @@ -21,5 +21,10 @@ class TrustProxies extends Middleware * * @var int */ - protected $headers = Request::HEADER_X_FORWARDED_ALL; + 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/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index de4373e..509c9be 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -11,7 +11,7 @@ class VerifyCsrfToken extends Middleware /** * The URIs that should be excluded from CSRF verification. * - * @var array + * @var array */ protected $except = [ // diff --git a/app/Http/Requests/ContentPage/BaseRequest.php b/app/Http/Requests/ContentPage/BaseRequest.php new file mode 100644 index 0000000..db15559 --- /dev/null +++ b/app/Http/Requests/ContentPage/BaseRequest.php @@ -0,0 +1,36 @@ + [ + 'required', + 'db_string', + Rule::unique('content_pages')->ignore($this->route('content_page')), + ], + 'title_en' => ['required', 'db_string'], + 'title_nl' => ['nullable', 'db_string'], + 'body_en' => ['required', 'db_text'], + 'body_nl' => ['nullable', 'db_text'], + ]; + } + + protected function prepareForValidation(): void + { + $this->merge([ + 'slug' => Str::slug($this->slug), + ]); + } +} diff --git a/app/Http/Requests/ContentPage/StoreRequest.php b/app/Http/Requests/ContentPage/StoreRequest.php new file mode 100644 index 0000000..41217d8 --- /dev/null +++ b/app/Http/Requests/ContentPage/StoreRequest.php @@ -0,0 +1,15 @@ +user()->can('create', ContentPage::class); + } +} diff --git a/app/Http/Requests/ContentPage/UpdateRequest.php b/app/Http/Requests/ContentPage/UpdateRequest.php new file mode 100644 index 0000000..b6d84b2 --- /dev/null +++ b/app/Http/Requests/ContentPage/UpdateRequest.php @@ -0,0 +1,13 @@ +user()->can('update', $this->route('content_page')); + } +} diff --git a/app/Http/Requests/CustomField/BaseRequest.php b/app/Http/Requests/CustomField/BaseRequest.php new file mode 100644 index 0000000..5d31eb3 --- /dev/null +++ b/app/Http/Requests/CustomField/BaseRequest.php @@ -0,0 +1,46 @@ + ['required', 'db_string', $this->getUniqueRule('title_en')], + 'title_nl' => ['nullable', 'db_string', $this->getUniqueRule('title_nl')], + 'sortkey' => ['nullable', 'numeric', 'between:1,20'], + 'tab_type' => ['required', Rule::in(Tabs::toArray())], + ]; + } + + public function attributes(): array + { + return trans('custom-field.attributes'); + } + + private function getUniqueRule(string $attribute): Unique + { + $instituteId = $this->user()->institute->id; + + $rule = Rule::unique('custom_fields', $attribute)->where('institute_id', $instituteId); + + /** @var CustomField $customField */ + $customField = $this->route('custom_field'); + if ($customField !== null) { + $rule = $rule->ignoreModel($customField); + } + + return $rule; + } +} diff --git a/app/Http/Requests/CustomField/StoreRequest.php b/app/Http/Requests/CustomField/StoreRequest.php new file mode 100644 index 0000000..df4d5ef --- /dev/null +++ b/app/Http/Requests/CustomField/StoreRequest.php @@ -0,0 +1,15 @@ +user()->can('create', CustomField::class); + } +} diff --git a/app/Http/Requests/CustomField/UpdateRequest.php b/app/Http/Requests/CustomField/UpdateRequest.php new file mode 100644 index 0000000..cd0ae76 --- /dev/null +++ b/app/Http/Requests/CustomField/UpdateRequest.php @@ -0,0 +1,13 @@ +user()->can('update', $this->route('custom_field')); + } +} diff --git a/app/Http/Requests/Experience/BaseRequest.php b/app/Http/Requests/Experience/BaseRequest.php index ff98319..25c3369 100644 --- a/app/Http/Requests/Experience/BaseRequest.php +++ b/app/Http/Requests/Experience/BaseRequest.php @@ -5,7 +5,6 @@ namespace App\Http\Requests\Experience; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Validation\Rule; abstract class BaseRequest extends FormRequest { @@ -14,8 +13,7 @@ abstract public function authorize(): bool; public function rules(): array { return [ - 'rating' => ['required', Rule::in(config('validation.experience.rating.in'))], - 'title' => ['nullable', 'db_string'], + 'title' => ['db_string', 'required'], 'message' => ['nullable', 'string', 'max:' . config('validation.experience.message.max')], ]; } diff --git a/app/Http/Requests/HomepageInformation/BaseRequest.php b/app/Http/Requests/HomepageInformation/BaseRequest.php new file mode 100644 index 0000000..ce80be7 --- /dev/null +++ b/app/Http/Requests/HomepageInformation/BaseRequest.php @@ -0,0 +1,22 @@ + ['nullable'], + 'homepage_body_en' => ['nullable', 'db_text'], + 'homepage_title_nl' => ['nullable'], + 'homepage_body_nl' => ['nullable', 'db_text'], + ]; + } +} diff --git a/app/Http/Requests/HomepageInformation/EditRequest.php b/app/Http/Requests/HomepageInformation/EditRequest.php new file mode 100644 index 0000000..6ba5aa8 --- /dev/null +++ b/app/Http/Requests/HomepageInformation/EditRequest.php @@ -0,0 +1,15 @@ +user()->can('editHomepage', Institute::class); + } +} diff --git a/app/Http/Requests/InstituteTag/BaseRequest.php b/app/Http/Requests/InstituteTag/BaseRequest.php new file mode 100644 index 0000000..71649de --- /dev/null +++ b/app/Http/Requests/InstituteTag/BaseRequest.php @@ -0,0 +1,42 @@ + ['nullable'], + 'description.nl' => ['nullable'], + 'name.en' => [ + 'required', + 'db_string', + new UniqueTagRule('en', $this->route('tag'), $user->institute), + ], + 'name.nl' => [ + 'nullable', + 'db_string', + new UniqueTagRule('nl', $this->route('tag'), $user->institute), + ], + 'type' => ['required', Rule::in(TagTypes::CATEGORIES)], + ]; + } + + public function attributes() + { + return trans('tag.attributes'); + } +} diff --git a/app/Http/Requests/InstituteTag/StoreRequest.php b/app/Http/Requests/InstituteTag/StoreRequest.php new file mode 100644 index 0000000..f7c4c5e --- /dev/null +++ b/app/Http/Requests/InstituteTag/StoreRequest.php @@ -0,0 +1,15 @@ +user()->can('createForInstitute', Tag::class); + } +} diff --git a/app/Http/Requests/InstituteTag/UpdateRequest.php b/app/Http/Requests/InstituteTag/UpdateRequest.php new file mode 100644 index 0000000..1208e11 --- /dev/null +++ b/app/Http/Requests/InstituteTag/UpdateRequest.php @@ -0,0 +1,13 @@ +user()->can('updateForInstitute', $this->route('tag')); + } +} diff --git a/app/Http/Requests/InstituteTool/BaseRequest.php b/app/Http/Requests/InstituteTool/BaseRequest.php index 46370e1..c3d2305 100644 --- a/app/Http/Requests/InstituteTool/BaseRequest.php +++ b/app/Http/Requests/InstituteTool/BaseRequest.php @@ -4,7 +4,10 @@ namespace App\Http\Requests\InstituteTool; +use App\Enums\InstituteTool\DataClassification; use App\Enums\InstituteTool\Status; +use App\Enums\Tags\TagTypes; +use App\Rules\ExistsInTags; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; @@ -14,40 +17,72 @@ abstract public function authorize(): bool; public function rules(): array { + $institute = $this->user()->institute; + return [ - 'categories' => ['nullable', 'array'], - 'categories.*' => [Rule::in($this->user()->institute->categories->pluck('id'))], + 'alternative_tools_ids' => ['nullable', 'array', 'max:4'], + 'alternative_tools_ids.*' => [ + Rule::in($institute->tools()->get()->pluck('id')), + ], - 'description_1' => ['nullable', 'string'], - 'description_1_image_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], + 'status' => ['nullable', Rule::in(Status::toArray())], + 'categories' => ['nullable', 'array'], + 'categories.*' => [new ExistsInTags(TagTypes::CATEGORIES, $institute)], + 'conditions_en' => ['nullable', 'db_text'], + 'conditions_nl' => ['nullable', 'db_text'], - 'description_2' => ['nullable', 'string'], - 'description_2_image_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], + 'links_with_other_tools_en' => ['nullable', 'db_text'], + 'links_with_other_tools_nl' => ['nullable', 'db_text'], + 'sla_url' => ['nullable', 'uri', 'db_string'], - 'extra_information_title' => ['nullable', 'string'], - 'extra_information' => ['nullable', 'string'], + 'privacy_contact' => ['nullable', 'db_string'], + 'privacy_evaluation_url' => ['nullable', 'uri', 'db_string'], + 'security_evaluation_url' => ['nullable', 'uri', 'db_string'], + 'data_classification' => ['nullable', Rule::in(DataClassification::toArray())], - 'support_title_1' => ['nullable', 'db_string'], - 'support_email_1' => ['nullable', 'email', 'db_string'], - 'support_title_2' => ['nullable', 'db_string'], - 'support_email_2' => ['nullable', 'email', 'db_string'], + 'how_to_login_en' => ['nullable', 'db_string'], + 'how_to_login_nl' => ['nullable', 'db_string'], + 'availability_en' => ['nullable', 'db_string'], + 'availability_nl' => ['nullable', 'db_string'], + 'licensing_en' => ['nullable', 'db_string'], + 'licensing_nl' => ['nullable', 'db_string'], + 'request_access_en' => ['nullable', 'db_text'], + 'request_access_nl' => ['nullable', 'db_text'], + 'instructions_en' => ['nullable', 'db_text'], + 'instructions_nl' => ['nullable', 'db_text'], + 'instructions_manual_1_url' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_2_url' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_3_url' => ['nullable', 'uri', 'db_string'], - 'manual_title_1' => ['nullable', 'db_string'], - 'manual_url_1' => ['nullable', 'url', 'db_string'], - 'manual_title_2' => ['nullable', 'db_string'], - 'manual_url_2' => ['nullable', 'url', 'db_string'], + 'faq_en' => ['nullable', 'db_text'], + 'faq_nl' => ['nullable', 'db_text'], + 'examples_of_usage_en' => ['nullable', 'db_text'], + 'examples_of_usage_nl' => ['nullable', 'db_text'], + 'additional_info_heading_en' => ['nullable', 'db_string'], + 'additional_info_heading_nl' => ['nullable', 'db_string'], + 'additional_info_text_en' => ['nullable', 'db_text'], + 'additional_info_text_nl' => ['nullable', 'db_text'], - 'video_title_1' => ['nullable', 'db_string'], - 'video_url_1' => ['nullable', 'url', 'db_string'], - 'video_title_2' => ['nullable', 'db_string'], - 'video_url_2' => ['nullable', 'url', 'db_string'], + 'custom_fields' => ['nullable', 'array'], + 'custom_fields.*.id' => ['numeric'], + 'custom_fields.*.value_nl' => ['nullable', 'string'], + 'custom_fields.*.value_en' => ['nullable', 'string', 'required_with:custom_fields.*.value_nl'], - 'status' => ['nullable', Rule::in(Status::toArray())], + 'why_unfit_nl' => ['nullable', 'db_text'], + 'why_unfit_en' => ['nullable', 'db_text'], ]; } + protected function prepareForValidation(): void + { + $this->merge([ + 'why_unfit_nl' => $this->status === Status::DISALLOWED ? $this->why_unfit_nl : null, + 'why_unfit_en' => $this->status === Status::DISALLOWED ? $this->why_unfit_en : null, + ]); + } + public function attributes(): array { - return trans('tool.attributes'); + return trans('institute.tool.attributes'); } } diff --git a/app/Http/Requests/InstituteTool/UpdateRequest.php b/app/Http/Requests/InstituteTool/UpdateRequest.php index e619fd9..1b194dd 100644 --- a/app/Http/Requests/InstituteTool/UpdateRequest.php +++ b/app/Http/Requests/InstituteTool/UpdateRequest.php @@ -5,6 +5,7 @@ namespace App\Http\Requests\InstituteTool; use App\Enums\InstituteTool\Status; +use App\Models\Tool; use Illuminate\Validation\Rule; class UpdateRequest extends BaseRequest @@ -18,7 +19,10 @@ public function rules(): array { $rules = parent::rules(); - if ($this->route('tool')->isPublishedForInstitute($this->user()->institute)) { + /** @var Tool $tool */ + $tool = $this->route('tool'); + + if ($tool->isPublishedForInstitute($this->user()->institute)) { $rules['status'] = ['required', Rule::in(Status::toArray())]; } diff --git a/app/Http/Requests/RequestForChangeRequest.php b/app/Http/Requests/RequestForChangeRequest.php new file mode 100644 index 0000000..6b9126b --- /dev/null +++ b/app/Http/Requests/RequestForChangeRequest.php @@ -0,0 +1,22 @@ +user()->can('submitRequestForChange', $this->route('tool')); + } + + public function rules(): array + { + return [ + 'request_for_change' => ['required', 'string'], + ]; + } +} diff --git a/app/Http/Requests/Tag/BaseRequest.php b/app/Http/Requests/Tag/BaseRequest.php new file mode 100644 index 0000000..d576c62 --- /dev/null +++ b/app/Http/Requests/Tag/BaseRequest.php @@ -0,0 +1,29 @@ + ['required', 'db_string', new UniqueTagRule('en', $this->route('tag'))], + 'name.nl' => ['nullable', 'db_string', new UniqueTagRule('nl', $this->route('tag'))], + 'type' => ['required', Rule::in(TagTypes::getTagsTypesToArrayExcept([TagTypes::CATEGORIES]))], + ]; + } + + public function attributes() + { + return trans('tag.attributes'); + } +} diff --git a/app/Http/Requests/Tag/StoreRequest.php b/app/Http/Requests/Tag/StoreRequest.php new file mode 100644 index 0000000..742e672 --- /dev/null +++ b/app/Http/Requests/Tag/StoreRequest.php @@ -0,0 +1,15 @@ +user()->can('create', Tag::class); + } +} diff --git a/app/Http/Requests/Tag/UpdateRequest.php b/app/Http/Requests/Tag/UpdateRequest.php new file mode 100644 index 0000000..54a39b0 --- /dev/null +++ b/app/Http/Requests/Tag/UpdateRequest.php @@ -0,0 +1,13 @@ +user()->can('update', $this->route('tag')); + } +} diff --git a/app/Http/Requests/Tool/BaseRequest.php b/app/Http/Requests/Tool/BaseRequest.php index d002bc6..53fb4f1 100644 --- a/app/Http/Requests/Tool/BaseRequest.php +++ b/app/Http/Requests/Tool/BaseRequest.php @@ -4,10 +4,9 @@ namespace App\Http\Requests\Tool; -use App\Enums\Tool\AuthenticationMethod; -use App\Enums\Tool\StoredData; -use App\Enums\Tool\SupportedStandard; -use App\Models\Feature; +use App\Enums\Tags\TagTypes; +use App\Helpers\Country; +use App\Rules\ExistsInTags; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; @@ -18,35 +17,71 @@ abstract public function authorize(): bool; public function rules(): array { return [ - 'name' => ['required', Rule::unique('tools'), 'db_string'], - 'description_short' => ['required', 'string'], - 'image_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], + 'name' => ['required', Rule::unique('tools'), 'db_string'], - 'features' => ['nullable', 'array'], - 'features.*' => [Rule::in(Feature::pluck('id'))], + 'supplier' => ['nullable', 'db_string'], + 'supplier_url' => ['nullable', 'uri', 'db_string'], + 'description_short_en' => ['required', 'db_text'], + 'description_short_nl' => ['required', 'db_text'], + 'features' => ['nullable', 'array'], + 'features.*' => [new ExistsInTags(TagTypes::FEATURES)], + 'addons_en' => ['nullable', 'db_text'], + 'addons_nl' => ['nullable', 'db_text'], + 'logo_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], + 'image_1_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], + 'image_2_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], - 'supported_standards' => ['nullable', 'array'], - 'supported_standards.*' => [Rule::in(SupportedStandard::toArray())], - 'additional_standards' => ['nullable', 'db_string'], + 'software_types' => ['nullable', 'array'], + 'software_types.*' => [new ExistsInTags(TagTypes::SOFTWARE_TYPES)], + 'devices' => ['nullable', 'array'], + 'devices.*' => [new ExistsInTags(TagTypes::DEVICES)], + 'system_requirements_en' => ['nullable', 'db_string'], + 'system_requirements_nl' => ['nullable', 'db_string'], + 'standards' => ['nullable', 'array'], + 'standards.*' => [new ExistsInTags(TagTypes::STANDARDS)], + 'operating_systems' => ['nullable', 'array'], + 'operating_systems.*' => [new ExistsInTags(TagTypes::OPERATING_SYSTEMS)], - 'authentication_methods' => ['nullable', 'array'], - 'authentication_methods.*' => [Rule::in(AuthenticationMethod::toArray())], + 'supplier_country' => ['nullable', 'string', Rule::in(Country::getCodes())], + 'personal_data_en' => ['nullable', 'db_text'], + 'personal_data_nl' => ['nullable', 'db_text'], + 'data_processing_locations' => ['nullable', 'array'], + 'data_processing_locations.*' => [new ExistsInTags(TagTypes::DATA_PROCESSING_LOCATIONS)], + 'privacy_policy_url' => ['nullable', 'uri', 'db_string'], + 'model_processor_agreement_url' => ['nullable', 'uri', 'db_string'], + 'privacy_analysis' => ['nullable', 'db_text'], + 'supplier_agrees_with_surf_standards' => ['boolean'], + 'certifications' => ['nullable', 'array'], + 'certifications.*' => [new ExistsInTags(TagTypes::CERTIFICATIONS)], + 'dtia_by_external_url' => ['nullable', 'uri', 'db_string'], + 'dpia_by_external_url' => ['nullable', 'uri', 'db_string'], + 'jurisdiction' => ['nullable', 'db_string'], - 'stored_data' => ['nullable', 'array'], - 'stored_data.*' => [Rule::in(StoredData::toArray())], - 'other_stored_data' => ['nullable', 'string'], + 'instructions_manual_1_url_en' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_1_url_nl' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_2_url_en' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_2_url_nl' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_3_url_en' => ['nullable', 'uri', 'db_string'], + 'instructions_manual_3_url_nl' => ['nullable', 'uri', 'db_string'], + 'support_for_teachers_en' => ['nullable', 'db_text'], + 'support_for_teachers_nl' => ['nullable', 'db_text'], + 'availability_surf' => ['nullable', 'db_text'], + 'accessibility_facilities_en' => ['nullable', 'db_text'], + 'accessibility_facilities_nl' => ['nullable', 'db_text'], - 'european_data_storage' => ['boolean'], - 'surf_standards_framework_agreed' => ['boolean'], - 'has_processing_agreement' => ['boolean'], + 'description_long_en' => ['nullable', 'string'], + 'description_long_nl' => ['nullable', 'string'], + 'use_for_education_en' => ['nullable', 'db_text'], + 'use_for_education_nl' => ['nullable', 'db_text'], + 'working_methods' => ['nullable', 'array'], + 'working_methods.*' => [new ExistsInTags(TagTypes::WORKING_METHODS)], + 'target_groups' => ['nullable', 'array'], + 'target_groups.*' => [new ExistsInTags(TagTypes::TARGET_GROUPS)], - 'description_long_1' => ['nullable', 'string'], - 'description_1_image_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], - - 'description_long_2' => ['nullable', 'string'], - 'description_2_image_filename' => ['nullable', 'image', 'max:' . config('validation.tool.image.max')], - - 'info_url' => ['nullable', 'url', 'db_string'], + 'how_does_it_work_en' => ['nullable', 'db_string'], + 'how_does_it_work_nl' => ['nullable', 'db_string'], + 'complexity' => ['nullable', 'array'], + 'complexity.*' => [new ExistsInTags(TagTypes::COMPLEXITY)], ]; } diff --git a/app/Http/Requests/Tool/SendNotificationRequest.php b/app/Http/Requests/Tool/SendNotificationRequest.php new file mode 100644 index 0000000..d702a5e --- /dev/null +++ b/app/Http/Requests/Tool/SendNotificationRequest.php @@ -0,0 +1,32 @@ +user()->can('sendNotifications', [Institute::class]); + } + + public function rules(): array + { + return [ + 'tool' => ['required', Rule::in(Tool::pluck('id'))], + 'subject' => ['required', 'string'], + 'message' => ['required', 'string'], + ]; + } + + public function attributes(): array + { + return trans('institute.notifications.attributes'); + } +} diff --git a/app/Http/Requests/Tool/StoreRequest.php b/app/Http/Requests/Tool/StoreRequest.php index ff2f92b..2a8b502 100644 --- a/app/Http/Requests/Tool/StoreRequest.php +++ b/app/Http/Requests/Tool/StoreRequest.php @@ -12,4 +12,12 @@ public function authorize(): bool { return $this->user()->can('create', Tool::class); } + + public function rules(): array + { + return [ + ...parent::rules(), + 'logo_filename' => ['required', 'image', 'max:' . config('validation.tool.image.max')], + ]; + } } diff --git a/app/Http/Resources/BaseToolIndexResource.php b/app/Http/Resources/BaseToolIndexResource.php new file mode 100644 index 0000000..4c1d4e7 --- /dev/null +++ b/app/Http/Resources/BaseToolIndexResource.php @@ -0,0 +1,52 @@ +getTool(); + + return [ + 'id' => $tool->id, + + ...$this->getToolData($tool), + ]; + } + + protected function getTool(): Tool + { + return $this->resource; + } + + protected function getToolData(Tool|ConceptTool $tool): array + { + $shortDescription = Locale::getLocalizedFieldValue($tool, 'description_short'); + + return [ + 'name' => $tool->name, + + 'description_short_stripped_tags' => Format::asSimpleHtml($shortDescription), + + 'logo_url' => $this->getImageUrl($tool->logo_filename, true), + ]; + } +} diff --git a/app/Http/Resources/ContentManager/ConceptToolResource.php b/app/Http/Resources/ContentManager/ConceptToolResource.php new file mode 100644 index 0000000..c23c7be --- /dev/null +++ b/app/Http/Resources/ContentManager/ConceptToolResource.php @@ -0,0 +1,63 @@ +resource; + + return [ + ...parent::toArray($request), + + 'id' => $concept->originalVersion->id, + 'is_published' => $concept->originalVersion->is_published, + + 'description_short_en' => $concept->description_short_en, + 'description_short_nl' => $concept->description_short_nl, + 'addons_en' => $concept->addons_en, + 'addons_nl' => $concept->addons_nl, + + 'system_requirements_en' => $concept->system_requirements_en, + 'system_requirements_nl' => $concept->system_requirements_nl, + + 'personal_data_en' => $concept->personal_data_en, + 'personal_data_nl' => $concept->personal_data_nl, + + 'instructions_manual_1_url_en' => $concept->instructions_manual_1_url_en, + 'instructions_manual_1_url_nl' => $concept->instructions_manual_1_url_nl, + 'instructions_manual_2_url_en' => $concept->instructions_manual_2_url_en, + 'instructions_manual_2_url_nl' => $concept->instructions_manual_2_url_nl, + 'instructions_manual_3_url_en' => $concept->instructions_manual_3_url_en, + 'instructions_manual_3_url_nl' => $concept->instructions_manual_3_url_nl, + 'support_for_teachers_en' => $concept->support_for_teachers_en, + 'support_for_teachers_nl' => $concept->support_for_teachers_nl, + 'accessibility_facilities_en' => $concept->accessibility_facilities_en, + 'accessibility_facilities_nl' => $concept->accessibility_facilities_nl, + 'description_long_en' => $concept->description_long_en, + 'description_long_nl' => $concept->description_long_nl, + 'use_for_education_en' => $concept->use_for_education_en, + 'use_for_education_nl' => $concept->use_for_education_nl, + 'how_does_it_work_en' => $concept->how_does_it_work_en, + 'how_does_it_work_nl' => $concept->how_does_it_work_nl, + + 'updated_at' => $this->updated_at->toW3cString(), + + 'permissions' => [ + 'publish' => $request->user()->can('publish', $concept->originalVersion), + ], + ]; + } +} diff --git a/app/Http/Resources/ContentManager/ToolIndexResource.php b/app/Http/Resources/ContentManager/ToolIndexResource.php index 59ac1b3..3ad92bc 100644 --- a/app/Http/Resources/ContentManager/ToolIndexResource.php +++ b/app/Http/Resources/ContentManager/ToolIndexResource.php @@ -4,8 +4,9 @@ namespace App\Http\Resources\ContentManager; -use App\Http\Resources\FeatureResource; -use App\Http\Resources\ToolIndexResource as BaseToolIndexResource; +use App\Http\Resources\BaseToolIndexResource; +use App\Http\Resources\TagResource; +use App\Models\ConceptTool; class ToolIndexResource extends BaseToolIndexResource { @@ -16,15 +17,29 @@ class ToolIndexResource extends BaseToolIndexResource */ public function toArray($request): array { - return array_merge(parent::toArray($request), [ - 'status' => $this->status, - 'status_display' => $this->status_display, + $tool = $this->getTool(); + $concept = $this->getConceptTool(); - 'features' => $this->whenLoaded('features', fn () => FeatureResource::collection($this->features)), + return [ + ...$this->getToolData($concept ?? $tool), + + 'id' => $tool->id, + + 'status' => $tool->status, + 'status_display' => $tool->status_display, + + 'features' => TagResource::collection($tool->features()), + + 'has_concept' => $concept !== null, 'permissions' => [ - 'update' => $request->user()->can('update', $this->resource), + 'update' => $request->user()->can('update', $tool), ], - ]); + ]; + } + + protected function getConceptTool(): ?ConceptTool + { + return $this->resource->concept; } } diff --git a/app/Http/Resources/ContentManager/ToolResource.php b/app/Http/Resources/ContentManager/ToolResource.php index 4223338..139f1ca 100644 --- a/app/Http/Resources/ContentManager/ToolResource.php +++ b/app/Http/Resources/ContentManager/ToolResource.php @@ -5,6 +5,7 @@ namespace App\Http\Resources\ContentManager; use App\Http\Resources\ToolResource as BaseToolResource; +use App\Models\Tool; class ToolResource extends BaseToolResource { @@ -15,12 +16,21 @@ class ToolResource extends BaseToolResource */ public function toArray($request): array { - return array_merge(parent::toArray($request), [ - 'is_published' => $this->is_published, + /** @var Tool $tool */ + $tool = $this->resource; + + return [ + ...parent::toArray($request), + + 'id' => $tool->id, + 'is_published' => $tool->is_published, + + 'description_short_en' => $tool->description_short_en, + 'description_short_nl' => $tool->description_short_nl, 'permissions' => [ - 'publish' => $request->user()->can('publish', $this->resource), + 'publish' => $request->user()->can('publish', $tool), ], - ]); + ]; } } diff --git a/app/Http/Resources/ContentPageResource.php b/app/Http/Resources/ContentPageResource.php new file mode 100644 index 0000000..ff3687e --- /dev/null +++ b/app/Http/Resources/ContentPageResource.php @@ -0,0 +1,40 @@ + $this->id, + + 'slug' => $this->slug, + + 'title' => Locale::getLocalizedFieldValue($this->resource, 'title'), + 'title_en' => $this->title_en, + 'title_nl' => $this->title_nl, + + 'body' => Locale::getLocalizedFieldValue($this->resource, 'body'), + 'body_en' => $this->body_en, + 'body_nl' => $this->body_nl, + ]; + } +} diff --git a/app/Http/Resources/CustomFieldResource.php b/app/Http/Resources/CustomFieldResource.php new file mode 100644 index 0000000..2036191 --- /dev/null +++ b/app/Http/Resources/CustomFieldResource.php @@ -0,0 +1,36 @@ + $this->id, + + 'institute' => $this->whenLoaded('institute', fn () => new InstituteResource($this->institute)), + 'title' => Locale::getLocalizedFieldValue($this->resource, 'title'), + 'title_en' => $this->title_en, + 'title_nl' => $this->title_nl, + 'sortkey' => $this->sortkey, + 'tab_type' => $this->tab_type, + 'tab_type_display' => Tabs::getTranslation($this->tab_type), + + 'created_at' => $this->created_at->toW3cString(), + 'updated_at' => $this->updated_at->toW3cString(), + ]; + } +} diff --git a/app/Http/Resources/ExperienceResource.php b/app/Http/Resources/ExperienceResource.php index 87073a8..5a4402d 100644 --- a/app/Http/Resources/ExperienceResource.php +++ b/app/Http/Resources/ExperienceResource.php @@ -4,29 +4,33 @@ namespace App\Http\Resources; +use App\Models\User; use Illuminate\Http\Resources\Json\JsonResource; -/** @extends JsonResource<\App\Models\Experience> */ +/** @mixin \App\Models\Experience */ class ExperienceResource extends JsonResource { /** @param \Illuminate\Http\Request $request */ public function toArray($request): array { + /** @var User $actingUser */ + $actingUser = $request->user(); + return [ 'id' => $this->id, - 'user' => new UserResource($this->user), + 'user' => $actingUser->can('seeUser', $this->resource) ? new UserResource($this->user) : null, + 'institute' => new InstituteResource($this->user->institute), + + 'title' => $this->title, - 'rating' => $this->rating, - 'title' => $this->title, - 'message' => $this->message, - 'message_display' => $this->message_display, + 'message' => $this->message_display, 'created_at' => $this->created_at->toW3cString(), 'permissions' => [ - 'update' => $request->user()->can('update', $this->resource), - 'delete' => $request->user()->can('delete', $this->resource), + 'update' => $actingUser->can('update', $this->resource), + 'delete' => $actingUser->can('delete', $this->resource), ], ]; } diff --git a/app/Http/Resources/InformationManager/CustomFieldResource.php b/app/Http/Resources/InformationManager/CustomFieldResource.php new file mode 100644 index 0000000..570edd0 --- /dev/null +++ b/app/Http/Resources/InformationManager/CustomFieldResource.php @@ -0,0 +1,25 @@ + $this->id, + 'title_en' => $this->title_en, + 'title_nl' => $this->title_nl, + ]; + } +} diff --git a/app/Http/Resources/InformationManager/CustomFieldValueResource.php b/app/Http/Resources/InformationManager/CustomFieldValueResource.php new file mode 100644 index 0000000..117dbba --- /dev/null +++ b/app/Http/Resources/InformationManager/CustomFieldValueResource.php @@ -0,0 +1,51 @@ +field = $this->resource; + } + + /** + * @param \Illuminate\Http\Request $request + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function toArray($request): array + { + return [ + 'id' => $this->field->id, + + 'title_en' => $this->field->title_en, + 'title_nl' => $this->field->title_nl, + + 'value_en' => WYSIWYG::valueForFrontend($this->field->pivot?->value_en), + 'value_nl' => WYSIWYG::valueForFrontend($this->field->pivot?->value_nl), + + 'tab_type' => $this->field->tab_type, + + 'title' => Locale::getLocalizedFieldValue($this->field, 'title'), + 'value' => $this->when( + $this->field->pivot !== null, + fn () => WYSIWYG::valueForFrontend( + Locale::getLocalizedFieldValue($this->field->pivot, 'value') + ) + ), + ]; + } +} diff --git a/app/Http/Resources/InformationManager/InstituteToolResource.php b/app/Http/Resources/InformationManager/InstituteToolResource.php index 76e1609..32acaf6 100644 --- a/app/Http/Resources/InformationManager/InstituteToolResource.php +++ b/app/Http/Resources/InformationManager/InstituteToolResource.php @@ -5,14 +5,13 @@ namespace App\Http\Resources\InformationManager; use App\Enums\InstituteTool\Status; -use App\Traits\Resources\WithImage; +use App\Http\Resources\ToolResource; +use App\Models\ConceptInstituteTool; use Illuminate\Http\Resources\Json\JsonResource; -/** @extends JsonResource<\App\Models\InstituteTool> */ +/** @mixin \App\Models\ConceptInstituteTool */ class InstituteToolResource extends JsonResource { - use WithImage; - /** * @param \Illuminate\Http\Request $request * @@ -20,47 +19,65 @@ class InstituteToolResource extends JsonResource */ public function toArray($request): array { - return [ - 'alternative_tool_id' => $this->alternative_tool_id, - - 'description_1' => $this->description_1, - 'description_1_image_filename' => $this->description_1_image_filename, - 'description_1_image_url' => $this->getImageUrl($this->description_1_image_filename), - - 'description_2' => $this->description_2, - 'description_2_image_filename' => $this->description_2_image_filename, - 'description_2_image_url' => $this->getImageUrl($this->description_2_image_filename), - - 'extra_information_title' => $this->extra_information_title, - 'extra_information' => $this->extra_information, - - 'support_title_1' => $this->support_title_1, - 'support_email_1' => $this->support_email_1, - 'support_title_2' => $this->support_title_2, - 'support_email_2' => $this->support_email_2, + /** @var ConceptInstituteTool $concept */ + $concept = $this->resource; - 'manual_title_1' => $this->manual_title_1, - 'manual_url_1' => $this->manual_url_1, - 'manual_title_2' => $this->manual_title_2, - 'manual_url_2' => $this->manual_url_2, + $tool = $concept->originalVersion->tool; - 'video_title_1' => $this->video_title_1, - 'video_url_1' => $this->video_url_1, - 'video_title_2' => $this->video_title_2, - 'video_url_2' => $this->video_url_2, - - 'status' => $this->status, - 'status_display' => trans('institute.tool.statuses.' . ($this->status ?? Status::UNRATED)), - - 'why_unfit' => $this->why_unfit, - - 'categories' => $this->institute->categories()->forTool($this->tool)->pluck('id'), - - 'is_published' => $this->is_published, - 'published_at' => $this->published_at, + return [ + 'alternative_tools_ids' => $concept->allowedAlternativeTools()->pluck('tool_id'), + + 'prohibited_alternative_tools_tool' => ToolResource::collection($concept->prohibitedAlternativeTools), + 'alternative_tools_tool' => ToolResource::collection($concept->allowedAlternativeTools), + + 'categories' => $concept->categories()->pluck('id'), + 'status' => $concept->status, + 'status_display' => Status::getTranslation($concept->status ?? Status::UNRATED), + 'conditions_en' => $concept->conditions_en, + 'conditions_nl' => $concept->conditions_nl, + + 'links_with_other_tools_en' => $concept->links_with_other_tools_en, + 'links_with_other_tools_nl' => $concept->links_with_other_tools_nl, + 'sla_url' => $concept->sla_url, + + 'privacy_contact' => $concept->privacy_contact, + 'privacy_evaluation_url' => $concept->privacy_evaluation_url, + 'security_evaluation_url' => $concept->security_evaluation_url, + 'data_classification' => $concept->data_classification, + + 'how_to_login_en' => $concept->how_to_login_en, + 'how_to_login_nl' => $concept->how_to_login_nl, + 'availability_en' => $concept->availability_en, + 'availability_nl' => $concept->availability_nl, + 'licensing_en' => $concept->licensing_en, + 'licensing_nl' => $concept->licensing_nl, + 'request_access_en' => $concept->request_access_en, + 'request_access_nl' => $concept->request_access_nl, + 'instructions_en' => $concept->instructions_en, + 'instructions_nl' => $concept->instructions_nl, + 'instructions_manual_1_url' => $concept->instructions_manual_1_url, + 'instructions_manual_2_url' => $concept->instructions_manual_2_url, + 'instructions_manual_3_url' => $concept->instructions_manual_3_url, + + 'faq_en' => $concept->faq_en, + 'faq_nl' => $concept->faq_nl, + 'examples_of_usage_en' => $concept->examples_of_usage_en, + 'examples_of_usage_nl' => $concept->examples_of_usage_nl, + 'additional_info_heading_en' => $concept->additional_info_heading_en, + 'additional_info_heading_nl' => $concept->additional_info_heading_nl, + 'additional_info_text_en' => $concept->additional_info_text_en, + 'additional_info_text_nl' => $concept->additional_info_text_nl, + + 'why_unfit_en' => $concept->why_unfit_en, + 'why_unfit_nl' => $concept->why_unfit_nl, + + 'custom_fields' => CustomFieldValueResource::collection($concept->getAllCustomFields()), + + 'is_published' => $concept->originalVersion->is_published, + 'published_at' => $concept->originalVersion->published_at, 'permissions' => [ - 'publish' => $request->user()->can('publishForInstitute', $this->resource->tool), + 'publish' => $request->user()->can('publishForInstitute', $tool), ], ]; } diff --git a/app/Http/Resources/InformationManager/TagResource.php b/app/Http/Resources/InformationManager/TagResource.php new file mode 100644 index 0000000..eaa87d5 --- /dev/null +++ b/app/Http/Resources/InformationManager/TagResource.php @@ -0,0 +1,42 @@ + $this->id, + 'name' => $this->name, + 'name_array' => $this->getTranslations('name'), + 'name_en' => $this->getTranslation('name', 'en'), + 'name_nl' => $this->getTranslation('name', 'nl', false), + 'description_array' => count($this->getTranslations('description')) > 0 ? + $this->getTranslations('description') : ['nl' => null, 'en' => null], + 'description_en' => $this->getTranslation('description', 'en'), + 'description_nl' => $this->getTranslation('description', 'nl', false), + 'slug' => $this->slug, + 'type' => $this->type, + 'type_display' => TagTypes::getTranslation($this->type), + 'institute_id' => $this->institute_id, + 'order_column' => $this->order_column, + + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/app/Http/Resources/InformationManager/ToolIndexResource.php b/app/Http/Resources/InformationManager/ToolIndexResource.php index 33d16a6..86c4d16 100644 --- a/app/Http/Resources/InformationManager/ToolIndexResource.php +++ b/app/Http/Resources/InformationManager/ToolIndexResource.php @@ -5,8 +5,13 @@ namespace App\Http\Resources\InformationManager; use App\Enums\InstituteTool\Status; -use App\Http\Resources\ToolIndexResource as BaseToolIndexResource; -use Illuminate\Support\Str; +use App\Helpers\Locale; +use App\Http\Resources\BaseToolIndexResource; +use App\Http\Resources\TagResource; +use App\Models\ConceptInstituteTool; +use App\Models\Institute; +use App\Models\InstituteTool; +use Illuminate\Http\Request; class ToolIndexResource extends BaseToolIndexResource { @@ -17,24 +22,54 @@ class ToolIndexResource extends BaseToolIndexResource */ public function toArray($request): array { - return array_merge(parent::toArray($request), [ - 'description_short' => Str::limit($this->description_short, 30), + $tool = $this->getTool(); + $instituteTool = $this->getInstituteTool($request); - 'rating' => $this->rating, + return [ + ...parent::toArray($request), + ...$this->getInstituteToolData($instituteTool->concept ?? $instituteTool), + ...[ + 'name' => $tool->name, + 'description_short' => Locale::getLocalizedFieldValue($tool, 'description_short'), - 'institute' => [ - 'status' => $this->pivot->status_display, - 'status_display' => trans('institute.tool.statuses.' . $this->pivot->status_display), + 'description_short_en' => $tool->description_short_en, + + 'total_experiences' => $tool->experiences()->count(), + + 'has_concept' => $instituteTool->concept !== null, + + 'permissions' => [ + 'update' => $request->user()->can('updateForInstitute', $tool), + 'view' => $request->user()->can('viewOther', $tool), + ], ], + ]; + } + + protected function getInstitute(Request $request): Institute + { + return $request->user()->institute; + } + + private function getInstituteTool(Request $request): InstituteTool + { + return InstituteTool::forTool($this->getTool()) + ->forInstitute($this->getInstitute($request)) + ->first(); + } - 'permissions' => [ - 'update' => $request->user()->can('update', $this->resource), - 'view' => $request->user()->can('viewOther', $this->resource), + private function getInstituteToolData(InstituteTool|ConceptInstituteTool $instituteTool): array + { + $tool = $this->getTool(); + + return [ + 'institute' => [ + 'status' => $instituteTool->status_display, + 'status_display' => Status::getTranslation($instituteTool->status_display), + 'categories' => TagResource::collection($instituteTool->categories()), ], - 'edit_url' => $this->pivot->status === Status::PROHIBITED - ? route('information-manager.tool.prohibited.edit', $this) - : route('information-manager.tool.edit', $this), - ]); + 'edit_url' => route('information-manager.tool.edit', $tool), + ]; } } diff --git a/app/Http/Resources/InstituteResource.php b/app/Http/Resources/InstituteResource.php index 1e95348..4723d59 100644 --- a/app/Http/Resources/InstituteResource.php +++ b/app/Http/Resources/InstituteResource.php @@ -4,11 +4,11 @@ namespace App\Http\Resources; +use App\Helpers\File; use App\Models\Institute; use Illuminate\Http\Resources\Json\JsonResource; -use Illuminate\Support\Facades\Storage; -/** @extends JsonResource<\App\Models\Institute> */ +/** @mixin \App\Models\Institute */ class InstituteResource extends JsonResource { /** @@ -18,9 +18,6 @@ class InstituteResource extends JsonResource */ public function toArray($request): array { - /** @var \Illuminate\Filesystem\FilesystemAdapter */ - $storage = Storage::disk(Institute::$disk); - return [ 'id' => $this->id, @@ -28,9 +25,14 @@ public function toArray($request): array 'short_name' => $this->short_name, 'domain' => $this->domain, - 'logo_full_url' => $storage->url($this->logo_full_filename), - 'logo_square_url' => $storage->url($this->logo_square_filename), - 'banner_url' => $storage->url($this->banner_filename), + 'logo_full_url' => File::getPublicUrl(Institute::$disk, $this->logo_full_filename), + 'logo_square_url' => File::getPublicUrl(Institute::$disk, $this->logo_square_filename), + 'banner_url' => File::getPublicUrl(Institute::$disk, $this->banner_filename), + + 'homepage_title_en' => $this->homepage_title_en, + 'homepage_body_en' => $this->homepage_body_en, + 'homepage_title_nl' => $this->homepage_title_nl, + 'homepage_body_nl' => $this->homepage_body_nl, 'created_at' => $this->created_at->toW3cString(), 'updated_at' => $this->updated_at->toW3cString(), diff --git a/app/Http/Resources/LocaleResource.php b/app/Http/Resources/LocaleResource.php new file mode 100644 index 0000000..d8f47fe --- /dev/null +++ b/app/Http/Resources/LocaleResource.php @@ -0,0 +1,24 @@ + $this['code'], + 'native' => $this['native'], + 'url' => route('locale.set', ['locale' => $this['code']]), + ]; + } +} diff --git a/app/Http/Resources/Other/ToolResource.php b/app/Http/Resources/Other/ToolResource.php index c89fda9..0f463b5 100644 --- a/app/Http/Resources/Other/ToolResource.php +++ b/app/Http/Resources/Other/ToolResource.php @@ -4,6 +4,9 @@ namespace App\Http\Resources\Other; +use App\Enums\Tags\TagTypes; +use App\Helpers\WYSIWYG; +use App\Http\Resources\TagResource; use App\Http\Resources\ToolResource as BaseToolResource; use App\Models\Experience; @@ -16,15 +19,51 @@ class ToolResource extends BaseToolResource */ public function toArray($request): array { - return array_merge(parent::toArray($request), [ - 'rating' => $this->rating, + $toolResource = parent::toArray($request); + + $this->setEmptyWysiwygValuesToNull($toolResource); + + return array_merge($toolResource, [ 'total_experiences' => $this->experiences->count(), + 'features' => TagResource::collection($this->tagsWithType(TagTypes::FEATURES)), + 'software_types' => TagResource::collection($this->tagsWithType(TagTypes::SOFTWARE_TYPES)), + 'devices' => TagResource::collection($this->tagsWithType(TagTypes::DEVICES)), + 'standards' => TagResource::collection($this->tagsWithType(TagTypes::STANDARDS)), + 'operating_systems' => TagResource::collection($this->tagsWithType(TagTypes::OPERATING_SYSTEMS)), + 'data_processing_locations' => TagResource::collection( + $this->tagsWithType(TagTypes::DATA_PROCESSING_LOCATIONS) + ), + 'certifications' => TagResource::collection($this->tagsWithType(TagTypes::CERTIFICATIONS)), + 'working_methods' => TagResource::collection($this->tagsWithType(TagTypes::WORKING_METHODS)), + 'target_groups' => TagResource::collection($this->tagsWithType(TagTypes::TARGET_GROUPS)), + 'complexity' => TagResource::collection($this->tagsWithType(TagTypes::COMPLEXITY)), + 'permissions' => [ 'add_to_collection' => $request->user()->can('addToInstitute', $this->resource), 'share_experience' => $request->user()->can('create', [Experience::class, $this->resource]), - 'see_technical_information' => $request->user()->isInformationManager(), + 'see_all_fields' => $request->user()->can('seeAllFields', $this->resource), + 'submit_request_for_change' => $request->user()->can('submitRequestForChange', $this->resource), ], ]); } + + private function setEmptyWysiwygValuesToNull(array &$toolResource): void + { + $wysiwygAttributes = [ + 'description_short', + 'addons', + 'personal_data', + 'privacy_analysis', + 'support_for_teachers', + 'availability_surf', + 'accessibility_facilities', + 'description_long', + 'use_for_education', + ]; + + foreach ($wysiwygAttributes as $wysiwygAttribute) { + $toolResource[$wysiwygAttribute] = WYSIWYG::valueForFrontend($toolResource[$wysiwygAttribute]); + } + } } diff --git a/app/Http/Resources/Our/AlternativeToolResource.php b/app/Http/Resources/Our/AlternativeToolResource.php index a129a1f..08a7504 100644 --- a/app/Http/Resources/Our/AlternativeToolResource.php +++ b/app/Http/Resources/Our/AlternativeToolResource.php @@ -5,8 +5,10 @@ namespace App\Http\Resources\Our; use App\Enums\InstituteTool\Status; -use App\Http\Resources\ToolIndexResource as BaseToolIndexResource; +use App\Helpers\Locale; +use App\Http\Resources\BaseToolIndexResource; use App\Models\InstituteTool; +use App\Models\Tool; use App\Traits\Resources\WithImage; use Illuminate\Http\Request; @@ -20,25 +22,27 @@ class AlternativeToolResource extends BaseToolIndexResource public function toArray($request): array { return array_merge(parent::toArray($request), [ - 'name' => $this->name, - 'description_short' => $this->description_short, - 'rating' => $this->rating, + 'name' => $this->resource->name, + 'description_short' => Locale::getLocalizedFieldValue($this->resource, 'description_short'), + 'total_experiences' => $this->experiences()->count(), 'institute' => $this->getInstituteData($request), ]); } private function getInstituteData(Request $request): array { + /** @var Tool $tool */ + $tool = $this->resource; $institute = $request->user()->institute; - $data = $institute->tools()->find($this->resource)?->pivot; - if ($data === null) { - $data = new InstituteTool(); + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->first(); + if ($instituteTool === null) { + $instituteTool = new InstituteTool(); } return [ - 'status' => $data->status ?? Status::UNRATED, - 'status_display' => trans('institute.tool.statuses.' . ($data->status ?? 'unrated')), + 'status' => $instituteTool->status ?? Status::UNRATED, + 'status_display' => Status::getTranslation($instituteTool->status ?? Status::UNRATED), ]; } } diff --git a/app/Http/Resources/Our/ToolResource.php b/app/Http/Resources/Our/ToolResource.php index da0ce7d..de3730c 100644 --- a/app/Http/Resources/Our/ToolResource.php +++ b/app/Http/Resources/Our/ToolResource.php @@ -2,13 +2,21 @@ declare(strict_types=1); +// phpcs:disable Generic.Files.LineLength.TooLong + namespace App\Http\Resources\Our; +use App\Enums\InstituteTool\DataClassification; use App\Enums\InstituteTool\Status; -use App\Http\Resources\CategoryResource; -use App\Http\Resources\ToolResource as BaseToolResource; +use App\Enums\Tags\TagTypes; +use App\Helpers\Locale; +use App\Helpers\WYSIWYG; +use App\Http\Resources\InformationManager\CustomFieldValueResource; +use App\Http\Resources\Other\ToolResource as BaseToolResource; +use App\Http\Resources\TagResource; use App\Models\Experience; use App\Models\InstituteTool; +use App\Models\Tool; use App\Traits\Resources\WithImage; class ToolResource extends BaseToolResource @@ -19,68 +27,161 @@ class ToolResource extends BaseToolResource public function toArray($request): array { return array_merge(parent::toArray($request), [ - 'rating' => $this->rating, + ...$this->getTags(), 'total_experiences' => $this->experiences->count(), + 'features' => TagResource::collection($this->tagsWithType(TagTypes::FEATURES)), + 'institute' => $this->getInstituteData($request), + 'description_short_en' => WYSIWYG::valueForFrontend($this->description_short_en), + 'description_short_nl' => WYSIWYG::valueForFrontend($this->description_short_nl), + 'description_long_en' => WYSIWYG::valueForFrontend($this->description_long_en), + 'description_long_nl' => WYSIWYG::valueForFrontend($this->description_long_nl), + 'permissions' => [ 'share_experience' => $request->user()->can('create', [Experience::class, $this->resource]), - 'see_technical_information' => $request->user()->isInformationManager(), + 'see_all_fields' => $request->user()->can('seeAllFields', $this->resource), + 'submit_request_for_change' => $request->user()->can('submitRequestForChange', $this->resource), ], + + 'how_does_it_work_nl' => $this->how_does_it_work_nl, + 'how_does_it_work_en' => $this->how_does_it_work_en, + + 'addons_nl' => WYSIWYG::valueForFrontend($this->addons_nl), + 'addons_en' => WYSIWYG::valueForFrontend($this->addons_en), + + 'accessibility_facilities_nl' => WYSIWYG::valueForFrontend($this->accessibility_facilities_nl), + 'accessibility_facilities_en' => WYSIWYG::valueForFrontend($this->accessibility_facilities_en), + + 'support_for_teachers_nl' => WYSIWYG::valueForFrontend($this->support_for_teachers_nl), + 'support_for_teachers_en' => WYSIWYG::valueForFrontend($this->support_for_teachers_en), + + 'instructions_manual_1_url_nl' => $this->instructions_manual_1_url_nl, + 'instructions_manual_1_url_en' => $this->instructions_manual_1_url_en, + + 'instructions_manual_2_url_nl' => $this->instructions_manual_2_url_nl, + 'instructions_manual_2_url_en' => $this->instructions_manual_2_url_en, + + 'instructions_manual_3_url_nl' => $this->instructions_manual_3_url_nl, + 'instructions_manual_3_url_en' => $this->instructions_manual_3_url_en, + + 'system_requirements_nl' => $this->system_requirements_nl, + 'system_requirements_en' => $this->system_requirements_en, + + 'personal_data_en' => WYSIWYG::valueForFrontend($this->personal_data_en), + 'personal_data_nl' => WYSIWYG::valueForFrontend($this->personal_data_nl), + + 'use_for_education_nl' => WYSIWYG::valueForFrontend($this->use_for_education_nl), + 'use_for_education_en' => WYSIWYG::valueForFrontend($this->use_for_education_en), + + 'updated_at' => $this->updated_at->toW3cString(), ]); } /** @param \Illuminate\Http\Request $request */ private function getInstituteData($request): array { + /** @var Tool $tool */ + $tool = $this->resource; $institute = $request->user()->institute; - $data = $institute->tools()->find($this->resource)?->pivot; - if ($data === null) { - $data = new InstituteTool(); + $instituteTool = InstituteTool::forTool($tool)->forInstitute($institute)->first(); + if ($instituteTool === null) { + $instituteTool = new InstituteTool(); } - $categories = $institute->categories()->forTool($this->resource)->get(); + $alternativeTools = $instituteTool->allowedAlternativeTools()->select('tools.*')->get(); + $alternativeTool = null; + if ($alternativeTools->count() > 0) { + $alternativeTool = AlternativeToolResource::collection($alternativeTools); + } + + $dataClassificationDisplay = null; + if ($instituteTool->data_classification) { + $dataClassificationDisplay = DataClassification::getTranslation($instituteTool->data_classification); + } + + return [ + 'alternative_tools' => $alternativeTool, + + 'categories' => TagResource::collection($instituteTool->categories()), + 'status' => $instituteTool->status ?? Status::UNRATED, + 'status_display' => Status::getTranslation($instituteTool->status ?? Status::UNRATED), + 'conditions' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'conditions')), + + 'links_with_other_tools' => WYSIWYG::valueForFrontend( + Locale::getLocalizedFieldValue($instituteTool, 'links_with_other_tools') + ), + 'sla_url' => $instituteTool->sla_url, + + 'privacy_contact' => $instituteTool->privacy_contact, + 'privacy_evaluation_url' => $instituteTool->privacy_evaluation_url, + 'security_evaluation_url' => $instituteTool->security_evaluation_url, + 'data_classification_display' => $dataClassificationDisplay, + + 'how_to_login' => Locale::getLocalizedFieldValue($instituteTool, 'how_to_login'), + 'availability' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'availability')), + 'licensing' => Locale::getLocalizedFieldValue($instituteTool, 'licensing'), + 'request_access' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'request_access')), + 'instructions' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'instructions')), + 'instructions_manual_1_url' => $instituteTool->instructions_manual_1_url, + 'instructions_manual_2_url' => $instituteTool->instructions_manual_2_url, + 'instructions_manual_3_url' => $instituteTool->instructions_manual_3_url, + + 'faq' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'faq')), + 'examples_of_usage' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'examples_of_usage')), + 'additional_info_heading' => Locale::getLocalizedFieldValue($instituteTool, 'additional_info_heading'), + 'additional_info_text' => WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'additional_info_text')), + + 'custom_fields' => CustomFieldValueResource::collection($instituteTool->customFields), + + 'tooltips' => $this->getTooltips(), + + 'why_unfit' => $instituteTool->status === Status::DISALLOWED ? + WYSIWYG::valueForFrontend(Locale::getLocalizedFieldValue($instituteTool, 'why_unfit')) : null, + + 'updated_at' => $instituteTool->updated_at?->toW3cString(), + ]; + } + + private function getTags(): array + { + $tags = []; + + foreach (TagTypes::toArray() as $type) { + $tags[$type] = TagResource::collection($this->tagsWithType($type)); + } + + return $tags; + } + + private function getTooltips(): array + { return [ - 'description_1' => $data->description_1, - 'description_1_display' => $data->description_1_display, - 'description_1_image_filename' => $data->description_1_image_filename, - 'description_1_image_url' => $this->getImageUrl($data->description_1_image_filename), - - 'description_2' => $data->description_2, - 'description_2_display' => $data->description_2_display, - 'description_2_image_filename' => $data->description_2_image_filename, - 'description_2_image_url' => $this->getImageUrl($data->description_2_image_filename), - - 'extra_information_title' => $data->extra_information_title, - 'extra_information' => $data->extra_information, - 'extra_information_display' => $data->extra_information_display, - - 'support_title_1' => $data->support_title_1, - 'support_email_1' => $data->support_email_1, - 'support_title_2' => $data->support_title_2, - 'support_email_2' => $data->support_email_2, - - 'manual_title_1' => $data->manual_title_1, - 'manual_url_1' => $data->manual_url_1, - 'manual_title_2' => $data->manual_title_2, - 'manual_url_2' => $data->manual_url_2, - - 'video_title_1' => $data->video_title_1, - 'video_url_1' => $data->video_url_1, - 'video_title_2' => $data->video_title_2, - 'video_url_2' => $data->video_url_2, - - 'categories' => CategoryResource::collection($categories), - - 'status' => $data->status ?? Status::UNRATED, - 'status_display' => trans('institute.tool.statuses.' . ($data->status ?? Status::UNRATED)), - - 'why_unfit' => $data->why_unfit, - 'why_unfit_display' => $data->why_unfit_display, - 'alternative_tool' => $data->alternativeTool ? new AlternativeToolResource($data->alternativeTool) : null, - ]; + 'status' => trans('institute.tool.tooltip.status'), + 'conditions' => Locale::getLocalizedTranslation('institute.tool.tooltip.conditions'), + 'faq' => Locale::getLocalizedTranslation('institute.tool.tooltip.faq'), + 'examples_of_usage' => Locale::getLocalizedTranslation('institute.tool.tooltip.examples_of_usage'), + 'additional_info_heading' => Locale::getLocalizedTranslation('institute.tool.tooltip.additional_info_heading'), + 'additional_info_text' => Locale::getLocalizedTranslation('institute.tool.tooltip.additional_info_text'), + 'how_to_login' => Locale::getLocalizedTranslation('institute.tool.tooltip.how_to_login'), + 'availability' => Locale::getLocalizedTranslation('institute.tool.tooltip.availability'), + 'licensing' => Locale::getLocalizedTranslation('institute.tool.tooltip.licensing'), + 'request_access' => Locale::getLocalizedTranslation('institute.tool.tooltip.request_access'), + 'instructions' => Locale::getLocalizedTranslation('institute.tool.tooltip.instructions'), + 'instructions_manual_1_url' => trans('institute.tool.tooltip.instructions_manual_1_url'), + 'instructions_manual_2_url' => trans('institute.tool.tooltip.instructions_manual_2_url'), + 'instructions_manual_3_url' => trans('institute.tool.tooltip.instructions_manual_3_url'), + 'links_with_other_tools' => Locale::getLocalizedTranslation('institute.tool.tooltip.links_with_other_tools'), + 'sla_url' => trans('institute.tool.tooltip.sla_url'), + 'privacy_contact' => trans('institute.tool.tooltip.privacy_contact'), + 'privacy_evaluation_url' => trans('institute.tool.tooltip.privacy_evaluation_url'), + 'security_evaluation_url' => trans('institute.tool.tooltip.security_evaluation_url'), + 'data_classification' => trans('institute.tool.tooltip.data_classification'), + 'categories' => trans('institute.tool.tooltip.categories'), + 'why_unfit' => Locale::getLocalizedTranslation('institute.tool.tooltip.why_unfit'), + ]; } } diff --git a/app/Http/Resources/PaginationResource.php b/app/Http/Resources/PaginationResource.php index 3e50776..972d2f7 100644 --- a/app/Http/Resources/PaginationResource.php +++ b/app/Http/Resources/PaginationResource.php @@ -6,6 +6,7 @@ use Illuminate\Http\Resources\Json\JsonResource; +/** @mixin \Illuminate\Contracts\Pagination\LengthAwarePaginator */ class PaginationResource extends JsonResource { /** diff --git a/app/Http/Resources/PendingToolEditResource.php b/app/Http/Resources/PendingToolEditResource.php new file mode 100644 index 0000000..3760dfe --- /dev/null +++ b/app/Http/Resources/PendingToolEditResource.php @@ -0,0 +1,24 @@ + new UserResource($this->user), + 'created_at' => $this->created_at->toW3cString(), + ]; + } +} diff --git a/app/Http/Resources/TagResource.php b/app/Http/Resources/TagResource.php new file mode 100644 index 0000000..8fe65d7 --- /dev/null +++ b/app/Http/Resources/TagResource.php @@ -0,0 +1,29 @@ + $this->id, + + 'name' => $this->name, + 'slug' => $this->slug, + 'type' => $this->type, + 'description' => $this->getTranslation('description', App::getLocale()), + ]; + } +} diff --git a/app/Http/Resources/ToolIndexResource.php b/app/Http/Resources/ToolIndexResource.php index fec4302..721a817 100644 --- a/app/Http/Resources/ToolIndexResource.php +++ b/app/Http/Resources/ToolIndexResource.php @@ -4,14 +4,11 @@ namespace App\Http\Resources; -use App\Traits\Resources\WithImage; -use Illuminate\Http\Resources\Json\JsonResource; +use App\Enums\InstituteTool\Status; +use App\Helpers\Locale; -/** @extends JsonResource<\App\Models\Tool> */ -class ToolIndexResource extends JsonResource +class ToolIndexResource extends BaseToolIndexResource { - use WithImage; - /** * @param \Illuminate\Http\Request $request * @@ -19,14 +16,29 @@ class ToolIndexResource extends JsonResource */ public function toArray($request): array { - return [ - 'id' => $this->id, + $viewPermission = $this->institute_tool_id ? 'viewOur' : 'viewOther'; + + $data = [ + ...parent::toArray($request), - 'name' => $this->name, + 'description_short' => Locale::getLocalizedFieldValue($this->resource, 'description_short'), + 'total_experiences' => $this->experiences->count(), - 'categories' => $this->whenLoaded('categories', fn () => CategoryResource::collection($this->categories)), + 'permissions' => [ + 'view' => $request->user()->can($viewPermission, $this->resource), + ], + ]; + + if (!$this->institute_tool_id) { + return $data; + } - 'image_url' => $this->getImageUrl($this->image_filename, true), + return [ + ...$data, + 'institute' => [ + 'status' => $this->status_institute, + 'status_display' => Status::getTranslation($this->status_institute ?? Status::UNRATED), + ], ]; } } diff --git a/app/Http/Resources/ToolLogResource.php b/app/Http/Resources/ToolLogResource.php new file mode 100644 index 0000000..48a9488 --- /dev/null +++ b/app/Http/Resources/ToolLogResource.php @@ -0,0 +1,24 @@ + new UserResource($this->user), + 'created_at' => $this->created_at->toW3cString(), + ]; + } +} diff --git a/app/Http/Resources/ToolResource.php b/app/Http/Resources/ToolResource.php index 90686ca..674ad3b 100644 --- a/app/Http/Resources/ToolResource.php +++ b/app/Http/Resources/ToolResource.php @@ -4,10 +4,15 @@ namespace App\Http\Resources; +use App\Enums\Tags\TagTypes; +use App\Helpers\Country; +use App\Helpers\Format; +use App\Helpers\Locale; +use App\Models\Tool; use App\Traits\Resources\WithImage; use Illuminate\Http\Resources\Json\JsonResource; -/** @extends JsonResource<\App\Models\Tool> */ +/** @mixin \App\Models\Tool */ class ToolResource extends JsonResource { use WithImage; @@ -19,43 +24,67 @@ class ToolResource extends JsonResource */ public function toArray($request): array { + /** @var Tool $tool */ + $tool = $this->resource; + $shortDescription = Locale::getLocalizedFieldValue($tool, 'description_short'); + + $supplierCountry = $tool->supplier_country; + $dataProcessingLocation = $tool->tagsWithType(TagTypes::DATA_PROCESSING_LOCATIONS)->pluck('id'); + return [ - 'id' => $this->id, + 'id' => $tool->id, - 'name' => $this->name, - 'description_short' => $this->description_short, - 'description_short_display' => $this->description_short_display, - 'image_filename' => $this->image_filename, + 'name' => $tool->name, + 'supplier' => $tool->supplier, + 'supplier_url' => $tool->supplier_url, + 'description_short' => $shortDescription, + 'description_short_stripped_tags' => Format::asSimpleHtml($shortDescription), + 'features' => $tool->tagsWithType(TagTypes::FEATURES)->pluck('id'), + 'addons' => Locale::getLocalizedFieldValue($tool, 'addons'), + 'logo_filename' => $tool->logo_filename, + 'logo_url' => $this->getImageUrl($tool->logo_filename, true), + 'image_1_filename' => $this->image_1_filename, + 'image_1_url' => $this->getImageUrl($tool->image_1_filename), + 'image_2_filename' => $tool->image_2_filename, + 'image_2_url' => $this->getImageUrl($tool->image_2_filename), - 'supported_standards' => $this->supported_standards, - 'supported_standards_display' => $this->supported_standards_display, - 'additional_standards' => $this->additional_standards, + 'software_types' => $tool->tagsWithType(TagTypes::SOFTWARE_TYPES)->pluck('id'), + 'devices' => $tool->tagsWithType(TagTypes::DEVICES)->pluck('id'), - 'authentication_methods' => $this->authentication_methods, - 'authentication_methods_display' => $this->authentication_methods_display, + 'system_requirements' => Locale::getLocalizedFieldValue($tool, 'system_requirements'), - 'stored_data' => $this->stored_data, - 'stored_data_display' => $this->stored_data_display, - 'other_stored_data' => $this->other_stored_data, + 'standards' => $tool->tagsWithType(TagTypes::STANDARDS)->pluck('id'), + 'operating_systems' => $tool->tagsWithType(TagTypes::OPERATING_SYSTEMS)->pluck('id'), - 'european_data_storage' => $this->european_data_storage, - 'surf_standards_framework_agreed' => $this->surf_standards_framework_agreed, - 'has_processing_agreement' => $this->has_processing_agreement, + 'supplier_country' => $supplierCountry, + 'supplier_country_display' => $supplierCountry ? Country::getName($supplierCountry) : null, + 'personal_data' => Locale::getLocalizedFieldValue($tool, 'personal_data'), + 'data_processing_locations' => $dataProcessingLocation, + 'privacy_policy_url' => $tool->privacy_policy_url, + 'model_processor_agreement_url' => $tool->model_processor_agreement_url, + 'privacy_analysis' => $tool->privacy_analysis, + 'supplier_agrees_with_surf_standards' => $tool->supplier_agrees_with_surf_standards, + 'certifications' => $tool->tagsWithType(TagTypes::CERTIFICATIONS)->pluck('id'), + 'dtia_by_external_url' => $tool->dtia_by_external_url, + 'dpia_by_external_url' => $tool->dpia_by_external_url, + 'jurisdiction' => $tool->jurisdiction, - 'description_long_1' => $this->description_long_1, - 'description_long_1_display' => $this->description_long_1_display, - 'description_1_image_filename' => $this->description_1_image_filename, - 'description_long_2' => $this->description_long_2, - 'description_long_2_display' => $this->description_long_2_display, - 'description_2_image_filename' => $this->description_2_image_filename, + 'instructions_manual_1_url' => Locale::getLocalizedFieldValue($tool, 'instructions_manual_1_url'), + 'instructions_manual_2_url' => Locale::getLocalizedFieldValue($tool, 'instructions_manual_2_url'), + 'instructions_manual_3_url' => Locale::getLocalizedFieldValue($tool, 'instructions_manual_3_url'), + 'support_for_teachers' => Locale::getLocalizedFieldValue($tool, 'support_for_teachers'), + 'availability_surf' => $tool->availability_surf, + 'accessibility_facilities' => Locale::getLocalizedFieldValue($tool, 'accessibility_facilities'), + 'description_long' => Locale::getLocalizedFieldValue($tool, 'description_long'), + 'use_for_education' => Locale::getLocalizedFieldValue($tool, 'use_for_education'), - 'info_url' => $this->info_url, + 'working_methods' => $tool->tagsWithType(TagTypes::WORKING_METHODS)->pluck('id'), + 'target_groups' => $tool->tagsWithType(TagTypes::TARGET_GROUPS)->pluck('id'), + 'how_does_it_work' => Locale::getLocalizedFieldValue($tool, 'how_does_it_work'), - 'features' => $this->whenLoaded('features', fn () => FeatureResource::collection($this->features)), + 'complexity' => $tool->tagsWithType(TagTypes::COMPLEXITY)->pluck('id'), - 'image_url' => $this->getImageUrl($this->image_filename, true), - 'description_1_image_url' => $this->getImageUrl($this->description_1_image_filename), - 'description_2_image_url' => $this->getImageUrl($this->description_2_image_filename), + 'updated_at' => $tool->updated_at->toW3cString(), ]; } } diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php index 9183141..82b3781 100644 --- a/app/Http/Resources/UserResource.php +++ b/app/Http/Resources/UserResource.php @@ -4,12 +4,15 @@ namespace App\Http\Resources; -use App\Models\Category; +use App\Models\ContentPage; +use App\Models\CustomField; +use App\Models\Institute; +use App\Models\Tag; use App\Models\Tool; use Illuminate\Http\Resources\Json\JsonResource; use Modules\Way2Translate\Models\Translation; -/** @extends JsonResource<\App\Models\User> */ +/** @mixin \App\Models\User */ class UserResource extends JsonResource { /** @@ -31,13 +34,16 @@ public function toArray($request): array 'roles' => $this->getRoles(), 'permissions' => [ - 'manageCategories' => $this->can('viewAll', Category::class), - 'manageOurTools' => $this->can('manageOur', Tool::class), - 'manageTranslations' => $this->can('viewAny', Translation::class), + 'manageCustomFields' => $this->can('viewAll', CustomField::class), + 'manageOurTools' => $this->can('manageOur', Tool::class), + 'manageTranslations' => $this->can('viewAny', Translation::class), + 'managePages' => $this->can('canManage', ContentPage::class), + 'impersonateInstitutes' => $this->can('impersonate', Institute::class), - 'viewAllTools' => $this->can('viewAll', Tool::class), - 'viewAllOurTools' => $this->can('viewAllOur', Tool::class), - 'viewAllOtherTools' => $this->can('viewAllOther', Tool::class), + 'viewAllTools' => $this->can('viewAll', Tool::class), + 'viewAllToolsWithinInstitute' => $this->can('viewAllWithinInstitute', Tool::class), + + 'viewAllTags' => $this->can('viewAll', Tag::class), ], ]; } diff --git a/app/Http/ViewComposers/AppComposer.php b/app/Http/ViewComposers/AppComposer.php index fa09c17..b25350c 100644 --- a/app/Http/ViewComposers/AppComposer.php +++ b/app/Http/ViewComposers/AppComposer.php @@ -6,7 +6,6 @@ use App\Helpers\Auth; use Illuminate\View\View; -use Modules\Way2Translate\Helpers\Js; use Modules\Way2Translate\Models\Locale; class AppComposer @@ -19,7 +18,8 @@ public function compose(View $view): void $this->data = [ 'activeLocales' => Locale::getActive()->sortBy('native'), 'currentUser' => Auth::user(), - 'langJsUrl' => Js::getLangUrl(), + 'langJsUrl' => route('way2translate.lang'), + 'piwikKey' => config('constants.piwik_key'), ]; } diff --git a/app/Mail/BaseMailable.php b/app/Mail/BaseMailable.php new file mode 100644 index 0000000..726f534 --- /dev/null +++ b/app/Mail/BaseMailable.php @@ -0,0 +1,20 @@ +queue = config('mail.queue_name'); + } +} diff --git a/app/Mail/InstituteToolNotificationMail.php b/app/Mail/InstituteToolNotificationMail.php new file mode 100644 index 0000000..46dc51e --- /dev/null +++ b/app/Mail/InstituteToolNotificationMail.php @@ -0,0 +1,53 @@ +subject = $subject; + } + + public function envelope(): Envelope + { + return new Envelope( + replyTo: $this->sender->email, + subject: $this->subject, + ); + } + + public function content(): Content + { + return new Content( + markdown: 'emails.institute-tool-notification', + with: [ + 'message' => $this->message, + 'tool' => $this->tool, + 'sender' => $this->sender, + 'url' => $this->getPublicToolUrl(), + ] + ); + } + + private function getPublicToolUrl(): string + { + if ($this->tool->isPublishedForInstitute($this->sender->institute)) { + return route('our.tool.show', $this->tool); + } + + return route('other.tool.show', $this->tool); + } +} diff --git a/app/Mail/RequestForChange.php b/app/Mail/RequestForChange.php new file mode 100644 index 0000000..62235c3 --- /dev/null +++ b/app/Mail/RequestForChange.php @@ -0,0 +1,50 @@ +tool->name, + ); + } + + public function content(): Content + { + return new Content( + markdown:'mailable.request-for-change', + with: [ + 'tool' => $this->tool, + 'user' => $this->user, + 'requestForChange' => $this->requestForChange, + 'urlToTool' => $this->getUrlToTool(), + ], + ); + } + + private function getUrlToTool(): string + { + return route( + $this->tool->isPublishedForInstitute($this->user->institute) ? 'our.tool.show' : 'other.tool.show', + $this->tool + ); + } +} diff --git a/app/Mail/ToolUpdated.php b/app/Mail/ToolUpdated.php new file mode 100644 index 0000000..25c9866 --- /dev/null +++ b/app/Mail/ToolUpdated.php @@ -0,0 +1,36 @@ + $this->tool->name, + ]) + ); + } + + public function content(): Content + { + return new Content( + markdown: 'mailable.tool-updated', + with: [ + 'tool' => $this->tool, + ], + ); + } +} diff --git a/app/Models/ConceptCustomFieldValue.php b/app/Models/ConceptCustomFieldValue.php new file mode 100644 index 0000000..6e9a7a3 --- /dev/null +++ b/app/Models/ConceptCustomFieldValue.php @@ -0,0 +1,21 @@ +belongsTo(CustomField::class); + } +} diff --git a/app/Models/ConceptInstituteTool.php b/app/Models/ConceptInstituteTool.php new file mode 100644 index 0000000..2678273 --- /dev/null +++ b/app/Models/ConceptInstituteTool.php @@ -0,0 +1,131 @@ + */ + protected $fillable = [ + 'status', + 'conditions_en', + 'conditions_nl', + + 'links_with_other_tools_en', + 'links_with_other_tools_nl', + 'sla_url', + + 'privacy_contact', + 'privacy_evaluation_url', + 'security_evaluation_url', + 'data_classification', + + 'how_to_login_en', + 'how_to_login_nl', + 'availability_en', + 'availability_nl', + 'licensing_en', + 'licensing_nl', + 'request_access_en', + 'request_access_nl', + 'instructions_en', + 'instructions_nl', + 'instructions_manual_1_url', + 'instructions_manual_2_url', + 'instructions_manual_3_url', + + 'faq_en', + 'faq_nl', + 'examples_of_usage_en', + 'examples_of_usage_nl', + 'additional_info_heading_en', + 'additional_info_heading_nl', + 'additional_info_text_en', + 'additional_info_text_nl', + + 'why_unfit_en', + 'why_unfit_nl', + ]; + + public static string $disk = 'tools'; + + public function categories(): Collection + { + return $this->tagsWithType(TagTypes::CATEGORIES); + } + + public function originalVersion(): BelongsTo + { + return $this->belongsTo(InstituteTool::class, 'institute_tool_id'); + } + + public function customFields(): BelongsToMany + { + return $this + ->belongsToMany(CustomField::class, 'concept_custom_field_values') + ->withTimestamps() + ->withPivot([ + 'value_en', + 'value_nl', + ]); + } + + public function getAllCustomFields(): Collection + { + return $this + ->originalVersion + ->institute + ->customFields + ->keyBy('id') + ->merge($this->customFields->keyBy('id')); + } + + public function getIsPublishedAttribute(): bool + { + return !empty($this->originalVersion->published_at); + } + + public function getStatusDisplayAttribute(): string + { + if (!$this->is_published) { + return Status::UNPUBLISHED; + } + + if ($this->status === null) { + return Status::UNRATED; + } + + return $this->status; + } + + public function alternativeTools(): BelongsToMany + { + return $this->belongsToMany(Tool::class, 'alternative_concept_institute_tools'); + } + + public function prohibitedAlternativeTools(): BelongsToMany + { + return $this->alternativeTools()->whereHas('instituteTools', function (Builder $builder): Builder { + return $builder->where('status', '=', Status::DISALLOWED); + }); + } + + public function allowedAlternativeTools(): BelongsToMany + { + return $this->alternativeTools()->whereHas('instituteTools', function (Builder $builder): Builder { + return $builder->whereIn('status', [Status::ALLOWED, Status::ALLOWED_UNDER_CONDITIONS]); + }); + } +} diff --git a/app/Models/ConceptTool.php b/app/Models/ConceptTool.php new file mode 100644 index 0000000..f5051f0 --- /dev/null +++ b/app/Models/ConceptTool.php @@ -0,0 +1,129 @@ + */ + protected $fillable = [ + 'name', + 'supplier', + 'supplier_url', + 'description_short_en', + 'description_short_nl', + 'addons_en', + 'addons_nl', + + 'system_requirements_en', + 'system_requirements_nl', + + 'supplier_country', + 'personal_data_en', + 'personal_data_nl', + 'privacy_policy_url', + 'model_processor_agreement_url', + 'privacy_analysis', + 'supplier_agrees_with_surf_standards', + 'dtia_by_external_url', + 'dpia_by_external_url', + 'jurisdiction', + + 'instructions_manual_1_url_en', + 'instructions_manual_1_url_nl', + 'instructions_manual_2_url_en', + 'instructions_manual_2_url_nl', + 'instructions_manual_3_url_en', + 'instructions_manual_3_url_nl', + 'support_for_teachers_en', + 'support_for_teachers_nl', + 'availability_surf', + 'accessibility_facilities_en', + 'accessibility_facilities_nl', + + 'description_long_en', + 'description_long_nl', + 'use_for_education_en', + 'use_for_education_nl', + 'how_does_it_work_en', + 'how_does_it_work_nl', + ]; + + /** @var array */ + protected $casts = [ + 'published_at' => 'datetime', + ]; + + public static string $disk = 'tools'; + + /** @var array */ + public static array $images = [ + 'logo_filename', + 'image_1_filename', + 'image_2_filename', + ]; + + public function originalVersion(): BelongsTo + { + return $this->belongsTo(Tool::class, 'tool_id'); + } + + public function features(): Collection + { + return $this->tagsWithType(TagTypes::FEATURES); + } + + public function softwareType(): Collection + { + return $this->tagsWithType(TagTypes::SOFTWARE_TYPES); + } + + public function devices(): Collection + { + return $this->tagsWithType(TagTypes::DEVICES); + } + + public function standards(): Collection + { + return $this->tagsWithType(TagTypes::STANDARDS); + } + + public function operatingSystem(): Collection + { + return $this->tagsWithType(TagTypes::OPERATING_SYSTEMS); + } + + public function dataProcessingLocation(): Collection + { + return $this->tagsWithType(TagTypes::DATA_PROCESSING_LOCATIONS); + } + + public function certification(): Collection + { + return $this->tagsWithType(TagTypes::CERTIFICATIONS); + } + + public function workingMethods(): Collection + { + return $this->tagsWithType(TagTypes::WORKING_METHODS); + } + + public function targetGroup(): Collection + { + return $this->tagsWithType(TagTypes::TARGET_GROUPS); + } + + public function complexity(): Collection + { + return $this->tagsWithType(TagTypes::COMPLEXITY); + } +} diff --git a/app/Models/ContentPage.php b/app/Models/ContentPage.php new file mode 100644 index 0000000..73d3dd2 --- /dev/null +++ b/app/Models/ContentPage.php @@ -0,0 +1,21 @@ +belongsTo(Institute::class); + } + + public function scopeForInstitute(Builder $query, Institute $institute): Builder + { + return $query->where('institute_id', $institute->id); + } +} diff --git a/app/Models/CustomFieldValue.php b/app/Models/CustomFieldValue.php new file mode 100644 index 0000000..5e8a9af --- /dev/null +++ b/app/Models/CustomFieldValue.php @@ -0,0 +1,29 @@ +belongsTo(CustomField::class); + } + + public function instituteTool(): BelongsTo + { + return $this->belongsTo(InstituteTool::class); + } +} diff --git a/app/Models/Experience.php b/app/Models/Experience.php index 5b185c4..a6bdf79 100644 --- a/app/Models/Experience.php +++ b/app/Models/Experience.php @@ -8,28 +8,29 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; class Experience extends Model { use HasFactory, LogsActivity; - /** @var array */ + /** @var array */ protected $fillable = [ - 'rating', 'title', 'message', ]; - protected static array $logAttributes = ['*']; - - protected static array $logAttributesToIgnore = [ - 'updated_at', - ]; - - protected static bool $logOnlyDirty = true; - - protected static bool $submitEmptyLogs = false; + public function getActivitylogOptions(): LogOptions + { + return LogOptions::defaults() + ->logAll() + ->logExcept([ + 'updated_at', + ]) + ->logOnlyDirty() + ->dontSubmitEmptyLogs(); + } public function user(): BelongsTo { @@ -43,6 +44,6 @@ public function tool(): BelongsTo public function getMessageDisplayAttribute(): string { - return Format::stripTagsAndConvertNewlineToHtml($this->message); + return Format::asSimpleHtml($this->message); } } diff --git a/app/Models/Institute.php b/app/Models/Institute.php index 1098b63..f03bdf2 100644 --- a/app/Models/Institute.php +++ b/app/Models/Institute.php @@ -4,41 +4,54 @@ namespace App\Models; +use App\Enums\InstituteTool\Status as InstituteToolStatus; +use App\Enums\Tags\TagTypes; +use App\Helpers\Locale; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; class Institute extends Model { use HasFactory, LogsActivity; - /** @var array */ + /** @var array */ protected $fillable = [ - 'full_name', + 'full_name_en', + 'full_name_nl', 'short_name', 'domain', 'logo_square_filename', 'logo_full_filename', 'banner_filename', + 'homepage_title_en', + 'homepage_body_en', + 'homepage_title_nl', + 'homepage_body_nl', ]; - protected static array $logAttributes = ['*']; - - protected static array $logAttributesToIgnore = [ - 'updated_at', - ]; - - protected static bool $logOnlyDirty = true; - - protected static bool $submitEmptyLogs = false; - public static string $disk = 'institutes'; - public function categories(): HasMany + public function getActivitylogOptions(): LogOptions { - return $this->hasMany(Category::class); + return LogOptions::defaults() + ->logAll() + ->logExcept([ + 'updated_at', + ]) + ->logOnlyDirty() + ->dontSubmitEmptyLogs(); + } + + /** @return Collection */ + public function categories(): Collection + { + return Tag::whereType(TagTypes::CATEGORIES)->where('institute_id', $this->id)->get(); } public function users(): HasMany @@ -46,47 +59,40 @@ public function users(): HasMany return $this->hasMany(User::class); } + public function customFields(): HasMany + { + return $this->hasMany(CustomField::class); + } + public function tools(): BelongsToMany { return $this ->belongsToMany(Tool::class) ->whereNotNull('tools.published_at') ->withTimestamps() - ->using(InstituteTool::class) ->withPivot([ - 'alternative_tool_id', - 'description_1', - 'description_1_image_filename', - 'description_2', - 'description_2_image_filename', - 'extra_information_title', - 'extra_information', - 'support_title_1', - 'support_email_1', - 'support_title_2', - 'support_email_2', - 'manual_title_1', - 'manual_url_1', - 'manual_title_2', - 'manual_url_2', - 'video_title_1', - 'video_url_1', - 'video_title_2', - 'video_url_2', 'status', - 'why_unfit', 'published_at', + 'updated_at', ]); } - public function toolsWithCategories(): BelongsToMany + public function scopeUsingTool(Builder $query, Tool $tool): Builder { - return $this->tools()->with(['categories' => fn ($categories) => $categories->forInstitute($this)]); + $publishedInstituteTools = InstituteTool::where('tool_id', $tool->id) + ->whereIn('status', [ + InstituteToolStatus::ALLOWED, + InstituteToolStatus::ALLOWED_UNDER_CONDITIONS, + ]) + ->whereNotNull('published_at') + ->pluck('institute_id'); + + return $query->whereIn('id', $publishedInstituteTools); } public function publishedToolsWithCategories(): BelongsToMany { - return $this->toolsWithCategories()->wherePivotNotNull('published_at'); + return $this->tools()->wherePivotNotNull('published_at'); } public function hasTool(Tool $tool): bool @@ -94,11 +100,8 @@ public function hasTool(Tool $tool): bool return $this->tools()->where('tools.id', $tool->id)->exists(); } - public function hasPublishedTool(Tool $tool): bool + public function getFullNameAttribute(): string { - return $this->tools() - ->where('tools.id', $tool->id) - ->wherePivotNotNull('published_at') - ->exists(); + return Locale::getLocalizedFieldValue($this, 'full_name'); } } diff --git a/app/Models/InstituteTool.php b/app/Models/InstituteTool.php index 3b4d30a..7d3e311 100644 --- a/app/Models/InstituteTool.php +++ b/app/Models/InstituteTool.php @@ -4,54 +4,106 @@ namespace App\Models; +use App\Actions\Institute\Tool\Concept\CreateAction as CreateConceptAction; use App\Enums\InstituteTool\Status; -use App\Helpers\Format; +use App\Enums\Tags\TagTypes; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\Pivot; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Support\Collection; +use Spatie\Tags\HasTags; -class InstituteTool extends Pivot +class InstituteTool extends Model { - use HasFactory; + use HasFactory, HasTags; /** @var bool */ public $incrementing = true; - /** @var array */ + protected $table = 'institute_tool'; + + /** @var array */ protected $fillable = [ 'alternative_tool_id', - 'description_1', - 'description_2', - 'extra_information_title', - 'extra_information', - 'support_title_1', - 'support_email_1', - 'support_title_2', - 'support_email_2', - 'manual_title_1', - 'manual_url_1', - 'manual_title_2', - 'manual_url_2', - 'video_title_1', - 'video_url_1', - 'video_title_2', - 'video_url_2', + 'status', - 'why_unfit', + 'conditions_en', + 'conditions_nl', + + 'links_with_other_tools_en', + 'links_with_other_tools_nl', + 'sla_url', + + 'privacy_contact', + 'privacy_evaluation_url', + 'security_evaluation_url', + 'data_classification', + + 'how_to_login_en', + 'how_to_login_nl', + 'availability_en', + 'availability_nl', + 'licensing_en', + 'licensing_nl', + 'request_access_en', + 'request_access_nl', + 'instructions_en', + 'instructions_nl', + 'instructions_manual_1_url', + 'instructions_manual_2_url', + 'instructions_manual_3_url', + + 'faq_en', + 'faq_nl', + 'examples_of_usage_en', + 'examples_of_usage_nl', + 'additional_info_heading_en', + 'additional_info_heading_nl', + 'additional_info_text_en', + 'additional_info_text_nl', + + 'why_unfit_en', + 'why_unfit_nl', + 'published_at', ]; - /** @var array */ + /** @var array */ protected $casts = [ 'published_at' => 'datetime', ]; - public static string $disk = 'tools'; + public static function getSearchFields(): array + { + return [ + 'privacy_contact', + ...self::getLocalizedFields(), + ]; + } - public static array $images = [ - 'description_1_image_filename', - 'description_2_image_filename', - ]; + public static function getLocalizedFields(): array + { + return [ + 'conditions', + 'links_with_other_tools', + 'how_to_login', + 'availability', + 'licensing', + 'instructions', + 'faq', + 'examples_of_usage', + 'additional_info_text', + 'why_unfit', + ]; + } + + public function categories(): Collection + { + return $this->tagsWithType(TagTypes::CATEGORIES); + } public function institute(): BelongsTo { @@ -63,11 +115,37 @@ public function tool(): BelongsTo return $this->belongsTo(Tool::class); } + public function concept(): HasOne + { + return $this->hasOne(ConceptInstituteTool::class, 'institute_tool_id'); + } + public function alternativeTool(): BelongsTo { return $this->belongsTo(Tool::class, 'alternative_tool_id'); } + public function customFields(): BelongsToMany + { + return $this + ->belongsToMany(CustomField::class, 'custom_field_values') + ->withTimestamps() + ->withPivot([ + 'value_en', + 'value_nl', + ]); + } + + public function scopeForTool(Builder $query, Tool $tool): Builder + { + return $query->where('tool_id', $tool->id); + } + + public function scopeForInstitute(Builder $query, Institute $institute): Builder + { + return $query->where('institute_id', $institute->id); + } + public function getIsPublishedAttribute(): bool { return !empty($this->published_at); @@ -86,23 +164,37 @@ public function getStatusDisplayAttribute(): string return $this->status; } - public function getDescription1DisplayAttribute(): string + public function getOrCreateConceptVersion(): ConceptInstituteTool { - return Format::stripTagsAndConvertNewlineToHtml($this->description_1); + $concept = $this->concept; + if ($concept === null) { + (new CreateConceptAction())->execute($this->tool, $this->institute); + + $concept = $this->refresh()->concept; + } + + return $concept; } - public function getDescription2DisplayAttribute(): string + public function alternativeTools(): BelongsToMany { - return Format::stripTagsAndConvertNewlineToHtml($this->description_2); + return $this->belongsToMany( + Tool::class, + 'alternative_tool_institute_tools', + ); } - public function getExtraInformationDisplayAttribute(): string + public function prohibitedAlternativeTools(): BelongsToMany { - return Format::stripTagsAndConvertNewlineToHtml($this->extra_information); + return $this->alternativeTools()->whereHas('instituteTools', function (Builder $builder): Builder { + return $builder->where('status', '=', Status::DISALLOWED); + }); } - public function getWhyUnfitDisplayAttribute(): string + public function allowedAlternativeTools(): BelongsToMany { - return Format::stripTagsAndConvertNewlineToHtml($this->why_unfit); + return $this->alternativeTools()->whereHas('instituteTools', function (Builder $builder): Builder { + return $builder->whereIn('status', [Status::ALLOWED, Status::ALLOWED_UNDER_CONDITIONS]); + }); } } diff --git a/app/Models/PendingToolEdit.php b/app/Models/PendingToolEdit.php new file mode 100644 index 0000000..03da85d --- /dev/null +++ b/app/Models/PendingToolEdit.php @@ -0,0 +1,66 @@ + */ + protected $fillable = []; + + public function tool(): BelongsTo + { + return $this->belongsTo(Tool::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function institute(): BelongsTo + { + return $this->belongsTo(Institute::class); + } + + public function scopeRecent(Builder $query): Builder + { + $maximumAgeMinutes = config('session.lifetime'); + + return $query->where('created_at', '>=', Carbon::now()->subMinutes($maximumAgeMinutes)); + } + + public function scopeForUser(Builder $query, User $user): Builder + { + return $query->where('user_id', $user->id); + } + + public function scopeNotForUser(Builder $query, User $user): Builder + { + return $query->where('user_id', '!=', $user->id); + } + + public function scopeForTool(Builder $query, Tool $tool): Builder + { + return $query->where('tool_id', $tool->id); + } + + public function scopeForInstitute(Builder $query, Institute $institute): Builder + { + return $query->where('institute_id', $institute->id); + } + + public function scopeMissingInstitute(Builder $query): Builder + { + return $query->whereNull('institute_id'); + } +} diff --git a/app/Models/Scopes/DefaultSortScope.php b/app/Models/Scopes/DefaultSortScope.php new file mode 100644 index 0000000..4989474 --- /dev/null +++ b/app/Models/Scopes/DefaultSortScope.php @@ -0,0 +1,24 @@ +orderBy($this->sortField); + } +} diff --git a/app/Models/Tag.php b/app/Models/Tag.php new file mode 100644 index 0000000..4fcb9ca --- /dev/null +++ b/app/Models/Tag.php @@ -0,0 +1,53 @@ +belongsTo(Institute::class); + } + + public function scopeWithoutInstitute(Builder $query): void + { + $query->whereNull('institute_id'); + } + + public function scopeForInstitute(Builder $query, Institute $institute): void + { + $query->where('institute_id', $institute->id); + } + + public function scopeAccessibleForInstitute(Builder $query, Institute $institute): void + { + $query->where(function (Builder $query) use ($institute): void { + $query->withoutInstitute(); + $query->orWhere(fn (Builder $query) => $query->forInstitute($institute)); + }); + } + + public function scopeWhereSlug(Builder $query, string $slug, string $locale): void + { + $query->where("slug->{$locale}", $slug); + } + + public function scopeWhereSlugIn(Builder $query, array $slugs, string $locale): void + { + $query->whereIn("slug->{$locale}", $slugs); + } +} diff --git a/app/Models/Tool.php b/app/Models/Tool.php index 50ffb0c..9862647 100644 --- a/app/Models/Tool.php +++ b/app/Models/Tool.php @@ -4,85 +4,176 @@ namespace App\Models; -use App\Casts\ArrayNotNull; +use App\Actions\Tool\Concept\CreateAction as CreateConceptAction; use App\Enums\InstituteTool\Status as InstituteToolStatus; +use App\Enums\Tags\TagTypes; use App\Enums\Tool\Status; -use App\Enums\Tool\StoredData; -use App\Helpers\Format; +use App\Traits\Models\SearchesLocalizedFields; use Exception; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Support\Collection; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Query\JoinClause; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\DB; +use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; +use Spatie\Tags\HasTags; +/** + * @SuppressWarnings(PHPMD.TooManyPublicMethods) + * @SuppressWarnings(PHPMD.TooManyMethods) + */ class Tool extends Model { - use HasFactory, LogsActivity; + use HasFactory, LogsActivity, SearchesLocalizedFields, HasTags; - /** @var array */ + /** @var array */ protected $fillable = [ 'name', - 'description_short', - 'description_long_1', - 'description_long_2', - 'info_url', - 'supported_standards', - 'additional_standards', - 'authentication_methods', - 'stored_data', - 'other_stored_data', - 'european_data_storage', - 'surf_standards_framework_agreed', - 'has_processing_agreement', + 'supplier', + 'supplier_url', + 'description_short_en', + 'description_short_nl', + 'addons_en', + 'addons_nl', + + 'system_requirements_en', + 'system_requirements_nl', + + 'supplier_country', + 'personal_data_en', + 'personal_data_nl', + 'privacy_policy_url', + 'model_processor_agreement_url', + 'privacy_analysis', + 'supplier_agrees_with_surf_standards', + 'dtia_by_external_url', + 'dpia_by_external_url', + 'jurisdiction', + + 'instructions_manual_1_url_en', + 'instructions_manual_1_url_nl', + 'instructions_manual_2_url_en', + 'instructions_manual_2_url_nl', + 'instructions_manual_3_url_en', + 'instructions_manual_3_url_nl', + 'support_for_teachers_en', + 'support_for_teachers_nl', + 'availability_surf', + 'accessibility_facilities_en', + 'accessibility_facilities_nl', + + 'description_long_en', + 'description_long_nl', + 'use_for_education_en', + 'use_for_education_nl', + 'how_does_it_work_en', + 'how_does_it_work_nl', ]; - /** @var array */ + /** @var array */ protected $casts = [ - 'supported_standards' => ArrayNotNull::class, - 'authentication_methods' => ArrayNotNull::class, - 'stored_data' => ArrayNotNull::class, - 'european_data_storage' => 'boolean', - 'surf_standards_framework_agreed' => 'boolean', - 'has_processing_agreement' => 'boolean', - 'published_at' => 'datetime', + 'published_at' => 'datetime', ]; - protected static array $logAttributes = ['*']; + public static string $disk = 'tools'; - protected static array $logAttributesToIgnore = [ - 'updated_at', + /** @var array */ + public static array $images = [ + 'logo_filename', + 'image_1_filename', + 'image_2_filename', ]; - protected static bool $logOnlyDirty = true; + public static function getSearchFields(): array + { + return [ + 'name', + ...self::getLocalizedFields(), + ]; + } - protected static bool $submitEmptyLogs = false; + public static function getLocalizedFields(): array + { + return [ + 'addons', + 'system_requirements', + 'instructions_manual_1_url', + 'instructions_manual_2_url', + 'instructions_manual_3_url', + 'support_for_teachers', + 'accessibility_facilities', + 'use_for_education', + 'how_does_it_work', + 'description_short', + 'description_long', + ]; + } - public static string $disk = 'tools'; + public function getActivitylogOptions(): LogOptions + { + return LogOptions::defaults() + ->logAll() + ->logExcept([ + 'updated_at', + ]) + ->logOnlyDirty() + ->dontSubmitEmptyLogs(); + } - public static array $images = [ - 'image_filename', - 'description_1_image_filename', - 'description_2_image_filename', - ]; + public function features(): Collection + { + return $this->tagsWithType(TagTypes::FEATURES); + } - public static array $searchFields = [ - 'name', - 'description_short', - 'description_long_1', - 'description_long_2', - ]; + public function softwareType(): Collection + { + return $this->tagsWithType(TagTypes::SOFTWARE_TYPES); + } + + public function devices(): Collection + { + return $this->tagsWithType(TagTypes::DEVICES); + } + + public function standards(): Collection + { + return $this->tagsWithType(TagTypes::STANDARDS); + } + + public function operatingSystem(): Collection + { + return $this->tagsWithType(TagTypes::OPERATING_SYSTEMS); + } + + public function dataProcessingLocation(): Collection + { + return $this->tagsWithType(TagTypes::DATA_PROCESSING_LOCATIONS); + } + + public function certification(): Collection + { + return $this->tagsWithType(TagTypes::CERTIFICATIONS); + } + + public function workingMethods(): Collection + { + return $this->tagsWithType(TagTypes::WORKING_METHODS); + } - public function features(): BelongsToMany + public function targetGroup(): Collection { - return $this->belongsToMany(Feature::class); + return $this->tagsWithType(TagTypes::TARGET_GROUPS); } - public function categories(): BelongsToMany + public function complexity(): Collection { - return $this->belongsToMany(Category::class, 'tool_categories')->withTimestamps(); + return $this->tagsWithType(TagTypes::COMPLEXITY); } public function experiences(): HasMany @@ -90,102 +181,123 @@ public function experiences(): HasMany return $this->hasMany(Experience::class); } + public function concept(): HasOne + { + return $this->hasOne(ConceptTool::class); + } + + public function followers(): BelongsToMany + { + return $this + ->belongsToMany(User::class, 'tool_followers') + ->withTimestamps(); + } + public function institutes(): BelongsToMany { return $this ->belongsToMany(Institute::class) ->withTimestamps() - ->using(InstituteTool::class) ->withPivot([ - 'alternative_tool_id', - 'description_1', - 'description_1_image_filename', - 'description_2', - 'description_2_image_filename', - 'extra_information_title', - 'extra_information', - 'support_title_1', - 'support_email_1', - 'support_title_2', - 'support_email_2', - 'manual_title_1', - 'manual_url_1', - 'manual_title_2', - 'manual_url_2', - 'video_title_1', - 'video_url_1', - 'video_title_2', - 'video_url_2', 'status', - 'why_unfit', 'published_at', ]); } - public function institutesThatUseTool(): BelongsToMany - { - return $this->institutes()->wherePivotIn('status', [ - InstituteToolStatus::RECOMMENDED, - InstituteToolStatus::SUPPORTED, - InstituteToolStatus::FREE_TO_USE, - ])->wherePivotNotNull('published_at'); - } - - public static function forOtherThan(Institute $institute): Builder + public function instituteTools(): HasMany { - return self::forStatus(Status::PUBLISHED)->exceptForInstitute($institute); + return $this->hasMany(InstituteTool::class); } - public static function forOur(Institute $institute): BelongsToMany | Builder + public static function forOur(Institute $institute): Builder|BelongsToMany { return $institute->publishedToolsWithCategories()->forStatus(Status::PUBLISHED); } - public function scopeSearch(Builder $query, string $searchTerm): void + public function scopeSearch(Builder $query, ?string $searchTerm): void { - (new Collection(explode(' ', $searchTerm))) - ->filter() - ->each(fn ($word) => $query->searchForWord($word)); - } + if ($searchTerm === null) { + return; + } - public function scopeSearchForWord(Builder $query, string $word): void - { - $query->where(function ($query) use ($word): void { - $word = '%' . $word . '%'; + $query->where(function (Builder $query) use ($searchTerm): void { + foreach (self::getSearchFields() as $searchField) { + if (in_array($searchField, self::getLocalizedFields())) { + $query->orWhere(fn ($query) => $query->searchLocalizedField($searchField, $searchTerm, 'tools')); + } else { + $query->orWhere($searchField, 'LIKE', '%' . $searchTerm . '%'); + } + } - foreach (self::$searchFields as $searchField) { - $query->orWhere($searchField, 'like', $word); + foreach (InstituteTool::getSearchFields() as $searchField) { + if (in_array($searchField, InstituteTool::getLocalizedFields())) { + $query->orWhere( + fn ($query) => $query->searchLocalizedField($searchField, $searchTerm, 'institute_tool') + ); + } else { + $query->orWhere('institute_tool.' . $searchField, 'LIKE', '%' . $searchTerm . '%'); + } } }); } - public function scopeForFeatures(Builder $query, array $features): void + public function scopeForCategory(Builder $query, string $categoryId): void { - $query->whereHas('features', function ($query) use ($features): void { - $query->whereIn('features.id', $features); + $query->whereHas('instituteTools', function (Builder $query) use ($categoryId): void { + $query->whereHas('tags', function (Builder $query) use ($categoryId): void { + $query->where('id', $categoryId); + }); }); } - public function scopeForCategories(Builder $query, array $categories): void + public function scopeForFeature(Builder $query, string $featureTagId): void { - $query->whereHas('categories', function ($query) use ($categories): void { - $query->whereIn('categories.id', $categories); + $query->whereHas('tags', function (Builder $query) use ($featureTagId): void { + $query->where('id', $featureTagId); }); } - public function scopeForCategory(Builder $query, int $category): void + public function scopeForTags(Builder $query, Institute $institute, ?array $tags): void { - $query->forCategories([$category]); + if (empty($tags)) { + return; + } + + $tags = Tag::whereIn('id', $tags)->get(); + + $query->where(function (Builder $query) use ($institute, $tags): void { + $query->forTagsOfInstituteTools($institute, $tags->whereIn('type', TagTypes::forInstituteTool())); + $query->forTagsOfTools($tags->whereIn('type', TagTypes::forTool())); + }); } - public function scopeExceptForInstitute(Builder $query, Institute $institute): void + public function scopeForTagsOfInstituteTools(Builder $query, Institute $institute, Collection $tags): void { - $query->whereDoesntHave('institutes', function ($query) use ($institute): void { - $query->where('institutes.id', $institute->id); - $query->whereNotNull('institute_tool.published_at'); + if ($tags->isEmpty()) { + return; + } + + $query->whereHas('instituteTools', function (Builder $query) use ($institute, $tags): void { + $query + ->where('institute_id', $institute->id) + ->whereNotNull('published_at') + ->whereHas('tags', function (Builder $query) use ($tags): void { + $query->whereIn('id', $tags->pluck('id')); + }, '=', $tags->count()); }); } + public function scopeForTagsOfTools(Builder $query, Collection $tags): void + { + if ($tags->isEmpty()) { + return; + } + + $query->whereHas('tags', function (Builder $query) use ($tags): void { + $query->whereIn('id', $tags->pluck('id')); + }, '=', $tags->count()); + } + public function scopeForStatus(Builder $query, string $status): void { switch ($status) { @@ -200,13 +312,6 @@ public function scopeForStatus(Builder $query, string $status): void } } - public function getRatingAttribute(): float - { - $rating = $this->experiences->average('rating') ?? 0; - - return round($rating, 0); - } - public function getStatusAttribute(): string { return $this->published_at ? Status::PUBLISHED : Status::CONCEPT; @@ -222,76 +327,80 @@ public function getIsPublishedAttribute(): bool return !empty($this->published_at); } - public function getDescriptionShortDisplayAttribute(): string + /** @return Collection */ + public function getAvailableAlternativeTools(Institute $institute): Collection { - return Format::stripTagsAndConvertNewlineToHtml($this->description_short); - } + /** @var Collection $result */ + $result = self::forOur($institute) + ->whereKeyNot($this->id) + ->whereDoesntHave('institutes', function ($query) use ($institute): void { + $query->where('institutes.id', $institute->id); + $query->where('institute_tool.status', InstituteToolStatus::DISALLOWED); + }) + ->get(); - public function getDescriptionLong1DisplayAttribute(): string - { - return Format::stripTagsAndConvertNewlineToHtml($this->description_long_1); + return $result; } - public function getDescriptionLong2DisplayAttribute(): string + public function isPublishedForInstitute(Institute $institute): bool { - return Format::stripTagsAndConvertNewlineToHtml($this->description_long_2); + return InstituteTool::forTool($this)->forInstitute($institute)->whereNotNull('published_at')->exists(); } - public function getSupportedStandardsDisplayAttribute(): string + public function getCurrentPendingEdit(User $ignoreUser, Institute $forInstitute = null): ?PendingToolEdit { - $translated = array_map( - fn ($item) => trans('tool.supported_standards.' . $item), - $this->supported_standards - ); - - return implode(', ', $translated); + return PendingToolEdit::forTool($this) + ->when($forInstitute === null, fn ($query) => $query->missingInstitute()) + ->when($forInstitute !== null, fn ($query) => $query->forInstitute($forInstitute)) + ->notForUser($ignoreUser) + ->recent() + ->oldest() + ->first(); } - public function getAuthenticationMethodsDisplayAttribute(): string + public function getOrCreateConceptVersion(): ConceptTool { - $translated = array_map( - fn ($item) => trans('tool.authentication_methods.' . $item), - $this->authentication_methods - ); + $concept = $this->concept; + if ($concept === null) { + (new CreateConceptAction())->execute($this); - return implode(', ', $translated); + $concept = $this->refresh()->concept; + } + + return $concept; } - public function getStoredDataDisplayAttribute(): string + public static function getToolsQueryForOverview(Institute $institute, array $tagFilter, string $searchTerm): Builder { - $storedData = $this->stored_data; - $otherIndex = array_search(StoredData::OTHER, $storedData); - - // If "Other" has been selected, we remove it from the list in order to replace it - if ($otherIndex !== false) { - unset($storedData[$otherIndex]); + $statuses = implode(', ', Arr::map(InstituteToolStatus::customOrder(), fn ($status) => "'$status'")); + $query = self::select([ + 'tools.*', + 'institute_tool.id AS institute_tool_id', + 'institute_tool.status as status_institute', + ]) + ->leftJoin('institute_tool', function (JoinClause $join) use ($institute): void { + $join + ->on('institute_tool.tool_id', '=', 'tools.id') + ->on('institute_tool.institute_id', '=', DB::raw($institute->id)) + ->whereNotNull('institute_tool.published_at'); + }) + ->whereNotNull('tools.published_at') + ->orderByRaw("FIELD(IFNULL(institute_tool.status, '-'), $statuses, '-'), ISNULL(institute_tool.id)") + ->orderBy('name'); + + if (!empty($tagFilter)) { + $query->forTags($institute, $tagFilter); } - $translated = array_map( - fn ($item) => trans('tool.stored_data.' . $item), - $storedData - ); - - if ($otherIndex !== false) { - $translated[] = $this->other_stored_data; + if (!empty($searchTerm)) { + $query->search($searchTerm); } - return implode(', ', $translated); + return $query; } - public function getAvailableAlternativeTools(Institute $institute): Collection - { - return self::forOur($institute) - ->whereKeyNot($this->id) - ->whereDoesntHave('institutes', function ($query) use ($institute): void { - $query->where('institutes.id', $institute->id); - $query->where('institute_tool.status', InstituteToolStatus::PROHIBITED); - }) - ->get(); - } - - public function isPublishedForInstitute(Institute $institute): bool + public static function getTagClassName(): string { - return $institute->tools()->find($this)?->pivot->published_at !== null; + return Tag::class; } } diff --git a/app/Models/ToolLog.php b/app/Models/ToolLog.php new file mode 100644 index 0000000..6ea2e58 --- /dev/null +++ b/app/Models/ToolLog.php @@ -0,0 +1,48 @@ + */ + protected $fillable = []; + + public function tool(): BelongsTo + { + return $this->belongsTo(Tool::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function institute(): BelongsTo + { + return $this->belongsTo(Institute::class); + } + + public function scopeForTool(Builder $query, Tool $tool): Builder + { + return $query->where('tool_id', $tool->id); + } + + public function scopeForInstitute(Builder $query, Institute $institute): Builder + { + return $query->where('institute_id', $institute->id); + } + + public function scopeMissingInstitute(Builder $query): Builder + { + return $query->where('institute_id', '=', null); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index fbe0e36..865f0a9 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -6,43 +6,61 @@ use App\Enums\Auth\Role; use Illuminate\Contracts\Auth\MustVerifyEmail; +use Illuminate\Contracts\Translation\HasLocalePreference; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Query\JoinClause; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; +use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; -class User extends Authenticatable implements MustVerifyEmail +class User extends Authenticatable implements MustVerifyEmail, HasLocalePreference { use HasFactory, Notifiable, LogsActivity; - /** @var array */ + /** @var array */ protected $fillable = [ 'external_id', + 'email', 'name', 'roles', ]; - /** @var array */ + /** @var array */ protected $casts = [ 'roles' => 'json', ]; - /** @var string|bool */ - protected $rememberTokenName = false; + /** @var string */ + protected $rememberTokenName = ''; - protected static array $logAttributes = ['*']; - - protected static array $logAttributesToIgnore = [ - 'updated_at', - ]; + public function getActivitylogOptions(): LogOptions + { + return LogOptions::defaults() + ->logAll() + ->logExcept([ + 'updated_at', + ]) + ->logOnlyDirty() + ->dontSubmitEmptyLogs(); + } - protected static bool $logOnlyDirty = true; + public function institute(): BelongsTo + { + if ($this->impersonated_institute_id !== null) { + return $this->impersonatedInstitute(); + } - protected static bool $submitEmptyLogs = false; + return $this->belongsTo(Institute::class); + } - public function institute(): BelongsTo + public function impersonatedInstitute(): BelongsTo { return $this->belongsTo(Institute::class); } @@ -52,6 +70,13 @@ public function experiences(): HasMany return $this->hasMany(Experience::class); } + public function followingTools(): BelongsToMany + { + return $this + ->belongsToMany(self::class, 'tool_followers') + ->withTimestamps(); + } + public function isSuperAdmin(): bool { return $this->hasAllRoles(); @@ -72,6 +97,58 @@ public function isTeacher(): bool return in_array(Role::TEACHER, $this->roles, true); } + public function isOnlyRole(string $role): bool + { + if (count($this->roles) !== 1) { + return false; + } + + return in_array($role, $this->roles, true); + } + + public function isFollowingTool(Tool $tool): bool + { + return $this->followingTools()->where('tool_id', $tool->id)->exists(); + } + + public function isImpersonating(): bool + { + return $this->impersonated_institute_id !== null; + } + + public function preferredLocale(): string + { + return $this->language; + } + + public function scopeFromInstitute(Builder $query, Institute $institute): Builder + { + return $query->where('institute_id', $institute->id); + } + + public function scopeWithEmail(Builder $query): Builder + { + return $query->whereNotNull('email'); + } + + public function scopeFollowingTool(Builder $query, Tool $tool): Builder + { + return $query->whereRelation('followingTools', 'tool_id', '=', $tool->id); + } + + public static function getStakeholdersToNotifyFor(Tool $tool): Collection + { + return self::select('users.*') + ->join('institute_tool', function (JoinClause $join) use ($tool): void { + $join + ->on('institute_tool.institute_id', '=', 'users.institute_id') + ->on('institute_tool.tool_id', '=', DB::raw($tool->id)); + }) + ->whereJsonContains('roles', Role::INFORMATION_MANAGER) + ->whereNotNull('email') + ->get(); + } + private function hasAllRoles(): bool { $missingRoles = array_diff(array_values(Role::toArray()), $this->roles); diff --git a/app/Policies/ContentPagePolicy.php b/app/Policies/ContentPagePolicy.php new file mode 100644 index 0000000..9563db7 --- /dev/null +++ b/app/Policies/ContentPagePolicy.php @@ -0,0 +1,15 @@ +isSuperAdmin(); + } +} diff --git a/app/Policies/CustomFieldPolicy.php b/app/Policies/CustomFieldPolicy.php new file mode 100644 index 0000000..755969e --- /dev/null +++ b/app/Policies/CustomFieldPolicy.php @@ -0,0 +1,33 @@ +isInformationManager(); + } + + public function create(User $currentUser): bool + { + return $currentUser->isInformationManager(); + } + + /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ + public function update(User $currentUser, CustomField $customField): bool + { + return $currentUser->isInformationManager() && $customField->institute()->is($currentUser->institute); + } + + /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ + public function delete(User $currentUser, CustomField $customField): bool + { + return $this->update($currentUser, $customField); + } +} diff --git a/app/Policies/ExperiencePolicy.php b/app/Policies/ExperiencePolicy.php index 05a0878..ebb92d6 100644 --- a/app/Policies/ExperiencePolicy.php +++ b/app/Policies/ExperiencePolicy.php @@ -16,6 +16,15 @@ public function create(User $currentUser, Tool $tool): bool return $currentUser->isTeacher(); } + public function seeUser(User $currentUser, Experience $experience): bool + { + if ($currentUser->is($experience->user)) { + return true; + } + + return $currentUser->institute->is($experience->user->institute); + } + public function update(User $currentUser, Experience $experience): bool { return $experience->user()->is($currentUser); diff --git a/app/Policies/InstitutePolicy.php b/app/Policies/InstitutePolicy.php new file mode 100644 index 0000000..0ecc17c --- /dev/null +++ b/app/Policies/InstitutePolicy.php @@ -0,0 +1,30 @@ +isInformationManager(); + } + + public function impersonate(User $user, Institute $institute = null): bool + { + if ($institute !== null && $institute->is($user->institute)) { + return false; + } + + return $this->viewAny($user); + } + + public function sendNotifications(User $currentUser): bool + { + return $currentUser->isInformationManager(); + } +} diff --git a/app/Policies/TagPolicy.php b/app/Policies/TagPolicy.php new file mode 100644 index 0000000..1b62473 --- /dev/null +++ b/app/Policies/TagPolicy.php @@ -0,0 +1,53 @@ +isContentManager(); + } + + public function createForInstitute(User $currentUser): bool + { + return $currentUser->isInformationManager(); + } + + public function updateForInstitute(User $currentUser, Tag $tag): bool + { + return $tag->institute->id === $currentUser->institute->id && $currentUser->isInformationManager(); + } + + public function deleteForInstitute(User $currentUser, Tag $tag): bool + { + return $tag->institute->id === $currentUser->institute->id && $currentUser->isInformationManager(); + } + + public function manageOur(User $currentUser): bool + { + return $currentUser->isInformationManager(); + } + + public function create(User $currentUser): bool + { + return $currentUser->isContentManager(); + } + + /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ + public function update(User $currentUser, Tag $tag): bool + { + return $currentUser->isContentManager(); + } + + /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ + public function delete(User $currentUser, Tag $tag): bool + { + return $currentUser->isContentManager(); + } +} diff --git a/app/Policies/TagTypePolicy.php b/app/Policies/TagTypePolicy.php new file mode 100644 index 0000000..d3192f9 --- /dev/null +++ b/app/Policies/TagTypePolicy.php @@ -0,0 +1,21 @@ +isOnlyRole(Role::TEACHER)) { + return in_array($tagType, TagTypes::forTeacher()); + } + + return true; + } +} diff --git a/app/Policies/ToolPolicy.php b/app/Policies/ToolPolicy.php index 14a63e9..6922d88 100644 --- a/app/Policies/ToolPolicy.php +++ b/app/Policies/ToolPolicy.php @@ -4,11 +4,13 @@ namespace App\Policies; +use App\Enums\Auth\Role; use App\Enums\InstituteTool\Status; use App\Models\InstituteTool; use App\Models\Tool; use App\Models\User; +/** @SuppressWarnings(PHPMD.TooManyPublicMethods) */ class ToolPolicy { public function viewAll(User $currentUser): bool @@ -17,13 +19,7 @@ public function viewAll(User $currentUser): bool } /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function viewAllOther(User $currentUser): bool - { - return true; - } - - /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function viewAllOur(User $currentUser): bool + public function viewAllWithinInstitute(User $currentUser): bool { return true; } @@ -37,7 +33,7 @@ public function viewOther(User $currentUser, Tool $tool): bool /** @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function viewOur(User $currentUser, Tool $tool): bool { - return $currentUser->institute->hasPublishedTool($tool); + return $tool->isPublishedForInstitute($currentUser->institute); } public function create(User $currentUser): bool @@ -56,6 +52,20 @@ public function publish(User $currentUser, Tool $tool): bool return !$tool->is_published && $currentUser->isContentManager(); } + public function publishConcept(User $currentUser, Tool $tool): bool + { + if (!$this->update($currentUser, $tool)) { + return false; + } + + return $tool->concept !== null; + } + + public function discardConcept(User $currentUser, Tool $tool): bool + { + return $this->publishConcept($currentUser, $tool); + } + public function manageOur(User $currentUser): bool { return $currentUser->isInformationManager(); @@ -82,15 +92,47 @@ public function publishForInstitute(User $currentUser, Tool $tool): bool && $currentUser->institute->hasTool($tool); } + public function publishConceptForInstitute(User $currentUser, Tool $tool): bool + { + if (!$currentUser->isInformationManager() || !$currentUser->institute->hasTool($tool)) { + return false; + } + + $instituteTool = InstituteTool::forInstitute($currentUser->institute)->forTool($tool)->first(); + if ($instituteTool?->concept === null) { + return false; + } + + return true; + } + + public function discardConceptForInstitute(User $currentUser, Tool $tool): bool + { + return $this->publishConceptForInstitute($currentUser, $tool); + } + public function getSupport(User $currentUser, Tool $tool): bool { - /** @var InstituteTool $instituteTool */ - $instituteTool = $currentUser->institute->tools()->find($tool)->pivot; + $instituteTool = InstituteTool::forInstitute($currentUser->institute)->forTool($tool)->first(); if (!$currentUser->isTeacher() && !$currentUser->isInformationManager()) { return false; } - return in_array($instituteTool->status, [Status::RECOMMENDED, Status::SUPPORTED]); + return in_array($instituteTool->status, [Status::ALLOWED, Status::ALLOWED_UNDER_CONDITIONS]); + } + + public function submitRequestForChange(User $currentUser, Tool $tool): bool + { + if (!$tool->is_published) { + return false; + } + + return $currentUser->isInformationManager(); + } + + public function seeAllFields(User $user): bool + { + return !$user->isOnlyRole(Role::TEACHER); } } diff --git a/app/Policies/TranslationPolicy.php b/app/Policies/TranslationPolicy.php index aa5f926..b00dc8b 100644 --- a/app/Policies/TranslationPolicy.php +++ b/app/Policies/TranslationPolicy.php @@ -5,19 +5,9 @@ namespace App\Policies; use App\Models\User; -use Illuminate\Support\Facades\App; class TranslationPolicy extends BasePolicy { - public function before(): ?bool - { - if (App::environment(config('constants.environment.production'))) { - return false; - } - - return null; - } - public function activateLocale(User $user): bool { return $this->viewAny($user); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 1bb5db0..c88991f 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -4,23 +4,25 @@ namespace App\Providers; -use App\Models\Category; +use App\Models\CustomField; use App\Models\Experience; use App\Models\Tool; -use App\Policies\CategoryPolicy; +use App\Policies\CustomFieldPolicy; use App\Policies\ExperiencePolicy; +use App\Policies\TagTypePolicy; use App\Policies\ToolPolicy; use App\Policies\TranslationPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Gate; use Modules\Way2Translate\Models\Translation; class AuthServiceProvider extends ServiceProvider { - /** @var array */ + /** @var array */ protected $policies = [ - Tool::class => ToolPolicy::class, - Category::class => CategoryPolicy::class, - Experience::class => ExperiencePolicy::class, + CustomField::class => CustomFieldPolicy::class, + Experience::class => ExperiencePolicy::class, + Tool::class => ToolPolicy::class, // Modules Translation::class => TranslationPolicy::class, @@ -29,5 +31,7 @@ class AuthServiceProvider extends ServiceProvider public function boot(): void { $this->registerPolicies(); + + Gate::define('filter-by-tag-type', [TagTypePolicy::class, 'filterBy']); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index b6b49c6..bbe857f 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -8,7 +8,7 @@ class EventServiceProvider extends ServiceProvider { - /** @var array */ + /** @var array> */ protected $listen = [ // ]; diff --git a/app/Providers/ValidationServiceProvider.php b/app/Providers/ValidationServiceProvider.php index 42621d3..520b778 100644 --- a/app/Providers/ValidationServiceProvider.php +++ b/app/Providers/ValidationServiceProvider.php @@ -6,7 +6,9 @@ use App\Rules\ChamberOfCommerceNumber; use App\Rules\DbString; +use App\Rules\DbText; use App\Rules\PostalCode; +use App\Rules\UriRule; use App\Rules\VATNumber; use Illuminate\Support\ServiceProvider; @@ -18,5 +20,7 @@ public function boot(): void ChamberOfCommerceNumber::addToLaravelValidation(); VATNumber::addToLaravelValidation(); DbString::addToLaravelValidation(); + DbText::addToLaravelValidation(); + UriRule::addToLaravelValidation(); } } diff --git a/app/Rules/DbString.php b/app/Rules/DbString.php index 2e97745..a55d8ed 100644 --- a/app/Rules/DbString.php +++ b/app/Rules/DbString.php @@ -37,7 +37,6 @@ public static function addToLaravelValidation(): void { Validator::extend('db_string', self::class . '@passes'); - // replace the message $length = config('validation.db_string.length'); Validator::replacer('db_string', function ($message) use ($length) { return str_replace(':length', (string) $length, $message); diff --git a/app/Rules/DbText.php b/app/Rules/DbText.php new file mode 100644 index 0000000..a8ae57c --- /dev/null +++ b/app/Rules/DbText.php @@ -0,0 +1,50 @@ +length = config('validation.db_text.length'); + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function passes($attribute, $value): bool + { + if (empty($value)) { + return true; + } + + return is_string($value) && (strlen($value) <= $this->length); + } + + public static function addToLaravelValidation(): void + { + Validator::extend('db_text', self::class . '@passes'); + + $length = config('validation.db_text.length'); + Validator::replacer('db_text', function ($message) use ($length) { + return str_replace(':length', (string) $length, $message); + }); + } + + public function message(): string + { + return trans('validation.db_string', ['length' => $this->length]); + } +} diff --git a/app/Rules/ExistsInTags.php b/app/Rules/ExistsInTags.php new file mode 100644 index 0000000..1acccc7 --- /dev/null +++ b/app/Rules/ExistsInTags.php @@ -0,0 +1,33 @@ +where('id', $value) + ->where('type', $this->tagType) + ->when($this->institute, fn ($query) => $query->where('institute_id', $this->institute->id)) + ->exists(); + } + + public function message(): string + { + return trans('validation.exists', ['attribute' => 'tag']); + } +} diff --git a/app/Rules/UniqueTagRule.php b/app/Rules/UniqueTagRule.php new file mode 100644 index 0000000..db3a1e1 --- /dev/null +++ b/app/Rules/UniqueTagRule.php @@ -0,0 +1,62 @@ +tagExists($value); + } + + private function tagExists(string $tagName): bool + { + $query = $this->institute !== null ? Tag::forInstitute($this->institute) : Tag::withoutInstitute(); + + if ($this->tag) { + $query->where('id', '!=', $this->tag->id); + } + + return $query + ->where('type', $this->data['type']) + ->whereSlug(Str::slug($tagName), $this->locale) + ->exists(); + } + + public function message(): string + { + return trans('validation.unique', ['attribute' => 'name']); + } + + public function setData($data): self + { + $this->data = $data; + + return $this; + } +} diff --git a/app/Rules/UriRule.php b/app/Rules/UriRule.php new file mode 100644 index 0000000..71785dd --- /dev/null +++ b/app/Rules/UriRule.php @@ -0,0 +1,42 @@ +getFullColumnName($field, 'en', $table); + $dutchField = $this->getFullColumnName($field, 'nl', $table); + $pattern = '%' . $value . '%'; + + $query->where($englishField, 'LIKE', $pattern)->orWhere($dutchField, 'LIKE', $pattern); + } + + private function getFullColumnName(string $field, string $locale, string $table = null): string + { + return ($table ? $table . '.' : '') . $field . '_' . $locale; + } +} diff --git a/app/Traits/Resources/WithImage.php b/app/Traits/Resources/WithImage.php index 7c21638..904a795 100644 --- a/app/Traits/Resources/WithImage.php +++ b/app/Traits/Resources/WithImage.php @@ -4,18 +4,15 @@ namespace App\Traits\Resources; +use App\Helpers\File; use App\Models\Tool; -use Illuminate\Support\Facades\Storage; trait WithImage { - private function getImageUrl(?string $image, bool $showPlaceholder = false): string | null + protected function getImageUrl(?string $image, bool $showPlaceholder = false): string | null { if ($image) { - /** @var \Illuminate\Filesystem\FilesystemAdapter */ - $storage = Storage::disk(Tool::$disk); - - return $storage->url($image); + return File::getPublicUrl(Tool::$disk, $image); } return $showPlaceholder ? asset('dist/admin/images/placeholder.png') : null; diff --git a/bootstrap/app.php b/bootstrap/app.php index ae8c1ee..08d677b 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,5 +1,7 @@ /dev/null 2>&1 if [ $? == 0 ]; then - echo "= NPM =" - npm install --no-ansi --no-color + echo "= PNPM install =" + pnpm install --frozen-lockfile --no-color if [ $? != 0 ]; then exit 1 fi @@ -36,10 +36,10 @@ do if [ $continueFlag ]; then echo "= Build dev =" - npm run build-dev --no-ansi --no-color --no-progress + pnpm run build-dev --no-color else echo "= Build production =" - npm run build --no-ansi --no-color + pnpm run build --no-color fi if [ $? != 0 ]; then exit 1 diff --git a/composer.json b/composer.json index 8641277..7732231 100644 --- a/composer.json +++ b/composer.json @@ -4,48 +4,54 @@ "license": "GNU-AGPLv3", "type": "project", "require": { - "php": "^8.0", - "fedeisas/laravel-mail-css-inliner": "^4.0", - "fideloper/proxy": "^4.2", - "fruitcake/laravel-cors": "^2.0", - "guzzlehttp/guzzle": "^7.0.1", - "inertiajs/inertia-laravel": "^0.4.0", + "php": "^8.1", + "doctrine/dbal": "^3.3", + "guzzlehttp/guzzle": "^7.8", + "inertiajs/inertia-laravel": "^1.0.0", "laracasts/flash": "^3.2", - "laravel/framework": "^8.12", + "laravel/framework": "^10.0", "laravel/socialite": "^5.2", - "laravel/ui": "^3.0", + "laravel/ui": "^4.2", "laravelcollective/html": "^6.2", "laravelista/ekko": "^3.2", - "mcamara/laravel-localization": "^1.6", - "predis/predis": "^1.1", - "propaganistas/laravel-phone": "^4.2", - "sentry/sentry-laravel": "^2.1", + "league/flysystem-aws-s3-v3": "^3.15", + "mcamara/laravel-localization": "^1.8", + "monarobase/country-list": "^3.4", + "predis/predis": "^2.2", + "propaganistas/laravel-phone": "^5.0", + "sentry/sentry-laravel": "^3.7", "socialiteproviders/surfconext": "^4.1", - "spatie/laravel-activitylog": "^3.17", - "spatie/laravel-query-builder": "^3.3", + "spatie/laravel-activitylog": "^4.0", + "spatie/laravel-query-builder": "^5.3", "spatie/laravel-queueable-action": "^2.10", + "spatie/laravel-tags": "^4.5", + "symfony/http-client": "^6.4", + "symfony/mailgun-mailer": "^6.4", "tedivm/jshrink": "^1.3", - "tightenco/ziggy": "^0.9" + "tightenco/ziggy": "^1.6" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.5", "barryvdh/laravel-ide-helper": "^2.8", "brianium/paratest": "^6.2", - "facade/ignition": "^2.3.6", "fakerphp/faker": "^1.16.0", "laracasts/generators": "^2.0", "laravel/telescope": "^4.0", "laravel/tinker": "^2.4", "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^5.0", - "nunomaduro/larastan": "^0.7", + "nunomaduro/collision": "^6.1", + "nunomaduro/larastan": "^2.0", "phpunit/phpunit": "^9.3", - "spatie/laravel-web-tinker": "^1.7.5" + "spatie/laravel-ignition": "^2.0", + "spatie/laravel-web-tinker": "^1.8" }, "config": { "optimize-autoloader": true, "preferred-install": "dist", - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "php-http/discovery": true + } }, "autoload": { "psr-4": { @@ -81,7 +87,7 @@ "@php artisan test --parallel" ], "test-coverage": [ - "./vendor/bin/phpunit --coverage-html public_html/tests-report" + "./vendor/bin/phpunit --coverage-html public/tests-report" ], "test-fresh": [ "php artisan migrate:fresh --env=testing --no-ansi", diff --git a/composer.lock b/composer.lock index 6225202..937e383 100644 --- a/composer.lock +++ b/composer.lock @@ -4,86 +4,178 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d9b6f23082beb77f15c9ad1511819676", + "content-hash": "6736fab03ecbc5be9f9228af9bb4e656", "packages": [ { - "name": "asm89/stack-cors", - "version": "v2.1.1", + "name": "aws/aws-crt-php", + "version": "v1.2.5", "source": { "type": "git", - "url": "https://github.com/asm89/stack-cors.git", - "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a" + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/asm89/stack-cors/zipball/73e5b88775c64ccc0b84fb60836b30dc9d92ac4a", - "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "symfony/http-foundation": "^4|^5|^6", - "symfony/http-kernel": "^4|^5|^6" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^7|^9", - "squizlabs/php_codesniffer": "^3.5" + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "https://github.com/awslabs/aws-crt-php", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" + }, + "time": "2024-04-19T21:30:56+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.306.5", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "07fa90825034bf64ab3fdddc1e1f1ca2fa33d6c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/07fa90825034bf64ab3fdddc1e1f1ca2fa33d6c2", + "reference": "07fa90825034bf64ab3fdddc1e1f1ca2fa33d6c2", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.2.3", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/promises": "^1.4.0 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "mtdowling/jmespath.php": "^2.6", + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "3.0-dev" } }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Asm89\\Stack\\": "src/" + "Aws\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Alexander", - "email": "iam.asm89@gmail.com" + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" } ], - "description": "Cross-origin resource sharing library and stack middleware", - "homepage": "https://github.com/asm89/stack-cors", + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", "keywords": [ - "cors", - "stack" + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" ], "support": { - "issues": "https://github.com/asm89/stack-cors/issues", - "source": "https://github.com/asm89/stack-cors/tree/v2.1.1" + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.306.5" }, - "time": "2022-01-18T09:12:03+00:00" + "time": "2024-05-13T18:04:50+00:00" }, { "name": "brick/math", - "version": "0.9.3", + "version": "0.12.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.9.2" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" }, "type": "library", "autoload": { @@ -103,53 +195,123 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.3" + "source": "https://github.com/brick/math/tree/0.12.1" }, "funding": [ { "url": "https://github.com/BenMorel", "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" }, { - "url": "https://tidelift.com/funding/github/packagist/brick/math", + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", "type": "tidelift" } ], - "time": "2021-08-15T20:50:18+00:00" + "time": "2023-12-11T17:09:12+00:00" }, { "name": "clue/stream-filter", - "version": "v1.5.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/clue/stream-filter.git", - "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", - "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { - "psr-4": { - "Clue\\StreamFilter\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -162,7 +324,7 @@ } ], "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ "bucket brigade", "callback", @@ -174,7 +336,7 @@ ], "support": { "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, "funding": [ { @@ -186,20 +348,20 @@ "type": "github" } ], - "time": "2020-10-02T12:38:20+00:00" + "time": "2023-12-20T15:40:13+00:00" }, { "name": "dflydev/dot-access-data", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "0992cc19268b259a39e86f296da5f0677841f42c" + "reference": "f41715465d65213d644d3141a6a93081be5d3549" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c", - "reference": "0992cc19268b259a39e86f296da5f0677841f42c", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", "shasum": "" }, "require": { @@ -210,7 +372,7 @@ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", "scrutinizer/ocular": "1.6.0", "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.14" + "vimeo/psalm": "^4.0.0" }, "type": "library", "extra": { @@ -259,39 +421,42 @@ ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" }, - "time": "2021-08-13T13:06:58+00:00" + "time": "2022-10-27T11:44:00+00:00" }, { - "name": "doctrine/inflector", - "version": "2.0.4", + "name": "doctrine/cache", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" } }, "notification-url": "https://packagist.org/downloads/", @@ -320,23 +485,22 @@ "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", + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", "php", - "plural", - "singular", - "strings", - "uppercase", - "words" + "redis", + "xcache" ], "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, "funding": [ { @@ -348,39 +512,59 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", "type": "tidelift" } ], - "time": "2021-10-22T20:16:43+00:00" + "time": "2022-05-20T20:07:39+00:00" }, { - "name": "doctrine/lexer", - "version": "1.2.2", + "name": "doctrine/dbal", + "version": "3.8.4", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c" + "url": "https://github.com/doctrine/dbal.git", + "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c", - "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/b05e48a745f722801f55408d0dbd8003b403dbbd", + "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.58", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.16", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.9.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." }, + "bin": [ + "bin/doctrine-dbal" + ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -397,22 +581,39 @@ "email": "roman@code-factory.org" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@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", + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.2" + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.8.4" }, "funding": [ { @@ -424,109 +625,89 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", "type": "tidelift" } ], - "time": "2022-01-12T08:27:12+00:00" + "time": "2024-04-25T07:04:44+00:00" }, { - "name": "dragonmantank/cron-expression", - "version": "v3.3.1", + "name": "doctrine/deprecations", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/be85b3f05b46c39bbc0d95f6c071ddff669510fa", - "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "webmozart/assert": "^1.0" - }, - "replace": { - "mtdowling/cron-expression": "^1.0" + "php": "^7.1 || ^8.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" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", "autoload": { "psr-4": { - "Cron\\": "src/Cron/" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" } }, "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" - ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", "support": { - "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1" + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "funding": [ - { - "url": "https://github.com/dragonmantank", - "type": "github" - } - ], - "time": "2022-01-18T15:43:28+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { - "name": "egulias/email-validator", - "version": "2.1.25", + "name": "doctrine/event-manager", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + "url": "https://github.com/doctrine/event-manager.git", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", "shasum": "" }, "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" + "php": "^8.1" }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" + "conflict": { + "doctrine/common": "<2.9" }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, "autoload": { "psr-4": { - "Egulias\\EmailValidator\\": "src" + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -535,66 +716,88 @@ ], "authors": [ { - "name": "Eduardo Gulias Davis" + "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" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" + "event", + "event dispatcher", + "event manager", + "event system", + "events" ], "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" }, "funding": [ { - "url": "https://github.com/egulias", - "type": "github" + "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%2Fevent-manager", + "type": "tidelift" } ], - "time": "2020-12-29T14:50:06+00:00" + "time": "2022-10-12T20:59:15+00:00" }, { - "name": "fedeisas/laravel-mail-css-inliner", - "version": "4.0", + "name": "doctrine/inflector", + "version": "2.0.10", "source": { "type": "git", - "url": "https://github.com/fedeisas/laravel-mail-css-inliner.git", - "reference": "285036b484f0f7642150388f68f00f93798ac7cb" + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fedeisas/laravel-mail-css-inliner/zipball/285036b484f0f7642150388f68f00f93798ac7cb", - "reference": "285036b484f0f7642150388f68f00f93798ac7cb", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { - "ext-dom": "*", - "illuminate/mail": "^7.4 || ^8.0", - "illuminate/support": "^7.4 || ^8.0", - "php": "^7.2|^8.0", - "tijsverkoyen/css-to-inline-styles": "~2.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5", - "swiftmailer/swiftmailer": "^6.0" + "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", - "extra": { - "laravel": { - "providers": [ - "Fedeisas\\LaravelMailCssInliner\\LaravelMailCssInlinerServiceProvider" - ] - } - }, "autoload": { "psr-4": { - "Fedeisas\\LaravelMailCssInliner\\": "src/" + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -603,56 +806,88 @@ ], "authors": [ { - "name": "Fede Isas", - "email": "fedeisas@hotmail.com" + "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": "Inline the CSS of your HTML emails using Laravel", + "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": [ - "css", - "laravel", - "mailer" + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" ], "support": { - "issues": "https://github.com/fedeisas/laravel-mail-css-inliner/issues", - "source": "https://github.com/fedeisas/laravel-mail-css-inliner/tree/4.0" + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, - "time": "2020-12-17T15:30:15+00:00" + "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": "2024-02-18T20:23:39+00:00" }, { - "name": "fideloper/proxy", - "version": "4.4.1", + "name": "doctrine/lexer", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0" + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0", - "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0", - "php": ">=5.4.0" + "php": "^8.1" }, "require-dev": { - "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.0" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, "type": "library", - "extra": { - "laravel": { - "providers": [ - "Fideloper\\Proxy\\TrustedProxyServiceProvider" - ] - } - }, "autoload": { "psr-4": { - "Fideloper\\Proxy\\": "src/" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -661,64 +896,78 @@ ], "authors": [ { - "name": "Chris Fidao", - "email": "fideloper@gmail.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Set trusted proxies for Laravel", + "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": [ - "load balancing", - "proxy", - "trusted proxy" + "annotations", + "docblock", + "lexer", + "parser", + "php" ], "support": { - "issues": "https://github.com/fideloper/TrustedProxy/issues", - "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.1" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, - "time": "2020-10-22T13:48:01+00:00" + "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": "2024-02-05T11:56:58+00:00" }, { - "name": "fruitcake/laravel-cors", - "version": "v2.0.5", + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", "source": { "type": "git", - "url": "https://github.com/fruitcake/laravel-cors.git", - "reference": "3a066e5cac32e2d1cdaacd6b961692778f37b5fc" + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/3a066e5cac32e2d1cdaacd6b961692778f37b5fc", - "reference": "3a066e5cac32e2d1cdaacd6b961692778f37b5fc", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", "shasum": "" }, "require": { - "asm89/stack-cors": "^2.0.1", - "illuminate/contracts": "^6|^7|^8|^9", - "illuminate/support": "^6|^7|^8|^9", - "php": ">=7.2", - "symfony/http-foundation": "^4|^5|^6", - "symfony/http-kernel": "^4.3.4|^5|^6" + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" }, "require-dev": { - "laravel/framework": "^6|^7.24|^8", - "orchestra/testbench-dusk": "^4|^5|^6|^7", - "phpunit/phpunit": "^6|^7|^8|^9", - "squizlabs/php_codesniffer": "^3.5" + "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", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - }, - "laravel": { - "providers": [ - "Fruitcake\\Cors\\CorsServiceProvider" - ] - } - }, "autoload": { "psr-4": { - "Fruitcake\\Cors\\": "src/" + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -727,150 +976,289 @@ ], "authors": [ { - "name": "Fruitcake", - "homepage": "https://fruitcake.nl" - }, - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" } ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", "keywords": [ - "api", - "cors", - "crossdomain", - "laravel" + "cron", + "schedule" ], "support": { - "issues": "https://github.com/fruitcake/laravel-cors/issues", - "source": "https://github.com/fruitcake/laravel-cors/tree/v2.0.5" + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" }, "funding": [ { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", + "url": "https://github.com/dragonmantank", "type": "github" } ], - "time": "2022-01-03T14:53:04+00:00" + "time": "2023-08-10T19:36:49+00:00" }, { - "name": "giggsey/libphonenumber-for-php", - "version": "8.12.43", + "name": "egulias/email-validator", + "version": "4.0.2", "source": { "type": "git", - "url": "https://github.com/giggsey/libphonenumber-for-php.git", - "reference": "27bc97a4941f42d320fb6da3de0dcaaf7db69f5d" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/27bc97a4941f42d320fb6da3de0dcaaf7db69f5d", - "reference": "27bc97a4941f42d320fb6da3de0dcaaf7db69f5d", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", "shasum": "" }, "require": { - "giggsey/locale": "^1.7|^2.0", - "php": ">=5.3.2", - "symfony/polyfill-mbstring": "^1.17" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "pear/pear-core-minimal": "^1.9", - "pear/pear_exception": "^1.0", - "pear/versioncontrol_git": "^0.5", - "phing/phing": "^2.7", - "php-coveralls/php-coveralls": "^1.0|^2.0", - "symfony/console": "^2.8|^3.0|^v4.4|^v5.2", - "symfony/phpunit-bridge": "^4.2 || ^5" + "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": "8.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { "psr-4": { - "libphonenumber\\": "src/" - }, - "exclude-from-classmap": [ - "/src/data/", - "/src/carrier/data/", - "/src/geocoding/data/", - "/src/timezone/data/" - ] + "Egulias\\EmailValidator\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { - "name": "Joshua Gigg", - "email": "giggsey@gmail.com", - "homepage": "https://giggsey.com/" + "name": "Eduardo Gulias Davis" } ], - "description": "PHP Port of Google's libphonenumber", - "homepage": "https://github.com/giggsey/libphonenumber-for-php", + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", "keywords": [ - "geocoding", - "geolocation", - "libphonenumber", - "mobile", - "phonenumber", - "validation" + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" ], "support": { - "irc": "irc://irc.appliedirc.com/lobby", - "issues": "https://github.com/giggsey/libphonenumber-for-php/issues", - "source": "https://github.com/giggsey/libphonenumber-for-php" + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" }, - "time": "2022-02-09T07:46:55+00:00" - }, - { - "name": "giggsey/locale", - "version": "2.1", - "source": { - "type": "git", - "url": "https://github.com/giggsey/Locale.git", - "reference": "8d324583b5899e6280a875c43bf1fc9658bc6962" + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/8d324583b5899e6280a875c43bf1fc9658bc6962", - "reference": "8d324583b5899e6280a875c43bf1fc9658bc6962", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", "shasum": "" }, "require": { - "php": ">=7.2" + "php": "^7.4||^8.0" }, "require-dev": { - "ext-json": "*", - "pear/pear-core-minimal": "^1.9", - "pear/pear_exception": "^1.0", - "pear/versioncontrol_git": "^0.5", - "phing/phing": "^2.7", - "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^8.5|^9.5", - "symfony/console": "^5.0", - "symfony/filesystem": "^5.0", - "symfony/finder": "^5.0", - "symfony/process": "^5.0" + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + }, + "time": "2023-12-01T16:26:39+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": { - "Giggsey\\Locale\\": "src/" + "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": "giggsey/libphonenumber-for-php-lite", + "version": "8.13.36", + "source": { + "type": "git", + "url": "https://github.com/giggsey/libphonenumber-for-php-lite.git", + "reference": "144bbe70d67664b5245910a475c7190ff140ab4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/144bbe70d67664b5245910a475c7190ff140ab4b", + "reference": "144bbe70d67664b5245910a475c7190ff140ab4b", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/polyfill-mbstring": "^1.17" + }, + "conflict": { + "giggsey/libphonenumber-for-php": "*" + }, + "require-dev": { + "ext-dom": "*", + "friendsofphp/php-cs-fixer": "^3.12", + "infection/infection": "^0.28", + "pear/pear-core-minimal": "^1.10.11", + "pear/pear_exception": "^1.0.2", + "pear/versioncontrol_git": "^0.7", + "phing/phing": "^2.17.4", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.2", + "phpunit/phpunit": "^10.5", + "symfony/console": "^6.0", + "symfony/var-exporter": "^6.0" + }, + "suggest": { + "giggsey/libphonenumber-for-php": "Use libphonenumber-for-php for geocoding, carriers, timezones and matching" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "libphonenumber\\": "src/" + }, + "exclude-from-classmap": [ + "/src/data/", + "/src/carrier/data/", + "/src/geocoding/data/", + "/src/timezone/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], "authors": [ { "name": "Joshua Gigg", @@ -878,33 +1266,42 @@ "homepage": "https://giggsey.com/" } ], - "description": "Locale functions required by libphonenumber-for-php", + "description": "A lite version of giggsey/libphonenumber-for-php, which is a PHP Port of Google's libphonenumber", + "homepage": "https://github.com/giggsey/libphonenumber-for-php-lite", + "keywords": [ + "geocoding", + "geolocation", + "libphonenumber", + "mobile", + "phonenumber", + "validation" + ], "support": { - "issues": "https://github.com/giggsey/Locale/issues", - "source": "https://github.com/giggsey/Locale/tree/2.1" + "issues": "https://github.com/giggsey/libphonenumber-for-php-lite/issues", + "source": "https://github.com/giggsey/libphonenumber-for-php-lite" }, - "time": "2021-11-04T19:12:22+00:00" + "time": "2024-05-03T06:31:11+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.0.4", + "version": "v1.1.2", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "0690bde05318336c7221785f2a932467f98b64ca" + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", - "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "phpoption/phpoption": "^1.8" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" }, "require-dev": { - "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "autoload": { @@ -933,7 +1330,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" }, "funding": [ { @@ -945,26 +1342,26 @@ "type": "tidelift" } ], - "time": "2021-11-21T21:41:47+00:00" + "time": "2023-11-12T22:16:48+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.4.1", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "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" @@ -973,10 +1370,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -986,17 +1384,18 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "7.4-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1053,7 +1452,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.1" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -1069,41 +1468,40 @@ "type": "tidelift" } ], - "time": "2021-12-06T18:43:05+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1137,7 +1535,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -1153,26 +1551,26 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.1.0", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -1180,17 +1578,18 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.1-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { @@ -1252,7 +1651,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.1.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -1268,7 +1667,93 @@ "type": "tidelift" } ], - "time": "2021-10-06T17:43:30+00:00" + "time": "2023-12-03T20:05:35+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "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.3" + }, + "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-12-03T19:50:20+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -1330,43 +1815,50 @@ }, { "name": "inertiajs/inertia-laravel", - "version": "v0.4.5", + "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/inertiajs/inertia-laravel.git", - "reference": "406b15af162e78be5c7793b25aadd5a183eea84b" + "reference": "fcf3d6db1a259a55d8d18cf43fc971202c1f6b0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/406b15af162e78be5c7793b25aadd5a183eea84b", - "reference": "406b15af162e78be5c7793b25aadd5a183eea84b", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/fcf3d6db1a259a55d8d18cf43fc971202c1f6b0d", + "reference": "fcf3d6db1a259a55d8d18cf43fc971202c1f6b0d", "shasum": "" }, "require": { "ext-json": "*", - "laravel/framework": "^5.4|^6.0|^7.0|^8.0", - "php": "^7.2|^8.0" + "laravel/framework": "^8.74|^9.0|^10.0|^11.0", + "php": "^7.3|~8.0.0|~8.1.0|~8.2.0|~8.3.0" }, "require-dev": { - "orchestra/testbench": "^4.0|^5.0|^6.0", - "phpunit/phpunit": "^8.0|^9.0", + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^6.4|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^8.0|^9.5.8|^10.4", "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" ] + }, + "branch-alias": { + "dev-master": "1.x-dev" } }, "autoload": { - "psr-4": { - "Inertia\\": "src" - }, "files": [ "./helpers.php" - ] + ], + "psr-4": { + "Inertia\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1386,7 +1878,7 @@ ], "support": { "issues": "https://github.com/inertiajs/inertia-laravel/issues", - "source": "https://github.com/inertiajs/inertia-laravel/tree/v0.4.5" + "source": "https://github.com/inertiajs/inertia-laravel/tree/v1.0.0" }, "funding": [ { @@ -1394,20 +1886,20 @@ "type": "github" } ], - "time": "2021-10-27T09:37:59+00:00" + "time": "2024-03-09T00:30:58+00:00" }, { "name": "jean85/pretty-package-versions", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", "shasum": "" }, "require": { @@ -1415,9 +1907,9 @@ "php": "^7.1|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", + "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^7.5|^8.5|^9.4", "vimeo/psalm": "^4.3" }, @@ -1451,31 +1943,31 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" }, - "time": "2021-10-08T21:21:46+00:00" + "time": "2024-03-08T09:58:59+00:00" }, { "name": "laracasts/flash", - "version": "3.2.1", + "version": "3.2.3", "source": { "type": "git", "url": "https://github.com/laracasts/flash.git", - "reference": "f64a8d97f901fdb3ce8eb9b28c5308a726455467" + "reference": "c2c4be1132f1bec3a689e84417a1c5787e6c71fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/flash/zipball/f64a8d97f901fdb3ce8eb9b28c5308a726455467", - "reference": "f64a8d97f901fdb3ce8eb9b28c5308a726455467", + "url": "https://api.github.com/repos/laracasts/flash/zipball/c2c4be1132f1bec3a689e84417a1c5787e6c71fd", + "reference": "c2c4be1132f1bec3a689e84417a1c5787e6c71fd", "shasum": "" }, "require": { - "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "php": ">=5.4.0" }, "require-dev": { "mockery/mockery": "dev-master", - "phpunit/phpunit": "^6.1|^9.5.10" + "phpunit/phpunit": "^6.1|^9.5.10|^10.5" }, "type": "library", "extra": { @@ -1489,12 +1981,12 @@ } }, "autoload": { - "psr-0": { - "Laracasts\\Flash": "src/" - }, "files": [ "src/Laracasts/Flash/functions.php" - ] + ], + "psr-0": { + "Laracasts\\Flash": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1508,63 +2000,76 @@ ], "description": "Easy flash notifications", "support": { - "issues": "https://github.com/laracasts/flash/issues", - "source": "https://github.com/laracasts/flash/tree/3.2.1" + "source": "https://github.com/laracasts/flash/tree/3.2.3" }, - "time": "2022-01-31T16:01:37+00:00" + "time": "2024-03-03T16:51:25+00:00" }, { "name": "laravel/framework", - "version": "v8.83.0", + "version": "v10.48.10", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "29bc8779103909ebc428478b339ee6fa8703e193" + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/29bc8779103909ebc428478b339ee6fa8703e193", - "reference": "29bc8779103909ebc428478b339ee6fa8703e193", + "url": "https://api.github.com/repos/laravel/framework/zipball/91e2b9e218afa4e5c377510faa11957042831ba3", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3", "shasum": "" }, "require": { - "doctrine/inflector": "^1.4|^2.0", - "dragonmantank/cron-expression": "^3.0.2", - "egulias/email-validator": "^2.1.10", - "ext-json": "*", + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "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": "*", - "laravel/serializable-closure": "^1.0", - "league/commonmark": "^1.3|^2.0.2", - "league/flysystem": "^1.1", - "monolog/monolog": "^2.0", - "nesbot/carbon": "^2.53.1", - "opis/closure": "^3.6", - "php": "^7.3|^8.0", - "psr/container": "^1.0", - "psr/log": "^1.0|^2.0", - "psr/simple-cache": "^1.0", - "ramsey/uuid": "^4.2.2", - "swiftmailer/swiftmailer": "^6.3", - "symfony/console": "^5.4", - "symfony/error-handler": "^5.4", - "symfony/finder": "^5.4", - "symfony/http-foundation": "^5.4", - "symfony/http-kernel": "^5.4", - "symfony/mime": "^5.4", - "symfony/process": "^5.4", - "symfony/routing": "^5.4", - "symfony/var-dumper": "^5.4", - "tijsverkoyen/css-to-inline-styles": "^2.2.2", - "vlucas/phpdotenv": "^5.4.1", - "voku/portable-ascii": "^1.6.1" + "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.4", + "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": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", "tightenco/collect": "<5.5.33" }, "provide": { - "psr/container-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" }, "replace": { "illuminate/auth": "self.version", @@ -1572,6 +2077,7 @@ "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", @@ -1589,6 +2095,7 @@ "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", @@ -1600,59 +2107,76 @@ "illuminate/view": "self.version" }, "require-dev": { - "aws/aws-sdk-php": "^3.198.1", - "doctrine/dbal": "^2.13.3|^3.1.4", - "filp/whoops": "^2.14.3", - "guzzlehttp/guzzle": "^6.5.5|^7.0.1", - "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "^1.4.4", - "orchestra/testbench-core": "^6.27", + "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.23.4", "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^8.5.19|^9.5.8", - "predis/predis": "^1.1.9", - "symfony/cache": "^5.4" + "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.198.1).", + "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 (^2.13.3|^3.1.4).", - "ext-bcmath": "Required to use the multiple_of validation rule.", + "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.", + "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, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "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 (^1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "mockery/mockery": "Required to use mocking (^1.4.4).", + "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 (^8.5.19|^9.5.8).", - "predis/predis": "Required to use the predis connector (^1.1.9).", + "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 (^4.0|^5.0|^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", - "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.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": "8.x-dev" + "dev-master": "10.x-dev" } }, "autoload": { "files": [ "src/Illuminate/Collections/helpers.php", "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Support/helpers.php" ], @@ -1660,7 +2184,8 @@ "Illuminate\\": "src/Illuminate/", "Illuminate\\Support\\": [ "src/Illuminate/Macroable/", - "src/Illuminate/Collections/" + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" ] } }, @@ -1684,29 +2209,88 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-02-08T15:44:51+00:00" + "time": "2024-04-30T12:52:59+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.21", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/23ea808e8a145653e0ab29e30d4385e49f40a920", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920", + "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.11", + "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" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.21" + }, + "time": "2024-04-30T12:46:16+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.1.0", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "65c9faf50d567b65d81764a44526545689e3fe63" + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/65c9faf50d567b65d81764a44526545689e3fe63", - "reference": "65c9faf50d567b65d81764a44526545689e3fe63", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "pestphp/pest": "^1.18", - "phpstan/phpstan": "^0.12.98", - "symfony/var-dumper": "^5.3" + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" }, "type": "library", "extra": { @@ -1743,35 +2327,38 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2022-02-01T16:29:39+00:00" + "time": "2023-11-08T14:08:06+00:00" }, { "name": "laravel/socialite", - "version": "v5.5.1", + "version": "v5.14.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "9b96dfd69e9c1de69c23205cb390550bc71c357e" + "reference": "c7b0193a3753a29aff8ce80aa2f511917e6ed68a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/9b96dfd69e9c1de69c23205cb390550bc71c357e", - "reference": "9b96dfd69e9c1de69c23205cb390550bc71c357e", + "url": "https://api.github.com/repos/laravel/socialite/zipball/c7b0193a3753a29aff8ce80aa2f511917e6ed68a", + "reference": "c7b0193a3753a29aff8ce80aa2f511917e6ed68a", "shasum": "" }, "require": { "ext-json": "*", + "firebase/php-jwt": "^6.4", "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", - "league/oauth1-client": "^1.0", - "php": "^7.2|^8.0" + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "league/oauth1-client": "^1.10.1", + "php": "^7.2|^8.0", + "phpseclib/phpseclib": "^3.0" }, "require-dev": { - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0", - "phpunit/phpunit": "^8.0|^9.3" + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.0|^9.3|^10.4" }, "type": "library", "extra": { @@ -1812,36 +2399,38 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2022-02-07T16:08:19+00:00" + "time": "2024-05-03T20:31:38+00:00" }, { "name": "laravel/ui", - "version": "v3.4.3", + "version": "v4.5.1", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "64a0f43492c00780b2261c56cd7007a4f370d95b" + "reference": "a3562953123946996a503159199d6742d5534e61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/64a0f43492c00780b2261c56cd7007a4f370d95b", - "reference": "64a0f43492c00780b2261c56cd7007a4f370d95b", + "url": "https://api.github.com/repos/laravel/ui/zipball/a3562953123946996a503159199d6742d5534e61", + "reference": "a3562953123946996a503159199d6742d5534e61", "shasum": "" }, "require": { - "illuminate/console": "^8.42|^9.0", - "illuminate/filesystem": "^8.42|^9.0", - "illuminate/support": "^8.82|^9.0", - "illuminate/validation": "^8.42|^9.0", - "php": "^7.3|^8.0" + "illuminate/console": "^9.21|^10.0|^11.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0", + "illuminate/support": "^9.21|^10.0|^11.0", + "illuminate/validation": "^9.21|^10.0|^11.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0" + "orchestra/testbench": "^7.35|^8.15|^9.0", + "phpunit/phpunit": "^9.3|^10.4|^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "4.x-dev" }, "laravel": { "providers": [ @@ -1871,34 +2460,34 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v3.4.3" + "source": "https://github.com/laravel/ui/tree/v4.5.1" }, - "time": "2022-02-08T14:19:32+00:00" + "time": "2024-03-21T18:12:29+00:00" }, { "name": "laravelcollective/html", - "version": "v6.3.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "78c3cb516ac9e6d3d76cad9191f81d217302dea6" + "reference": "64ddfdcaeeb8d332bd98bef442bef81e39c3910b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/78c3cb516ac9e6d3d76cad9191f81d217302dea6", - "reference": "78c3cb516ac9e6d3d76cad9191f81d217302dea6", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/64ddfdcaeeb8d332bd98bef442bef81e39c3910b", + "reference": "64ddfdcaeeb8d332bd98bef442bef81e39c3910b", "shasum": "" }, "require": { - "illuminate/http": "^6.0|^7.0|^8.0|^9.0", - "illuminate/routing": "^6.0|^7.0|^8.0|^9.0", - "illuminate/session": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", - "illuminate/view": "^6.0|^7.0|^8.0|^9.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/routing": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/session": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/view": "^6.0|^7.0|^8.0|^9.0|^10.0", "php": ">=7.2.5" }, "require-dev": { - "illuminate/database": "^6.0|^7.0|^8.0|^9.0", + "illuminate/database": "^6.0|^7.0|^8.0|^9.0|^10.0", "mockery/mockery": "~1.0", "phpunit/phpunit": "~8.5|^9.5.10" }, @@ -1945,7 +2534,8 @@ "issues": "https://github.com/LaravelCollective/html/issues", "source": "https://github.com/LaravelCollective/html" }, - "time": "2022-02-08T21:02:54+00:00" + "abandoned": "spatie/laravel-html", + "time": "2023-04-25T02:46:11+00:00" }, { "name": "laravelista/ekko", @@ -2013,16 +2603,16 @@ }, { "name": "league/commonmark", - "version": "2.2.1", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "f8afb78f087777b040e0ab8a6b6ca93f6fc3f18a" + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/f8afb78f087777b040e0ab8a6b6ca93f6fc3f18a", - "reference": "f8afb78f087777b040e0ab8a6b6ca93f6fc3f18a", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", "shasum": "" }, "require": { @@ -2031,24 +2621,26 @@ "php": "^7.4 || ^8.0", "psr/event-dispatcher": "^1.0", "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.0", + "commonmark/cmark": "0.30.3", "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", - "phpstan/phpstan": "^0.12.88 || ^1.0.0", - "phpunit/phpunit": "^9.5.5", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.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" @@ -2056,7 +2648,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.5-dev" } }, "autoload": { @@ -2113,20 +2705,20 @@ "type": "tidelift" } ], - "time": "2022-01-25T14:37:33+00:00" + "time": "2024-02-02T11:59:32+00:00" }, { "name": "league/config", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/config.git", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { @@ -2135,7 +2727,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.5", "scrutinizer/ocular": "^1.8.1", "unleashedtech/php-coding-standard": "^3.1", @@ -2195,58 +2787,56 @@ "type": "github" } ], - "time": "2021-08-14T12:15:32+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { "name": "league/flysystem", - "version": "1.1.9", + "version": "3.27.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99" + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + "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.295.10", + "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.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { - "League\\Flysystem\\": "src/" + "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2256,70 +2846,128 @@ "authors": [ { "name": "Frank de Jonge", - "email": "info@frenky.net" + "email": "info@frankdejonge.nl" } ], - "description": "Filesystem abstraction: Many filesystems, one API.", + "description": "File storage abstraction for PHP", "keywords": [ - "Cloud Files", "WebDAV", - "abstraction", "aws", "cloud", - "copy.com", - "dropbox", - "file systems", + "file", "files", "filesystem", "filesystems", "ftp", - "rackspace", - "remote", "s3", "sftp", "storage" ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" + "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" }, "funding": [ { - "url": "https://offset.earth/frankdejonge", - "type": "other" + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" } ], - "time": "2021-12-09T09:40:50+00:00" + "time": "2024-04-07T19:17:50+00:00" }, { - "name": "league/iso3166", - "version": "4.0.0", + "name": "league/flysystem-aws-s3-v3", + "version": "3.27.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/iso3166.git", - "reference": "1a3ec7e6f1e4f16fce68dc239bafae217fbdcfef" + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "3e6ce2f972f1470db779f04d29c289dcd2c32837" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/iso3166/zipball/1a3ec7e6f1e4f16fce68dc239bafae217fbdcfef", - "reference": "1a3ec7e6f1e4f16fce68dc239bafae217fbdcfef", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/3e6ce2f972f1470db779f04d29c289dcd2c32837", + "reference": "3e6ce2f972f1470db779f04d29c289dcd2c32837", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "aws/aws-sdk-php": "^3.295.10", + "league/flysystem": "^3.10.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, - "require-dev": { - "phpunit/phpunit": "^9.5" + "conflict": { + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" + "autoload": { + "psr-4": { + "League\\Flysystem\\AwsS3V3\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "AWS S3 filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "aws", + "file", + "files", + "filesystem", + "s3", + "storage" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.27.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" } + ], + "time": "2024-04-07T19:16:54+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.25.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "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\\ISO3166\\": "src" + "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2328,48 +2976,55 @@ ], "authors": [ { - "name": "Rob Bast", - "email": "rob.bast@gmail.com" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "ISO 3166-1 PHP Library", - "homepage": "https://github.com/thephpleague/iso3166", + "description": "Local filesystem adapter for Flysystem.", "keywords": [ - "3166", - "3166-1", - "ISO 3166", - "countries", - "iso", - "library" + "Flysystem", + "file", + "files", + "filesystem", + "local" ], "support": { - "issues": "https://github.com/thephpleague/iso3166/issues", - "source": "https://github.com/thephpleague/iso3166" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" }, - "time": "2021-10-22T12:47:55+00:00" + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-03-15T19:58:44+00:00" }, { "name": "league/mime-type-detection", - "version": "1.9.0", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "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" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -2390,7 +3045,7 @@ "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.9.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" }, "funding": [ { @@ -2402,20 +3057,20 @@ "type": "tidelift" } ], - "time": "2021-11-21T11:48:40+00:00" + "time": "2024-01-28T23:22:08+00:00" }, { "name": "league/oauth1-client", - "version": "v1.10.0", + "version": "v1.10.1", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth1-client.git", - "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc" + "reference": "d6365b901b5c287dd41f143033315e2f777e1167" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/88dd16b0cff68eb9167bfc849707d2c40ad91ddc", - "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167", + "reference": "d6365b901b5c287dd41f143033315e2f777e1167", "shasum": "" }, "require": { @@ -2476,31 +3131,31 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth1-client/issues", - "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.0" + "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1" }, - "time": "2021-08-15T23:05:49+00:00" + "time": "2022-04-15T14:02:14+00:00" }, { "name": "mcamara/laravel-localization", - "version": "v1.7.0", + "version": "V1.8.0", "source": { "type": "git", "url": "https://github.com/mcamara/laravel-localization.git", - "reference": "27565315c585e90d8d93aa06afd49d6a5992fe5a" + "reference": "9b1779a963c1779d1977d8ad0558a681608e3ec1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/27565315c585e90d8d93aa06afd49d6a5992fe5a", - "reference": "27565315c585e90d8d93aa06afd49d6a5992fe5a", + "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/9b1779a963c1779d1977d8ad0558a681608e3ec1", + "reference": "9b1779a963c1779d1977d8ad0558a681608e3ec1", "shasum": "" }, "require": { - "laravel/framework": "~5.2.0||~5.3.0||~5.4.0||~5.5.0||~5.6.0||~5.7.0||~5.8.0||^6.0||^7.0||^8.0||^9.0", + "laravel/framework": "~5.2.0||~5.3.0||~5.4.0||~5.5.0||~5.6.0||~5.7.0||~5.8.0||^6.0||^7.0||^8.0||^9.0|^10.0", "php": ">=7.1.0" }, "require-dev": { - "orchestra/testbench-browser-kit": "~3.4|~3.8|~4.0", - "phpunit/phpunit": "6.0.*|^8.0" + "orchestra/testbench-browser-kit": "~3.4|~3.8|~4.0|^7.12", + "phpunit/phpunit": "6.0.*|^8.0|^9.5.10" }, "suggest": { "ext-intl": "*" @@ -2517,10 +3172,10 @@ } }, "autoload": { - "classmap": [], "psr-0": { "Mcamara\\LaravelLocalization": "src/" - } + }, + "classmap": [] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2542,7 +3197,7 @@ ], "support": { "issues": "https://github.com/mcamara/laravel-localization/issues", - "source": "https://github.com/mcamara/laravel-localization/tree/v1.7.0" + "source": "https://github.com/mcamara/laravel-localization/tree/V1.8.0" }, "funding": [ { @@ -2554,44 +3209,108 @@ "type": "github" } ], - "time": "2022-01-26T10:27:45+00:00" + "time": "2023-02-18T15:43:23+00:00" + }, + { + "name": "monarobase/country-list", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/Monarobase/country-list.git", + "reference": "96330b054c756ed76bf1f493f6fe52ba60ffc0de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Monarobase/country-list/zipball/96330b054c756ed76bf1f493f6fe52ba60ffc0de", + "reference": "96330b054c756ed76bf1f493f6fe52ba60ffc0de", + "shasum": "" + }, + "require": { + "illuminate/support": "^5.8|^6|^7|^8|^9|^10|^11", + "php": ">=5.6.0", + "umpirsky/country-list": "2.0.*" + }, + "require-dev": { + "phpunit/phpunit": "^8.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Monarobase\\CountryList\\CountryListServiceProvider" + ], + "aliases": { + "Countries": "Monarobase\\CountryList\\CountryListFacade" + } + } + }, + "autoload": { + "psr-4": { + "Monarobase\\CountryList\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Thuau", + "email": "jonathan@monarobase.net", + "homepage": "https://monarobase.net", + "role": "Developer" + } + ], + "description": "List of all countries with names and ISO 3166-1 codes in all languages and data formats for Laravel", + "keywords": [ + "countries", + "laravel" + ], + "support": { + "issues": "https://github.com/Monarobase/country-list/issues", + "source": "https://github.com/Monarobase/country-list/tree/3.5.0" + }, + "time": "2024-03-13T08:58:03+00:00" }, { "name": "monolog/monolog", - "version": "2.3.5", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", - "graylog2/gelf-php": "^1.4.2", + "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", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "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", @@ -2606,14 +3325,13 @@ "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", - "php-console/php-console": "Allow sending log messages to Google Chrome", "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": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -2641,7 +3359,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" }, "funding": [ { @@ -2653,38 +3371,111 @@ "type": "tidelift" } ], - "time": "2021-10-01T21:08:31+00:00" + "time": "2024-04-12T21:02:21+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "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" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + }, + "time": "2023-08-25T10:54:48+00:00" }, { "name": "nesbot/carbon", - "version": "2.56.0", + "version": "2.72.3", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "626ec8cbb724cd3c3400c3ed8f730545b744e3f4" + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/626ec8cbb724cd3c3400c3ed8f730545b744e3f4", - "reference": "626ec8cbb724cd3c3400c3ed8f730545b744e3f4", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", "shasum": "" }, "require": { + "carbonphp/carbon-doctrine-types": "*", "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.0", - "doctrine/orm": "^2.7", + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", "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.54 || ^1.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "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": [ @@ -2741,43 +3532,47 @@ }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "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": "2022-01-21T17:08:38+00:00" + "time": "2024-01-25T10:35:09+00:00" }, { "name": "nette/schema", - "version": "v1.2.2", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", "shasum": "" }, "require": { - "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.2" + "nette/utils": "^4.0", + "php": "8.1 - 8.3" }, "require-dev": { - "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^0.12", - "tracy/tracy": "^2.7" + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -2809,34 +3604,36 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.2" + "source": "https://github.com/nette/schema/tree/v1.3.0" }, - "time": "2021-10-15T11:40:02+00:00" + "time": "2023-12-11T11:54:22+00:00" }, { "name": "nette/utils", - "version": "v3.2.7", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99" + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/0af4e3de4df9f1543534beab255ccf459e7a2c99", - "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", "shasum": "" }, "require": { - "php": ">=7.2 <8.2" + "php": ">=8.0 <8.4" }, "conflict": { - "nette/di": "<3.0.6" + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { - "nette/tester": "~2.0", + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.3" + "tracy/tracy": "^2.9" }, "suggest": { "ext-gd": "to use Image", @@ -2844,13 +3641,12 @@ "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()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2894,44 +3690,131 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.7" + "source": "https://github.com/nette/utils/tree/v4.0.4" }, - "time": "2022-01-24T11:29:14+00:00" + "time": "2024-01-17T16:50:36+00:00" }, { - "name": "nyholm/psr7", - "version": "1.5.0", + "name": "nunomaduro/termwind", + "version": "v1.15.1", "source": { "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "1461e07a0f2a975a52082ca3b769ca912b816226" + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/1461e07a0f2a975a52082ca3b769ca912b816226", - "reference": "1461e07a0f2a975a52082ca3b769ca912b816226", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", "shasum": "" }, "require": { - "php": ">=7.1", - "php-http/message-factory": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.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": "nyholm/psr7", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || 8.5 || 9.4", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/error-handler": "^4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -2961,7 +3844,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.5.0" + "source": "https://github.com/Nyholm/psr7/tree/1.8.1" }, "funding": [ { @@ -2973,42 +3856,34 @@ "type": "github" } ], - "time": "2022-02-02T18:37:57+00:00" + "time": "2023-11-13T09:31:12+00:00" }, { - "name": "opis/closure", - "version": "3.6.3", + "name": "paragonie/constant_time_encoding", + "version": "v2.7.0", "source": { "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/52a0d99e69f56b9ec27ace92ba56897fe6993105", + "reference": "52a0d99e69f56b9ec27ace92ba56897fe6993105", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0" + "php": "^7|^8" }, "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6.x-dev" - } - }, "autoload": { "psr-4": { - "Opis\\Closure\\": "src/" - }, - "files": [ - "functions.php" - ] + "ParagonIE\\ConstantTime\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3016,53 +3891,112 @@ ], "authors": [ { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" }, { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" } ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" + "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": "2024-05-08T12:18:48+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": { - "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.3" + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" }, - "time": "2022-01-27T09:35:39+00:00" + "time": "2020-10-15T08:29:30+00:00" }, { "name": "php-http/client-common", - "version": "2.5.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "d135751167d57e27c74de674d6a30cef2dc8e054" + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/d135751167d57e27c74de674d6a30cef2dc8e054", - "reference": "d135751167d57e27c74de674d6a30cef2dc8e054", + "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/httplug": "^2.0", "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", "symfony/polyfill-php80": "^1.17" }, "require-dev": { @@ -3071,7 +4005,7 @@ "nyholm/psr7": "^1.2", "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" }, "suggest": { "ext-json": "To detect JSON responses with the ContentTypePlugin", @@ -3081,11 +4015,6 @@ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\Common\\": "src/" @@ -3111,50 +4040,60 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.5.0" + "source": "https://github.com/php-http/client-common/tree/2.7.1" }, - "time": "2021-11-26T15:01:24+00:00" + "time": "2023-11-30T10:31:25+00:00" }, { "name": "php-http/discovery", - "version": "1.14.1", + "version": "1.19.4", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "de90ab2b41d7d61609f504e031339776bc8c7223" + "reference": "0700efda8d7526335132360167315fdab3aeb599" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/de90ab2b41d7d61609f504e031339776bc8c7223", - "reference": "de90ab2b41d7d61609f504e031339776bc8c7223", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", "shasum": "" }, "require": { + "composer-plugin-api": "^1.0|^2.0", "php": "^7.1 || ^8.0" }, "conflict": { - "nyholm/psr7": "<1.0" + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, "require-dev": { + "composer/composer": "^1.0.2|^2.0", "graham-campbell/phpspec-skip-example-extension": "^5.0", "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" - }, - "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, - "type": "library", + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, "autoload": { "psr-4": { "Http\\Discovery\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3166,7 +4105,7 @@ "email": "mark.sagikazar@gmail.com" } ], - "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", "homepage": "http://php-http.org", "keywords": [ "adapter", @@ -3175,44 +4114,40 @@ "factory", "http", "message", + "psr17", "psr7" ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.14.1" + "source": "https://github.com/php-http/discovery/tree/1.19.4" }, - "time": "2021-09-18T07:57:46+00:00" + "time": "2024-03-29T13:00:05+00:00" }, { "name": "php-http/httplug", - "version": "2.2.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", - "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/promise": "^1.1", "psr/http-client": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1", - "phpspec/phpspec": "^5.1 || ^6.0" + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\": "src/" @@ -3241,29 +4176,28 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/master" + "source": "https://github.com/php-http/httplug/tree/2.4.0" }, - "time": "2020-07-13T15:43:23+00:00" + "time": "2023-04-14T15:10:03+00:00" }, { "name": "php-http/message", - "version": "1.12.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "39eb7548be982a81085fe5a6e2a44268cd586291" + "reference": "5997f3289332c699fa2545c427826272498a2088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/39eb7548be982a81085fe5a6e2a44268cd586291", - "reference": "39eb7548be982a81085fe5a6e2a44268cd586291", + "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", + "reference": "5997f3289332c699fa2545c427826272498a2088", "shasum": "" }, "require": { "clue/stream-filter": "^1.5", - "php": "^7.1 || ^8.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0" + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" }, "provide": { "php-http/message-factory-implementation": "1.0" @@ -3271,9 +4205,10 @@ "require-dev": { "ergebnis/composer-normalize": "^2.6", "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0", - "laminas/laminas-diactoros": "^2.0", - "phpspec/phpspec": "^5.1 || ^6.3", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "slim/slim": "^3.0" }, "suggest": { @@ -3283,11 +4218,6 @@ "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { "files": [ "src/filters.php" @@ -3315,32 +4245,32 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.12.0" + "source": "https://github.com/php-http/message/tree/1.16.1" }, - "time": "2021-08-29T09:13:12+00:00" + "time": "2024-03-07T13:22:09+00:00" }, { "name": "php-http/message-factory", - "version": "v1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", "shasum": "" }, "require": { "php": ">=5.4", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -3369,37 +4299,33 @@ ], "support": { "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/master" + "source": "https://github.com/php-http/message-factory/tree/1.1.0" }, - "time": "2015-12-19T14:08:53+00:00" + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" }, { "name": "php-http/promise", - "version": "1.1.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { "Http\\Promise\\": "src/" @@ -3426,35 +4352,39 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "phpoption/phpoption", - "version": "1.8.1", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + "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.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -3487,7 +4417,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" }, "funding": [ { @@ -3499,31 +4429,142 @@ "type": "tidelift" } ], - "time": "2021-12-04T23:24:31+00:00" + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.37", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2024-03-03T02:14:58+00:00" }, { "name": "predis/predis", - "version": "v1.1.10", + "version": "v2.2.2", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e" + "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", - "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "url": "https://api.github.com/repos/predis/predis/zipball/b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", + "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "friendsofphp/php-cs-fixer": "^3.3", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^8.0 || ~9.4.4" }, "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" }, "type": "library", "autoload": { @@ -3536,19 +4577,13 @@ "MIT" ], "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net", - "role": "Creator & Maintainer" - }, { "name": "Till Krüss", "homepage": "https://till.im", "role": "Maintainer" } ], - "description": "Flexible and feature-complete Redis client for PHP and HHVM", + "description": "A flexible and feature-complete Redis client for PHP.", "homepage": "http://github.com/predis/predis", "keywords": [ "nosql", @@ -3557,7 +4592,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v1.1.10" + "source": "https://github.com/predis/predis/tree/v2.2.2" }, "funding": [ { @@ -3565,34 +4600,34 @@ "type": "github" } ], - "time": "2022-01-05T17:46:08+00:00" + "time": "2023-09-13T16:42:03+00:00" }, { "name": "propaganistas/laravel-phone", - "version": "4.3.6", + "version": "5.3.2", "source": { "type": "git", "url": "https://github.com/Propaganistas/Laravel-Phone.git", - "reference": "74be6e327a76501d800a4a9b7cdf0332ccb04afe" + "reference": "44efd6edc181616c49f895fff97ad1cc0f3fecb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Propaganistas/Laravel-Phone/zipball/74be6e327a76501d800a4a9b7cdf0332ccb04afe", - "reference": "74be6e327a76501d800a4a9b7cdf0332ccb04afe", + "url": "https://api.github.com/repos/Propaganistas/Laravel-Phone/zipball/44efd6edc181616c49f895fff97ad1cc0f3fecb2", + "reference": "44efd6edc181616c49f895fff97ad1cc0f3fecb2", "shasum": "" }, "require": { - "giggsey/libphonenumber-for-php": "^7.0|^8.0", - "illuminate/contracts": "^8.9|^9.0", - "illuminate/support": "^8.0|^9.0", - "illuminate/validation": "^8.0|^9.0", - "league/iso3166": "^2.0|^3.0|^4.0", - "php": "^7.3|^8.0" + "giggsey/libphonenumber-for-php-lite": "^8.13.35", + "illuminate/contracts": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "illuminate/validation": "^10.0|^11.0", + "php": "^8.1" }, "require-dev": { - "nunomaduro/larastan": "^1.0", + "larastan/larastan": "^2.9", + "laravel/pint": "^1.14", "orchestra/testbench": "*", - "phpunit/phpunit": "^9.5.10" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -3629,31 +4664,42 @@ ], "support": { "issues": "https://github.com/Propaganistas/Laravel-Phone/issues", - "source": "https://github.com/Propaganistas/Laravel-Phone/tree/4.3.6" + "source": "https://github.com/Propaganistas/Laravel-Phone/tree/5.3.2" }, - "time": "2022-01-15T20:03:10+00:00" + "funding": [ + { + "url": "https://github.com/Propaganistas", + "type": "github" + } + ], + "time": "2024-04-24T09:18:58+00:00" }, { - "name": "psr/container", - "version": "1.1.2", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3666,20 +4712,117 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Common interface for caching libraries", "keywords": [ - "PSR-11", - "container", + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+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/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -3733,21 +4876,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "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" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3767,7 +4910,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -3779,27 +4922,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3819,10 +4962,10 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -3834,31 +4977,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -3873,7 +5016,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -3887,22 +5030,22 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", - "version": "2.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -3911,7 +5054,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { @@ -3937,31 +5080,31 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:41:46+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -3976,7 +5119,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for simple caching", @@ -3988,9 +5131,9 @@ "simple-cache" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2017-10-23T01:57:42+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -4038,42 +5181,52 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": "^7.3 || ^8", - "symfony/polyfill-php81": "^1.23" + "php": "^8.1" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "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", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "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/" @@ -4101,7 +5254,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { @@ -4113,29 +5266,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { "name": "ramsey/uuid", - "version": "4.2.3", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8 || ^0.9", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", - "php": "^7.2 || ^8.0", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php80": "^1.14" + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -4147,24 +5298,23 @@ "doctrine/annotations": "^1.8", "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", "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.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", "phpunit/phpunit": "^8.5 || ^9", - "slevomat/coding-standard": "^7.0", + "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-ctype": "Enables faster processing of character classification using ctype functions.", "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", @@ -4172,20 +5322,17 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "4.x-dev" - }, "captainhook": { "force-install": true } }, "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, "files": [ "src/functions.php" - ] + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4199,7 +5346,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.2.3" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -4211,26 +5358,26 @@ "type": "tidelift" } ], - "time": "2021-09-25T23:10:38+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "sentry/sdk", - "version": "3.1.1", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "2de7de3233293f80d1e244bd950adb2121a3731c" + "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/2de7de3233293f80d1e244bd950adb2121a3731c", - "reference": "2de7de3233293f80d1e244bd950adb2121a3731c", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/24c235ff2027401cbea099bf88689e1a1f197c7a", + "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a", "shasum": "" }, "require": { "http-interop/http-factory-guzzle": "^1.0", - "sentry/sentry": "^3.1", - "symfony/http-client": "^4.3|^5.0|^6.0" + "sentry/sentry": "^3.22", + "symfony/http-client": "^4.3|^5.0|^6.0|^7.0" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -4255,7 +5402,8 @@ "sentry" ], "support": { - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.1" + "issues": "https://github.com/getsentry/sentry-php-sdk/issues", + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.6.0" }, "funding": [ { @@ -4267,40 +5415,39 @@ "type": "custom" } ], - "time": "2021-11-30T11:54:41+00:00" + "time": "2023-12-04T10:49:33+00:00" }, { "name": "sentry/sentry", - "version": "3.3.7", + "version": "3.22.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "32e5415803ff0349ccb5e5b5e77b016320762786" + "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/32e5415803ff0349ccb5e5b5e77b016320762786", - "reference": "32e5415803ff0349ccb5e5b5e77b016320762786", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", + "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7|^2.0", + "guzzlehttp/promises": "^1.5.3|^2.0", "jean85/pretty-package-versions": "^1.5|^2.0.4", "php": "^7.2|^8.0", "php-http/async-client-implementation": "^1.0", "php-http/client-common": "^1.5|^2.0", - "php-http/discovery": "^1.6.1", + "php-http/discovery": "^1.15", "php-http/httplug": "^1.1|^2.0", "php-http/message": "^1.5", + "php-http/message-factory": "^1.1", "psr/http-factory": "^1.0", - "psr/http-message-implementation": "^1.0", + "psr/http-factory-implementation": "^1.0", "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", - "symfony/polyfill-php80": "^1.17", - "symfony/polyfill-uuid": "^1.13.1" + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0|^7.0", + "symfony/polyfill-php80": "^1.17" }, "conflict": { "php-http/client-common": "1.8.0", @@ -4308,8 +5455,9 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", "http-interop/http-factory-guzzle": "^1.0", - "monolog/monolog": "^1.3|^2.0", + "monolog/monolog": "^1.6|^2.0|^3.0", "nikic/php-parser": "^4.10.3", "php-http/mock-client": "^1.3", "phpbench/phpbench": "^1.0", @@ -4324,11 +5472,6 @@ "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, "autoload": { "files": [ "src/functions.php" @@ -4339,7 +5482,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { @@ -4360,7 +5503,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.3.7" + "source": "https://github.com/getsentry/sentry-php/tree/3.22.1" }, "funding": [ { @@ -4372,44 +5515,45 @@ "type": "custom" } ], - "time": "2022-01-19T08:46:27+00:00" + "time": "2023-11-13T11:47:28+00:00" }, { "name": "sentry/sentry-laravel", - "version": "2.11.0", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "87b0a1d21b85728206de43f816aa349030811627" + "reference": "1293e5732f8405e12f000cdf5dee78c927a18de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/87b0a1d21b85728206de43f816aa349030811627", - "reference": "87b0a1d21b85728206de43f816aa349030811627", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/1293e5732f8405e12f000cdf5dee78c927a18de0", + "reference": "1293e5732f8405e12f000cdf5dee78c927a18de0", "shasum": "" }, "require": { - "illuminate/support": "5.0 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", - "sentry/sdk": "^3.1", - "sentry/sentry": "^3.3", + "sentry/sdk": "^3.4", + "sentry/sentry": "^3.20.1", "symfony/psr-http-message-bridge": "^1.0 | ^2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "2.18.*", - "laravel/framework": "5.0 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "friendsofphp/php-cs-fixer": "^3.11", + "laravel/folio": "^1.0", + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "mockery/mockery": "^1.3", - "orchestra/testbench": "3.1 - 3.8 | ^4.7 | ^5.1 | ^6.0 | ^7.0", - "phpunit/phpunit": "^5.7 | ^6.5 | ^7.5 | ^8.4 | ^9.3" - }, - "suggest": { - "zendframework/zend-diactoros": "When using Laravel >=5.1 - <=6.9 this package can help get more accurate request info, not used on Laravel >=6.10 anymore (https://laravel.com/docs/5.8/requests#psr7-requests)" + "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.4 | ^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev", + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev", "dev-0.x": "0.x-dev" }, "laravel": { @@ -4429,7 +5573,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { @@ -4451,7 +5595,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/2.11.0" + "source": "https://github.com/getsentry/sentry-laravel/tree/3.8.2" }, "funding": [ { @@ -4463,30 +5607,30 @@ "type": "custom" } ], - "time": "2022-01-19T10:29:29+00:00" + "time": "2023-10-12T14:38:46+00:00" }, { "name": "socialiteproviders/manager", - "version": "v4.1.0", + "version": "v4.6.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "4e63afbd26dc45ff263591de2a0970436a6a0bf9" + "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/4e63afbd26dc45ff263591de2a0970436a6a0bf9", - "reference": "4e63afbd26dc45ff263591de2a0970436a6a0bf9", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/dea5190981c31b89e52259da9ab1ca4e2b258b21", + "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21", "shasum": "" }, "require": { - "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "laravel/socialite": "~4.0 || ~5.0", - "php": "^7.2 || ^8.0" + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "laravel/socialite": "^5.5", + "php": "^8.0" }, "require-dev": { "mockery/mockery": "^1.2", - "phpunit/phpunit": "^6.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { @@ -4537,7 +5681,7 @@ "issues": "https://github.com/socialiteproviders/manager/issues", "source": "https://github.com/socialiteproviders/manager" }, - "time": "2022-01-23T22:40:23+00:00" + "time": "2024-05-04T07:57:39+00:00" }, { "name": "socialiteproviders/surfconext", @@ -4580,30 +5724,105 @@ }, "time": "2020-12-01T23:10:59+00:00" }, + { + "name": "spatie/eloquent-sortable", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/eloquent-sortable.git", + "reference": "fb8a5d071eec525cd5a0ad1a011306c0a76b2a9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/fb8a5d071eec525cd5a0ad1a011306c0a76b2a9f", + "reference": "fb8a5d071eec525cd5a0ad1a011306c0a76b2a9f", + "shasum": "" + }, + "require": { + "illuminate/database": "^9.31|^10.0|^11.0", + "illuminate/support": "^9.31|^10.0|^11.0", + "nesbot/carbon": "^2.63|^3.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.5|^10.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\EloquentSortable\\EloquentSortableServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\EloquentSortable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be" + } + ], + "description": "Sortable behaviour for eloquent models", + "homepage": "https://github.com/spatie/eloquent-sortable", + "keywords": [ + "behaviour", + "eloquent", + "laravel", + "model", + "sort", + "sortable" + ], + "support": { + "issues": "https://github.com/spatie/eloquent-sortable/issues", + "source": "https://github.com/spatie/eloquent-sortable/tree/4.3.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-02T09:49:34+00:00" + }, { "name": "spatie/laravel-activitylog", - "version": "3.17.0", + "version": "4.8.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-activitylog.git", - "reference": "bdc44862aaca39ecbd824133b80dbd7c8017ed7f" + "reference": "eb6f37dd40af950ce10cf5280f0acfa3e08c3bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/bdc44862aaca39ecbd824133b80dbd7c8017ed7f", - "reference": "bdc44862aaca39ecbd824133b80dbd7c8017ed7f", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/eb6f37dd40af950ce10cf5280f0acfa3e08c3bff", + "reference": "eb6f37dd40af950ce10cf5280f0acfa3e08c3bff", "shasum": "" }, "require": { - "illuminate/config": "^6.0 || ^7.0 || ^8.0", - "illuminate/database": "^6.0 || ^7.0 || ^8.0", - "illuminate/support": "^6.0 || ^7.0 || ^8.0", - "php": "^7.3 || ^8.0" + "illuminate/config": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/database": "^8.69 || ^9.27 || ^10.0 || ^11.0", + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.6.3" }, "require-dev": { "ext-json": "*", - "orchestra/testbench": "^4.0 || ^5.0 || ^6.0", - "phpunit/phpunit": "^9.3" + "orchestra/testbench": "^6.23 || ^7.0 || ^8.0 || ^9.0", + "pestphp/pest": "^1.20 || ^2.0" }, "type": "library", "extra": { @@ -4656,7 +5875,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-activitylog/issues", - "source": "https://github.com/spatie/laravel-activitylog/tree/3.17.0" + "source": "https://github.com/spatie/laravel-activitylog/tree/4.8.0" }, "funding": [ { @@ -4668,34 +5887,97 @@ "type": "github" } ], - "time": "2021-03-02T16:49:06+00:00" + "time": "2024-03-08T22:28:17+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.16.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.5.24", + "spatie/pest-plugin-test-time": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-03-20T07:29:11+00:00" }, { "name": "spatie/laravel-query-builder", - "version": "3.6.2", + "version": "5.7.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-query-builder.git", - "reference": "3768381e9f2f80b01f0088eca49f061c269e0e8b" + "reference": "ff61a9ea32c5b55cbe63de8e3c6e35a201e6b746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/3768381e9f2f80b01f0088eca49f061c269e0e8b", - "reference": "3768381e9f2f80b01f0088eca49f061c269e0e8b", + "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/ff61a9ea32c5b55cbe63de8e3c6e35a201e6b746", + "reference": "ff61a9ea32c5b55cbe63de8e3c6e35a201e6b746", "shasum": "" }, "require": { - "illuminate/database": "^6.20.13|^7.30.4|^8.22.2", - "illuminate/http": "^6.20.13|^7.30.4|^8.22.2", - "illuminate/support": "^6.20.13|^7.30.4|^8.22.2", - "php": "^7.3|^8.0" + "illuminate/database": "^9.0|^10.0", + "illuminate/http": "^9.0|^10.0", + "illuminate/support": "^9.0|^10.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.11" }, "require-dev": { "ext-json": "*", - "laravel/legacy-factories": "^1.0.4", "mockery/mockery": "^1.4", - "orchestra/testbench": "^4.9|^5.8|^6.3", - "phpunit/phpunit": "^9.0" + "orchestra/testbench": "^7.0|^8.0", + "pestphp/pest": "^1.20", + "phpunit/phpunit": "^9.6.11", + "spatie/invade": "^2.0", + "spatie/laravel-ray": "^1.28" }, "type": "library", "extra": { @@ -4707,7 +5989,8 @@ }, "autoload": { "psr-4": { - "Spatie\\QueryBuilder\\": "src" + "Spatie\\QueryBuilder\\": "src", + "Spatie\\QueryBuilder\\Database\\Factories\\": "database/factories" } }, "notification-url": "https://packagist.org/downloads/", @@ -4738,30 +6021,31 @@ "type": "custom" } ], - "time": "2022-01-09T15:39:13+00:00" + "time": "2024-01-08T09:57:13+00:00" }, { "name": "spatie/laravel-queueable-action", - "version": "2.14.1", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-queueable-action.git", - "reference": "ce25c279ec0add73c35eae7fd7f1d8fb4da26072" + "reference": "cc9273121c90d99623570199cc52bcf4699835bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-queueable-action/zipball/ce25c279ec0add73c35eae7fd7f1d8fb4da26072", - "reference": "ce25c279ec0add73c35eae7fd7f1d8fb4da26072", + "url": "https://api.github.com/repos/spatie/laravel-queueable-action/zipball/cc9273121c90d99623570199cc52bcf4699835bf", + "reference": "cc9273121c90d99623570199cc52bcf4699835bf", "shasum": "" }, "require": { - "laravel/framework": "^8.0|^9.0", + "laravel/framework": "^8.0|^9.0|^10.0|^11.0", "php": "^8.0" }, "require-dev": { "mockery/mockery": "^1.4", - "orchestra/testbench": "^6.23|^7.0", - "phpunit/phpunit": "^9.5.10" + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", + "pestphp/pest": "^1.22|^2.34", + "pestphp/pest-plugin-laravel": "^1.3|^2.3" }, "type": "library", "extra": { @@ -4814,7 +6098,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-queueable-action/issues", - "source": "https://github.com/spatie/laravel-queueable-action/tree/2.14.1" + "source": "https://github.com/spatie/laravel-queueable-action/tree/2.15.0" }, "funding": [ { @@ -4822,46 +6106,47 @@ "type": "custom" } ], - "time": "2022-02-09T07:57:23+00:00" + "time": "2024-02-27T12:08:08+00:00" }, { - "name": "swiftmailer/swiftmailer", - "version": "v6.3.0", + "name": "spatie/laravel-tags", + "version": "4.6.1", "source": { "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + "url": "https://github.com/spatie/laravel-tags.git", + "reference": "73944e8bd7a341269c03959fe063d8714adbe5a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "url": "https://api.github.com/repos/spatie/laravel-tags/zipball/73944e8bd7a341269c03959fe063d8714adbe5a6", + "reference": "73944e8bd7a341269c03959fe063d8714adbe5a6", "shasum": "" }, "require": { - "egulias/email-validator": "^2.0|^3.1", - "php": ">=7.0.0", - "symfony/polyfill-iconv": "^1.0", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "laravel/framework": "^8.67|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.63|^3.0", + "php": "^8.0", + "spatie/eloquent-sortable": "^3.10|^4.0", + "spatie/laravel-package-tools": "^1.4", + "spatie/laravel-translatable": "^4.6|^5.0|^6.0" }, "require-dev": { - "mockery/mockery": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.4" - }, - "suggest": { - "ext-intl": "Needed to support internationalized email addresses" + "orchestra/testbench": "^6.13|^7.0|^8.0|^9.0", + "pestphp/pest": "^1.22|^2.0", + "phpunit/phpunit": "^9.5.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "6.2-dev" + "laravel": { + "providers": [ + "Spatie\\Tags\\TagsServiceProvider" + ] } }, "autoload": { - "files": [ - "lib/swift_required.php" - ] + "psr-4": { + "Spatie\\Tags\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4869,85 +6154,155 @@ ], "authors": [ { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Add tags and taggable behaviour to your Laravel app", + "homepage": "https://github.com/spatie/laravel-tags", "keywords": [ - "email", - "mail", - "mailer" + "laravel-tags", + "spatie" ], "support": { - "issues": "https://github.com/swiftmailer/swiftmailer/issues", - "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + "issues": "https://github.com/spatie/laravel-tags/issues", + "source": "https://github.com/spatie/laravel-tags/tree/4.6.1" }, "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://github.com/spatie", "type": "github" + } + ], + "time": "2024-03-01T12:44:53+00:00" + }, + { + "name": "spatie/laravel-translatable", + "version": "6.7.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-translatable.git", + "reference": "b75b3300949cdc6ce191f9a4b70addbce5d54ff5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/b75b3300949cdc6ce191f9a4b70addbce5d54ff5", + "reference": "b75b3300949cdc6ce191f9a4b70addbce5d54ff5", + "shasum": "" + }, + "require": { + "illuminate/database": "^9.0|^10.0|^11.0", + "illuminate/support": "^9.0|^10.0|^11.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.11" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7.0|^8.0|^9.0", + "pestphp/pest": "^1.20|^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Translatable\\TranslatableServiceProvider" + ] + }, + "aliases": { + "Translatable": "Spatie\\Translatable\\Facades\\Translatable" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Translatable\\": "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" }, { - "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", - "type": "tidelift" + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to make an Eloquent model hold translations", + "homepage": "https://github.com/spatie/laravel-translatable", + "keywords": [ + "eloquent", + "i8n", + "laravel-translatable", + "model", + "multilingual", + "spatie", + "translate" + ], + "support": { + "issues": "https://github.com/spatie/laravel-translatable/issues", + "source": "https://github.com/spatie/laravel-translatable/tree/6.7.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" } ], - "abandoned": "symfony/mailer", - "time": "2021-10-18T15:26:12+00:00" + "time": "2024-05-13T12:34:22+00:00" }, { "name": "symfony/console", - "version": "v5.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8" + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a2a86ec353d825c75856c6fd14fac416a7bdb6b8", - "reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8", + "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "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" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -4976,12 +6331,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.3" + "source": "https://github.com/symfony/console/tree/v6.4.7" }, "funding": [ { @@ -4997,24 +6352,24 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:28:35+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/css-selector", - "version": "v6.0.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "1955d595c12c111629cc814d3f2a2ff13580508a" + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1955d595c12c111629cc814d3f2a2ff13580508a", - "reference": "1955d595c12c111629cc814d3f2a2ff13580508a", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -5046,7 +6401,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.0.3" + "source": "https://github.com/symfony/css-selector/tree/v6.4.7" }, "funding": [ { @@ -5062,29 +6417,29 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.0.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", - "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5113,7 +6468,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -5129,31 +6484,35 @@ "type": "tidelift" } ], - "time": "2021-11-01T23:48:49+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/error-handler", - "version": "v5.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5" + "reference": "667a072466c6a53827ed7b119af93806b884cbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5", - "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/667a072466c6a53827ed7b119af93806b884cbb3", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -5184,7 +6543,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.3" + "source": "https://github.com/symfony/error-handler/tree/v6.4.7" }, "funding": [ { @@ -5200,28 +6559,29 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.0.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934" + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6472ea2dd415e925b90ca82be64b8bc6157f3934", - "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -5229,17 +6589,13 @@ }, "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": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5267,7 +6623,7 @@ "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.0.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.7" }, "funding": [ { @@ -5283,33 +6639,30 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.0.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "aa5422287b75594b90ee9cd807caf8f0df491385" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385", - "reference": "aa5422287b75594b90ee9cd807caf8f0df491385", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5346,7 +6699,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -5362,26 +6715,27 @@ "type": "tidelift" } ], - "time": "2021-07-15T12:33:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/finder", - "version": "v5.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d" + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d", + "url": "https://api.github.com/repos/symfony/finder/zipball/511c48990be17358c23bf45c5d71ab85d40fb764", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -5409,7 +6763,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.3" + "source": "https://github.com/symfony/finder/tree/v6.4.7" }, "funding": [ { @@ -5425,27 +6779,32 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:34:36+00:00" + "time": "2024-04-23T10:36:43+00:00" }, { "name": "symfony/http-client", - "version": "v6.0.3", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "45b95017f6a20d564584bdee6a376c9a79caa316" + "reference": "cb4073c905cd12b8496d24ac428a9228c1750670" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/45b95017f6a20d564584bdee6a376c9a79caa316", - "reference": "45b95017f6a20d564584bdee6a376c9a79caa316", + "url": "https://api.github.com/repos/symfony/http-client/zipball/cb4073c905cd12b8496d24ac428a9228c1750670", + "reference": "cb4073c905cd12b8496d24ac428a9228c1750670", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^1.0|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3.4.1", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" }, "provide": { "php-http/async-client-implementation": "*", @@ -5458,14 +6817,15 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5492,8 +6852,11 @@ ], "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", + "keywords": [ + "http" + ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.0.3" + "source": "https://github.com/symfony/http-client/tree/v6.4.15" }, "funding": [ { @@ -5509,32 +6872,29 @@ "type": "tidelift" } ], - "time": "2022-01-22T06:58:00+00:00" + "time": "2024-11-13T13:40:18+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.0.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "265f03fed057044a8e4dc159aa33596d0f48ed3f" + "reference": "20414d96f391677bf80078aa55baece78b82647d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/265f03fed057044a8e4dc159aa33596d0f48ed3f", - "reference": "265f03fed057044a8e4dc159aa33596d0f48ed3f", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", "shasum": "" }, "require": { - "php": ">=8.0.2" - }, - "suggest": { - "symfony/http-client-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5544,7 +6904,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\HttpClient\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5571,7 +6934,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.0.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" }, "funding": [ { @@ -5587,36 +6950,40 @@ "type": "tidelift" } ], - "time": "2021-11-03T13:44:55+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.3", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ef409ff341a565a3663157d4324536746d49a0c7" + "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ef409ff341a565a3663157d4324536746d49a0c7", - "reference": "ef409ff341a565a3663157d4324536746d49a0c7", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6", + "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-php83": "^1.27" }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0" + "conflict": { + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5644,7 +7011,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.3" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.15" }, "funding": [ { @@ -5660,76 +7027,78 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-11-08T16:09:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.4", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "49f40347228c773688a0488feea0175aa7f4d268" + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/49f40347228c773688a0488feea0175aa7f4d268", - "reference": "49f40347228c773688a0488feea0175aa7f4d268", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.3.7|^6.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.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": "<6.4", + "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "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/config": "^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -5756,7 +7125,7 @@ "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/v5.4.4" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.7" }, "funding": [ { @@ -5772,47 +7141,48 @@ "type": "tidelift" } ], - "time": "2022-01-29T18:08:07+00:00" + "time": "2024-04-29T11:24:44+00:00" }, { - "name": "symfony/mime", - "version": "v5.4.3", + "name": "symfony/mailer", + "version": "v6.4.7", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f" + "url": "https://github.com/symfony/mailer.git", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/e1503cfb5c9a225350f549d3bb99296f4abfb80f", - "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" + "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|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "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": { - "egulias/email-validator": "^2.1.10|^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\Mailer\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5832,14 +7202,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows manipulating MIME messages", + "description": "Helps sending emails", "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.3" + "source": "https://github.com/symfony/mailer/tree/v6.4.7" }, "funding": [ { @@ -5855,30 +7221,37 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { - "name": "symfony/options-resolver", - "version": "v6.0.3", + "name": "symfony/mailgun-mailer", + "version": "v6.4.7", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "51f7006670febe4cbcbae177cbffe93ff833250d" + "url": "https://github.com/symfony/mailgun-mailer.git", + "reference": "044eede71c3eb5fbe7192042b8c0d04987b5653d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/51f7006670febe4cbcbae177cbffe93ff833250d", - "reference": "51f7006670febe4cbcbae177cbffe93ff833250d", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/044eede71c3eb5fbe7192042b8c0d04987b5653d", + "reference": "044eede71c3eb5fbe7192042b8c0d04987b5653d", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "symfony/mailer": "^5.4.21|^6.2.7|^7.0" }, - "type": "library", + "conflict": { + "symfony/http-foundation": "<6.2" + }, + "require-dev": { + "symfony/http-client": "^6.3|^7.0", + "symfony/webhook": "^6.3|^7.0" + }, + "type": "symfony-mailer-bridge", "autoload": { "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" + "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5898,15 +7271,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an improved replacement for the array_replace PHP function", + "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.0.3" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.7" }, "funding": [ { @@ -5922,47 +7290,118 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.24.0", + "name": "symfony/mime", + "version": "v6.4.13", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "url": "https://github.com/symfony/mime.git", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" }, - "provide": { - "ext-ctype": "*" + "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.4.3|>7.0,<7.0.3" }, - "suggest": { - "ext-ctype": "For best performance" + "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|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "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.4.13" + }, + "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": "2024-10-25T15:07:50+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "9a3c92b490716ba6771f5beced13c6eda7183eed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/9a3c92b490716ba6771f5beced13c6eda7183eed", + "reference": "9a3c92b490716ba6771f5beced13c6eda7183eed", + "shasum": "" }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, - "files": [ - "bootstrap.php" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5971,24 +7410,23 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "config", + "configuration", + "options" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.7" }, "funding": [ { @@ -6004,36 +7442,33 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { - "name": "symfony/polyfill-iconv", - "version": "v1.24.0", + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f1aed619e28cb077fc83fac8c4c0383578356e40", - "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { "php": ">=7.1" }, "provide": { - "ext-iconv": "*" + "ext-ctype": "*" }, "suggest": { - "ext-iconv": "For best performance" + "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6044,7 +7479,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" + "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -6053,25 +7488,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Iconv extension", + "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "iconv", + "ctype", "polyfill", - "portable", - "shim" + "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -6087,20 +7521,20 @@ "type": "tidelift" } ], - "time": "2022-01-04T09:04:05+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.24.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -6111,9 +7545,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6152,7 +7583,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -6168,35 +7599,31 @@ "type": "tidelift" } ], - "time": "2021-11-23T21:10:46+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.24.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6239,7 +7666,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -6255,33 +7682,30 @@ "type": "tidelift" } ], - "time": "2021-09-14T14:02:44+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.24.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6323,7 +7747,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -6339,24 +7763,24 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.24.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -6366,86 +7790,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.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": "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.24.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": "2021-11-30T18:21:41+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.24.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6456,88 +7800,9 @@ "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.24.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": "2021-05-27T09:17:38+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.24.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "Symfony\\Polyfill\\Mbstring\\": "" } }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -6552,16 +7817,17 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -6577,30 +7843,27 @@ "type": "tidelift" } ], - "time": "2021-06-05T21:20:04+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.24.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", - "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6644,7 +7907,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -6660,30 +7923,27 @@ "type": "tidelift" } ], - "time": "2021-09-13T13:58:33+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.24.0", + "name": "symfony/polyfill-php83", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6694,7 +7954,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -6714,7 +7974,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -6723,7 +7983,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -6739,20 +7999,20 @@ "type": "tidelift" } ], - "time": "2021-09-13T13:58:11+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.24.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "7529922412d23ac44413d0f308861d50cf68d3ee" + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/7529922412d23ac44413d0f308861d50cf68d3ee", - "reference": "7529922412d23ac44413d0f308861d50cf68d3ee", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", "shasum": "" }, "require": { @@ -6766,9 +8026,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6805,7 +8062,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" }, "funding": [ { @@ -6821,25 +8078,24 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", - "version": "v5.4.3", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "553f50487389a977eb31cf6b37faae56da00f753" + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/553f50487389a977eb31cf6b37faae56da00f753", - "reference": "553f50487389a977eb31cf6b37faae56da00f753", + "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -6867,7 +8123,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.3" + "source": "https://github.com/symfony/process/tree/v6.4.15" }, "funding": [ { @@ -6883,36 +8139,37 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:28:35+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.1.2", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34" + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", - "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.0" }, "require-dev": { "nyholm/psr7": "^1.1", "psr/log": "^1.1 || ^2 || ^3", - "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.4@dev || ^6.0" + "symfony/browser-kit": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/http-kernel": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2" }, "suggest": { "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" @@ -6920,7 +8177,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-main": "2.1-dev" + "dev-main": "2.3-dev" } }, "autoload": { @@ -6955,7 +8212,7 @@ ], "support": { "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.2" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" }, "funding": [ { @@ -6971,47 +8228,40 @@ "type": "tidelift" } ], - "time": "2021-11-05T13:13:39+00:00" + "time": "2023-07-26T11:53:26+00:00" }, { "name": "symfony/routing", - "version": "v5.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "44b29c7a94e867ccde1da604792f11a469958981" + "reference": "276e06398f71fa2a973264d94f28150f93cfb907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981", - "reference": "44b29c7a94e867ccde1da604792f11a469958981", + "url": "https://api.github.com/repos/symfony/routing/zipball/276e06398f71fa2a973264d94f28150f93cfb907", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.12", + "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7045,7 +8295,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.3" + "source": "https://github.com/symfony/routing/tree/v6.4.7" }, "funding": [ { @@ -7061,36 +8311,34 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d664541b99d6fb0247ec5ff32e87238582236204" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d664541b99d6fb0247ec5ff32e87238582236204", - "reference": "d664541b99d6fb0247ec5ff32e87238582236204", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7100,7 +8348,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7127,7 +8378,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -7143,46 +8394,47 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:37:19+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/string", - "version": "v6.0.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2" + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2", - "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2", + "url": "https://api.github.com/repos/symfony/string/zipball/ffeb9591c61f65a68d47f77d12b83fa530227a69", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69", "shasum": "" }, "require": { - "php": ">=8.0.2", + "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.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -7212,7 +8464,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.3" + "source": "https://github.com/symfony/string/tree/v6.4.7" }, "funding": [ { @@ -7228,32 +8480,35 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/translation", - "version": "v6.0.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "71bb15335798f8c4da110911bcf2d2fead7a430d" + "reference": "7495687c58bfd88b7883823747b0656d90679123" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/71bb15335798f8c4da110911bcf2d2fead7a430d", - "reference": "71bb15335798f8c4da110911bcf2d2fead7a430d", + "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", + "reference": "7495687c58bfd88b7883823747b0656d90679123", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.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" }, @@ -7261,22 +8516,19 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { + "nikic/php-parser": "^4.18|^5.0", "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": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7307,7 +8559,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.0.3" + "source": "https://github.com/symfony/translation/tree/v6.4.7" }, "funding": [ { @@ -7323,32 +8575,29 @@ "type": "tidelift" } ], - "time": "2022-01-07T00:29:03+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.0.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", - "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { - "php": ">=8.0.2" - }, - "suggest": { - "symfony/translation-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7358,7 +8607,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7385,7 +8637,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.0.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -7401,53 +8653,33 @@ "type": "tidelift" } ], - "time": "2021-09-07T12:43:40+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { - "name": "symfony/var-dumper", - "version": "v5.4.3", + "name": "symfony/uid", + "version": "v6.4.7", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "970a01f208bf895c5f327ba40b72288da43adec4" + "url": "https://github.com/symfony/uid.git", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/970a01f208bf895c5f327ba40b72288da43adec4", - "reference": "970a01f208bf895c5f327ba40b72288da43adec4", + "url": "https://api.github.com/repos/symfony/uid/zipball/a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + "symfony/console": "^5.4|^6.0|^7.0" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" + "Symfony\\Component\\Uid\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7458,6 +8690,10 @@ "MIT" ], "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -7467,14 +8703,15 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "description": "Provides an object-oriented API to generate and represent UIDs", "homepage": "https://symfony.com", "keywords": [ - "debug", - "dump" + "UID", + "ulid", + "uuid" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.3" + "source": "https://github.com/symfony/uid/tree/v6.4.7" }, "funding": [ { @@ -7490,83 +8727,174 @@ "type": "tidelift" } ], - "time": "2022-01-17T16:30:37+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { - "name": "tedivm/jshrink", - "version": "v1.4.0", + "name": "symfony/var-dumper", + "version": "v6.4.7", "source": { "type": "git", - "url": "https://github.com/tedious/JShrink.git", - "reference": "0513ba1407b1f235518a939455855e6952a48bbc" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tedious/JShrink/zipball/0513ba1407b1f235518a939455855e6952a48bbc", - "reference": "0513ba1407b1f235518a939455855e6952a48bbc", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", "shasum": "" }, "require": { - "php": "^5.6|^7.0|^8.0" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.8", - "php-coveralls/php-coveralls": "^1.1.0", - "phpunit/phpunit": "^6" + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "autoload": { - "psr-0": { - "JShrink": "src/" - } + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Robert Hafner", - "email": "tedivm@tedivm.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Javascript Minifier built in PHP", - "homepage": "http://github.com/tedious/JShrink", + "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.4.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": "2024-04-18T09:22:46+00:00" + }, + { + "name": "tedivm/jshrink", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/tedious/JShrink.git", + "reference": "7a35f5a4651ca2ce77295eb8a3b4e133ba47e19e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tedious/JShrink/zipball/7a35f5a4651ca2ce77295eb8a3b4e133ba47e19e", + "reference": "7a35f5a4651ca2ce77295eb8a3b4e133ba47e19e", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.14", + "php-coveralls/php-coveralls": "^2.5.0", + "phpunit/phpunit": "^9|^10" + }, + "type": "library", + "autoload": { + "psr-0": { + "JShrink": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Robert Hafner", + "email": "tedivm@tedivm.com" + } + ], + "description": "Javascript Minifier built in PHP", + "homepage": "http://github.com/tedious/JShrink", "keywords": [ "javascript", "minifier" ], "support": { "issues": "https://github.com/tedious/JShrink/issues", - "source": "https://github.com/tedious/JShrink/tree/v1.4.0" + "source": "https://github.com/tedious/JShrink/tree/v1.7.0" }, "funding": [ + { + "url": "https://github.com/tedivm", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/tedivm/jshrink", "type": "tidelift" } ], - "time": "2020-11-30T18:10:21+00:00" + "time": "2023-10-04T17:23:23+00:00" }, { "name": "tightenco/ziggy", - "version": "0.9.4", + "version": "v1.8.2", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "82ea6ec6cb6ab3545b0245310b2a424316fe48d8" + "reference": "939576ad0f3d3e633a9401c8c377bc7bc873ff35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/82ea6ec6cb6ab3545b0245310b2a424316fe48d8", - "reference": "82ea6ec6cb6ab3545b0245310b2a424316fe48d8", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/939576ad0f3d3e633a9401c8c377bc7bc873ff35", + "reference": "939576ad0f3d3e633a9401c8c377bc7bc873ff35", "shasum": "" }, "require": { + "ext-json": "*", "laravel/framework": ">=5.4@dev" }, "require-dev": { - "orchestra/testbench": "^5.0" + "orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0" }, "type": "library", "extra": { @@ -7593,10 +8921,14 @@ { "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/tightenco/ziggy", + "homepage": "https://github.com/tighten/ziggy", "keywords": [ "Ziggy", "javascript", @@ -7605,29 +8937,29 @@ ], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/0.9.4" + "source": "https://github.com/tighten/ziggy/tree/v1.8.2" }, - "time": "2020-06-05T14:42:41+00:00" + "time": "2024-02-20T19:56:04+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.4", + "version": "v2.2.7", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c" + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", "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" + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" @@ -7658,45 +8990,95 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "umpirsky/country-list", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/umpirsky/country-list.git", + "reference": "6dddae6983c1bc4d314b513c5decb7c8c6c879dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/umpirsky/country-list/zipball/6dddae6983c1bc4d314b513c5decb7c8c6c879dc", + "reference": "6dddae6983c1bc4d314b513c5decb7c8c6c879dc", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "slowprog/composer-copy-file": "^0.2", + "symfony/intl": "^4.3", + "umpirsky/list-generator": "^1.2" + }, + "type": "library", + "extra": { + "copy-file": { + "vendor/umpirsky/list-generator/Dockerfile": "./", + "vendor/umpirsky/list-generator/docker-compose.yml": "./" + } }, - "time": "2021-12-08T09:12:39+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Saša Stamenković", + "email": "umpirsky@gmail.com" + } + ], + "description": "List of all countries with names and ISO 3166-1 codes in all languages and data formats.", + "support": { + "issues": "https://github.com/umpirsky/country-list/issues", + "source": "https://github.com/umpirsky/country-list/tree/2.0.6" + }, + "time": "2020-12-03T10:09:09+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.4.1", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" + "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.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + "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.4-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -7728,7 +9110,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" }, "funding": [ { @@ -7740,20 +9122,20 @@ "type": "tidelift" } ], - "time": "2021-12-12T23:22:04+00:00" + "time": "2023-11-12T22:43:29+00:00" }, { "name": "voku/portable-ascii", - "version": "1.6.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" + "reference": "b56450eed252f6801410d810c8e1727224ae0743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", "shasum": "" }, "require": { @@ -7790,7 +9172,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.6.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, "funding": [ { @@ -7814,25 +9196,25 @@ "type": "tidelift" } ], - "time": "2022-01-24T18:55:24+00:00" + "time": "2022-03-08T17:03:00+00:00" }, { "name": "webmozart/assert", - "version": "1.10.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", @@ -7870,45 +9252,44 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2021-03-09T10:59:23+00:00" + "time": "2022-06-03T18:03:27+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.6.7", + "version": "v3.13.5", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "b96f9820aaf1ff9afe945207883149e1c7afb298" + "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/b96f9820aaf1ff9afe945207883149e1c7afb298", - "reference": "b96f9820aaf1ff9afe945207883149e1c7afb298", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/92d86be45ee54edff735e46856f64f14b6a8bb07", + "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07", "shasum": "" }, "require": { - "illuminate/routing": "^6|^7|^8|^9", - "illuminate/session": "^6|^7|^8|^9", - "illuminate/support": "^6|^7|^8|^9", - "maximebf/debugbar": "^1.17.2", - "php": ">=7.2", - "symfony/debug": "^4.3|^5|^6", - "symfony/finder": "^4.3|^5|^6" + "illuminate/routing": "^9|^10|^11", + "illuminate/session": "^9|^10|^11", + "illuminate/support": "^9|^10|^11", + "maximebf/debugbar": "~1.22.0", + "php": "^8.0", + "symfony/finder": "^6|^7" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^4|^5|^6|^7", - "phpunit/phpunit": "^8.5|^9.0", + "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", + "phpunit/phpunit": "^9.6|^10.5", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.6-dev" + "dev-master": "3.13-dev" }, "laravel": { "providers": [ @@ -7947,7 +9328,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.6.7" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.5" }, "funding": [ { @@ -7959,52 +9340,52 @@ "type": "github" } ], - "time": "2022-02-09T07:52:32+00:00" + "time": "2024-04-12T11:20:37+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.12.2", + "version": "v2.15.1", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "7917cce7c991c7203545ea2e59a1dd366d1b60af" + "reference": "77831852bb7bc54f287246d32eb91274eaf87f8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/7917cce7c991c7203545ea2e59a1dd366d1b60af", - "reference": "7917cce7c991c7203545ea2e59a1dd366d1b60af", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/77831852bb7bc54f287246d32eb91274eaf87f8b", + "reference": "77831852bb7bc54f287246d32eb91274eaf87f8b", "shasum": "" }, "require": { "barryvdh/reflection-docblock": "^2.0.6", - "composer/pcre": "^1.0", - "doctrine/dbal": "^2.6 || ^3", + "composer/class-map-generator": "^1.0", + "doctrine/dbal": "^2.6 || ^3.1.4", "ext-json": "*", - "illuminate/console": "^8 || ^9", - "illuminate/filesystem": "^8 || ^9", - "illuminate/support": "^8 || ^9", - "nikic/php-parser": "^4.7", - "php": "^7.3 || ^8.0", + "illuminate/console": "^9 || ^10", + "illuminate/filesystem": "^9 || ^10", + "illuminate/support": "^9 || ^10", + "nikic/php-parser": "^4.18 || ^5", + "php": "^8.0", "phpdocumentor/type-resolver": "^1.1.0" }, "require-dev": { "ext-pdo_sqlite": "*", - "friendsofphp/php-cs-fixer": "^2", - "illuminate/config": "^8 || ^9", - "illuminate/view": "^8 || ^9", + "friendsofphp/php-cs-fixer": "^3", + "illuminate/config": "^9 || ^10", + "illuminate/view": "^9 || ^10", "mockery/mockery": "^1.4", - "orchestra/testbench": "^6 || ^7", - "phpunit/phpunit": "^8.5 || ^9", - "spatie/phpunit-snapshot-assertions": "^3 || ^4", - "vimeo/psalm": "^3.12" + "orchestra/testbench": "^7 || ^8", + "phpunit/phpunit": "^9", + "spatie/phpunit-snapshot-assertions": "^4", + "vimeo/psalm": "^5.4" }, "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9)." + "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.12-dev" + "dev-master": "2.15-dev" }, "laravel": { "providers": [ @@ -8041,7 +9422,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.2" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.15.1" }, "funding": [ { @@ -8053,27 +9434,27 @@ "type": "github" } ], - "time": "2022-02-08T19:30:33+00:00" + "time": "2024-02-15T14:23:20+00:00" }, { "name": "barryvdh/reflection-docblock", - "version": "v2.0.6", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16" + "reference": "e6811e927f0ecc37cc4deaa6627033150343e597" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/e6811e927f0ecc37cc4deaa6627033150343e597", + "reference": "e6811e927f0ecc37cc4deaa6627033150343e597", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.0,<4.5" + "phpunit/phpunit": "^8.5.14|^9" }, "suggest": { "dflydev/markdown": "~1.0", @@ -8103,22 +9484,22 @@ } ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.0.6" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.1" }, - "time": "2018-12-13T10:34:14+00:00" + "time": "2023-06-14T05:06:27+00:00" }, { "name": "brianium/paratest", - "version": "v6.4.1", + "version": "v6.11.1", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "c32a5c4fc2ff339202437d25d19a5f496f880d61" + "reference": "78e297a969049ca7cc370e80ff5e102921ef39a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/c32a5c4fc2ff339202437d25d19a5f496f880d61", - "reference": "c32a5c4fc2ff339202437d25d19a5f496f880d61", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/78e297a969049ca7cc370e80ff5e102921ef39a3", + "reference": "78e297a969049ca7cc370e80ff5e102921ef39a3", "shasum": "" }, "require": { @@ -8126,33 +9507,30 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "jean85/pretty-package-versions": "^2.0.5", "php": "^7.3 || ^8.0", - "phpunit/php-code-coverage": "^9.2.9", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.25", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-timer": "^5.0.3", - "phpunit/phpunit": "^9.5.10", - "sebastian/environment": "^5.1.3", - "symfony/console": "^5.4.0 || ^6.0.0", - "symfony/process": "^5.4.0 || ^6.0.0" + "phpunit/phpunit": "^9.6.4", + "sebastian/environment": "^5.1.5", + "symfony/console": "^5.4.28 || ^6.3.4 || ^7.0.0", + "symfony/process": "^5.4.28 || ^6.3.4 || ^7.0.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0.0", - "ekino/phpstan-banned-code": "^0.5.0", - "ergebnis/phpstan-rules": "^0.15.3", + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", "ext-posix": "*", - "infection/infection": "^0.25.3", - "malukenho/mcbumpface": "^1.1.5", - "phpstan/phpstan": "^0.12.99", - "phpstan/phpstan-deprecation-rules": "^0.12.6", - "phpstan/phpstan-phpunit": "^0.12.22", - "phpstan/phpstan-strict-rules": "^0.12.11", - "squizlabs/php_codesniffer": "^3.6.1", - "symfony/filesystem": "^v5.4.0", - "thecodingmachine/phpstan-strict-rules": "^v0.12.2", - "vimeo/psalm": "^4.13.1" + "infection/infection": "^0.27.6", + "squizlabs/php_codesniffer": "^3.7.2", + "symfony/filesystem": "^5.4.25 || ^6.3.1 || ^7.0.0", + "vimeo/psalm": "^5.7.7" }, "bin": [ - "bin/paratest" + "bin/paratest", + "bin/paratest.bat", + "bin/paratest_for_phpstorm" ], "type": "library", "autoload": { @@ -8188,7 +9566,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v6.4.1" + "source": "https://github.com/paratestphp/paratest/tree/v6.11.1" }, "funding": [ { @@ -8200,32 +9578,34 @@ "type": "paypal" } ], - "time": "2021-12-02T09:12:23+00:00" + "time": "2024-03-13T06:54:29+00:00" }, { - "name": "composer/ca-bundle", - "version": "1.3.1", + "name": "composer/class-map-generator", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + "url": "https://github.com/composer/class-map-generator.git", + "reference": "8286a62d243312ed99b3eee20d5005c961adb311" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8286a62d243312ed99b3eee20d5005c961adb311", + "reference": "8286a62d243312ed99b3eee20d5005c961adb311", "shasum": "" }, "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" }, "type": "library", "extra": { @@ -8235,102 +9615,7 @@ }, "autoload": { "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-10-28T20:44:15+00:00" - }, - { - "name": "composer/composer", - "version": "2.2.6", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "ce785a18c0fb472421e52d958bab339247cb0e82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/ce785a18c0fb472421e52d958bab339247cb0e82", - "reference": "ce785a18c0fb472421e52d958bab339247cb0e82", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/metadata-minifier": "^1.0", - "composer/pcre": "^1.0", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", - "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "react/promise": "^1.2 || ^2.7", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" + "Composer\\ClassMapGenerator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8338,97 +9623,19 @@ "MIT" ], "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de" - }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https://seld.be" } ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.2.6" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-04T16:00:38+00:00" - }, - { - "name": "composer/metadata-minifier", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/metadata-minifier.git", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "composer/composer": "^2", - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\MetadataMinifier\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Small utility library that handles metadata minification and expansion.", + "description": "Utilities to scan PHP code and generate class maps.", "keywords": [ - "composer", - "compression" + "classmap" ], "support": { - "issues": "https://github.com/composer/metadata-minifier/issues", - "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.1.1" }, "funding": [ { @@ -8444,34 +9651,34 @@ "type": "tidelift" } ], - "time": "2021-04-07T13:37:33+00:00" + "time": "2024-03-15T12:53:41+00:00" }, { "name": "composer/pcre", - "version": "1.0.1", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5" + "symfony/phpunit-bridge": "^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -8499,7 +9706,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/1.0.1" + "source": "https://github.com/composer/pcre/tree/3.1.3" }, "funding": [ { @@ -8515,38 +9722,39 @@ "type": "tidelift" } ], - "time": "2022-01-21T20:24:37+00:00" + "time": "2024-03-19T10:26:25+00:00" }, { - "name": "composer/semver", - "version": "3.2.9", + "name": "doctrine/instantiator", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "a951f614bd64dcd26137bc9b7b2637ddcfc57649" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/a951f614bd64dcd26137bc9b7b2637ddcfc57649", - "reference": "a951f614bd64dcd26137bc9b7b2637ddcfc57649", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^8.1" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\Semver\\": "src" + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8555,598 +9763,24 @@ ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ - "semantic", - "semver", - "validation", - "versioning" + "constructor", + "instantiate" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.9" + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-04T13:58:43+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.6", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "a30d487169d799745ca7280bc90fdfa693536901" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a30d487169d799745ca7280bc90fdfa693536901", - "reference": "a30d487169d799745ca7280bc90fdfa693536901", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.6" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-11-18T10:14:14+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "0c1a3925ec58a4ec98e992b9c7d171e9e184be0a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/0c1a3925ec58a4ec98e992b9c7d171e9e184be0a", - "reference": "0c1a3925ec58a4ec98e992b9c7d171e9e184be0a", - "shasum": "" - }, - "require": { - "composer/pcre": "^1", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-01-04T17:06:45+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "predis/predis": "~1.0", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", - "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "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 Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.1.1" - }, - "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%2Fcache", - "type": "tidelift" - } - ], - "time": "2021-07-17T14:49:29+00:00" - }, - { - "name": "doctrine/dbal", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "35eae239ef515d55ebb24e9d4715cad09a4f58ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/35eae239ef515d55ebb24e9d4715cad09a4f58ed", - "reference": "35eae239ef515d55ebb24e9d4715cad09a4f58ed", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.0", - "php": "^7.3 || ^8.0", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.4.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "9.5.11", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^5.2|^6.0", - "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0", - "vimeo/psalm": "4.16.1" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "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": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.3.2" - }, - "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%2Fdbal", - "type": "tidelift" - } - ], - "time": "2022-02-05T16:33:45+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "v0.5.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0|^7.0|^8.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0", - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" - }, - "time": "2021-03-21T12:59:47+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "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" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" - }, - "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%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2020-05-29T18:28:51+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { @@ -9158,220 +9792,24 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" - }, - { - "name": "facade/flare-client-php", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/facade/flare-client-php.git", - "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/b2adf1512755637d0cef4f7d1b54301325ac78ed", - "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed", - "shasum": "" - }, - "require": { - "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0", - "php": "^7.1|^8.0", - "symfony/http-foundation": "^3.3|^4.1|^5.0", - "symfony/mime": "^3.4|^4.0|^5.1", - "symfony/var-dumper": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "phpunit/phpunit": "^7.5.16", - "spatie/phpunit-snapshot-assertions": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Facade\\FlareClient\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/facade/flare-client-php", - "keywords": [ - "exception", - "facade", - "flare", - "reporting" - ], - "support": { - "issues": "https://github.com/facade/flare-client-php/issues", - "source": "https://github.com/facade/flare-client-php/tree/1.9.1" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2021-09-13T12:16:46+00:00" - }, - { - "name": "facade/ignition", - "version": "2.17.4", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition.git", - "reference": "95c80bd35ee6858e9e1439b2f6a698295eeb2070" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/95c80bd35ee6858e9e1439b2f6a698295eeb2070", - "reference": "95c80bd35ee6858e9e1439b2f6a698295eeb2070", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "facade/flare-client-php": "^1.9.1", - "facade/ignition-contracts": "^1.0.2", - "illuminate/support": "^7.0|^8.0", - "monolog/monolog": "^2.0", - "php": "^7.2.5|^8.0", - "symfony/console": "^5.0", - "symfony/var-dumper": "^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "livewire/livewire": "^2.4", - "mockery/mockery": "^1.3", - "orchestra/testbench": "^5.0|^6.0", - "psalm/plugin-laravel": "^1.2" - }, - "suggest": { - "laravel/telescope": "^3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Facade\\Ignition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Facade\\Ignition\\Facades\\Flare" - } - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Facade\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://github.com/facade/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/facade/ignition/issues", - "source": "https://github.com/facade/ignition" - }, - "time": "2021-12-27T15:11:24+00:00" - }, - { - "name": "facade/ignition-contracts", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^v2.15.8", - "phpunit/phpunit": "^9.3.11", - "vimeo/psalm": "^3.17.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" - } - ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", - "keywords": [ - "contracts", - "flare", - "ignition" - ], - "support": { - "issues": "https://github.com/facade/ignition-contracts/issues", - "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" - }, - "time": "2020-10-16T08:27:54+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { "name": "fakerphp/faker", - "version": "v1.19.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75" + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/d7f08a622b3346766325488aa32ddc93ccdecc75", - "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "php": "^7.4 || ^8.0", "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, @@ -9382,7 +9820,8 @@ "bamarni/composer-bin-plugin": "^1.4.1", "doctrine/persistence": "^1.3 || ^2.0", "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, "suggest": { "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", @@ -9392,11 +9831,6 @@ "ext-mbstring": "Required for multibyte Unicode string functionality." }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v1.19-dev" - } - }, "autoload": { "psr-4": { "Faker\\": "src/Faker/" @@ -9419,22 +9853,83 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.19.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" }, - "time": "2022-02-02T17:38:57+00:00" + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-02-07T09:43:46+00:00" }, { "name": "filp/whoops", - "version": "2.14.5", + "version": "2.15.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", "shasum": "" }, "require": { @@ -9484,7 +9979,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.5" + "source": "https://github.com/filp/whoops/tree/2.15.4" }, "funding": [ { @@ -9492,7 +9987,7 @@ "type": "github" } ], - "time": "2022-01-07T12:00:00+00:00" + "time": "2023-11-03T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -9545,92 +10040,22 @@ }, "time": "2020-07-09T08:09:16+00:00" }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.11", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" - }, - "time": "2021-07-22T09:24:00+00:00" - }, { "name": "laracasts/generators", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/laracasts/Laravel-5-Generators-Extended.git", - "reference": "5527f50260c6d3bf50a8e62e902e3fb44e87c4d8" + "reference": "94d454e3b5940ec4df9e33d2e6dc44e84c4f3113" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/Laravel-5-Generators-Extended/zipball/5527f50260c6d3bf50a8e62e902e3fb44e87c4d8", - "reference": "5527f50260c6d3bf50a8e62e902e3fb44e87c4d8", + "url": "https://api.github.com/repos/laracasts/Laravel-5-Generators-Extended/zipball/94d454e3b5940ec4df9e33d2e6dc44e84c4f3113", + "reference": "94d454e3b5940ec4df9e33d2e6dc44e84c4f3113", "shasum": "" }, "require": { - "illuminate/support": "~6.0|~7.0|~8.0|~9.0" + "illuminate/support": "~6.0|~7.0|~8.0|~9.0|^10.0" }, "require-dev": { "phpspec/phpspec": "~6.0" @@ -9669,33 +10094,37 @@ ], "support": { "issues": "https://github.com/laracasts/Laravel-5-Generators-Extended/issues", - "source": "https://github.com/laracasts/Laravel-5-Generators-Extended/tree/2.0.1" + "source": "https://github.com/laracasts/Laravel-5-Generators-Extended/tree/2.0.2" }, - "time": "2022-02-09T14:12:17+00:00" + "time": "2023-03-22T14:23:28+00:00" }, { "name": "laravel/telescope", - "version": "v4.7.2", + "version": "v4.17.6", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "2baeb9313ce3cfd213b23b52dbaf61615a44f907" + "reference": "2d453dc629b27e8cf39fb1217aba062f8c54e690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/2baeb9313ce3cfd213b23b52dbaf61615a44f907", - "reference": "2baeb9313ce3cfd213b23b52dbaf61615a44f907", + "url": "https://api.github.com/repos/laravel/telescope/zipball/2d453dc629b27e8cf39fb1217aba062f8c54e690", + "reference": "2d453dc629b27e8cf39fb1217aba062f8c54e690", "shasum": "" }, "require": { "ext-json": "*", - "laravel/framework": "^8.29|^9.0", - "php": "^7.3|^8.0", + "laravel/framework": "^8.37|^9.0|^10.0", + "php": "^8.0", "symfony/var-dumper": "^5.0|^6.0" }, "require-dev": { "ext-gd": "*", - "orchestra/testbench": "^6.0|^7.0" + "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": { @@ -9736,44 +10165,42 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v4.7.2" + "source": "https://github.com/laravel/telescope/tree/v4.17.6" }, - "time": "2022-02-04T07:19:09+00:00" + "time": "2024-02-08T15:04:38+00:00" }, { "name": "laravel/tinker", - "version": "v2.7.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "5f2f9815b7631b9f586a3de7933c25f9327d4073" + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/5f2f9815b7631b9f586a3de7933c25f9327d4073", - "reference": "5f2f9815b7631b9f586a3de7933c25f9327d4073", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.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" + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.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)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, "laravel": { "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" @@ -9804,31 +10231,34 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.0" + "source": "https://github.com/laravel/tinker/tree/v2.9.0" }, - "time": "2022-01-10T08:52:49+00:00" + "time": "2024-01-04T16:10:04+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.17.3", + "version": "v1.22.3", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "e8ac3499af0ea5b440908e06cc0abe5898008b3c" + "reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/e8ac3499af0ea5b440908e06cc0abe5898008b3c", - "reference": "e8ac3499af0ea5b440908e06cc0abe5898008b3c", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96", + "reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96", "shasum": "" }, "require": { - "php": "^7.1|^8", + "php": "^7.2|^8", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^2.6|^3|^4|^5" + "symfony/var-dumper": "^4|^5|^6|^7" }, "require-dev": { - "phpunit/phpunit": "^7.5.20 || ^9.4.2" + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" }, "suggest": { "kriswallsmith/assetic": "The best way to manage assets", @@ -9838,7 +10268,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.22-dev" } }, "autoload": { @@ -9869,44 +10299,44 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.17.3" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.22.3" }, - "time": "2021-10-19T12:33:27+00:00" + "time": "2024-04-03T19:39:26+00:00" }, { "name": "mockery/mockery", - "version": "1.5.0", + "version": "1.6.11", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac" + "reference": "81a161d0b135df89951abd52296adf97deb0723d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", + "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", + "reference": "81a161d0b135df89951abd52296adf97deb0723d", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { - "psr-0": { - "Mockery": "library/" + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", @@ -9917,12 +10347,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.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", @@ -9940,35 +10378,39 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.5.0" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2022-01-20T13:18:17+00:00" + "time": "2024-03-21T18:34:15+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "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": { @@ -9993,7 +10435,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -10001,29 +10443,31 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.2", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -10031,7 +10475,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -10055,43 +10499,44 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2021-11-30T19:35:32+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "nunomaduro/collision", - "version": "v5.11.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461" + "reference": "f05978827b9343cba381ca05b8c7deee346b6015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/8b610eef8582ccdc05d8f2ab23305e2d37049461", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f05978827b9343cba381ca05b8c7deee346b6015", + "reference": "f05978827b9343cba381ca05b8c7deee346b6015", "shasum": "" }, "require": { - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.14.3", - "php": "^7.3 || ^8.0", - "symfony/console": "^5.0" + "filp/whoops": "^2.14.5", + "php": "^8.0.0", + "symfony/console": "^6.0.2" }, "require-dev": { - "brianium/paratest": "^6.1", - "fideloper/proxy": "^4.4.1", - "fruitcake/laravel-cors": "^2.0.3", - "laravel/framework": "8.x-dev", - "nunomaduro/larastan": "^0.6.2", - "nunomaduro/mock-final-classes": "^1.0", - "orchestra/testbench": "^6.0", - "phpstan/phpstan": "^0.12.64", - "phpunit/phpunit": "^9.5.0" + "brianium/paratest": "^6.4.1", + "laravel/framework": "^9.26.1", + "laravel/pint": "^1.1.1", + "nunomaduro/larastan": "^1.0.3", + "nunomaduro/mock-final-classes": "^1.1.0", + "orchestra/testbench": "^7.7", + "phpunit/phpunit": "^9.5.23", + "spatie/ignition": "^1.4.1" }, "type": "library", "extra": { + "branch-alias": { + "dev-develop": "6.x-dev" + }, "laravel": { "providers": [ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" @@ -10144,41 +10589,41 @@ "type": "patreon" } ], - "time": "2022-01-10T16:22:52+00:00" + "time": "2023-01-03T12:54:54+00:00" }, { "name": "nunomaduro/larastan", - "version": "v0.7.15", + "version": "v2.9.6", "source": { "type": "git", - "url": "https://github.com/nunomaduro/larastan.git", - "reference": "fffd371277aeca7951a841818d21f1015a0a2662" + "url": "https://github.com/larastan/larastan.git", + "reference": "93d5b95d2e29cdb8203363d44abfdbc0bc7ef57f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/fffd371277aeca7951a841818d21f1015a0a2662", - "reference": "fffd371277aeca7951a841818d21f1015a0a2662", + "url": "https://api.github.com/repos/larastan/larastan/zipball/93d5b95d2e29cdb8203363d44abfdbc0bc7ef57f", + "reference": "93d5b95d2e29cdb8203363d44abfdbc0bc7ef57f", "shasum": "" }, "require": { - "composer/composer": "^1.0 || ^2.0", "ext-json": "*", - "illuminate/console": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/container": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/contracts": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/database": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/http": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/pipeline": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "mockery/mockery": "^0.9 || ^1.0", - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^0.12.90", - "symfony/process": "^4.3 || ^5.0 || ^6.0" - }, - "require-dev": { - "nikic/php-parser": "4.12.0", - "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0", - "phpunit/phpunit": "^7.3 || ^8.2 || ^9.3" + "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", + "php": "^8.0.2", + "phpmyadmin/sql-parser": "^5.9.0", + "phpstan/phpstan": "^1.10.66" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0", + "nikic/php-parser": "^4.19.1", + "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", + "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", + "phpunit/phpunit": "^9.6.13 || ^10.5.16" }, "suggest": { "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" @@ -10186,7 +10631,7 @@ "type": "phpstan-extension", "extra": { "branch-alias": { - "dev-master": "0.7-dev" + "dev-master": "2.0-dev" }, "phpstan": { "includes": [ @@ -10196,7 +10641,7 @@ }, "autoload": { "psr-4": { - "NunoMaduro\\Larastan\\": "src/" + "Larastan\\Larastan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10204,6 +10649,10 @@ "MIT" ], "authors": [ + { + "name": "Can Vural", + "email": "can9119@gmail.com" + }, { "name": "Nuno Maduro", "email": "enunomaduro@gmail.com" @@ -10221,12 +10670,12 @@ "static analysis" ], "support": { - "issues": "https://github.com/nunomaduro/larastan/issues", - "source": "https://github.com/nunomaduro/larastan/tree/v0.7.15" + "issues": "https://github.com/larastan/larastan/issues", + "source": "https://github.com/larastan/larastan/tree/v2.9.6" }, "funding": [ { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "url": "https://www.paypal.com/paypalme/enunomaduro", "type": "custom" }, { @@ -10242,24 +10691,26 @@ "type": "patreon" } ], - "time": "2021-10-26T11:07:56+00:00" + "abandoned": "larastan/larastan", + "time": "2024-05-09T11:53:26+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -10300,22 +10751,28 @@ "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" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", - "version": "3.1.1", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "15a90844ad40f127afd244c0cad228de2a80052a" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/15a90844ad40f127afd244c0cad228de2a80052a", - "reference": "15a90844ad40f127afd244c0cad228de2a80052a", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { @@ -10351,9 +10808,9 @@ "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.1.1" + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2022-02-07T21:56:48+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -10409,34 +10866,39 @@ "time": "2020-06-27T09:03:43+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", "shasum": "" }, "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { @@ -10452,152 +10914,166 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-02-23T11:10:43+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.6.0", + "name": "phpmyadmin/sql-parser", + "version": "5.9.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" + "url": "https://github.com/phpmyadmin/sql-parser.git", + "reference": "011fa18a4e55591fac6545a821921dd1d61c6984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/011fa18a4e55591fac6545a821921dd1d61c6984", + "reference": "011fa18a4e55591fac6545a821921dd1d61c6984", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpmyadmin/motranslator": "<3.0" }, "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "phpbench/phpbench": "^1.1", + "phpmyadmin/coding-standard": "^3.0", + "phpmyadmin/motranslator": "^4.0 || ^5.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.9.12", + "phpstan/phpstan-phpunit": "^1.3.3", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.11", + "zumba/json-serializer": "~3.0.2" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } + "suggest": { + "ext-mbstring": "For best performance", + "phpmyadmin/motranslator": "Translate messages to your favorite locale" }, + "bin": [ + "bin/highlight-query", + "bin/lint-query", + "bin/sql-parser", + "bin/tokenize-query" + ], + "type": "library", "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "PhpMyAdmin\\SqlParser\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "GPL-2.0-or-later" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "The phpMyAdmin Team", + "email": "developers@phpmyadmin.net", + "homepage": "https://www.phpmyadmin.net/team/" } ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", + "homepage": "https://github.com/phpmyadmin/sql-parser", + "keywords": [ + "analysis", + "lexer", + "parser", + "query linter", + "sql", + "sql lexer", + "sql linter", + "sql parser", + "sql syntax highlighter", + "sql tokenizer" + ], "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" + "issues": "https://github.com/phpmyadmin/sql-parser/issues", + "source": "https://github.com/phpmyadmin/sql-parser" }, - "time": "2022-01-04T19:58:01+00:00" + "funding": [ + { + "url": "https://www.phpmyadmin.net/donate/", + "type": "other" + } + ], + "time": "2024-01-20T20:34:02+00:00" }, { - "name": "phpspec/prophecy", - "version": "v1.15.0", + "name": "phpstan/phpdoc-parser", + "version": "1.29.0", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/536889f2b340489d328f5ffb7b02bb6b183ddedc", + "reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Prophecy\\": "src/Prophecy" + "PHPStan\\PhpDocParser\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.0" }, - "time": "2021-12-08T12:19:24+00:00" + "time": "2024-05-06T12:04:23+00:00" }, { "name": "phpstan/phpstan", - "version": "0.12.99", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7" + "reference": "666cb1703742cea9cc80fee631f0940e1592fa6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b4d40f1d759942f523be267a1bab6884f46ca3f7", - "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/666cb1703742cea9cc80fee631f0940e1592fa6e", + "reference": "666cb1703742cea9cc80fee631f0940e1592fa6e", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.2|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -10607,11 +11083,6 @@ "phpstan.phar" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.12-dev" - } - }, "autoload": { "files": [ "bootstrap.php" @@ -10622,9 +11093,16 @@ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/0.12.99" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -10634,37 +11112,29 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2021-09-12T20:09:55+00:00" + "time": "2024-05-13T06:02:22+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.10", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", - "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -10679,8 +11149,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "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": { @@ -10713,7 +11183,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, "funding": [ { @@ -10721,7 +11192,7 @@ "type": "github" } ], - "time": "2021-12-05T09:12:13+00:00" + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", @@ -10966,20 +11437,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.13", + "version": "9.6.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "597cb647654ede35e43b137926dfdfef0fb11743" + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/597cb647654ede35e43b137926dfdfef0fb11743", - "reference": "597cb647654ede35e43b137926dfdfef0fb11743", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -10990,31 +11461,26 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -11022,7 +11488,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -11053,7 +11519,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.13" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" }, "funding": [ { @@ -11063,91 +11530,46 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2022-01-24T07:33:35+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + }, { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2024-04-05T04:35:58+00:00" }, { "name": "psy/psysh", - "version": "v0.11.1", + "version": "v0.12.3", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "570292577277f06f590635381a7f761a6cf4f026" + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/570292577277f06f590635381a7f761a6cf4f026", - "reference": "570292577277f06f590635381a7f761a6cf4f026", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", "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" + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^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", - "hoa/console": "3.17.05.02" + "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.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, "bin": [ "bin/psysh" @@ -11155,7 +11577,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.11.x-dev" + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -11187,72 +11613,22 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.1" - }, - "time": "2022-01-03T13:58:38+00:00" - }, - { - "name": "react/promise", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" }, - "time": "2020-05-12T15:16:56+00:00" + "time": "2024-04-02T15:57:53+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -11287,7 +11663,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -11295,7 +11671,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -11410,16 +11786,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -11472,7 +11848,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -11480,24 +11856,24 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -11529,7 +11905,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -11537,20 +11913,20 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -11595,7 +11971,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -11603,20 +11979,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -11658,7 +12034,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -11666,20 +12042,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -11735,7 +12111,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -11743,20 +12119,20 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.4", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "19c519631c5a511b7ed0ad64a6713fdb3fd25fe4" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/19c519631c5a511b7ed0ad64a6713fdb3fd25fe4", - "reference": "19c519631c5a511b7ed0ad64a6713fdb3fd25fe4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -11799,7 +12175,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.4" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -11807,24 +12183,24 @@ "type": "github" } ], - "time": "2022-02-10T07:01:19+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -11856,7 +12232,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -11864,7 +12240,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -11980,16 +12356,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -12028,10 +12404,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -12039,20 +12415,20 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -12064,7 +12440,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -12085,8 +12461,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -12094,32 +12469,32 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -12142,7 +12517,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -12150,7 +12525,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -12206,32 +12581,33 @@ "time": "2020-09-28T06:39:44+00:00" }, { - "name": "seld/jsonlint", - "version": "1.8.3", + "name": "spatie/backtrace", + "version": "1.6.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "url": "https://github.com/spatie/backtrace.git", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" + "php": "^7.3|^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "ext-json": "*", + "laravel/serializable-closure": "^1.3", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" }, - "bin": [ - "bin/jsonlint" - ], "type": "library", "autoload": { "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" + "Spatie\\Backtrace\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -12240,118 +12616,150 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "JSON Linter", + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", "keywords": [ - "json", - "linter", - "parser", - "validator" + "Backtrace", + "spatie" ], "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/spatie/backtrace/tree/1.6.1" }, "funding": [ { - "url": "https://github.com/Seldaek", + "url": "https://github.com/sponsors/spatie", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" + "url": "https://spatie.be/open-source/support-us", + "type": "other" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2024-04-24T13:22:11+00:00" }, { - "name": "seld/phar-utils", - "version": "1.2.0", + "name": "spatie/flare-client-php", + "version": "1.5.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee" + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "e27977d534eefe04c154c6fd8460217024054c05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/e27977d534eefe04c154c6fd8460217024054c05", + "reference": "e27977d534eefe04c154c6fd8460217024054c05", "shasum": "" }, "require": { - "php": ">=5.3" + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "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-master": "1.x-dev" + "dev-main": "1.3.x-dev" } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "Seld\\PharUtils\\": "src/" + "Spatie\\FlareClient\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", "keywords": [ - "phar" + "exception", + "flare", + "reporting", + "spatie" ], "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0" + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.5.1" }, - "time": "2021-12-10T11:20:11+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-03T15:43:14+00:00" }, { - "name": "spatie/laravel-web-tinker", - "version": "1.8.1", + "name": "spatie/ignition", + "version": "1.14.1", "source": { "type": "git", - "url": "https://github.com/spatie/laravel-web-tinker.git", - "reference": "8d2fed2555bd97e52d1565dd77afce74d0dc15b8" + "url": "https://github.com/spatie/ignition.git", + "reference": "c23cc018c5f423d2f413b99f84655fceb6549811" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-web-tinker/zipball/8d2fed2555bd97e52d1565dd77afce74d0dc15b8", - "reference": "8d2fed2555bd97e52d1565dd77afce74d0dc15b8", + "url": "https://api.github.com/repos/spatie/ignition/zipball/c23cc018c5f423d2f413b99f84655fceb6549811", + "reference": "c23cc018c5f423d2f413b99f84655fceb6549811", "shasum": "" }, "require": { - "illuminate/cookie": "^5.8|^6.0|^7.0|^8.0|^9.0", - "illuminate/session": "^5.8|^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^5.8|^6.0|^7.0|^8.0|^9.0", - "laravel/tinker": "^1.0|^2.0", - "php": "^7.2|^8.0" + "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": { - "orchestra/testbench": "^3.8|^4.0|^5.0|^6.0|^7.0", - "phpunit/phpunit": "^8.0|^9.0" + "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": { - "laravel": { - "providers": [ - "Spatie\\WebTinker\\WebTinkerServiceProvider" - ] + "branch-alias": { + "dev-main": "1.5.x-dev" } }, "autoload": { "psr-4": { - "Spatie\\WebTinker\\": "src" + "Spatie\\Ignition\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -12360,66 +12768,91 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", + "name": "Spatie", + "email": "info@spatie.be", "role": "Developer" } ], - "description": "Artisan Tinker in your browser", - "homepage": "https://github.com/spatie/laravel-web-tinker", + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", "keywords": [ - "Tinker", - "debug", - "development", + "error", + "flare", "laravel", - "spatie", - "web-tinker" + "page" ], "support": { - "issues": "https://github.com/spatie/laravel-web-tinker/issues", - "source": "https://github.com/spatie/laravel-web-tinker/tree/1.8.1" + "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://spatie.be/open-source/support-us", - "type": "custom" + "url": "https://github.com/spatie", + "type": "github" } ], - "time": "2022-01-14T08:56:07+00:00" + "time": "2024-05-03T15:56:16+00:00" }, { - "name": "symfony/debug", - "version": "v4.4.37", + "name": "spatie/laravel-ignition", + "version": "2.7.0", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "5de6c6e7f52b364840e53851c126be4d71e60470" + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/5de6c6e7f52b364840e53851c126be4d71e60470", - "reference": "5de6c6e7f52b364840e53851c126be4d71e60470", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f52124d50122611e8a40f628cef5c19ff6cc5b57", + "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "^1|^2|^3" - }, - "conflict": { - "symfony/http-kernel": "<3.4" + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0|^11.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.5", + "spatie/ignition": "^1.14", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" + }, + "require-dev": { + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1", + "orchestra/testbench": "8.22.3|^9.0", + "pestphp/pest": "^2.34", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.16", + "vlucas/phpdotenv": "^5.5" }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "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": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Spatie\\LaravelIgnition\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -12427,62 +12860,70 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" } ], - "description": "Provides tools to ease debugging PHP code", - "homepage": "https://symfony.com", + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.37" + "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://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/spatie", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-01-02T09:41:36+00:00" + "time": "2024-05-02T13:42:49+00:00" }, { - "name": "symfony/filesystem", - "version": "v6.0.3", + "name": "spatie/laravel-web-tinker", + "version": "1.8.4", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "6ae49c4fda17322171a2b8dc5f70bc6edbc498e1" + "url": "https://github.com/spatie/laravel-web-tinker.git", + "reference": "0ac5c8a35f86772aa965598a89f76236281490d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6ae49c4fda17322171a2b8dc5f70bc6edbc498e1", - "reference": "6ae49c4fda17322171a2b8dc5f70bc6edbc498e1", + "url": "https://api.github.com/repos/spatie/laravel-web-tinker/zipball/0ac5c8a35f86772aa965598a89f76236281490d7", + "reference": "0ac5c8a35f86772aa965598a89f76236281490d7", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "illuminate/cookie": "^5.8|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/session": "^5.8|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^5.8|^6.0|^7.0|^8.0|^9.0|^10.0", + "laravel/tinker": "^1.0|^2.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^3.8|^4.0|^5.0|^6.0|^7.0|^8.0", + "phpunit/phpunit": "^8.0|^9.0" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\WebTinker\\WebTinkerServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Spatie\\WebTinker\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -12490,47 +12931,46 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", + "description": "Artisan Tinker in your browser", + "homepage": "https://github.com/spatie/laravel-web-tinker", + "keywords": [ + "Tinker", + "debug", + "development", + "laravel", + "spatie", + "web-tinker" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.3" + "issues": "https://github.com/spatie/laravel-web-tinker/issues", + "source": "https://github.com/spatie/laravel-web-tinker/tree/1.8.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://spatie.be/open-source/support-us", "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2023-03-01T07:21:54+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -12559,7 +12999,7 @@ "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.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -12567,7 +13007,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], @@ -12576,8 +13016,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.0" + "php": "^8.1" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.6.0" } diff --git a/config/bootstrap.php b/config/bootstrap.php index d68d20b..d4260fe 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -5,53 +5,103 @@ return [ 'institutes' => [ [ - 'full_name' => 'HAN, hogeschool Arnhem en Nijmegen', - 'short_name' => 'HAN', - 'logo' => 'HAN.png', - 'domain' => 'han.nl', - 'banner' => 'UT_banner.jpg', + 'full_name_en' => 'HAN', + 'full_name_nl' => 'HAN', + 'short_name' => 'HAN', + 'logo' => 'HAN.png', + 'domain' => 'han.nl', + 'banner' => 'UT_banner.jpg', ], [ - 'full_name' => 'Hanze University of Applied Sciences', - 'short_name' => 'Hanze', - 'logo' => 'Hanze.png', - 'domain' => 'hanze.nl', - 'banner' => 'UT_banner.jpg', + 'full_name_en' => 'Hanze University of Applied Sciences', + 'full_name_nl' => 'Hanzehogeschool Groningen', + 'short_name' => 'Hanze', + 'logo' => 'Hanze.png', + 'domain' => 'hanze.nl', + 'banner' => 'Hanze-banner.png', ], [ - 'full_name' => 'Hogeschool Saxion', - 'short_name' => 'Saxion', - 'logo' => 'Saxion.png', - 'domain' => 'saxion.nl', - 'banner' => 'Saxion_banner.jpg', + 'full_name_en' => 'Saxion University of Applied Sciences', + 'full_name_nl' => 'Saxion', + 'short_name' => 'Saxion', + 'logo' => 'Saxion.png', + 'domain' => 'saxion.nl', + 'banner' => 'Saxion_banner.jpg', ], [ - 'full_name' => 'Inholland University of Applied Sciences', - 'short_name' => 'InHolland', - 'logo' => 'InHolland.png', - 'domain' => 'inholland.nl', - 'banner' => 'UT_banner.jpg', + 'full_name_en' => 'Inholland University of Applied Sciences', + 'full_name_nl' => 'Inholland', + 'short_name' => 'Inholland', + 'logo' => 'Inholland.png', + 'domain' => 'inholland.nl', + 'banner' => 'Inholland-banner.jpg', ], [ - 'full_name' => 'Universiteit Twente', - 'short_name' => 'UT', - 'logo' => 'UT.png', - 'domain' => 'utwente.nl', - 'banner' => 'UT_banner.jpg', + 'full_name_en' => 'University of Twente', + 'full_name_nl' => 'Universiteit Twente', + 'short_name' => 'UT', + 'logo' => 'UT.png', + 'domain' => 'utwente.nl', + 'banner' => 'UT_banner.jpg', ], [ - 'full_name' => 'University of Amsterdam', - 'short_name' => 'UvA', - 'logo' => 'UvA.png', - 'domain' => 'uva.nl', - 'banner' => 'UvA_banner.jpg', + 'full_name_en' => 'SURF', + 'full_name_nl' => 'SURF', + 'short_name' => 'SURF', + 'logo' => 'SURF.png', + 'domain' => 'surf.nl', + 'banner' => 'SURF_banner.jpg', ], [ - 'full_name' => 'EduID', - 'short_name' => 'EduID', - 'logo' => 'EduID.png', - 'domain' => 'eduid.nl', - 'banner' => 'UT_banner.jpg', + 'full_name_en' => 'Erasmus University Rotterdam', + 'full_name_nl' => 'Erasmus Universiteit Rotterdam', + 'short_name' => 'EUR', + 'logo' => 'EUR-logo.jpg', + 'domain' => 'eur.nl', + 'banner' => 'EUR-banner.jpg', + ], + [ + 'full_name_en' => 'Fontys University of Applied Sciences', + 'full_name_nl' => 'Fontys', + 'short_name' => 'Fontys', + 'logo' => 'Fontys-logo.jpg', + 'domain' => 'fontys.nl', + 'banner' => 'Fontys-banner.jpg', + ], + [ + 'full_name_en' => 'Leiden University of Applied Sciences', + 'full_name_nl' => 'Hogeschool Leiden', + 'short_name' => 'HS Leiden', + 'logo' => 'hsleiden-logo.jpg', + 'domain' => 'hsleiden.nl', + 'banner' => 'hsleiden-202409-banner.jpg', + ], + [ + 'full_name_en' => 'HZ University of Applied Sciences', + 'full_name_nl' => 'HZ', + 'short_name' => 'HZ', + 'logo' => 'hz-logo.jpg', + 'domain' => 'hz.nl', + 'banner' => 'hz-banner.jpg', + ], + [ + 'full_name_en' => 'ArtEZ University of the Arts', + 'full_name_nl' => 'ArtEZ University of the Arts', + 'short_name' => 'ArtEZ', + 'logo' => 'artez-logo.png', + 'domain' => 'artez.nl', + 'banner' => 'artez-banner.jpg', + ], + ], + + 'test-institutes' => [ + [ + 'full_name_en' => 'EduID', + 'full_name_nl' => 'EduID', + 'short_name' => 'EduID', + 'logo' => 'EduID.png', + 'domain' => 'eduid.nl', + 'banner' => 'UT_banner.jpg', ], ], ]; diff --git a/config/constants.php b/config/constants.php index fd9c7e7..1f8f3a3 100644 --- a/config/constants.php +++ b/config/constants.php @@ -4,7 +4,7 @@ return [ 'general' => [ - 'domain' => env('APP_DOMAIN'), + 'domain' => env('APP_DOMAIN', 'localhost'), 'protocol' => env('APP_PROTOCOL', 'https://'), ], 'registration' => [ @@ -65,4 +65,5 @@ 'stage', ], ], + 'piwik_key' => env('PIWIK_KEY'), ]; diff --git a/config/filesystems.php b/config/filesystems.php index dab9d2b..2ae1745 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -16,19 +16,6 @@ 'default' => env('FILESYSTEM_DRIVER', 'local'), - /* - |-------------------------------------------------------------------------- - | Default Cloud Filesystem Disk - |-------------------------------------------------------------------------- - | - | Many applications store files both locally and in the cloud. For this - | reason, you may specify a default "cloud" driver here. This driver - | will be bound as the Cloud disk implementation in the container. - | - */ - - 'cloud' => env('FILESYSTEM_CLOUD', 's3'), - /* |-------------------------------------------------------------------------- | Filesystem Disks @@ -56,27 +43,38 @@ ], 'tools' => [ - 'driver' => 'local', - 'root' => storage_path('app/tools'), - 'url' => env('APP_URL') . '/uploads/tools', - 'visibility' => 'public', + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET_PUBLIC'), + 'url' => env('AWS_URL_PUBLIC'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'root' => 'tools', ], 'institutes' => [ - 'driver' => 'local', - 'root' => storage_path('app/institutes'), - 'url' => env('APP_URL') . '/uploads/institutes', - 'visibility' => 'public', + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET_PUBLIC'), + 'url' => env('AWS_URL_PUBLIC'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'root' => 'institutes', ], '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'), + '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), ], ], @@ -91,8 +89,5 @@ | */ - 'links' => [ - public_path('uploads/institutes') => storage_path('app/institutes'), - public_path('uploads/tools') => storage_path('app/tools'), - ], + 'links' => [], ]; diff --git a/config/ignition.php b/config/ignition.php index 0c0e75f..aaf1d12 100644 --- a/config/ignition.php +++ b/config/ignition.php @@ -28,7 +28,7 @@ | */ - 'theme' => env('IGNITION_THEME', 'light'), + 'theme' => env('IGNITION_THEME', 'dark'), /* |-------------------------------------------------------------------------- @@ -69,9 +69,7 @@ | */ - 'ignored_solution_providers' => [ - \Facade\Ignition\SolutionProviders\MissingPackageSolutionProvider::class, - ], + 'ignored_solution_providers' => [], /* |-------------------------------------------------------------------------- @@ -84,7 +82,7 @@ | */ - 'enable_runnable_solutions' => env('IGNITION_ENABLE_RUNNABLE_SOLUTIONS', null), + 'enable_runnable_solutions' => env('IGNITION_ENABLE_RUNNABLE_SOLUTIONS', env('APP_DEBUG', false)), /* |-------------------------------------------------------------------------- @@ -109,7 +107,7 @@ | */ - 'remote_sites_path' => env('IGNITION_REMOTE_SITES_PATH', ''), + 'remote_sites_path' => env('IGNITION_REMOTE_SITES_PATH', base_path()), 'local_sites_path' => env('IGNITION_LOCAL_SITES_PATH', ''), /* diff --git a/config/laravellocalization.php b/config/laravellocalization.php index 6d821a3..6be2c87 100644 --- a/config/laravellocalization.php +++ b/config/laravellocalization.php @@ -10,295 +10,295 @@ // These are sorted by the native name, which is the order you might show them in a language selector. // Regional languages are sorted by their base language, so "British English" sorts as "English, British" 'supportedLocales' => [ - 'ace' => ['name' => 'Achinese', 'script' => 'Latn', 'native' => 'Aceh', 'regional' => ''], - 'af' => ['name' => 'Afrikaans', 'script' => 'Latn', 'native' => 'Afrikaans', 'regional' => 'af_ZA'], - 'agq' => ['name' => 'Aghem', 'script' => 'Latn', 'native' => 'Aghem', 'regional' => ''], - 'ak' => ['name' => 'Akan', 'script' => 'Latn', 'native' => 'Akan', 'regional' => 'ak_GH'], - 'an' => ['name' => 'Aragonese', 'script' => 'Latn', 'native' => 'aragonés', 'regional' => 'an_ES'], - 'cch' => ['name' => 'Atsam', 'script' => 'Latn', 'native' => 'Atsam', 'regional' => ''], - 'gn' => ['name' => 'Guaraní', 'script' => 'Latn', 'native' => 'Avañe’ẽ', 'regional' => ''], - 'ae' => ['name' => 'Avestan', 'script' => 'Latn', 'native' => 'avesta', 'regional' => ''], - 'ay' => ['name' => 'Aymara', 'script' => 'Latn', 'native' => 'aymar aru', 'regional' => 'ay_PE'], - 'az' => ['name' => 'Azerbaijani (Latin)', 'script' => 'Latn', 'native' => 'azərbaycanca', 'regional' => 'az_AZ'], - 'id' => ['name' => 'Indonesian', 'script' => 'Latn', 'native' => 'Bahasa Indonesia', 'regional' => 'id_ID'], - 'ms' => ['name' => 'Malay', 'script' => 'Latn', 'native' => 'Bahasa Melayu', 'regional' => 'ms_MY'], - 'bm' => ['name' => 'Bambara', 'script' => 'Latn', 'native' => 'bamanakan', 'regional' => ''], - 'jv' => ['name' => 'Javanese (Latin)', 'script' => 'Latn', 'native' => 'Basa Jawa', 'regional' => ''], - 'su' => ['name' => 'Sundanese', 'script' => 'Latn', 'native' => 'Basa Sunda', 'regional' => ''], - 'bh' => ['name' => 'Bihari', 'script' => 'Latn', 'native' => 'Bihari', 'regional' => ''], - 'bi' => ['name' => 'Bislama', 'script' => 'Latn', 'native' => 'Bislama', 'regional' => ''], - 'nb' => ['name' => 'Norwegian Bokmål', 'script' => 'Latn', 'native' => 'Bokmål', 'regional' => 'nb_NO'], - 'bs' => ['name' => 'Bosnian', 'script' => 'Latn', 'native' => 'bosanski', 'regional' => 'bs_BA'], - 'br' => ['name' => 'Breton', 'script' => 'Latn', 'native' => 'brezhoneg', 'regional' => 'br_FR'], - 'ca' => ['name' => 'Catalan', 'script' => 'Latn', 'native' => 'català', 'regional' => 'ca_ES'], - 'ch' => ['name' => 'Chamorro', 'script' => 'Latn', 'native' => 'Chamoru', 'regional' => ''], - 'ny' => ['name' => 'Chewa', 'script' => 'Latn', 'native' => 'chiCheŵa', 'regional' => ''], - 'kde' => ['name' => 'Makonde', 'script' => 'Latn', 'native' => 'Chimakonde', 'regional' => ''], - 'sn' => ['name' => 'Shona', 'script' => 'Latn', 'native' => 'chiShona', 'regional' => ''], - 'co' => ['name' => 'Corsican', 'script' => 'Latn', 'native' => 'corsu', 'regional' => ''], - 'cy' => ['name' => 'Welsh', 'script' => 'Latn', 'native' => 'Cymraeg', 'regional' => 'cy_GB'], - 'da' => ['name' => 'Danish', 'script' => 'Latn', 'native' => 'dansk', 'regional' => 'da_DK'], - 'se' => ['name' => 'Northern Sami', 'script' => 'Latn', 'native' => 'davvisámegiella', 'regional' => 'se_NO'], - 'de' => ['name' => 'German', 'script' => 'Latn', 'native' => 'Deutsch', 'regional' => 'de_DE'], - 'luo' => ['name' => 'Luo', 'script' => 'Latn', 'native' => 'Dholuo', 'regional' => ''], - 'nv' => ['name' => 'Navajo', 'script' => 'Latn', 'native' => 'Diné bizaad', 'regional' => ''], - 'dua' => ['name' => 'Duala', 'script' => 'Latn', 'native' => 'duálá', 'regional' => ''], - 'et' => ['name' => 'Estonian', 'script' => 'Latn', 'native' => 'eesti', 'regional' => 'et_EE'], - 'na' => ['name' => 'Nauru', 'script' => 'Latn', 'native' => 'Ekakairũ Naoero', 'regional' => ''], - 'guz' => ['name' => 'Ekegusii', 'script' => 'Latn', 'native' => 'Ekegusii', 'regional' => ''], - 'en' => ['name' => 'English', 'script' => 'Latn', 'native' => 'English', 'regional' => 'en_GB'], - 'en-AU' => ['name' => 'Australian English', 'script' => 'Latn', 'native' => 'Australian English', 'regional' => 'en_AU'], - 'en-GB' => ['name' => 'British English', 'script' => 'Latn', 'native' => 'British English', 'regional' => 'en_GB'], - 'en-US' => ['name' => 'U.S. English', 'script' => 'Latn', 'native' => 'U.S. English', 'regional' => 'en_US'], - 'es' => ['name' => 'Spanish', 'script' => 'Latn', 'native' => 'español', 'regional' => 'es_ES'], - 'eo' => ['name' => 'Esperanto', 'script' => 'Latn', 'native' => 'esperanto', 'regional' => ''], - 'eu' => ['name' => 'Basque', 'script' => 'Latn', 'native' => 'euskara', 'regional' => 'eu_ES'], - 'ewo' => ['name' => 'Ewondo', 'script' => 'Latn', 'native' => 'ewondo', 'regional' => ''], - 'ee' => ['name' => 'Ewe', 'script' => 'Latn', 'native' => 'eʋegbe', 'regional' => ''], - 'fil' => ['name' => 'Filipino', 'script' => 'Latn', 'native' => 'Filipino', 'regional' => 'fil_PH'], - 'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'français', 'regional' => 'fr_FR'], - 'fr-CA' => ['name' => 'Canadian French', 'script' => 'Latn', 'native' => 'français canadien', 'regional' => 'fr_CA'], - 'fy' => ['name' => 'Western Frisian', 'script' => 'Latn', 'native' => 'frysk', 'regional' => 'fy_DE'], - 'fur' => ['name' => 'Friulian', 'script' => 'Latn', 'native' => 'furlan', 'regional' => 'fur_IT'], - 'fo' => ['name' => 'Faroese', 'script' => 'Latn', 'native' => 'føroyskt', 'regional' => 'fo_FO'], - 'gaa' => ['name' => 'Ga', 'script' => 'Latn', 'native' => 'Ga', 'regional' => ''], - 'ga' => ['name' => 'Irish', 'script' => 'Latn', 'native' => 'Gaeilge', 'regional' => 'ga_IE'], - 'gv' => ['name' => 'Manx', 'script' => 'Latn', 'native' => 'Gaelg', 'regional' => 'gv_GB'], - 'sm' => ['name' => 'Samoan', 'script' => 'Latn', 'native' => 'Gagana fa’a Sāmoa', 'regional' => ''], - 'gl' => ['name' => 'Galician', 'script' => 'Latn', 'native' => 'galego', 'regional' => 'gl_ES'], - 'ki' => ['name' => 'Kikuyu', 'script' => 'Latn', 'native' => 'Gikuyu', 'regional' => ''], - 'gd' => ['name' => 'Scottish Gaelic', 'script' => 'Latn', 'native' => 'Gàidhlig', 'regional' => 'gd_GB'], - 'ha' => ['name' => 'Hausa', 'script' => 'Latn', 'native' => 'Hausa', 'regional' => 'ha_NG'], - 'bez' => ['name' => 'Bena', 'script' => 'Latn', 'native' => 'Hibena', 'regional' => ''], - 'ho' => ['name' => 'Hiri Motu', 'script' => 'Latn', 'native' => 'Hiri Motu', 'regional' => ''], - 'hr' => ['name' => 'Croatian', 'script' => 'Latn', 'native' => 'hrvatski', 'regional' => 'hr_HR'], - 'bem' => ['name' => 'Bemba', 'script' => 'Latn', 'native' => 'Ichibemba', 'regional' => 'bem_ZM'], - 'io' => ['name' => 'Ido', 'script' => 'Latn', 'native' => 'Ido', 'regional' => ''], - 'ig' => ['name' => 'Igbo', 'script' => 'Latn', 'native' => 'Igbo', 'regional' => 'ig_NG'], - 'rn' => ['name' => 'Rundi', 'script' => 'Latn', 'native' => 'Ikirundi', 'regional' => ''], - 'ia' => ['name' => 'Interlingua', 'script' => 'Latn', 'native' => 'interlingua', 'regional' => 'ia_FR'], - 'iu-Latn' => ['name' => 'Inuktitut (Latin)', 'script' => 'Latn', 'native' => 'Inuktitut', 'regional' => 'iu_CA'], - 'sbp' => ['name' => 'Sileibi', 'script' => 'Latn', 'native' => 'Ishisangu', 'regional' => ''], - 'nd' => ['name' => 'North Ndebele', 'script' => 'Latn', 'native' => 'isiNdebele', 'regional' => ''], - 'nr' => ['name' => 'South Ndebele', 'script' => 'Latn', 'native' => 'isiNdebele', 'regional' => 'nr_ZA'], - 'xh' => ['name' => 'Xhosa', 'script' => 'Latn', 'native' => 'isiXhosa', 'regional' => 'xh_ZA'], - 'zu' => ['name' => 'Zulu', 'script' => 'Latn', 'native' => 'isiZulu', 'regional' => 'zu_ZA'], - 'it' => ['name' => 'Italian', 'script' => 'Latn', 'native' => 'italiano', 'regional' => 'it_IT'], - 'ik' => ['name' => 'Inupiaq', 'script' => 'Latn', 'native' => 'Iñupiaq', 'regional' => 'ik_CA'], - 'dyo' => ['name' => 'Jola-Fonyi', 'script' => 'Latn', 'native' => 'joola', 'regional' => ''], - 'kea' => ['name' => 'Kabuverdianu', 'script' => 'Latn', 'native' => 'kabuverdianu', 'regional' => ''], - 'kaj' => ['name' => 'Jju', 'script' => 'Latn', 'native' => 'Kaje', 'regional' => ''], - 'mh' => ['name' => 'Marshallese', 'script' => 'Latn', 'native' => 'Kajin M̧ajeļ', 'regional' => 'mh_MH'], - 'kl' => ['name' => 'Kalaallisut', 'script' => 'Latn', 'native' => 'kalaallisut', 'regional' => 'kl_GL'], - 'kln' => ['name' => 'Kalenjin', 'script' => 'Latn', 'native' => 'Kalenjin', 'regional' => ''], - 'kr' => ['name' => 'Kanuri', 'script' => 'Latn', 'native' => 'Kanuri', 'regional' => ''], - 'kcg' => ['name' => 'Tyap', 'script' => 'Latn', 'native' => 'Katab', 'regional' => ''], - 'kw' => ['name' => 'Cornish', 'script' => 'Latn', 'native' => 'kernewek', 'regional' => 'kw_GB'], - 'naq' => ['name' => 'Nama', 'script' => 'Latn', 'native' => 'Khoekhoegowab', 'regional' => ''], - 'rof' => ['name' => 'Rombo', 'script' => 'Latn', 'native' => 'Kihorombo', 'regional' => ''], - 'kam' => ['name' => 'Kamba', 'script' => 'Latn', 'native' => 'Kikamba', 'regional' => ''], - 'kg' => ['name' => 'Kongo', 'script' => 'Latn', 'native' => 'Kikongo', 'regional' => ''], - 'jmc' => ['name' => 'Machame', 'script' => 'Latn', 'native' => 'Kimachame', 'regional' => ''], - 'rw' => ['name' => 'Kinyarwanda', 'script' => 'Latn', 'native' => 'Kinyarwanda', 'regional' => 'rw_RW'], - 'asa' => ['name' => 'Kipare', 'script' => 'Latn', 'native' => 'Kipare', 'regional' => ''], - 'rwk' => ['name' => 'Rwa', 'script' => 'Latn', 'native' => 'Kiruwa', 'regional' => ''], - 'saq' => ['name' => 'Samburu', 'script' => 'Latn', 'native' => 'Kisampur', 'regional' => ''], - 'ksb' => ['name' => 'Shambala', 'script' => 'Latn', 'native' => 'Kishambaa', 'regional' => ''], - 'swc' => ['name' => 'Congo Swahili', 'script' => 'Latn', 'native' => 'Kiswahili ya Kongo', 'regional' => ''], - 'sw' => ['name' => 'Swahili', 'script' => 'Latn', 'native' => 'Kiswahili', 'regional' => 'sw_KE'], - 'dav' => ['name' => 'Dawida', 'script' => 'Latn', 'native' => 'Kitaita', 'regional' => ''], - 'teo' => ['name' => 'Teso', 'script' => 'Latn', 'native' => 'Kiteso', 'regional' => ''], - 'khq' => ['name' => 'Koyra Chiini', 'script' => 'Latn', 'native' => 'Koyra ciini', 'regional' => ''], - 'ses' => ['name' => 'Songhay', 'script' => 'Latn', 'native' => 'Koyraboro senni', 'regional' => ''], - 'mfe' => ['name' => 'Morisyen', 'script' => 'Latn', 'native' => 'kreol morisien', 'regional' => ''], - 'ht' => ['name' => 'Haitian', 'script' => 'Latn', 'native' => 'Kreyòl ayisyen', 'regional' => 'ht_HT'], - 'kj' => ['name' => 'Kuanyama', 'script' => 'Latn', 'native' => 'Kwanyama', 'regional' => ''], - 'ksh' => ['name' => 'Kölsch', 'script' => 'Latn', 'native' => 'Kölsch', 'regional' => ''], - 'ebu' => ['name' => 'Kiembu', 'script' => 'Latn', 'native' => 'Kĩembu', 'regional' => ''], - 'mer' => ['name' => 'Kimîîru', 'script' => 'Latn', 'native' => 'Kĩmĩrũ', 'regional' => ''], - 'lag' => ['name' => 'Langi', 'script' => 'Latn', 'native' => 'Kɨlaangi', 'regional' => ''], - 'lah' => ['name' => 'Lahnda', 'script' => 'Latn', 'native' => 'Lahnda', 'regional' => ''], - 'la' => ['name' => 'Latin', 'script' => 'Latn', 'native' => 'latine', 'regional' => ''], - 'lv' => ['name' => 'Latvian', 'script' => 'Latn', 'native' => 'latviešu', 'regional' => 'lv_LV'], - 'to' => ['name' => 'Tongan', 'script' => 'Latn', 'native' => 'lea fakatonga', 'regional' => ''], - 'lt' => ['name' => 'Lithuanian', 'script' => 'Latn', 'native' => 'lietuvių', 'regional' => 'lt_LT'], - 'li' => ['name' => 'Limburgish', 'script' => 'Latn', 'native' => 'Limburgs', 'regional' => 'li_BE'], - 'ln' => ['name' => 'Lingala', 'script' => 'Latn', 'native' => 'lingála', 'regional' => ''], - 'lg' => ['name' => 'Ganda', 'script' => 'Latn', 'native' => 'Luganda', 'regional' => 'lg_UG'], - 'luy' => ['name' => 'Oluluyia', 'script' => 'Latn', 'native' => 'Luluhia', 'regional' => ''], - 'lb' => ['name' => 'Luxembourgish', 'script' => 'Latn', 'native' => 'Lëtzebuergesch', 'regional' => 'lb_LU'], - 'hu' => ['name' => 'Hungarian', 'script' => 'Latn', 'native' => 'magyar', 'regional' => 'hu_HU'], - 'mgh' => ['name' => 'Makhuwa-Meetto', 'script' => 'Latn', 'native' => 'Makua', 'regional' => ''], - 'mg' => ['name' => 'Malagasy', 'script' => 'Latn', 'native' => 'Malagasy', 'regional' => 'mg_MG'], - 'mt' => ['name' => 'Maltese', 'script' => 'Latn', 'native' => 'Malti', 'regional' => 'mt_MT'], - 'mtr' => ['name' => 'Mewari', 'script' => 'Latn', 'native' => 'Mewari', 'regional' => ''], - 'mua' => ['name' => 'Mundang', 'script' => 'Latn', 'native' => 'Mundang', 'regional' => ''], - 'mi' => ['name' => 'Māori', 'script' => 'Latn', 'native' => 'Māori', 'regional' => 'mi_NZ'], - 'nl' => ['name' => 'Dutch', 'script' => 'Latn', 'native' => 'Nederlands', 'regional' => 'nl_NL'], - 'nmg' => ['name' => 'Kwasio', 'script' => 'Latn', 'native' => 'ngumba', 'regional' => ''], - 'yav' => ['name' => 'Yangben', 'script' => 'Latn', 'native' => 'nuasue', 'regional' => ''], - 'nn' => ['name' => 'Norwegian Nynorsk', 'script' => 'Latn', 'native' => 'nynorsk', 'regional' => 'nn_NO'], - 'oc' => ['name' => 'Occitan', 'script' => 'Latn', 'native' => 'occitan', 'regional' => 'oc_FR'], - 'ang' => ['name' => 'Old English', 'script' => 'Runr', 'native' => 'Old English', 'regional' => ''], - 'xog' => ['name' => 'Soga', 'script' => 'Latn', 'native' => 'Olusoga', 'regional' => ''], - 'om' => ['name' => 'Oromo', 'script' => 'Latn', 'native' => 'Oromoo', 'regional' => 'om_ET'], - 'ng' => ['name' => 'Ndonga', 'script' => 'Latn', 'native' => 'OshiNdonga', 'regional' => ''], - 'hz' => ['name' => 'Herero', 'script' => 'Latn', 'native' => 'Otjiherero', 'regional' => ''], - 'uz-Latn' => ['name' => 'Uzbek (Latin)', 'script' => 'Latn', 'native' => 'oʼzbekcha', 'regional' => 'uz_UZ'], - 'nds' => ['name' => 'Low German', 'script' => 'Latn', 'native' => 'Plattdüütsch', 'regional' => 'nds_DE'], - 'pl' => ['name' => 'Polish', 'script' => 'Latn', 'native' => 'polski', 'regional' => 'pl_PL'], - 'pt' => ['name' => 'Portuguese', 'script' => 'Latn', 'native' => 'português', 'regional' => 'pt_PT'], - 'pt-BR' => ['name' => 'Brazilian Portuguese', 'script' => 'Latn', 'native' => 'português do Brasil', 'regional' => 'pt_BR'], - 'ff' => ['name' => 'Fulah', 'script' => 'Latn', 'native' => 'Pulaar', 'regional' => 'ff_SN'], - 'pi' => ['name' => 'Pahari-Potwari', 'script' => 'Latn', 'native' => 'Pāli', 'regional' => ''], - 'aa' => ['name' => 'Afar', 'script' => 'Latn', 'native' => 'Qafar', 'regional' => 'aa_ER'], - 'ty' => ['name' => 'Tahitian', 'script' => 'Latn', 'native' => 'Reo Māohi', 'regional' => ''], - 'ksf' => ['name' => 'Bafia', 'script' => 'Latn', 'native' => 'rikpa', 'regional' => ''], - 'ro' => ['name' => 'Romanian', 'script' => 'Latn', 'native' => 'română', 'regional' => 'ro_RO'], - 'cgg' => ['name' => 'Chiga', 'script' => 'Latn', 'native' => 'Rukiga', 'regional' => ''], - 'rm' => ['name' => 'Romansh', 'script' => 'Latn', 'native' => 'rumantsch', 'regional' => ''], - 'qu' => ['name' => 'Quechua', 'script' => 'Latn', 'native' => 'Runa Simi', 'regional' => ''], - 'nyn' => ['name' => 'Nyankole', 'script' => 'Latn', 'native' => 'Runyankore', 'regional' => ''], - 'ssy' => ['name' => 'Saho', 'script' => 'Latn', 'native' => 'Saho', 'regional' => ''], - 'sc' => ['name' => 'Sardinian', 'script' => 'Latn', 'native' => 'sardu', 'regional' => 'sc_IT'], - 'de-CH' => ['name' => 'Swiss High German', 'script' => 'Latn', 'native' => 'Schweizer Hochdeutsch', 'regional' => 'de_CH'], - 'gsw' => ['name' => 'Swiss German', 'script' => 'Latn', 'native' => 'Schwiizertüütsch', 'regional' => ''], - 'trv' => ['name' => 'Taroko', 'script' => 'Latn', 'native' => 'Seediq', 'regional' => ''], - 'seh' => ['name' => 'Sena', 'script' => 'Latn', 'native' => 'sena', 'regional' => ''], - 'nso' => ['name' => 'Northern Sotho', 'script' => 'Latn', 'native' => 'Sesotho sa Leboa', 'regional' => 'nso_ZA'], - 'st' => ['name' => 'Southern Sotho', 'script' => 'Latn', 'native' => 'Sesotho', 'regional' => 'st_ZA'], - 'tn' => ['name' => 'Tswana', 'script' => 'Latn', 'native' => 'Setswana', 'regional' => 'tn_ZA'], - 'sq' => ['name' => 'Albanian', 'script' => 'Latn', 'native' => 'shqip', 'regional' => 'sq_AL'], - 'sid' => ['name' => 'Sidamo', 'script' => 'Latn', 'native' => 'Sidaamu Afo', 'regional' => 'sid_ET'], - 'ss' => ['name' => 'Swati', 'script' => 'Latn', 'native' => 'Siswati', 'regional' => 'ss_ZA'], - 'sk' => ['name' => 'Slovak', 'script' => 'Latn', 'native' => 'slovenčina', 'regional' => 'sk_SK'], - 'sl' => ['name' => 'Slovene', 'script' => 'Latn', 'native' => 'slovenščina', 'regional' => 'sl_SI'], - 'so' => ['name' => 'Somali', 'script' => 'Latn', 'native' => 'Soomaali', 'regional' => 'so_SO'], - 'sr-Latn' => ['name' => 'Serbian (Latin)', 'script' => 'Latn', 'native' => 'Srpski', 'regional' => 'sr_RS'], - 'sh' => ['name' => 'Serbo-Croatian', 'script' => 'Latn', 'native' => 'srpskohrvatski', 'regional' => ''], - 'fi' => ['name' => 'Finnish', 'script' => 'Latn', 'native' => 'suomi', 'regional' => 'fi_FI'], - 'sv' => ['name' => 'Swedish', 'script' => 'Latn', 'native' => 'svenska', 'regional' => 'sv_FI'], - 'sg' => ['name' => 'Sango', 'script' => 'Latn', 'native' => 'Sängö', 'regional' => ''], - 'tl' => ['name' => 'Tagalog', 'script' => 'Latn', 'native' => 'Tagalog', 'regional' => 'tl_PH'], - 'tzm-Latn' => ['name' => 'Central Atlas Tamazight (Latin)', 'script' => 'Latn', 'native' => 'Tamazight', 'regional' => ''], - 'kab' => ['name' => 'Kabyle', 'script' => 'Latn', 'native' => 'Taqbaylit', 'regional' => 'kab_DZ'], - 'twq' => ['name' => 'Tasawaq', 'script' => 'Latn', 'native' => 'Tasawaq senni', 'regional' => ''], - 'shi' => ['name' => 'Tachelhit (Latin)', 'script' => 'Latn', 'native' => 'Tashelhit', 'regional' => ''], - 'nus' => ['name' => 'Nuer', 'script' => 'Latn', 'native' => 'Thok Nath', 'regional' => ''], - 'vi' => ['name' => 'Vietnamese', 'script' => 'Latn', 'native' => 'Tiếng Việt', 'regional' => 'vi_VN'], - 'tg-Latn' => ['name' => 'Tajik (Latin)', 'script' => 'Latn', 'native' => 'tojikī', 'regional' => 'tg_TJ'], - 'lu' => ['name' => 'Luba-Katanga', 'script' => 'Latn', 'native' => 'Tshiluba', 'regional' => 've_ZA'], - 've' => ['name' => 'Venda', 'script' => 'Latn', 'native' => 'Tshivenḓa', 'regional' => ''], - 'tw' => ['name' => 'Twi', 'script' => 'Latn', 'native' => 'Twi', 'regional' => ''], - 'tr' => ['name' => 'Turkish', 'script' => 'Latn', 'native' => 'Türkçe', 'regional' => 'tr_TR'], - 'ale' => ['name' => 'Aleut', 'script' => 'Latn', 'native' => 'Unangax tunuu', 'regional' => ''], - 'ca-valencia' => ['name' => 'Valencian', 'script' => 'Latn', 'native' => 'valencià', 'regional' => ''], - 'vai-Latn' => ['name' => 'Vai (Latin)', 'script' => 'Latn', 'native' => 'Viyamíĩ', 'regional' => ''], - 'vo' => ['name' => 'Volapük', 'script' => 'Latn', 'native' => 'Volapük', 'regional' => ''], - 'fj' => ['name' => 'Fijian', 'script' => 'Latn', 'native' => 'vosa Vakaviti', 'regional' => ''], - 'wa' => ['name' => 'Walloon', 'script' => 'Latn', 'native' => 'Walon', 'regional' => 'wa_BE'], - 'wae' => ['name' => 'Walser', 'script' => 'Latn', 'native' => 'Walser', 'regional' => 'wae_CH'], - 'wen' => ['name' => 'Sorbian', 'script' => 'Latn', 'native' => 'Wendic', 'regional' => ''], - 'wo' => ['name' => 'Wolof', 'script' => 'Latn', 'native' => 'Wolof', 'regional' => 'wo_SN'], - 'ts' => ['name' => 'Tsonga', 'script' => 'Latn', 'native' => 'Xitsonga', 'regional' => 'ts_ZA'], - 'dje' => ['name' => 'Zarma', 'script' => 'Latn', 'native' => 'Zarmaciine', 'regional' => ''], - 'yo' => ['name' => 'Yoruba', 'script' => 'Latn', 'native' => 'Èdè Yorùbá', 'regional' => 'yo_NG'], - 'de-AT' => ['name' => 'Austrian German', 'script' => 'Latn', 'native' => 'Österreichisches Deutsch', 'regional' => 'de_AT'], - 'is' => ['name' => 'Icelandic', 'script' => 'Latn', 'native' => 'íslenska', 'regional' => 'is_IS'], - 'cs' => ['name' => 'Czech', 'script' => 'Latn', 'native' => 'čeština', 'regional' => 'cs_CZ'], - 'bas' => ['name' => 'Basa', 'script' => 'Latn', 'native' => 'Ɓàsàa', 'regional' => ''], - 'mas' => ['name' => 'Masai', 'script' => 'Latn', 'native' => 'ɔl-Maa', 'regional' => ''], - 'haw' => ['name' => 'Hawaiian', 'script' => 'Latn', 'native' => 'ʻŌlelo Hawaiʻi', 'regional' => ''], - 'el' => ['name' => 'Greek', 'script' => 'Grek', 'native' => 'Ελληνικά', 'regional' => 'el_GR'], - 'uz' => ['name' => 'Uzbek (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Ўзбек', 'regional' => 'uz_UZ'], - 'az-Cyrl' => ['name' => 'Azerbaijani (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Азәрбајҹан', 'regional' => 'uz_UZ'], - 'ab' => ['name' => 'Abkhazian', 'script' => 'Cyrl', 'native' => 'Аҧсуа', 'regional' => ''], - 'os' => ['name' => 'Ossetic', 'script' => 'Cyrl', 'native' => 'Ирон', 'regional' => 'os_RU'], - 'ky' => ['name' => 'Kyrgyz', 'script' => 'Cyrl', 'native' => 'Кыргыз', 'regional' => 'ky_KG'], - 'sr' => ['name' => 'Serbian (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Српски', 'regional' => 'sr_RS'], - 'av' => ['name' => 'Avaric', 'script' => 'Cyrl', 'native' => 'авар мацӀ', 'regional' => ''], - 'ady' => ['name' => 'Adyghe', 'script' => 'Cyrl', 'native' => 'адыгэбзэ', 'regional' => ''], - 'ba' => ['name' => 'Bashkir', 'script' => 'Cyrl', 'native' => 'башҡорт теле', 'regional' => ''], - 'be' => ['name' => 'Belarusian', 'script' => 'Cyrl', 'native' => 'беларуская', 'regional' => 'be_BY'], - 'bg' => ['name' => 'Bulgarian', 'script' => 'Cyrl', 'native' => 'български', 'regional' => 'bg_BG'], - 'kv' => ['name' => 'Komi', 'script' => 'Cyrl', 'native' => 'коми кыв', 'regional' => ''], - 'mk' => ['name' => 'Macedonian', 'script' => 'Cyrl', 'native' => 'македонски', 'regional' => 'mk_MK'], - 'mn' => ['name' => 'Mongolian (Cyrillic)', 'script' => 'Cyrl', 'native' => 'монгол', 'regional' => 'mn_MN'], - 'ce' => ['name' => 'Chechen', 'script' => 'Cyrl', 'native' => 'нохчийн мотт', 'regional' => 'ce_RU'], - 'ru' => ['name' => 'Russian', 'script' => 'Cyrl', 'native' => 'русский', 'regional' => 'ru_RU'], - 'sah' => ['name' => 'Yakut', 'script' => 'Cyrl', 'native' => 'саха тыла', 'regional' => ''], - 'tt' => ['name' => 'Tatar', 'script' => 'Cyrl', 'native' => 'татар теле', 'regional' => 'tt_RU'], - 'tg' => ['name' => 'Tajik (Cyrillic)', 'script' => 'Cyrl', 'native' => 'тоҷикӣ', 'regional' => 'tg_TJ'], - 'tk' => ['name' => 'Turkmen', 'script' => 'Cyrl', 'native' => 'түркменче', 'regional' => 'tk_TM'], - 'uk' => ['name' => 'Ukrainian', 'script' => 'Cyrl', 'native' => 'українська', 'regional' => 'uk_UA'], - 'cv' => ['name' => 'Chuvash', 'script' => 'Cyrl', 'native' => 'чӑваш чӗлхи', 'regional' => 'cv_RU'], - 'cu' => ['name' => 'Church Slavic', 'script' => 'Cyrl', 'native' => 'ѩзыкъ словѣньскъ', 'regional' => ''], - 'kk' => ['name' => 'Kazakh', 'script' => 'Cyrl', 'native' => 'қазақ тілі', 'regional' => 'kk_KZ'], - 'hy' => ['name' => 'Armenian', 'script' => 'Armn', 'native' => 'Հայերէն', 'regional' => 'hy_AM'], - 'yi' => ['name' => 'Yiddish', 'script' => 'Hebr', 'native' => 'ייִדיש', 'regional' => 'yi_US'], - 'he' => ['name' => 'Hebrew', 'script' => 'Hebr', 'native' => 'עברית', 'regional' => 'he_IL'], - 'ug' => ['name' => 'Uyghur', 'script' => 'Arab', 'native' => 'ئۇيغۇرچە', 'regional' => 'ug_CN'], - 'ur' => ['name' => 'Urdu', 'script' => 'Arab', 'native' => 'اردو', 'regional' => 'ur_PK'], - 'ar' => ['name' => 'Arabic', 'script' => 'Arab', 'native' => 'العربية', 'regional' => 'ar_AE'], - 'uz-Arab' => ['name' => 'Uzbek (Arabic)', 'script' => 'Arab', 'native' => 'اۉزبېک', 'regional' => ''], - 'tg-Arab' => ['name' => 'Tajik (Arabic)', 'script' => 'Arab', 'native' => 'تاجیکی', 'regional' => 'tg_TJ'], - 'sd' => ['name' => 'Sindhi', 'script' => 'Arab', 'native' => 'سنڌي', 'regional' => 'sd_IN'], - 'fa' => ['name' => 'Persian', 'script' => 'Arab', 'native' => 'فارسی', 'regional' => 'fa_IR'], - 'pa-Arab' => ['name' => 'Punjabi (Arabic)', 'script' => 'Arab', 'native' => 'پنجاب', 'regional' => 'pa_IN'], - 'ps' => ['name' => 'Pashto', 'script' => 'Arab', 'native' => 'پښتو', 'regional' => 'ps_AF'], - 'ks' => ['name' => 'Kashmiri (Arabic)', 'script' => 'Arab', 'native' => 'کأشُر', 'regional' => 'ks_IN'], - 'ku' => ['name' => 'Kurdish', 'script' => 'Arab', 'native' => 'کوردی', 'regional' => 'ku_TR'], - 'dv' => ['name' => 'Divehi', 'script' => 'Thaa', 'native' => 'ދިވެހިބަސް', 'regional' => 'dv_MV'], - 'ks-Deva' => ['name' => 'Kashmiri (Devaganari)', 'script' => 'Deva', 'native' => 'कॉशुर', 'regional' => 'ks_IN'], - 'kok' => ['name' => 'Konkani', 'script' => 'Deva', 'native' => 'कोंकणी', 'regional' => 'kok_IN'], - 'doi' => ['name' => 'Dogri', 'script' => 'Deva', 'native' => 'डोगरी', 'regional' => 'doi_IN'], - 'ne' => ['name' => 'Nepali', 'script' => 'Deva', 'native' => 'नेपाली', 'regional' => ''], - 'pra' => ['name' => 'Prakrit', 'script' => 'Deva', 'native' => 'प्राकृत', 'regional' => ''], - 'brx' => ['name' => 'Bodo', 'script' => 'Deva', 'native' => 'बड़ो', 'regional' => 'brx_IN'], - 'bra' => ['name' => 'Braj', 'script' => 'Deva', 'native' => 'ब्रज भाषा', 'regional' => ''], - 'mr' => ['name' => 'Marathi', 'script' => 'Deva', 'native' => 'मराठी', 'regional' => 'mr_IN'], - 'mai' => ['name' => 'Maithili', 'script' => 'Tirh', 'native' => 'मैथिली', 'regional' => 'mai_IN'], - 'raj' => ['name' => 'Rajasthani', 'script' => 'Deva', 'native' => 'राजस्थानी', 'regional' => ''], - 'sa' => ['name' => 'Sanskrit', 'script' => 'Deva', 'native' => 'संस्कृतम्', 'regional' => 'sa_IN'], - 'hi' => ['name' => 'Hindi', 'script' => 'Deva', 'native' => 'हिन्दी', 'regional' => 'hi_IN'], - 'as' => ['name' => 'Assamese', 'script' => 'Beng', 'native' => 'অসমীয়া', 'regional' => 'as_IN'], - 'bn' => ['name' => 'Bengali', 'script' => 'Beng', 'native' => 'বাংলা', 'regional' => 'bn_BD'], - 'mni' => ['name' => 'Manipuri', 'script' => 'Beng', 'native' => 'মৈতৈ', 'regional' => 'mni_IN'], - 'pa' => ['name' => 'Punjabi (Gurmukhi)', 'script' => 'Guru', 'native' => 'ਪੰਜਾਬੀ', 'regional' => 'pa_IN'], - 'gu' => ['name' => 'Gujarati', 'script' => 'Gujr', 'native' => 'ગુજરાતી', 'regional' => 'gu_IN'], - 'or' => ['name' => 'Oriya', 'script' => 'Orya', 'native' => 'ଓଡ଼ିଆ', 'regional' => 'or_IN'], - 'ta' => ['name' => 'Tamil', 'script' => 'Taml', 'native' => 'தமிழ்', 'regional' => 'ta_IN'], - 'te' => ['name' => 'Telugu', 'script' => 'Telu', 'native' => 'తెలుగు', 'regional' => 'te_IN'], - 'kn' => ['name' => 'Kannada', 'script' => 'Knda', 'native' => 'ಕನ್ನಡ', 'regional' => 'kn_IN'], - 'ml' => ['name' => 'Malayalam', 'script' => 'Mlym', 'native' => 'മലയാളം', 'regional' => 'ml_IN'], - 'si' => ['name' => 'Sinhala', 'script' => 'Sinh', 'native' => 'සිංහල', 'regional' => 'si_LK'], - 'th' => ['name' => 'Thai', 'script' => 'Thai', 'native' => 'ไทย', 'regional' => 'th_TH'], - 'lo' => ['name' => 'Lao', 'script' => 'Laoo', 'native' => 'ລາວ', 'regional' => 'lo_LA'], - 'bo' => ['name' => 'Tibetan', 'script' => 'Tibt', 'native' => 'པོད་སྐད་', 'regional' => 'bo_IN'], - 'dz' => ['name' => 'Dzongkha', 'script' => 'Tibt', 'native' => 'རྫོང་ཁ', 'regional' => 'dz_BT'], - 'my' => ['name' => 'Burmese', 'script' => 'Mymr', 'native' => 'မြန်မာဘာသာ', 'regional' => 'my_MM'], - 'ka' => ['name' => 'Georgian', 'script' => 'Geor', 'native' => 'ქართული', 'regional' => 'ka_GE'], - 'byn' => ['name' => 'Blin', 'script' => 'Ethi', 'native' => 'ብሊን', 'regional' => 'byn_ER'], - 'tig' => ['name' => 'Tigre', 'script' => 'Ethi', 'native' => 'ትግረ', 'regional' => 'tig_ER'], - 'ti' => ['name' => 'Tigrinya', 'script' => 'Ethi', 'native' => 'ትግርኛ', 'regional' => 'ti_ET'], - 'am' => ['name' => 'Amharic', 'script' => 'Ethi', 'native' => 'አማርኛ', 'regional' => 'am_ET'], - 'wal' => ['name' => 'Wolaytta', 'script' => 'Ethi', 'native' => 'ወላይታቱ', 'regional' => 'wal_ET'], - 'chr' => ['name' => 'Cherokee', 'script' => 'Cher', 'native' => 'ᏣᎳᎩ', 'regional' => ''], - 'iu' => ['name' => 'Inuktitut (Canadian Aboriginal Syllabics)', 'script' => 'Cans', 'native' => 'ᐃᓄᒃᑎᑐᑦ', 'regional' => 'iu_CA'], - 'oj' => ['name' => 'Ojibwa', 'script' => 'Cans', 'native' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'regional' => ''], - 'cr' => ['name' => 'Cree', 'script' => 'Cans', 'native' => 'ᓀᐦᐃᔭᐍᐏᐣ', 'regional' => ''], - 'km' => ['name' => 'Khmer', 'script' => 'Khmr', 'native' => 'ភាសាខ្មែរ', 'regional' => 'km_KH'], - 'mn-Mong' => ['name' => 'Mongolian (Mongolian)', 'script' => 'Mong', 'native' => 'ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ', 'regional' => 'mn_MN'], - 'shi-Tfng' => ['name' => 'Tachelhit (Tifinagh)', 'script' => 'Tfng', 'native' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', 'regional' => ''], - 'tzm' => ['name' => 'Central Atlas Tamazight (Tifinagh)', 'script' => 'Tfng', 'native' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', 'regional' => ''], - 'yue' => ['name' => 'Yue', 'script' => 'Hant', 'native' => '廣州話', 'regional' => 'yue_HK'], - 'ja' => ['name' => 'Japanese', 'script' => 'Jpan', 'native' => '日本語', 'regional' => 'ja_JP'], - 'zh' => ['name' => 'Chinese (Simplified)', 'script' => 'Hans', 'native' => '简体中文', 'regional' => 'zh_CN'], - 'zh-Hant' => ['name' => 'Chinese (Traditional)', 'script' => 'Hant', 'native' => '繁體中文', 'regional' => 'zh_CN'], - 'ii' => ['name' => 'Sichuan Yi', 'script' => 'Yiii', 'native' => 'ꆈꌠꉙ', 'regional' => ''], - 'vai' => ['name' => 'Vai (Vai)', 'script' => 'Vaii', 'native' => 'ꕙꔤ', 'regional' => ''], - 'jv-Java' => ['name' => 'Javanese (Javanese)', 'script' => 'Java', 'native' => 'ꦧꦱꦗꦮ', 'regional' => ''], - 'ko' => ['name' => 'Korean', 'script' => 'Hang', 'native' => '한국어', 'regional' => 'ko_KR'], + // 'ace' => ['name' => 'Achinese', 'script' => 'Latn', 'native' => 'Aceh', 'regional' => ''], + // 'af' => ['name' => 'Afrikaans', 'script' => 'Latn', 'native' => 'Afrikaans', 'regional' => 'af_ZA'], + // 'agq' => ['name' => 'Aghem', 'script' => 'Latn', 'native' => 'Aghem', 'regional' => ''], + // 'ak' => ['name' => 'Akan', 'script' => 'Latn', 'native' => 'Akan', 'regional' => 'ak_GH'], + // 'an' => ['name' => 'Aragonese', 'script' => 'Latn', 'native' => 'aragonés', 'regional' => 'an_ES'], + // 'cch' => ['name' => 'Atsam', 'script' => 'Latn', 'native' => 'Atsam', 'regional' => ''], + // 'gn' => ['name' => 'Guaraní', 'script' => 'Latn', 'native' => 'Avañe’ẽ', 'regional' => ''], + // 'ae' => ['name' => 'Avestan', 'script' => 'Latn', 'native' => 'avesta', 'regional' => ''], + // 'ay' => ['name' => 'Aymara', 'script' => 'Latn', 'native' => 'aymar aru', 'regional' => 'ay_PE'], + // 'az' => ['name' => 'Azerbaijani (Latin)', 'script' => 'Latn', 'native' => 'azərbaycanca', 'regional' => 'az_AZ'], + // 'id' => ['name' => 'Indonesian', 'script' => 'Latn', 'native' => 'Bahasa Indonesia', 'regional' => 'id_ID'], + // 'ms' => ['name' => 'Malay', 'script' => 'Latn', 'native' => 'Bahasa Melayu', 'regional' => 'ms_MY'], + // 'bm' => ['name' => 'Bambara', 'script' => 'Latn', 'native' => 'bamanakan', 'regional' => ''], + // 'jv' => ['name' => 'Javanese (Latin)', 'script' => 'Latn', 'native' => 'Basa Jawa', 'regional' => ''], + // 'su' => ['name' => 'Sundanese', 'script' => 'Latn', 'native' => 'Basa Sunda', 'regional' => ''], + // 'bh' => ['name' => 'Bihari', 'script' => 'Latn', 'native' => 'Bihari', 'regional' => ''], + // 'bi' => ['name' => 'Bislama', 'script' => 'Latn', 'native' => 'Bislama', 'regional' => ''], + // 'nb' => ['name' => 'Norwegian Bokmål', 'script' => 'Latn', 'native' => 'Bokmål', 'regional' => 'nb_NO'], + // 'bs' => ['name' => 'Bosnian', 'script' => 'Latn', 'native' => 'bosanski', 'regional' => 'bs_BA'], + // 'br' => ['name' => 'Breton', 'script' => 'Latn', 'native' => 'brezhoneg', 'regional' => 'br_FR'], + // 'ca' => ['name' => 'Catalan', 'script' => 'Latn', 'native' => 'català', 'regional' => 'ca_ES'], + // 'ch' => ['name' => 'Chamorro', 'script' => 'Latn', 'native' => 'Chamoru', 'regional' => ''], + // 'ny' => ['name' => 'Chewa', 'script' => 'Latn', 'native' => 'chiCheŵa', 'regional' => ''], + // 'kde' => ['name' => 'Makonde', 'script' => 'Latn', 'native' => 'Chimakonde', 'regional' => ''], + // 'sn' => ['name' => 'Shona', 'script' => 'Latn', 'native' => 'chiShona', 'regional' => ''], + // 'co' => ['name' => 'Corsican', 'script' => 'Latn', 'native' => 'corsu', 'regional' => ''], + // 'cy' => ['name' => 'Welsh', 'script' => 'Latn', 'native' => 'Cymraeg', 'regional' => 'cy_GB'], + // 'da' => ['name' => 'Danish', 'script' => 'Latn', 'native' => 'dansk', 'regional' => 'da_DK'], + // 'se' => ['name' => 'Northern Sami', 'script' => 'Latn', 'native' => 'davvisámegiella', 'regional' => 'se_NO'], + // 'de' => ['name' => 'German', 'script' => 'Latn', 'native' => 'Deutsch', 'regional' => 'de_DE'], + // 'luo' => ['name' => 'Luo', 'script' => 'Latn', 'native' => 'Dholuo', 'regional' => ''], + // 'nv' => ['name' => 'Navajo', 'script' => 'Latn', 'native' => 'Diné bizaad', 'regional' => ''], + // 'dua' => ['name' => 'Duala', 'script' => 'Latn', 'native' => 'duálá', 'regional' => ''], + // 'et' => ['name' => 'Estonian', 'script' => 'Latn', 'native' => 'eesti', 'regional' => 'et_EE'], + // 'na' => ['name' => 'Nauru', 'script' => 'Latn', 'native' => 'Ekakairũ Naoero', 'regional' => ''], + // 'guz' => ['name' => 'Ekegusii', 'script' => 'Latn', 'native' => 'Ekegusii', 'regional' => ''], + 'en' => ['name' => 'English', 'script' => 'Latn', 'native' => 'English', 'regional' => 'en_GB'], + // 'en-AU' => ['name' => 'Australian English', 'script' => 'Latn', 'native' => 'Australian English', 'regional' => 'en_AU'], + // 'en-GB' => ['name' => 'British English', 'script' => 'Latn', 'native' => 'British English', 'regional' => 'en_GB'], + // 'en-US' => ['name' => 'U.S. English', 'script' => 'Latn', 'native' => 'U.S. English', 'regional' => 'en_US'], + // 'es' => ['name' => 'Spanish', 'script' => 'Latn', 'native' => 'español', 'regional' => 'es_ES'], + // 'eo' => ['name' => 'Esperanto', 'script' => 'Latn', 'native' => 'esperanto', 'regional' => ''], + // 'eu' => ['name' => 'Basque', 'script' => 'Latn', 'native' => 'euskara', 'regional' => 'eu_ES'], + // 'ewo' => ['name' => 'Ewondo', 'script' => 'Latn', 'native' => 'ewondo', 'regional' => ''], + // 'ee' => ['name' => 'Ewe', 'script' => 'Latn', 'native' => 'eʋegbe', 'regional' => ''], + // 'fil' => ['name' => 'Filipino', 'script' => 'Latn', 'native' => 'Filipino', 'regional' => 'fil_PH'], + // 'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'français', 'regional' => 'fr_FR'], + // 'fr-CA' => ['name' => 'Canadian French', 'script' => 'Latn', 'native' => 'français canadien', 'regional' => 'fr_CA'], + // 'fy' => ['name' => 'Western Frisian', 'script' => 'Latn', 'native' => 'frysk', 'regional' => 'fy_DE'], + // 'fur' => ['name' => 'Friulian', 'script' => 'Latn', 'native' => 'furlan', 'regional' => 'fur_IT'], + // 'fo' => ['name' => 'Faroese', 'script' => 'Latn', 'native' => 'føroyskt', 'regional' => 'fo_FO'], + // 'gaa' => ['name' => 'Ga', 'script' => 'Latn', 'native' => 'Ga', 'regional' => ''], + // 'ga' => ['name' => 'Irish', 'script' => 'Latn', 'native' => 'Gaeilge', 'regional' => 'ga_IE'], + // 'gv' => ['name' => 'Manx', 'script' => 'Latn', 'native' => 'Gaelg', 'regional' => 'gv_GB'], + // 'sm' => ['name' => 'Samoan', 'script' => 'Latn', 'native' => 'Gagana fa’a Sāmoa', 'regional' => ''], + // 'gl' => ['name' => 'Galician', 'script' => 'Latn', 'native' => 'galego', 'regional' => 'gl_ES'], + // 'ki' => ['name' => 'Kikuyu', 'script' => 'Latn', 'native' => 'Gikuyu', 'regional' => ''], + // 'gd' => ['name' => 'Scottish Gaelic', 'script' => 'Latn', 'native' => 'Gàidhlig', 'regional' => 'gd_GB'], + // 'ha' => ['name' => 'Hausa', 'script' => 'Latn', 'native' => 'Hausa', 'regional' => 'ha_NG'], + // 'bez' => ['name' => 'Bena', 'script' => 'Latn', 'native' => 'Hibena', 'regional' => ''], + // 'ho' => ['name' => 'Hiri Motu', 'script' => 'Latn', 'native' => 'Hiri Motu', 'regional' => ''], + // 'hr' => ['name' => 'Croatian', 'script' => 'Latn', 'native' => 'hrvatski', 'regional' => 'hr_HR'], + // 'bem' => ['name' => 'Bemba', 'script' => 'Latn', 'native' => 'Ichibemba', 'regional' => 'bem_ZM'], + // 'io' => ['name' => 'Ido', 'script' => 'Latn', 'native' => 'Ido', 'regional' => ''], + // 'ig' => ['name' => 'Igbo', 'script' => 'Latn', 'native' => 'Igbo', 'regional' => 'ig_NG'], + // 'rn' => ['name' => 'Rundi', 'script' => 'Latn', 'native' => 'Ikirundi', 'regional' => ''], + // 'ia' => ['name' => 'Interlingua', 'script' => 'Latn', 'native' => 'interlingua', 'regional' => 'ia_FR'], + // 'iu-Latn' => ['name' => 'Inuktitut (Latin)', 'script' => 'Latn', 'native' => 'Inuktitut', 'regional' => 'iu_CA'], + // 'sbp' => ['name' => 'Sileibi', 'script' => 'Latn', 'native' => 'Ishisangu', 'regional' => ''], + // 'nd' => ['name' => 'North Ndebele', 'script' => 'Latn', 'native' => 'isiNdebele', 'regional' => ''], + // 'nr' => ['name' => 'South Ndebele', 'script' => 'Latn', 'native' => 'isiNdebele', 'regional' => 'nr_ZA'], + // 'xh' => ['name' => 'Xhosa', 'script' => 'Latn', 'native' => 'isiXhosa', 'regional' => 'xh_ZA'], + // 'zu' => ['name' => 'Zulu', 'script' => 'Latn', 'native' => 'isiZulu', 'regional' => 'zu_ZA'], + // 'it' => ['name' => 'Italian', 'script' => 'Latn', 'native' => 'italiano', 'regional' => 'it_IT'], + // 'ik' => ['name' => 'Inupiaq', 'script' => 'Latn', 'native' => 'Iñupiaq', 'regional' => 'ik_CA'], + // 'dyo' => ['name' => 'Jola-Fonyi', 'script' => 'Latn', 'native' => 'joola', 'regional' => ''], + // 'kea' => ['name' => 'Kabuverdianu', 'script' => 'Latn', 'native' => 'kabuverdianu', 'regional' => ''], + // 'kaj' => ['name' => 'Jju', 'script' => 'Latn', 'native' => 'Kaje', 'regional' => ''], + // 'mh' => ['name' => 'Marshallese', 'script' => 'Latn', 'native' => 'Kajin M̧ajeļ', 'regional' => 'mh_MH'], + // 'kl' => ['name' => 'Kalaallisut', 'script' => 'Latn', 'native' => 'kalaallisut', 'regional' => 'kl_GL'], + // 'kln' => ['name' => 'Kalenjin', 'script' => 'Latn', 'native' => 'Kalenjin', 'regional' => ''], + // 'kr' => ['name' => 'Kanuri', 'script' => 'Latn', 'native' => 'Kanuri', 'regional' => ''], + // 'kcg' => ['name' => 'Tyap', 'script' => 'Latn', 'native' => 'Katab', 'regional' => ''], + // 'kw' => ['name' => 'Cornish', 'script' => 'Latn', 'native' => 'kernewek', 'regional' => 'kw_GB'], + // 'naq' => ['name' => 'Nama', 'script' => 'Latn', 'native' => 'Khoekhoegowab', 'regional' => ''], + // 'rof' => ['name' => 'Rombo', 'script' => 'Latn', 'native' => 'Kihorombo', 'regional' => ''], + // 'kam' => ['name' => 'Kamba', 'script' => 'Latn', 'native' => 'Kikamba', 'regional' => ''], + // 'kg' => ['name' => 'Kongo', 'script' => 'Latn', 'native' => 'Kikongo', 'regional' => ''], + // 'jmc' => ['name' => 'Machame', 'script' => 'Latn', 'native' => 'Kimachame', 'regional' => ''], + // 'rw' => ['name' => 'Kinyarwanda', 'script' => 'Latn', 'native' => 'Kinyarwanda', 'regional' => 'rw_RW'], + // 'asa' => ['name' => 'Kipare', 'script' => 'Latn', 'native' => 'Kipare', 'regional' => ''], + // 'rwk' => ['name' => 'Rwa', 'script' => 'Latn', 'native' => 'Kiruwa', 'regional' => ''], + // 'saq' => ['name' => 'Samburu', 'script' => 'Latn', 'native' => 'Kisampur', 'regional' => ''], + // 'ksb' => ['name' => 'Shambala', 'script' => 'Latn', 'native' => 'Kishambaa', 'regional' => ''], + // 'swc' => ['name' => 'Congo Swahili', 'script' => 'Latn', 'native' => 'Kiswahili ya Kongo', 'regional' => ''], + // 'sw' => ['name' => 'Swahili', 'script' => 'Latn', 'native' => 'Kiswahili', 'regional' => 'sw_KE'], + // 'dav' => ['name' => 'Dawida', 'script' => 'Latn', 'native' => 'Kitaita', 'regional' => ''], + // 'teo' => ['name' => 'Teso', 'script' => 'Latn', 'native' => 'Kiteso', 'regional' => ''], + // 'khq' => ['name' => 'Koyra Chiini', 'script' => 'Latn', 'native' => 'Koyra ciini', 'regional' => ''], + // 'ses' => ['name' => 'Songhay', 'script' => 'Latn', 'native' => 'Koyraboro senni', 'regional' => ''], + // 'mfe' => ['name' => 'Morisyen', 'script' => 'Latn', 'native' => 'kreol morisien', 'regional' => ''], + // 'ht' => ['name' => 'Haitian', 'script' => 'Latn', 'native' => 'Kreyòl ayisyen', 'regional' => 'ht_HT'], + // 'kj' => ['name' => 'Kuanyama', 'script' => 'Latn', 'native' => 'Kwanyama', 'regional' => ''], + // 'ksh' => ['name' => 'Kölsch', 'script' => 'Latn', 'native' => 'Kölsch', 'regional' => ''], + // 'ebu' => ['name' => 'Kiembu', 'script' => 'Latn', 'native' => 'Kĩembu', 'regional' => ''], + // 'mer' => ['name' => 'Kimîîru', 'script' => 'Latn', 'native' => 'Kĩmĩrũ', 'regional' => ''], + // 'lag' => ['name' => 'Langi', 'script' => 'Latn', 'native' => 'Kɨlaangi', 'regional' => ''], + // 'lah' => ['name' => 'Lahnda', 'script' => 'Latn', 'native' => 'Lahnda', 'regional' => ''], + // 'la' => ['name' => 'Latin', 'script' => 'Latn', 'native' => 'latine', 'regional' => ''], + // 'lv' => ['name' => 'Latvian', 'script' => 'Latn', 'native' => 'latviešu', 'regional' => 'lv_LV'], + // 'to' => ['name' => 'Tongan', 'script' => 'Latn', 'native' => 'lea fakatonga', 'regional' => ''], + // 'lt' => ['name' => 'Lithuanian', 'script' => 'Latn', 'native' => 'lietuvių', 'regional' => 'lt_LT'], + // 'li' => ['name' => 'Limburgish', 'script' => 'Latn', 'native' => 'Limburgs', 'regional' => 'li_BE'], + // 'ln' => ['name' => 'Lingala', 'script' => 'Latn', 'native' => 'lingála', 'regional' => ''], + // 'lg' => ['name' => 'Ganda', 'script' => 'Latn', 'native' => 'Luganda', 'regional' => 'lg_UG'], + // 'luy' => ['name' => 'Oluluyia', 'script' => 'Latn', 'native' => 'Luluhia', 'regional' => ''], + // 'lb' => ['name' => 'Luxembourgish', 'script' => 'Latn', 'native' => 'Lëtzebuergesch', 'regional' => 'lb_LU'], + // 'hu' => ['name' => 'Hungarian', 'script' => 'Latn', 'native' => 'magyar', 'regional' => 'hu_HU'], + // 'mgh' => ['name' => 'Makhuwa-Meetto', 'script' => 'Latn', 'native' => 'Makua', 'regional' => ''], + // 'mg' => ['name' => 'Malagasy', 'script' => 'Latn', 'native' => 'Malagasy', 'regional' => 'mg_MG'], + // 'mt' => ['name' => 'Maltese', 'script' => 'Latn', 'native' => 'Malti', 'regional' => 'mt_MT'], + // 'mtr' => ['name' => 'Mewari', 'script' => 'Latn', 'native' => 'Mewari', 'regional' => ''], + // 'mua' => ['name' => 'Mundang', 'script' => 'Latn', 'native' => 'Mundang', 'regional' => ''], + // 'mi' => ['name' => 'Māori', 'script' => 'Latn', 'native' => 'Māori', 'regional' => 'mi_NZ'], + 'nl' => ['name' => 'Dutch', 'script' => 'Latn', 'native' => 'Nederlands', 'regional' => 'nl_NL'], + // 'nmg' => ['name' => 'Kwasio', 'script' => 'Latn', 'native' => 'ngumba', 'regional' => ''], + // 'yav' => ['name' => 'Yangben', 'script' => 'Latn', 'native' => 'nuasue', 'regional' => ''], + // 'nn' => ['name' => 'Norwegian Nynorsk', 'script' => 'Latn', 'native' => 'nynorsk', 'regional' => 'nn_NO'], + // 'oc' => ['name' => 'Occitan', 'script' => 'Latn', 'native' => 'occitan', 'regional' => 'oc_FR'], + // 'ang' => ['name' => 'Old English', 'script' => 'Runr', 'native' => 'Old English', 'regional' => ''], + // 'xog' => ['name' => 'Soga', 'script' => 'Latn', 'native' => 'Olusoga', 'regional' => ''], + // 'om' => ['name' => 'Oromo', 'script' => 'Latn', 'native' => 'Oromoo', 'regional' => 'om_ET'], + // 'ng' => ['name' => 'Ndonga', 'script' => 'Latn', 'native' => 'OshiNdonga', 'regional' => ''], + // 'hz' => ['name' => 'Herero', 'script' => 'Latn', 'native' => 'Otjiherero', 'regional' => ''], + // 'uz-Latn' => ['name' => 'Uzbek (Latin)', 'script' => 'Latn', 'native' => 'oʼzbekcha', 'regional' => 'uz_UZ'], + // 'nds' => ['name' => 'Low German', 'script' => 'Latn', 'native' => 'Plattdüütsch', 'regional' => 'nds_DE'], + // 'pl' => ['name' => 'Polish', 'script' => 'Latn', 'native' => 'polski', 'regional' => 'pl_PL'], + // 'pt' => ['name' => 'Portuguese', 'script' => 'Latn', 'native' => 'português', 'regional' => 'pt_PT'], + // 'pt-BR' => ['name' => 'Brazilian Portuguese', 'script' => 'Latn', 'native' => 'português do Brasil', 'regional' => 'pt_BR'], + // 'ff' => ['name' => 'Fulah', 'script' => 'Latn', 'native' => 'Pulaar', 'regional' => 'ff_SN'], + // 'pi' => ['name' => 'Pahari-Potwari', 'script' => 'Latn', 'native' => 'Pāli', 'regional' => ''], + // 'aa' => ['name' => 'Afar', 'script' => 'Latn', 'native' => 'Qafar', 'regional' => 'aa_ER'], + // 'ty' => ['name' => 'Tahitian', 'script' => 'Latn', 'native' => 'Reo Māohi', 'regional' => ''], + // 'ksf' => ['name' => 'Bafia', 'script' => 'Latn', 'native' => 'rikpa', 'regional' => ''], + // 'ro' => ['name' => 'Romanian', 'script' => 'Latn', 'native' => 'română', 'regional' => 'ro_RO'], + // 'cgg' => ['name' => 'Chiga', 'script' => 'Latn', 'native' => 'Rukiga', 'regional' => ''], + // 'rm' => ['name' => 'Romansh', 'script' => 'Latn', 'native' => 'rumantsch', 'regional' => ''], + // 'qu' => ['name' => 'Quechua', 'script' => 'Latn', 'native' => 'Runa Simi', 'regional' => ''], + // 'nyn' => ['name' => 'Nyankole', 'script' => 'Latn', 'native' => 'Runyankore', 'regional' => ''], + // 'ssy' => ['name' => 'Saho', 'script' => 'Latn', 'native' => 'Saho', 'regional' => ''], + // 'sc' => ['name' => 'Sardinian', 'script' => 'Latn', 'native' => 'sardu', 'regional' => 'sc_IT'], + // 'de-CH' => ['name' => 'Swiss High German', 'script' => 'Latn', 'native' => 'Schweizer Hochdeutsch', 'regional' => 'de_CH'], + // 'gsw' => ['name' => 'Swiss German', 'script' => 'Latn', 'native' => 'Schwiizertüütsch', 'regional' => ''], + // 'trv' => ['name' => 'Taroko', 'script' => 'Latn', 'native' => 'Seediq', 'regional' => ''], + // 'seh' => ['name' => 'Sena', 'script' => 'Latn', 'native' => 'sena', 'regional' => ''], + // 'nso' => ['name' => 'Northern Sotho', 'script' => 'Latn', 'native' => 'Sesotho sa Leboa', 'regional' => 'nso_ZA'], + // 'st' => ['name' => 'Southern Sotho', 'script' => 'Latn', 'native' => 'Sesotho', 'regional' => 'st_ZA'], + // 'tn' => ['name' => 'Tswana', 'script' => 'Latn', 'native' => 'Setswana', 'regional' => 'tn_ZA'], + // 'sq' => ['name' => 'Albanian', 'script' => 'Latn', 'native' => 'shqip', 'regional' => 'sq_AL'], + // 'sid' => ['name' => 'Sidamo', 'script' => 'Latn', 'native' => 'Sidaamu Afo', 'regional' => 'sid_ET'], + // 'ss' => ['name' => 'Swati', 'script' => 'Latn', 'native' => 'Siswati', 'regional' => 'ss_ZA'], + // 'sk' => ['name' => 'Slovak', 'script' => 'Latn', 'native' => 'slovenčina', 'regional' => 'sk_SK'], + // 'sl' => ['name' => 'Slovene', 'script' => 'Latn', 'native' => 'slovenščina', 'regional' => 'sl_SI'], + // 'so' => ['name' => 'Somali', 'script' => 'Latn', 'native' => 'Soomaali', 'regional' => 'so_SO'], + // 'sr-Latn' => ['name' => 'Serbian (Latin)', 'script' => 'Latn', 'native' => 'Srpski', 'regional' => 'sr_RS'], + // 'sh' => ['name' => 'Serbo-Croatian', 'script' => 'Latn', 'native' => 'srpskohrvatski', 'regional' => ''], + // 'fi' => ['name' => 'Finnish', 'script' => 'Latn', 'native' => 'suomi', 'regional' => 'fi_FI'], + // 'sv' => ['name' => 'Swedish', 'script' => 'Latn', 'native' => 'svenska', 'regional' => 'sv_FI'], + // 'sg' => ['name' => 'Sango', 'script' => 'Latn', 'native' => 'Sängö', 'regional' => ''], + // 'tl' => ['name' => 'Tagalog', 'script' => 'Latn', 'native' => 'Tagalog', 'regional' => 'tl_PH'], + // 'tzm-Latn' => ['name' => 'Central Atlas Tamazight (Latin)', 'script' => 'Latn', 'native' => 'Tamazight', 'regional' => ''], + // 'kab' => ['name' => 'Kabyle', 'script' => 'Latn', 'native' => 'Taqbaylit', 'regional' => 'kab_DZ'], + // 'twq' => ['name' => 'Tasawaq', 'script' => 'Latn', 'native' => 'Tasawaq senni', 'regional' => ''], + // 'shi' => ['name' => 'Tachelhit (Latin)', 'script' => 'Latn', 'native' => 'Tashelhit', 'regional' => ''], + // 'nus' => ['name' => 'Nuer', 'script' => 'Latn', 'native' => 'Thok Nath', 'regional' => ''], + // 'vi' => ['name' => 'Vietnamese', 'script' => 'Latn', 'native' => 'Tiếng Việt', 'regional' => 'vi_VN'], + // 'tg-Latn' => ['name' => 'Tajik (Latin)', 'script' => 'Latn', 'native' => 'tojikī', 'regional' => 'tg_TJ'], + // 'lu' => ['name' => 'Luba-Katanga', 'script' => 'Latn', 'native' => 'Tshiluba', 'regional' => 've_ZA'], + // 've' => ['name' => 'Venda', 'script' => 'Latn', 'native' => 'Tshivenḓa', 'regional' => ''], + // 'tw' => ['name' => 'Twi', 'script' => 'Latn', 'native' => 'Twi', 'regional' => ''], + // 'tr' => ['name' => 'Turkish', 'script' => 'Latn', 'native' => 'Türkçe', 'regional' => 'tr_TR'], + // 'ale' => ['name' => 'Aleut', 'script' => 'Latn', 'native' => 'Unangax tunuu', 'regional' => ''], + // 'ca-valencia' => ['name' => 'Valencian', 'script' => 'Latn', 'native' => 'valencià', 'regional' => ''], + // 'vai-Latn' => ['name' => 'Vai (Latin)', 'script' => 'Latn', 'native' => 'Viyamíĩ', 'regional' => ''], + // 'vo' => ['name' => 'Volapük', 'script' => 'Latn', 'native' => 'Volapük', 'regional' => ''], + // 'fj' => ['name' => 'Fijian', 'script' => 'Latn', 'native' => 'vosa Vakaviti', 'regional' => ''], + // 'wa' => ['name' => 'Walloon', 'script' => 'Latn', 'native' => 'Walon', 'regional' => 'wa_BE'], + // 'wae' => ['name' => 'Walser', 'script' => 'Latn', 'native' => 'Walser', 'regional' => 'wae_CH'], + // 'wen' => ['name' => 'Sorbian', 'script' => 'Latn', 'native' => 'Wendic', 'regional' => ''], + // 'wo' => ['name' => 'Wolof', 'script' => 'Latn', 'native' => 'Wolof', 'regional' => 'wo_SN'], + // 'ts' => ['name' => 'Tsonga', 'script' => 'Latn', 'native' => 'Xitsonga', 'regional' => 'ts_ZA'], + // 'dje' => ['name' => 'Zarma', 'script' => 'Latn', 'native' => 'Zarmaciine', 'regional' => ''], + // 'yo' => ['name' => 'Yoruba', 'script' => 'Latn', 'native' => 'Èdè Yorùbá', 'regional' => 'yo_NG'], + // 'de-AT' => ['name' => 'Austrian German', 'script' => 'Latn', 'native' => 'Österreichisches Deutsch', 'regional' => 'de_AT'], + // 'is' => ['name' => 'Icelandic', 'script' => 'Latn', 'native' => 'íslenska', 'regional' => 'is_IS'], + // 'cs' => ['name' => 'Czech', 'script' => 'Latn', 'native' => 'čeština', 'regional' => 'cs_CZ'], + // 'bas' => ['name' => 'Basa', 'script' => 'Latn', 'native' => 'Ɓàsàa', 'regional' => ''], + // 'mas' => ['name' => 'Masai', 'script' => 'Latn', 'native' => 'ɔl-Maa', 'regional' => ''], + // 'haw' => ['name' => 'Hawaiian', 'script' => 'Latn', 'native' => 'ʻŌlelo Hawaiʻi', 'regional' => ''], + // 'el' => ['name' => 'Greek', 'script' => 'Grek', 'native' => 'Ελληνικά', 'regional' => 'el_GR'], + // 'uz' => ['name' => 'Uzbek (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Ўзбек', 'regional' => 'uz_UZ'], + // 'az-Cyrl' => ['name' => 'Azerbaijani (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Азәрбајҹан', 'regional' => 'uz_UZ'], + // 'ab' => ['name' => 'Abkhazian', 'script' => 'Cyrl', 'native' => 'Аҧсуа', 'regional' => ''], + // 'os' => ['name' => 'Ossetic', 'script' => 'Cyrl', 'native' => 'Ирон', 'regional' => 'os_RU'], + // 'ky' => ['name' => 'Kyrgyz', 'script' => 'Cyrl', 'native' => 'Кыргыз', 'regional' => 'ky_KG'], + // 'sr' => ['name' => 'Serbian (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Српски', 'regional' => 'sr_RS'], + // 'av' => ['name' => 'Avaric', 'script' => 'Cyrl', 'native' => 'авар мацӀ', 'regional' => ''], + // 'ady' => ['name' => 'Adyghe', 'script' => 'Cyrl', 'native' => 'адыгэбзэ', 'regional' => ''], + // 'ba' => ['name' => 'Bashkir', 'script' => 'Cyrl', 'native' => 'башҡорт теле', 'regional' => ''], + // 'be' => ['name' => 'Belarusian', 'script' => 'Cyrl', 'native' => 'беларуская', 'regional' => 'be_BY'], + // 'bg' => ['name' => 'Bulgarian', 'script' => 'Cyrl', 'native' => 'български', 'regional' => 'bg_BG'], + // 'kv' => ['name' => 'Komi', 'script' => 'Cyrl', 'native' => 'коми кыв', 'regional' => ''], + // 'mk' => ['name' => 'Macedonian', 'script' => 'Cyrl', 'native' => 'македонски', 'regional' => 'mk_MK'], + // 'mn' => ['name' => 'Mongolian (Cyrillic)', 'script' => 'Cyrl', 'native' => 'монгол', 'regional' => 'mn_MN'], + // 'ce' => ['name' => 'Chechen', 'script' => 'Cyrl', 'native' => 'нохчийн мотт', 'regional' => 'ce_RU'], + // 'ru' => ['name' => 'Russian', 'script' => 'Cyrl', 'native' => 'русский', 'regional' => 'ru_RU'], + // 'sah' => ['name' => 'Yakut', 'script' => 'Cyrl', 'native' => 'саха тыла', 'regional' => ''], + // 'tt' => ['name' => 'Tatar', 'script' => 'Cyrl', 'native' => 'татар теле', 'regional' => 'tt_RU'], + // 'tg' => ['name' => 'Tajik (Cyrillic)', 'script' => 'Cyrl', 'native' => 'тоҷикӣ', 'regional' => 'tg_TJ'], + // 'tk' => ['name' => 'Turkmen', 'script' => 'Cyrl', 'native' => 'түркменче', 'regional' => 'tk_TM'], + // 'uk' => ['name' => 'Ukrainian', 'script' => 'Cyrl', 'native' => 'українська', 'regional' => 'uk_UA'], + // 'cv' => ['name' => 'Chuvash', 'script' => 'Cyrl', 'native' => 'чӑваш чӗлхи', 'regional' => 'cv_RU'], + // 'cu' => ['name' => 'Church Slavic', 'script' => 'Cyrl', 'native' => 'ѩзыкъ словѣньскъ', 'regional' => ''], + // 'kk' => ['name' => 'Kazakh', 'script' => 'Cyrl', 'native' => 'қазақ тілі', 'regional' => 'kk_KZ'], + // 'hy' => ['name' => 'Armenian', 'script' => 'Armn', 'native' => 'Հայերէն', 'regional' => 'hy_AM'], + // 'yi' => ['name' => 'Yiddish', 'script' => 'Hebr', 'native' => 'ייִדיש', 'regional' => 'yi_US'], + // 'he' => ['name' => 'Hebrew', 'script' => 'Hebr', 'native' => 'עברית', 'regional' => 'he_IL'], + // 'ug' => ['name' => 'Uyghur', 'script' => 'Arab', 'native' => 'ئۇيغۇرچە', 'regional' => 'ug_CN'], + // 'ur' => ['name' => 'Urdu', 'script' => 'Arab', 'native' => 'اردو', 'regional' => 'ur_PK'], + // 'ar' => ['name' => 'Arabic', 'script' => 'Arab', 'native' => 'العربية', 'regional' => 'ar_AE'], + // 'uz-Arab' => ['name' => 'Uzbek (Arabic)', 'script' => 'Arab', 'native' => 'اۉزبېک', 'regional' => ''], + // 'tg-Arab' => ['name' => 'Tajik (Arabic)', 'script' => 'Arab', 'native' => 'تاجیکی', 'regional' => 'tg_TJ'], + // 'sd' => ['name' => 'Sindhi', 'script' => 'Arab', 'native' => 'سنڌي', 'regional' => 'sd_IN'], + // 'fa' => ['name' => 'Persian', 'script' => 'Arab', 'native' => 'فارسی', 'regional' => 'fa_IR'], + // 'pa-Arab' => ['name' => 'Punjabi (Arabic)', 'script' => 'Arab', 'native' => 'پنجاب', 'regional' => 'pa_IN'], + // 'ps' => ['name' => 'Pashto', 'script' => 'Arab', 'native' => 'پښتو', 'regional' => 'ps_AF'], + // 'ks' => ['name' => 'Kashmiri (Arabic)', 'script' => 'Arab', 'native' => 'کأشُر', 'regional' => 'ks_IN'], + // 'ku' => ['name' => 'Kurdish', 'script' => 'Arab', 'native' => 'کوردی', 'regional' => 'ku_TR'], + // 'dv' => ['name' => 'Divehi', 'script' => 'Thaa', 'native' => 'ދިވެހިބަސް', 'regional' => 'dv_MV'], + // 'ks-Deva' => ['name' => 'Kashmiri (Devaganari)', 'script' => 'Deva', 'native' => 'कॉशुर', 'regional' => 'ks_IN'], + // 'kok' => ['name' => 'Konkani', 'script' => 'Deva', 'native' => 'कोंकणी', 'regional' => 'kok_IN'], + // 'doi' => ['name' => 'Dogri', 'script' => 'Deva', 'native' => 'डोगरी', 'regional' => 'doi_IN'], + // 'ne' => ['name' => 'Nepali', 'script' => 'Deva', 'native' => 'नेपाली', 'regional' => ''], + // 'pra' => ['name' => 'Prakrit', 'script' => 'Deva', 'native' => 'प्राकृत', 'regional' => ''], + // 'brx' => ['name' => 'Bodo', 'script' => 'Deva', 'native' => 'बड़ो', 'regional' => 'brx_IN'], + // 'bra' => ['name' => 'Braj', 'script' => 'Deva', 'native' => 'ब्रज भाषा', 'regional' => ''], + // 'mr' => ['name' => 'Marathi', 'script' => 'Deva', 'native' => 'मराठी', 'regional' => 'mr_IN'], + // 'mai' => ['name' => 'Maithili', 'script' => 'Tirh', 'native' => 'मैथिली', 'regional' => 'mai_IN'], + // 'raj' => ['name' => 'Rajasthani', 'script' => 'Deva', 'native' => 'राजस्थानी', 'regional' => ''], + // 'sa' => ['name' => 'Sanskrit', 'script' => 'Deva', 'native' => 'संस्कृतम्', 'regional' => 'sa_IN'], + // 'hi' => ['name' => 'Hindi', 'script' => 'Deva', 'native' => 'हिन्दी', 'regional' => 'hi_IN'], + // 'as' => ['name' => 'Assamese', 'script' => 'Beng', 'native' => 'অসমীয়া', 'regional' => 'as_IN'], + // 'bn' => ['name' => 'Bengali', 'script' => 'Beng', 'native' => 'বাংলা', 'regional' => 'bn_BD'], + // 'mni' => ['name' => 'Manipuri', 'script' => 'Beng', 'native' => 'মৈতৈ', 'regional' => 'mni_IN'], + // 'pa' => ['name' => 'Punjabi (Gurmukhi)', 'script' => 'Guru', 'native' => 'ਪੰਜਾਬੀ', 'regional' => 'pa_IN'], + // 'gu' => ['name' => 'Gujarati', 'script' => 'Gujr', 'native' => 'ગુજરાતી', 'regional' => 'gu_IN'], + // 'or' => ['name' => 'Oriya', 'script' => 'Orya', 'native' => 'ଓଡ଼ିଆ', 'regional' => 'or_IN'], + // 'ta' => ['name' => 'Tamil', 'script' => 'Taml', 'native' => 'தமிழ்', 'regional' => 'ta_IN'], + // 'te' => ['name' => 'Telugu', 'script' => 'Telu', 'native' => 'తెలుగు', 'regional' => 'te_IN'], + // 'kn' => ['name' => 'Kannada', 'script' => 'Knda', 'native' => 'ಕನ್ನಡ', 'regional' => 'kn_IN'], + // 'ml' => ['name' => 'Malayalam', 'script' => 'Mlym', 'native' => 'മലയാളം', 'regional' => 'ml_IN'], + // 'si' => ['name' => 'Sinhala', 'script' => 'Sinh', 'native' => 'සිංහල', 'regional' => 'si_LK'], + // 'th' => ['name' => 'Thai', 'script' => 'Thai', 'native' => 'ไทย', 'regional' => 'th_TH'], + // 'lo' => ['name' => 'Lao', 'script' => 'Laoo', 'native' => 'ລາວ', 'regional' => 'lo_LA'], + // 'bo' => ['name' => 'Tibetan', 'script' => 'Tibt', 'native' => 'པོད་སྐད་', 'regional' => 'bo_IN'], + // 'dz' => ['name' => 'Dzongkha', 'script' => 'Tibt', 'native' => 'རྫོང་ཁ', 'regional' => 'dz_BT'], + // 'my' => ['name' => 'Burmese', 'script' => 'Mymr', 'native' => 'မြန်မာဘာသာ', 'regional' => 'my_MM'], + // 'ka' => ['name' => 'Georgian', 'script' => 'Geor', 'native' => 'ქართული', 'regional' => 'ka_GE'], + // 'byn' => ['name' => 'Blin', 'script' => 'Ethi', 'native' => 'ብሊን', 'regional' => 'byn_ER'], + // 'tig' => ['name' => 'Tigre', 'script' => 'Ethi', 'native' => 'ትግረ', 'regional' => 'tig_ER'], + // 'ti' => ['name' => 'Tigrinya', 'script' => 'Ethi', 'native' => 'ትግርኛ', 'regional' => 'ti_ET'], + // 'am' => ['name' => 'Amharic', 'script' => 'Ethi', 'native' => 'አማርኛ', 'regional' => 'am_ET'], + // 'wal' => ['name' => 'Wolaytta', 'script' => 'Ethi', 'native' => 'ወላይታቱ', 'regional' => 'wal_ET'], + // 'chr' => ['name' => 'Cherokee', 'script' => 'Cher', 'native' => 'ᏣᎳᎩ', 'regional' => ''], + // 'iu' => ['name' => 'Inuktitut (Canadian Aboriginal Syllabics)', 'script' => 'Cans', 'native' => 'ᐃᓄᒃᑎᑐᑦ', 'regional' => 'iu_CA'], + // 'oj' => ['name' => 'Ojibwa', 'script' => 'Cans', 'native' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'regional' => ''], + // 'cr' => ['name' => 'Cree', 'script' => 'Cans', 'native' => 'ᓀᐦᐃᔭᐍᐏᐣ', 'regional' => ''], + // 'km' => ['name' => 'Khmer', 'script' => 'Khmr', 'native' => 'ភាសាខ្មែរ', 'regional' => 'km_KH'], + // 'mn-Mong' => ['name' => 'Mongolian (Mongolian)', 'script' => 'Mong', 'native' => 'ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ', 'regional' => 'mn_MN'], + // 'shi-Tfng' => ['name' => 'Tachelhit (Tifinagh)', 'script' => 'Tfng', 'native' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', 'regional' => ''], + // 'tzm' => ['name' => 'Central Atlas Tamazight (Tifinagh)', 'script' => 'Tfng', 'native' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', 'regional' => ''], + // 'yue' => ['name' => 'Yue', 'script' => 'Hant', 'native' => '廣州話', 'regional' => 'yue_HK'], + // 'ja' => ['name' => 'Japanese', 'script' => 'Jpan', 'native' => '日本語', 'regional' => 'ja_JP'], + // 'zh' => ['name' => 'Chinese (Simplified)', 'script' => 'Hans', 'native' => '简体中文', 'regional' => 'zh_CN'], + // 'zh-Hant' => ['name' => 'Chinese (Traditional)', 'script' => 'Hant', 'native' => '繁體中文', 'regional' => 'zh_CN'], + // 'ii' => ['name' => 'Sichuan Yi', 'script' => 'Yiii', 'native' => 'ꆈꌠꉙ', 'regional' => ''], + // 'vai' => ['name' => 'Vai (Vai)', 'script' => 'Vaii', 'native' => 'ꕙꔤ', 'regional' => ''], + // 'jv-Java' => ['name' => 'Javanese (Javanese)', 'script' => 'Java', 'native' => 'ꦧꦱꦗꦮ', 'regional' => ''], + // 'ko' => ['name' => 'Korean', 'script' => 'Hang', 'native' => '한국어', 'regional' => 'ko_KR'], ], // Requires middleware `LaravelSessionRedirect.php`. diff --git a/config/mail.php b/config/mail.php index 2b986e1..515f16f 100644 --- a/config/mail.php +++ b/config/mail.php @@ -109,4 +109,10 @@ ], 'queue_name' => env('MAIL_QUEUE_NAME', 'emails'), + + 'request_for_change' => [ + 'to' => 'spea@surf.nl', + ], + + 'notifications_enabled' => env('MAIL_NOTIFICATIONS_ENABLED', true), ]; diff --git a/config/tags.php b/config/tags.php new file mode 100644 index 0000000..e0aad4a --- /dev/null +++ b/config/tags.php @@ -0,0 +1,26 @@ + null, + + // The fully qualified class name of the tag model. + 'tag_model' => Tag::class, + + // The name of the table associated with the taggable morph relation. + 'taggable' => [ + 'table_name' => 'taggables', + 'morph_name' => 'taggable', + + // The fully qualified class name of the pivot model. + 'class_name' => MorphPivot::class, + ], +]; diff --git a/config/validation.php b/config/validation.php index ecb4c03..5e709d7 100644 --- a/config/validation.php +++ b/config/validation.php @@ -14,7 +14,9 @@ 'db_string' => [ 'length' => env('DB_STRING_LENGTH', 255), ], - + 'db_text' => [ + 'length' => env('DB_TEXT_LENGTH', 16777215), + ], 'tool' => [ 'image' => [ 'max' => 5000, @@ -25,8 +27,9 @@ 'message' => [ 'max' => 800, ], - 'rating' => [ - 'in' => [1, 2, 3, 4, 5], - ], + ], + + 'url' => [ + 'allowed_protocols' => ['https', 'http', 'mailto'], ], ]; diff --git a/database/factories/ContentPageFactory.php b/database/factories/ContentPageFactory.php new file mode 100644 index 0000000..3cb206c --- /dev/null +++ b/database/factories/ContentPageFactory.php @@ -0,0 +1,26 @@ + */ +class ContentPageFactory extends Factory +{ + public function definition(): array + { + return [ + 'title_en' => $this->faker->word(), + 'title_nl' => $this->faker->word(), + 'slug' => $this->faker->slug(), + 'body_en' => $this->faker->paragraph(), + 'body_nl' => $this->faker->paragraph(), + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ]; + } +} diff --git a/database/factories/CustomFieldFactory.php b/database/factories/CustomFieldFactory.php new file mode 100644 index 0000000..d68152f --- /dev/null +++ b/database/factories/CustomFieldFactory.php @@ -0,0 +1,28 @@ + $this->faker->unique()->word(), + 'title_nl' => $this->faker->unique()->word(), + 'tab_type' => $this->faker->randomElement(Tabs::toArray()), + + 'sortkey' => $this->faker->numberBetween(1, 100), + + 'institute_id' => fn () => Institute::factory()->create(), + ]; + } +} diff --git a/database/factories/CustomFieldValueFactory.php b/database/factories/CustomFieldValueFactory.php new file mode 100644 index 0000000..8ee4f93 --- /dev/null +++ b/database/factories/CustomFieldValueFactory.php @@ -0,0 +1,26 @@ + $this->faker->unique()->word(), + 'value_nl' => $this->faker->unique()->word(), + + 'institute_tool_id' => fn () => InstituteTool::factory()->create(), + 'custom_field_id' => fn () => CustomField::factory()->create(), + ]; + } +} diff --git a/database/factories/ExperienceFactory.php b/database/factories/ExperienceFactory.php index 1fe3921..e5d5f81 100644 --- a/database/factories/ExperienceFactory.php +++ b/database/factories/ExperienceFactory.php @@ -4,16 +4,13 @@ namespace Database\Factories; -use App\Models\Experience; use App\Models\Tool; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; +/** @extends Factory<\App\Models\Experience> */ class ExperienceFactory extends Factory { - /** @var string */ - protected $model = Experience::class; - public function definition(): array { $createdAt = $this->faker->dateTimeBetween('-3 months', '-2 hours'); @@ -23,8 +20,8 @@ public function definition(): array 'tool_id' => fn () => Tool::factory()->create(), 'user_id' => fn () => User::factory()->create(), - 'rating' => $this->faker->numberBetween(1, 5), - 'title' => $this->faker->optional(0.7)->sentence(), + 'title' => $this->faker->optional(0.7)->sentence(), + 'message' => $this->faker->optional(0.7)->text(), 'created_at' => $createdAt, diff --git a/database/factories/InstituteFactory.php b/database/factories/InstituteFactory.php index ed01bf5..15480da 100644 --- a/database/factories/InstituteFactory.php +++ b/database/factories/InstituteFactory.php @@ -4,33 +4,34 @@ namespace Database\Factories; +use App\Helpers\File; use App\Models\Institute; -use Closure; use Illuminate\Database\Eloquent\Factories\Factory; -use Illuminate\Support\Facades\Storage; +/** @extends Factory<\App\Models\Institute> */ class InstituteFactory extends Factory { - /** @var string */ - protected $model = Institute::class; - public function definition() { return [ - 'full_name' => $this->faker->company(), - 'short_name' => $this->faker->lexify('???'), - 'domain' => $this->faker->unique()->domainName(), + 'full_name_en' => $this->faker->company(), + 'full_name_nl' => $this->faker->company(), + 'short_name' => $this->faker->lexify('???'), + 'domain' => $this->faker->unique()->domainName(), 'logo_full_filename' => $this->selectRandomFile('seeding/institutes/full'), 'logo_square_filename' => $this->selectRandomFile('seeding/institutes/square'), 'banner_filename' => $this->selectRandomFile('seeding/institutes/banner'), + + 'homepage_title_en' => $this->faker->optional()->sentence(rand(2, 4)), + 'homepage_body_en' => $this->faker->optional()->text(), + 'homepage_title_nl' => $this->faker->optional()->sentence(rand(2, 4)), + 'homepage_body_nl' => $this->faker->optional()->text(), ]; } - private function selectRandomFile(string $path): Closure + private function selectRandomFile(string $path): string { - return fn (): string => basename( - Storage::putFile(Institute::$disk, $this->faker->file(resource_path($path))) - ); + return File::storeFromPath($this->faker->file(resource_path($path)), Institute::$disk); } } diff --git a/database/factories/InstituteToolFactory.php b/database/factories/InstituteToolFactory.php index 5f3d6f0..89dad51 100644 --- a/database/factories/InstituteToolFactory.php +++ b/database/factories/InstituteToolFactory.php @@ -4,81 +4,78 @@ namespace Database\Factories; +use App\Enums\InstituteTool\DataClassification; use App\Enums\InstituteTool\Status; use App\Models\Institute; -use App\Models\InstituteTool; use App\Models\Tool; +use DateTime; use Illuminate\Database\Eloquent\Factories\Factory; -use Illuminate\Support\Facades\Storage; +/** @extends Factory<\App\Models\InstituteTool> */ class InstituteToolFactory extends Factory { - /** @var string */ - protected $model = InstituteTool::class; - public function definition() { - $status = $this->faker->optional(80)->randomElement(Status::toArray()); + /** @var DateTime|null */ + $publishedAt = $this->faker->optional()->dateTimeThisYear(); + $status = $this + ->faker + ->optional($publishedAt ? 100 : 80) + ->randomElement([Status::ALLOWED, Status::ALLOWED_UNDER_CONDITIONS, Status::DISALLOWED]); $data = [ 'institute_id' => fn () => Institute::factory(), - 'tool_id' => fn () => Tool::factory(), - - 'description_1' => $this->faker->text(), - 'description_1_image_filename' => null, - - 'description_2' => $this->faker->text(), - 'description_2_image_filename' => null, - - 'extra_information_title' => $this->faker->words(2, true), - 'extra_information' => $this->faker->text(), - - 'support_title_1' => $this->faker->words(2, true), - 'support_email_1' => $this->faker->email(), - 'support_title_2' => $this->faker->words(2, true), - 'support_email_2' => $this->faker->email(), - - 'manual_title_1' => $this->faker->words(2, true), - 'manual_url_1' => $this->faker->url(), - 'manual_title_2' => $this->faker->words(2, true), - 'manual_url_2' => $this->faker->url(), - - 'video_title_1' => $this->faker->words(2, true), - 'video_url_1' => $this->faker->url(), - 'video_title_2' => $this->faker->words(2, true), - 'video_url_2' => $this->faker->url(), - - 'status' => $status, - - 'published_at' => $this->faker->optional()->dateTimeThisYear(), + 'tool_id' => fn () => Tool::factory(), + + 'status' => $status, + 'conditions_en' => $this->faker->text(), + 'conditions_nl' => $this->faker->text(), + + 'links_with_other_tools_en' => $this->faker->text(), + 'links_with_other_tools_nl' => $this->faker->text(), + 'sla_url' => $this->faker->url(), + + 'privacy_contact' => $this->faker->text(), + 'privacy_evaluation_url' => $this->faker->url(), + 'security_evaluation_url' => $this->faker->url(), + 'data_classification' => $this->faker->randomElement(DataClassification::toArray()), + + 'how_to_login_en' => $this->faker->text(), + 'how_to_login_nl' => $this->faker->text(), + 'availability_en' => $this->faker->text(), + 'availability_nl' => $this->faker->text(), + 'licensing_en' => $this->faker->text(), + 'licensing_nl' => $this->faker->text(), + 'request_access_en' => sprintf('%1$s', $this->faker->url()), + 'request_access_nl' => sprintf('%1$s', $this->faker->url()), + 'instructions_en' => $this->faker->text(), + 'instructions_nl' => $this->faker->text(), + 'instructions_manual_1_url' => $this->faker->url(), + 'instructions_manual_2_url' => $this->faker->url(), + 'instructions_manual_3_url' => $this->faker->url(), + + 'faq_en' => $this->faker->text(), + 'faq_nl' => $this->faker->text(), + 'examples_of_usage_en' => $this->faker->text(), + 'examples_of_usage_nl' => $this->faker->text(), + 'additional_info_heading_en' => $this->faker->text(), + 'additional_info_heading_nl' => $this->faker->text(), + 'additional_info_text_en' => $this->faker->text(), + 'additional_info_text_nl' => $this->faker->text(), + + 'published_at' => $publishedAt, ]; - if ($status === Status::PROHIBITED) { + if ($status === Status::DISALLOWED) { $data = array_merge($data, [ - 'why_unfit' => $this->faker->optional(75)->text(), - 'alternative_tool_id' => fn () => rand(0, 3) ? Tool::factory() : null, + 'why_unfit_en' => $this->faker->optional(75)->text(), + 'why_unfit_nl' => $this->faker->optional(75)->text(), ]); } return $data; } - public function withImages(): Factory - { - return $this->state(fn () => [ - 'description_1_image_filename' => function (): string { - $file = $this->faker->file(resource_path('seeding/tools/description')); - - return basename(Storage::putFile(Tool::$disk, $file)); - }, - 'description_2_image_filename' => function (): string { - $file = $this->faker->file(resource_path('seeding/tools/description')); - - return basename(Storage::putFile(Tool::$disk, $file)); - }, - ]); - } - public function status(string $status): Factory { return $this->state(fn () => [ diff --git a/database/factories/LanguageFactory.php b/database/factories/LanguageFactory.php new file mode 100644 index 0000000..019a079 --- /dev/null +++ b/database/factories/LanguageFactory.php @@ -0,0 +1,38 @@ + */ +class LanguageFactory extends Factory +{ + /** @var class-string */ + protected $model = Language::class; + + public function definition(): array + { + $createdAt = $this->faker->dateTimeBetween('-3 months', '-2 hours'); + $updatedAt = $this->faker->optional(0.5, $createdAt)->dateTimeBetween($createdAt, 'now'); + + return [ + 'locale' => $this->faker->languageCode, + 'activated_at' => $this->faker->optional()->dateTimeBetween('-3 months', 'now'), + + 'created_at' => $createdAt, + 'updated_at' => $updatedAt, + ]; + } + + public function activated(): Factory + { + return $this->state(function () { + return [ + 'activated_at' => $this->faker->dateTimeBetween('-3 months', 'now'), + ]; + }); + } +} diff --git a/database/factories/PendingToolEditFactory.php b/database/factories/PendingToolEditFactory.php new file mode 100644 index 0000000..8f779d2 --- /dev/null +++ b/database/factories/PendingToolEditFactory.php @@ -0,0 +1,29 @@ + */ +class PendingToolEditFactory extends Factory +{ + public function definition(): array + { + $createdAt = $this->faker->dateTimeBetween('-30 minutes', 'now'); + $updatedAt = $createdAt; + + return [ + 'tool_id' => fn () => Tool::factory()->create(), + 'user_id' => fn () => User::factory()->create(), + 'institute_id' => $this->faker->boolean() ? fn () => Institute::factory()->create() : null, + + 'created_at' => $createdAt, + 'updated_at' => $updatedAt, + ]; + } +} diff --git a/database/factories/TagFactory.php b/database/factories/TagFactory.php new file mode 100644 index 0000000..dcfdad0 --- /dev/null +++ b/database/factories/TagFactory.php @@ -0,0 +1,33 @@ + */ +class TagFactory extends Factory +{ + protected $model = Tag::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->unique()->words(rand(1, 3), true), + 'type' => $this->faker->randomElement(TagTypes::forTool()), + 'order_column' => $this->faker->randomNumber(), + ]; + } + + public function withInstitute(?Institute $institute = null): Factory + { + return $this->state(fn () => [ + 'institute_id' => $institute ?? Institute::factory()->create(), + 'type' => $this->faker->randomElement(TagTypes::forInstituteTool()), + ]); + } +} diff --git a/database/factories/ToolFactory.php b/database/factories/ToolFactory.php index bd5d936..f2c4e31 100644 --- a/database/factories/ToolFactory.php +++ b/database/factories/ToolFactory.php @@ -4,22 +4,16 @@ namespace Database\Factories; -use App\Enums\Tool\AuthenticationMethod; -use App\Enums\Tool\StoredData; -use App\Enums\Tool\SupportedStandard; +use App\Helpers\Country; +use App\Helpers\File; use App\Models\Tool; use Illuminate\Database\Eloquent\Factories\Factory; -use Illuminate\Support\Facades\Storage; +/** @extends Factory<\App\Models\Tool> */ class ToolFactory extends Factory { - /** @var string */ - protected $model = Tool::class; - public function definition(): array { - $storedData = $this->faker->randomElements(StoredData::toArray(), rand(1, 2)); - $otherStoredData = null; $createdAt = $this->faker->dateTimeBetween('-3 months', '-2 hours'); $updatedAt = $createdAt; $publishedAt = null; @@ -32,34 +26,47 @@ public function definition(): array $publishedAt = $this->faker->dateTimeBetween($createdAt, 'now'); } - if (in_array(StoredData::OTHER, $storedData)) { - $otherStoredData = $this->faker->text(40); - } - return [ - 'name' => $this->faker->unique()->sentence(rand(2, 4)), - 'description_short' => $this->faker->text(), - 'image_filename' => null, - - 'description_long_1' => $this->faker->optional()->text(), - 'description_1_image_filename' => null, - - 'description_long_2' => $this->faker->optional()->text(), - 'description_2_image_filename' => null, - - 'info_url' => $this->faker->optional()->url(), - - 'supported_standards' => $this->faker->randomElements(SupportedStandard::toArray(), rand(1, 3)), - 'additional_standards' => $this->faker->text(40), - - 'authentication_methods' => $this->faker->randomElements(AuthenticationMethod::toArray(), rand(1, 2)), - - 'stored_data' => $storedData, - 'other_stored_data' => $otherStoredData, - - 'european_data_storage' => $this->faker->boolean(), - 'surf_standards_framework_agreed' => $this->faker->boolean(), - 'has_processing_agreement' => $this->faker->boolean(), + 'name' => $this->faker->unique()->sentence(rand(2, 4)), + 'supplier' => $this->faker->text(), + 'supplier_url' => $this->faker->url(), + 'description_short_en' => $this->faker->text(), + 'description_short_nl' => $this->faker->text(), + 'addons_en' => $this->faker->text(), + 'addons_nl' => $this->faker->text(), + 'system_requirements_en' => $this->faker->text(), + 'system_requirements_nl' => $this->faker->text(), + 'supplier_country' => $this->faker->optional()->randomElement(Country::getCodes()), + 'personal_data_en' => $this->faker->text(), + 'personal_data_nl' => $this->faker->text(), + 'privacy_policy_url' => $this->faker->url(), + 'model_processor_agreement_url' => $this->faker->url(), + 'privacy_analysis' => $this->faker->text(), + 'supplier_agrees_with_surf_standards' => $this->faker->boolean(), + 'dtia_by_external_url' => $this->faker->url(), + 'dpia_by_external_url' => $this->faker->url(), + 'jurisdiction' => $this->faker->text(), + 'instructions_manual_1_url_en' => $this->faker->url(), + 'instructions_manual_1_url_nl' => $this->faker->url(), + 'instructions_manual_2_url_en' => $this->faker->url(), + 'instructions_manual_2_url_nl' => $this->faker->url(), + 'instructions_manual_3_url_en' => $this->faker->url(), + 'instructions_manual_3_url_nl' => $this->faker->url(), + 'support_for_teachers_en' => $this->faker->text(), + 'support_for_teachers_nl' => $this->faker->text(), + 'availability_surf' => $this->faker->text(), + 'accessibility_facilities_en' => $this->faker->text(), + 'accessibility_facilities_nl' => $this->faker->text(), + 'description_long_en' => $this->faker->text(), + 'description_long_nl' => $this->faker->text(), + 'use_for_education_en' => $this->faker->text(), + 'use_for_education_nl' => $this->faker->text(), + 'how_does_it_work_en' => $this->faker->text(), + 'how_does_it_work_nl' => $this->faker->text(), + + 'logo_filename' => null, + 'image_1_filename' => null, + 'image_2_filename' => null, 'published_at' => $publishedAt, @@ -78,20 +85,14 @@ public function published(bool $isPublished = true): Factory public function withImages(): Factory { return $this->state(fn () => [ - 'image_filename' => function (): string { - $file = $this->faker->file(resource_path('seeding/tools/main')); - - return basename(Storage::putFile(Tool::$disk, $file)); + 'logo_filename' => function (): string { + return File::storeFromPath($this->faker->file(resource_path('seeding/tools/main')), Tool::$disk); }, - 'description_1_image_filename' => function (): string { - $file = $this->faker->file(resource_path('seeding/tools/description')); - - return basename(Storage::putFile(Tool::$disk, $file)); + 'image_1_filename' => function (): string { + return File::storeFromPath($this->faker->file(resource_path('seeding/tools/description')), Tool::$disk); }, - 'description_2_image_filename' => function (): string { - $file = $this->faker->file(resource_path('seeding/tools/description')); - - return basename(Storage::putFile(Tool::$disk, $file)); + 'image_2_filename' => function (): string { + return File::storeFromPath($this->faker->file(resource_path('seeding/tools/description')), Tool::$disk); }, ]); } diff --git a/database/factories/ToolLogFactory.php b/database/factories/ToolLogFactory.php new file mode 100644 index 0000000..22ab5a3 --- /dev/null +++ b/database/factories/ToolLogFactory.php @@ -0,0 +1,43 @@ + */ +class ToolLogFactory extends Factory +{ + public function definition(): array + { + $createdAt = $this->faker->dateTimeBetween('-2 months', 'now'); + $updatedAt = $createdAt; + + return [ + 'tool_id' => fn () => Tool::factory()->create(), + 'user_id' => fn () => User::factory()->create(), + 'institute_id' => $this->faker->boolean() ? fn () => Institute::factory()->create() : null, + + 'created_at' => $createdAt, + 'updated_at' => $updatedAt, + ]; + } + + public function withInstitute(): self + { + return $this->state([ + 'institute_id' => fn () => Institute::factory()->create(), + ]); + } + + public function withoutInstitute(): self + { + return $this->state([ + 'institute_id' => null, + ]); + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index ea05824..2a55402 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -6,14 +6,11 @@ use App\Enums\Auth\Role; use App\Models\Institute; -use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; +/** @extends Factory<\App\Models\User> */ class UserFactory extends Factory { - /** @var string */ - protected $model = User::class; - public function definition(): array { $createdAt = $this->faker->dateTimeBetween('-3 months', '-2 hours'); @@ -24,11 +21,12 @@ public function definition(): array } return [ - 'name' => $this->faker->name(), - - 'external_id' => null, 'institute_id' => fn () => Institute::factory(), + 'external_id' => null, + 'email' => $this->faker->email(), + 'name' => $this->faker->name(), 'roles' => $this->faker->randomElements(Role::toArray(), rand(1, 3)), + 'language' => $this->faker->randomElement(['en', 'nl']), 'created_at' => $createdAt, 'updated_at' => $updatedAt, diff --git a/database/migrations/2023_08_29_100117_add_event_column_to_activity_log_table.php b/database/migrations/2023_08_29_100117_add_event_column_to_activity_log_table.php new file mode 100644 index 0000000..6f0490a --- /dev/null +++ b/database/migrations/2023_08_29_100117_add_event_column_to_activity_log_table.php @@ -0,0 +1,26 @@ +table(config('activitylog.table_name'), function (Blueprint $table): void { + $table->string('event')->nullable()->after('subject_type'); + }); + } + + public function down(): void + { + Schema::connection(config('activitylog.database_connection')) + ->table(config('activitylog.table_name'), function (Blueprint $table): void { + $table->dropColumn('event'); + }); + } +} diff --git a/database/migrations/2023_08_29_100118_add_batch_uuid_column_to_activity_log_table.php b/database/migrations/2023_08_29_100118_add_batch_uuid_column_to_activity_log_table.php new file mode 100644 index 0000000..5e0ed77 --- /dev/null +++ b/database/migrations/2023_08_29_100118_add_batch_uuid_column_to_activity_log_table.php @@ -0,0 +1,26 @@ +table(config('activitylog.table_name'), function (Blueprint $table): void { + $table->uuid('batch_uuid')->nullable()->after('properties'); + }); + } + + public function down(): void + { + Schema::connection(config('activitylog.database_connection')) + ->table(config('activitylog.table_name'), function (Blueprint $table): void { + $table->dropColumn('batch_uuid'); + }); + } +} diff --git a/database/migrations/2023_09_18_104859_make_tools_fields_bilingual.php b/database/migrations/2023_09_18_104859_make_tools_fields_bilingual.php new file mode 100644 index 0000000..84dd842 --- /dev/null +++ b/database/migrations/2023_09_18_104859_make_tools_fields_bilingual.php @@ -0,0 +1,33 @@ +dropUnique(['name']); + }); + + Schema::table('tools', function (Blueprint $table): void { + $table->renameColumn('name', 'name_en'); + $table->unique('name_en'); + + $table->renameColumn('description_short', 'description_short_en'); + $table->renameColumn('description_long_1', 'description_long_1_en'); + $table->renameColumn('description_long_2', 'description_long_2_en'); + }); + + Schema::table('tools', function (Blueprint $table): void { + $table->string('name_nl')->after('name_en')->nullable()->unique(); + + $table->text('description_short_nl')->after('description_short_en')->nullable(); + $table->mediumText('description_long_1_nl')->after('description_long_1_en')->nullable()->default(null); + $table->mediumText('description_long_2_nl')->after('description_long_2_en')->nullable()->default(null); + }); + } +}; diff --git a/database/migrations/2023_09_18_111639_make_institute_tool_bilingual.php b/database/migrations/2023_09_18_111639_make_institute_tool_bilingual.php new file mode 100644 index 0000000..3f1d968 --- /dev/null +++ b/database/migrations/2023_09_18_111639_make_institute_tool_bilingual.php @@ -0,0 +1,40 @@ +renameColumn('description_1', 'description_1_en'); + $table->renameColumn('description_2', 'description_2_en'); + $table->renameColumn('extra_information', 'extra_information_en'); + $table->renameColumn('extra_information_title', 'extra_information_title_en'); + $table->renameColumn('support_title_1', 'support_title_1_en'); + $table->renameColumn('support_title_2', 'support_title_2_en'); + $table->renameColumn('manual_title_1', 'manual_title_1_en'); + $table->renameColumn('manual_title_2', 'manual_title_2_en'); + $table->renameColumn('video_title_1', 'video_title_1_en'); + $table->renameColumn('video_title_2', 'video_title_2_en'); + $table->renameColumn('why_unfit', 'why_unfit_en'); + }); + + Schema::table('institute_tool', function (Blueprint $table): void { + $table->mediumText('description_1_nl')->after('description_1_en')->nullable(); + $table->mediumText('description_2_nl')->after('description_2_en')->nullable(); + $table->mediumText('extra_information_nl')->after('extra_information_en')->nullable(); + $table->string('extra_information_title_nl')->after('extra_information_title_en')->nullable(); + $table->string('support_title_1_nl')->after('support_title_1_en')->nullable(); + $table->string('support_title_2_nl')->after('support_title_2_en')->nullable(); + $table->string('manual_title_1_nl')->after('manual_title_1_en')->nullable(); + $table->string('manual_title_2_nl')->after('manual_title_2_en')->nullable(); + $table->string('video_title_1_nl')->after('video_title_1_en')->nullable(); + $table->string('video_title_2_nl')->after('video_title_2_en')->nullable(); + $table->text('why_unfit_nl')->after('why_unfit_en')->nullable(); + }); + } +}; diff --git a/database/migrations/2023_09_18_134852_create_pending_tool_edits_table.php b/database/migrations/2023_09_18_134852_create_pending_tool_edits_table.php new file mode 100644 index 0000000..2ce00da --- /dev/null +++ b/database/migrations/2023_09_18_134852_create_pending_tool_edits_table.php @@ -0,0 +1,39 @@ +id(); + + $table->unsignedBigInteger('tool_id'); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('institute_id')->nullable(); + + $table->foreign('tool_id') + ->references('id')->on('tools') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->foreign('institute_id') + ->references('id')->on('institutes') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->timestamps(); + + $table->unique(['tool_id', 'user_id', 'institute_id']); + }); + } +}; diff --git a/database/migrations/2023_09_19_155728_create_concept_tools_table.php b/database/migrations/2023_09_19_155728_create_concept_tools_table.php new file mode 100644 index 0000000..264499e --- /dev/null +++ b/database/migrations/2023_09_19_155728_create_concept_tools_table.php @@ -0,0 +1,52 @@ +id(); + $table->unsignedBigInteger('tool_id'); + + $table->string('name_en')->unique(); + $table->string('name_nl')->nullable()->unique(); + $table->text('description_short_en'); + $table->text('description_short_nl')->nullable(); + $table->string('image_filename')->nullable()->default(null); + + $table->mediumText('description_long_1_en')->nullable()->default(null); + $table->mediumText('description_long_1_nl')->nullable()->default(null); + $table->string('description_1_image_filename')->nullable()->default(null); + + $table->mediumText('description_long_2_en')->nullable()->default(null); + $table->mediumText('description_long_2_nl')->nullable()->default(null); + $table->string('description_2_image_filename')->nullable()->default(null); + + $table->string('info_url')->nullable()->default(null); + + $table->json('supported_standards')->nullable()->default(null); + $table->string('additional_standards')->nullable()->default(null); + + $table->json('authentication_methods')->nullable()->default(null); + + $table->json('stored_data')->nullable()->default(null); + $table->string('other_stored_data')->nullable()->default(null); + + $table->boolean('european_data_storage')->default(false); + $table->boolean('surf_standards_framework_agreed')->default(false); + $table->boolean('has_processing_agreement')->default(false); + + $table->timestamps(); + + $table->foreign('tool_id') + ->references('id')->on('tools') + ->restrictOnUpdate() + ->cascadeOnDelete(); + }); + } +}; diff --git a/database/migrations/2023_09_21_135831_add_language_to_users.php b/database/migrations/2023_09_21_135831_add_language_to_users.php new file mode 100644 index 0000000..cacf3a2 --- /dev/null +++ b/database/migrations/2023_09_21_135831_add_language_to_users.php @@ -0,0 +1,16 @@ +string('language')->after('roles')->default('en'); + }); + } +}; diff --git a/database/migrations/2023_09_21_142700_create_concept_institute_tools_table.php b/database/migrations/2023_09_21_142700_create_concept_institute_tools_table.php new file mode 100644 index 0000000..8e3029e --- /dev/null +++ b/database/migrations/2023_09_21_142700_create_concept_institute_tools_table.php @@ -0,0 +1,74 @@ +id(); + + $table->unsignedBigInteger('institute_tool_id'); + + $table->unsignedBigInteger('alternative_tool_id')->nullable(); + + $table->mediumText('description_1_en')->nullable(); + $table->mediumText('description_1_nl')->nullable(); + $table->string('description_1_image_filename')->nullable()->default(null); + + $table->mediumText('description_2_en')->nullable(); + $table->mediumText('description_2_nl')->nullable(); + $table->string('description_2_image_filename')->nullable()->default(null); + + $table->mediumText('extra_information_en')->nullable(); + $table->mediumText('extra_information_nl')->nullable(); + $table->string('extra_information_title_en')->nullable(); + $table->string('extra_information_title_nl')->nullable(); + + $table->string('support_email_1')->nullable(); + $table->string('support_title_1_en')->nullable(); + $table->string('support_title_1_nl')->nullable(); + + $table->string('support_email_2')->nullable(); + $table->string('support_title_2_en')->nullable(); + $table->string('support_title_2_nl')->nullable(); + + $table->string('manual_url_1')->nullable(); + $table->string('manual_title_1_en')->nullable(); + $table->string('manual_title_1_nl')->nullable(); + + $table->string('manual_url_2')->nullable(); + $table->string('manual_title_2_en')->nullable(); + $table->string('manual_title_2_nl')->nullable(); + + $table->string('video_url_1')->nullable(); + $table->string('video_title_1_en')->nullable(); + $table->string('video_title_1_nl')->nullable(); + + $table->string('video_url_2')->nullable(); + $table->string('video_title_2_en')->nullable(); + $table->string('video_title_2_nl')->nullable(); + + $table->string('status', 25)->nullable(); + + $table->text('why_unfit_en')->nullable(); + $table->text('why_unfit_nl')->nullable(); + + $table->timestamps(); + + $table->foreign('institute_tool_id') + ->references('id')->on('institute_tool') + ->restrictOnUpdate() + ->cascadeOnDelete(); + + $table->foreign('alternative_tool_id') + ->references('id')->on('tools') + ->restrictOnUpdate() + ->nullOnDelete(); + }); + } +}; diff --git a/database/migrations/2023_09_21_210137_create_concept_tool_categories_table.php b/database/migrations/2023_09_21_210137_create_concept_tool_categories_table.php new file mode 100644 index 0000000..10a3dba --- /dev/null +++ b/database/migrations/2023_09_21_210137_create_concept_tool_categories_table.php @@ -0,0 +1,31 @@ +id(); + + $table->unsignedBigInteger('category_id'); + $table->unsignedBigInteger('concept_institute_tool_id'); + + $table->foreign('category_id') + ->references('id')->on('categories') + ->restrictOnUpdate() + ->cascadeOnDelete(); + + $table->foreign('concept_institute_tool_id') + ->references('id')->on('concept_institute_tools') + ->restrictOnUpdate() + ->cascadeOnDelete(); + + $table->timestamps(); + }); + } +}; diff --git a/database/migrations/2023_09_21_210655_create_concept_tool_features_table.php b/database/migrations/2023_09_21_210655_create_concept_tool_features_table.php new file mode 100644 index 0000000..6d60137 --- /dev/null +++ b/database/migrations/2023_09_21_210655_create_concept_tool_features_table.php @@ -0,0 +1,31 @@ +id(); + + $table->unsignedBigInteger('feature_id'); + $table->unsignedBigInteger('concept_tool_id'); + + $table->foreign('feature_id') + ->references('id')->on('features') + ->restrictOnUpdate() + ->cascadeOnDelete(); + + $table->foreign('concept_tool_id') + ->references('id')->on('concept_tools') + ->restrictOnUpdate() + ->cascadeOnDelete(); + + $table->timestamps(); + }); + } +}; diff --git a/database/migrations/2023_09_25_104637_create_tool_logs_table.php b/database/migrations/2023_09_25_104637_create_tool_logs_table.php new file mode 100644 index 0000000..1eeb22b --- /dev/null +++ b/database/migrations/2023_09_25_104637_create_tool_logs_table.php @@ -0,0 +1,37 @@ +id(); + + $table->unsignedBigInteger('tool_id'); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('institute_id')->nullable(); + + $table->foreign('tool_id') + ->references('id')->on('tools') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->foreign('institute_id') + ->references('id')->on('institutes') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->timestamps(); + }); + } +}; diff --git a/database/migrations/2023_09_25_130911_make_categories_bilingual.php b/database/migrations/2023_09_25_130911_make_categories_bilingual.php new file mode 100644 index 0000000..fbdf537 --- /dev/null +++ b/database/migrations/2023_09_25_130911_make_categories_bilingual.php @@ -0,0 +1,22 @@ +renameColumn('name', 'name_en'); + $table->renameColumn('description', 'description_en'); + }); + + Schema::table('categories', function (Blueprint $table): void { + $table->mediumText('name_nl')->after('name_en')->nullable(); + $table->mediumText('description_nl')->after('description_en')->nullable(); + }); + } +}; diff --git a/database/migrations/2023_10_03_095207_add_email_to_users_table.php b/database/migrations/2023_10_03_095207_add_email_to_users_table.php new file mode 100644 index 0000000..5f8d83a --- /dev/null +++ b/database/migrations/2023_10_03_095207_add_email_to_users_table.php @@ -0,0 +1,16 @@ +string('email')->nullable()->after('external_id'); + }); + } +}; diff --git a/database/migrations/2023_10_12_140026_create_custom_fields_table.php b/database/migrations/2023_10_12_140026_create_custom_fields_table.php new file mode 100644 index 0000000..fd88ed9 --- /dev/null +++ b/database/migrations/2023_10_12_140026_create_custom_fields_table.php @@ -0,0 +1,30 @@ +id(); + + $table->unsignedBigInteger('institute_id'); + + $table->string('title_en'); + $table->string('title_nl')->nullable(); + + $table->unsignedInteger('sortkey'); + + $table->timestamps(); + + $table->foreign('institute_id') + ->references('id')->on('institutes') + ->restrictOnDelete() + ->cascadeOnDelete(); + }); + } +}; diff --git a/database/migrations/2023_10_12_140401_create_custom_field_values_table.php b/database/migrations/2023_10_12_140401_create_custom_field_values_table.php new file mode 100644 index 0000000..dabf8c6 --- /dev/null +++ b/database/migrations/2023_10_12_140401_create_custom_field_values_table.php @@ -0,0 +1,36 @@ +id(); + + $table->unsignedBigInteger('institute_tool_id'); + $table->unsignedBigInteger('custom_field_id'); + + $table->text('value_en')->nullable(); + $table->text('value_nl')->nullable(); + + $table->timestamps(); + + $table->unique(['institute_tool_id', 'custom_field_id']); + + $table->foreign('institute_tool_id') + ->references('id')->on('institute_tool') + ->restrictOnDelete() + ->cascadeOnDelete(); + + $table->foreign('custom_field_id') + ->references('id')->on('custom_fields') + ->restrictOnDelete() + ->cascadeOnDelete(); + }); + } +}; diff --git a/database/migrations/2023_10_12_140635_create_concept_custom_field_values.php b/database/migrations/2023_10_12_140635_create_concept_custom_field_values.php new file mode 100644 index 0000000..6be0d93 --- /dev/null +++ b/database/migrations/2023_10_12_140635_create_concept_custom_field_values.php @@ -0,0 +1,36 @@ +id(); + + $table->unsignedBigInteger('concept_institute_tool_id'); + $table->unsignedBigInteger('custom_field_id'); + + $table->mediumText('value_en')->nullable(); + $table->mediumText('value_nl')->nullable(); + + $table->timestamps(); + + $table->unique(['concept_institute_tool_id', 'custom_field_id'], 'institute_tool_custom_field_unique'); + + $table->foreign('concept_institute_tool_id') + ->references('id')->on('concept_institute_tools') + ->restrictOnDelete() + ->cascadeOnDelete(); + + $table->foreign('custom_field_id') + ->references('id')->on('custom_fields') + ->restrictOnDelete() + ->cascadeOnDelete(); + }); + } +}; diff --git a/database/migrations/2023_10_23_112730_create_tag_tables.php b/database/migrations/2023_10_23_112730_create_tag_tables.php new file mode 100644 index 0000000..744e8d1 --- /dev/null +++ b/database/migrations/2023_10_23_112730_create_tag_tables.php @@ -0,0 +1,32 @@ +id(); + + $table->json('name'); + $table->json('slug'); + $table->string('type')->nullable(); + $table->foreignId('institute_id')->nullable()->constrained()->cascadeOnDelete(); + $table->integer('order_column')->nullable(); + + $table->timestamps(); + }); + + Schema::create('taggables', function (Blueprint $table): void { + $table->foreignId('tag_id')->constrained()->cascadeOnDelete(); + + $table->morphs('taggable'); + + $table->unique(['tag_id', 'taggable_id', 'taggable_type']); + }); + } +}; diff --git a/database/migrations/2023_10_23_133135_change_tools_by_information_model.php b/database/migrations/2023_10_23_133135_change_tools_by_information_model.php new file mode 100644 index 0000000..b32109f --- /dev/null +++ b/database/migrations/2023_10_23_133135_change_tools_by_information_model.php @@ -0,0 +1,71 @@ +renameColumn('name_en', 'name'); + $table->renameIndex('tools_name_en_unique', 'tools_name_unique'); + $table->dropColumn('name_nl'); + + $table->after('name_en', function (Blueprint $table): void { + $table->string('supplier')->nullable(); + $table->string('supplier_url')->nullable(); + $table->text('addons_en')->nullable(); + $table->text('addons_nl')->nullable(); + $table->string('system_requirements_en')->nullable(); + $table->string('system_requirements_nl')->nullable(); + $table->string('supplier_country')->nullable(); + $table->text('personal_data')->nullable(); + $table->string('privacy_policy_url')->nullable(); + $table->string('model_processor_agreement_url')->nullable(); + $table->text('privacy_analysis')->nullable(); + $table->boolean('supplier_agrees_with_surf_standards')->nullable(); + $table->string('dtia_by_external_url')->nullable(); + $table->string('dpia_by_external_url')->nullable(); + $table->string('jurisdiction')->nullable(); + $table->string('instructions_manual_1_url_en')->nullable(); + $table->string('instructions_manual_1_url_nl')->nullable(); + $table->string('instructions_manual_2_url_en')->nullable(); + $table->string('instructions_manual_2_url_nl')->nullable(); + $table->string('instructions_manual_3_url_en')->nullable(); + $table->string('instructions_manual_3_url_nl')->nullable(); + $table->text('support_for_teachers_en')->nullable(); + $table->text('support_for_teachers_nl')->nullable(); + $table->text('availability_surf')->nullable(); + $table->text('accessibility_facilities_en')->nullable(); + $table->text('accessibility_facilities_nl')->nullable(); + $table->text('use_for_education_en')->nullable(); + $table->text('use_for_education_nl')->nullable(); + $table->string('how_does_it_work_en')->nullable(); + $table->string('how_does_it_work_nl')->nullable(); + }); + + $table->renameColumn('description_long_1_en', 'description_long_en'); + $table->renameColumn('description_long_1_nl', 'description_long_nl'); + $table->dropColumn(['description_long_2_en', 'description_long_2_nl']); + + $table->renameColumn('image_filename', 'logo_filename'); + $table->renameColumn('description_1_image_filename', 'image_1_filename'); + $table->renameColumn('description_2_image_filename', 'image_2_filename'); + + $table->dropColumn([ + 'info_url', + 'supported_standards', + 'additional_standards', + 'authentication_methods', + 'stored_data', + 'other_stored_data', + 'european_data_storage', + 'surf_standards_framework_agreed', + 'has_processing_agreement', + ]); + }); + } +}; diff --git a/database/migrations/2023_10_25_131029_change_concept_tools_by_information_model.php b/database/migrations/2023_10_25_131029_change_concept_tools_by_information_model.php new file mode 100644 index 0000000..bccc58e --- /dev/null +++ b/database/migrations/2023_10_25_131029_change_concept_tools_by_information_model.php @@ -0,0 +1,70 @@ +renameColumn('name_en', 'name'); + $table->renameIndex('concept_tools_name_en_unique', 'concept_tools_name_unique'); + $table->dropColumn('name_nl'); + + $table->after('name_en', function (Blueprint $table): void { + $table->string('supplier')->nullable(); + $table->string('supplier_url')->nullable(); + $table->text('addons_en')->nullable(); + $table->text('addons_nl')->nullable(); + $table->string('system_requirements_en')->nullable(); + $table->string('system_requirements_nl')->nullable(); + $table->string('supplier_country')->nullable(); + $table->text('personal_data')->nullable(); + $table->string('privacy_policy_url')->nullable(); + $table->string('model_processor_agreement_url')->nullable(); + $table->text('privacy_analysis')->nullable(); + $table->boolean('supplier_agrees_with_surf_standards')->nullable(); + $table->string('dtia_by_external_url')->nullable(); + $table->string('dpia_by_external_url')->nullable(); + $table->string('jurisdiction')->nullable(); + $table->string('instructions_manual_1_url_en')->nullable(); + $table->string('instructions_manual_1_url_nl')->nullable(); + $table->string('instructions_manual_2_url_en')->nullable(); + $table->string('instructions_manual_2_url_nl')->nullable(); + $table->string('instructions_manual_3_url_en')->nullable(); + $table->string('instructions_manual_3_url_nl')->nullable(); + $table->text('support_for_teachers_en')->nullable(); + $table->text('support_for_teachers_nl')->nullable(); + $table->text('availability_surf')->nullable(); + $table->text('accessibility_facilities_en')->nullable(); + $table->text('accessibility_facilities_nl')->nullable(); + $table->text('use_for_education_en')->nullable(); + $table->text('use_for_education_nl')->nullable(); + $table->string('how_does_it_work_en')->nullable(); + $table->string('how_does_it_work_nl')->nullable(); + }); + + $table->renameColumn('description_long_1_en', 'description_long_en'); + $table->renameColumn('description_long_1_nl', 'description_long_nl'); + $table->dropColumn(['description_long_2_en', 'description_long_2_nl']); + + $table->renameColumn('image_filename', 'logo_filename'); + $table->renameColumn('description_1_image_filename', 'image_1_filename'); + $table->renameColumn('description_2_image_filename', 'image_2_filename'); + + $table->dropColumn([ + 'info_url', + 'supported_standards', + 'additional_standards', + 'authentication_methods', + 'stored_data', + 'other_stored_data', + 'european_data_storage', + 'surf_standards_framework_agreed', + 'has_processing_agreement', + ]); + }); + } +}; diff --git a/database/migrations/2023_10_25_131108_change_institute_tool_by_information_model.php b/database/migrations/2023_10_25_131108_change_institute_tool_by_information_model.php new file mode 100644 index 0000000..a609e78 --- /dev/null +++ b/database/migrations/2023_10_25_131108_change_institute_tool_by_information_model.php @@ -0,0 +1,76 @@ +after('tool_id', function (Blueprint $table): void { + $table->string('conditions_en')->nullable(); + $table->string('conditions_nl')->nullable(); + $table->text('links_with_other_tools_en')->nullable(); + $table->text('links_with_other_tools_nl')->nullable(); + $table->text('sla_url')->nullable(); + $table->string('privacy_contact')->nullable(); + $table->string('privacy_evaluation_url')->nullable(); + $table->string('security_evaluation_url')->nullable(); + $table->string('data_classification')->nullable(); + $table->string('how_to_login_en')->nullable(); + $table->string('how_to_login_nl')->nullable(); + $table->string('availability_en')->nullable(); + $table->string('availability_nl')->nullable(); + $table->string('licensing_en')->nullable(); + $table->string('licensing_nl')->nullable(); + $table->string('request_access_url')->nullable(); + $table->text('instructions_en')->nullable(); + $table->text('instructions_nl')->nullable(); + $table->string('instructions_manual_1_url')->nullable(); + $table->string('instructions_manual_2_url')->nullable(); + $table->string('instructions_manual_3_url')->nullable(); + $table->text('faq_en')->nullable(); + $table->text('faq_nl')->nullable(); + $table->text('examples_of_usage_en')->nullable(); + $table->text('examples_of_usage_nl')->nullable(); + $table->string('additional_info_heading_en')->nullable(); + $table->string('additional_info_heading_nl')->nullable(); + $table->text('additional_info_text_en')->nullable(); + $table->text('additional_info_text_nl')->nullable(); + }); + + $table->dropColumn([ + 'description_1_image_filename', + 'description_2_image_filename', + 'description_1_en', + 'description_1_nl', + 'description_2_en', + 'description_2_nl', + 'extra_information_title_en', + 'extra_information_title_nl', + 'extra_information_en', + 'extra_information_nl', + 'support_title_1_en', + 'support_title_1_nl', + 'support_email_1', + 'support_title_2_en', + 'support_title_2_nl', + 'support_email_2', + 'manual_title_1_en', + 'manual_title_1_nl', + 'manual_url_1', + 'manual_title_2_en', + 'manual_title_2_nl', + 'manual_url_2', + 'video_title_1_en', + 'video_title_1_nl', + 'video_url_1', + 'video_title_2_en', + 'video_title_2_nl', + 'video_url_2', + ]); + }); + } +}; diff --git a/database/migrations/2023_10_27_084119_change_concept_institute_tools_by_information_model.php b/database/migrations/2023_10_27_084119_change_concept_institute_tools_by_information_model.php new file mode 100644 index 0000000..a02afaa --- /dev/null +++ b/database/migrations/2023_10_27_084119_change_concept_institute_tools_by_information_model.php @@ -0,0 +1,76 @@ +after('alternative_tool_id', function (Blueprint $table): void { + $table->string('conditions_en')->nullable(); + $table->string('conditions_nl')->nullable(); + $table->text('links_with_other_tools_en')->nullable(); + $table->text('links_with_other_tools_nl')->nullable(); + $table->text('sla_url')->nullable(); + $table->string('privacy_contact')->nullable(); + $table->string('privacy_evaluation_url')->nullable(); + $table->string('security_evaluation_url')->nullable(); + $table->string('data_classification')->nullable(); + $table->string('how_to_login_en')->nullable(); + $table->string('how_to_login_nl')->nullable(); + $table->string('availability_en')->nullable(); + $table->string('availability_nl')->nullable(); + $table->string('licensing_en')->nullable(); + $table->string('licensing_nl')->nullable(); + $table->string('request_access_url')->nullable(); + $table->text('instructions_en')->nullable(); + $table->text('instructions_nl')->nullable(); + $table->string('instructions_manual_1_url')->nullable(); + $table->string('instructions_manual_2_url')->nullable(); + $table->string('instructions_manual_3_url')->nullable(); + $table->text('faq_en')->nullable(); + $table->text('faq_nl')->nullable(); + $table->text('examples_of_usage_en')->nullable(); + $table->text('examples_of_usage_nl')->nullable(); + $table->string('additional_info_heading_en')->nullable(); + $table->string('additional_info_heading_nl')->nullable(); + $table->text('additional_info_text_en')->nullable(); + $table->text('additional_info_text_nl')->nullable(); + }); + + $table->dropColumn([ + 'description_1_image_filename', + 'description_2_image_filename', + 'description_1_en', + 'description_1_nl', + 'description_2_en', + 'description_2_nl', + 'extra_information_title_en', + 'extra_information_title_nl', + 'extra_information_en', + 'extra_information_nl', + 'support_title_1_en', + 'support_title_1_nl', + 'support_email_1', + 'support_title_2_en', + 'support_title_2_nl', + 'support_email_2', + 'manual_title_1_en', + 'manual_title_1_nl', + 'manual_url_1', + 'manual_title_2_en', + 'manual_title_2_nl', + 'manual_url_2', + 'video_title_1_en', + 'video_title_1_nl', + 'video_url_1', + 'video_title_2_en', + 'video_title_2_nl', + 'video_url_2', + ]); + }); + } +}; diff --git a/database/migrations/2023_10_30_125726_add_description_to_tags_table.php b/database/migrations/2023_10_30_125726_add_description_to_tags_table.php new file mode 100644 index 0000000..3eba4e9 --- /dev/null +++ b/database/migrations/2023_10_30_125726_add_description_to_tags_table.php @@ -0,0 +1,16 @@ +json('description')->nullable()->after('slug'); + }); + } +}; diff --git a/database/migrations/2023_10_31_155528_remove_feature_tables.php b/database/migrations/2023_10_31_155528_remove_feature_tables.php new file mode 100644 index 0000000..dbc6512 --- /dev/null +++ b/database/migrations/2023_10_31_155528_remove_feature_tables.php @@ -0,0 +1,14 @@ +string('homepage_title')->nullable()->after('domain'); + $table->text('homepage_body')->nullable()->after('homepage_title'); + }); + } +}; diff --git a/database/migrations/2023_11_02_161558_add_extended_fields_to_experiences.php b/database/migrations/2023_11_02_161558_add_extended_fields_to_experiences.php new file mode 100644 index 0000000..daf167b --- /dev/null +++ b/database/migrations/2023_11_02_161558_add_extended_fields_to_experiences.php @@ -0,0 +1,18 @@ +renameColumn('message', 'tool_usage'); + $table->mediumText('didactic_experience')->nullable()->after('message'); + $table->mediumText('recommend')->nullable()->after('didactic_experience'); + }); + } +}; diff --git a/database/migrations/2023_11_07_065449_fix_tool_tables_column_types.php b/database/migrations/2023_11_07_065449_fix_tool_tables_column_types.php new file mode 100644 index 0000000..1d87c84 --- /dev/null +++ b/database/migrations/2023_11_07_065449_fix_tool_tables_column_types.php @@ -0,0 +1,19 @@ +string('sla_url')->change(); + }); + + Schema::table('institute_tool', function (Blueprint $table): void { + $table->string('sla_url')->change(); + }); + } +}; diff --git a/database/migrations/2023_11_09_130100_add_pros_and_cons_to_experience.php b/database/migrations/2023_11_09_130100_add_pros_and_cons_to_experience.php new file mode 100644 index 0000000..ac1f4cd --- /dev/null +++ b/database/migrations/2023_11_09_130100_add_pros_and_cons_to_experience.php @@ -0,0 +1,17 @@ +text('pros')->nullable()->after('recommend'); + $table->text('cons')->nullable()->after('pros'); + }); + } +}; diff --git a/database/migrations/2024_01_09_102140_change_wysiwyg_fields_to_medium_text.php b/database/migrations/2024_01_09_102140_change_wysiwyg_fields_to_medium_text.php new file mode 100644 index 0000000..a7b84f2 --- /dev/null +++ b/database/migrations/2024_01_09_102140_change_wysiwyg_fields_to_medium_text.php @@ -0,0 +1,51 @@ +mediumText('addons_en')->change(); + $table->mediumText('addons_nl')->change(); + $table->mediumText('personal_data')->change(); + $table->mediumText('privacy_analysis')->change(); + $table->mediumText('support_for_teachers_en')->change(); + $table->mediumText('support_for_teachers_nl')->change(); + $table->mediumText('availability_surf')->change(); + $table->mediumText('accessibility_facilities_en')->change(); + $table->mediumText('accessibility_facilities_nl')->change(); + $table->mediumText('use_for_education_en')->change(); + $table->mediumText('use_for_education_nl')->change(); + $table->mediumText('description_short_en')->change(); + $table->mediumText('description_short_nl')->change(); + }); + } + + foreach (['concept_institute_tools', 'institute_tool'] as $table) { + Schema::table($table, function (Blueprint $table): void { + $table->mediumText('links_with_other_tools_en')->change(); + $table->mediumText('links_with_other_tools_nl')->change(); + $table->mediumText('instructions_en')->change(); + $table->mediumText('instructions_nl')->change(); + $table->mediumText('faq_en')->change(); + $table->mediumText('faq_nl')->change(); + $table->mediumText('examples_of_usage_en')->change(); + $table->mediumText('examples_of_usage_nl')->change(); + $table->mediumText('additional_info_text_en')->change(); + $table->mediumText('additional_info_text_nl')->change(); + $table->mediumText('why_unfit_en')->change(); + $table->mediumText('why_unfit_nl')->change(); + }); + } + + Schema::table('institutes', function (Blueprint $table): void { + $table->mediumText('homepage_body')->change(); + }); + } +}; diff --git a/database/migrations/2024_01_09_145242_add_english_homepage_fields_to_institutes_table.php b/database/migrations/2024_01_09_145242_add_english_homepage_fields_to_institutes_table.php new file mode 100644 index 0000000..edfc596 --- /dev/null +++ b/database/migrations/2024_01_09_145242_add_english_homepage_fields_to_institutes_table.php @@ -0,0 +1,20 @@ +renameColumn('homepage_title', 'homepage_title_nl'); + $table->renameColumn('homepage_body', 'homepage_body_nl'); + + $table->string('homepage_title_en')->nullable()->after('homepage_title'); + $table->mediumText('homepage_body_en')->nullable()->after('homepage_body'); + }); + } +}; diff --git a/database/migrations/2024_01_10_092737_add_personal_data_en_to_tools.php b/database/migrations/2024_01_10_092737_add_personal_data_en_to_tools.php new file mode 100644 index 0000000..3035586 --- /dev/null +++ b/database/migrations/2024_01_10_092737_add_personal_data_en_to_tools.php @@ -0,0 +1,22 @@ +renameColumn('personal_data', 'personal_data_en'); + $table->string('personal_data_nl')->nullable(); + }); + + Schema::table('concept_tools', function (Blueprint $table): void { + $table->renameColumn('personal_data', 'personal_data_en'); + $table->string('personal_data_nl')->nullable(); + }); + } +}; diff --git a/database/migrations/2024_01_10_133425_add_tab_type_to_custom_fields.php b/database/migrations/2024_01_10_133425_add_tab_type_to_custom_fields.php new file mode 100644 index 0000000..f53678e --- /dev/null +++ b/database/migrations/2024_01_10_133425_add_tab_type_to_custom_fields.php @@ -0,0 +1,16 @@ +string('tab_type')->default('product')->after('institute_id'); + }); + } +}; diff --git a/database/migrations/2024_01_11_152535_create_content_pages_table.php b/database/migrations/2024_01_11_152535_create_content_pages_table.php new file mode 100644 index 0000000..b3006d2 --- /dev/null +++ b/database/migrations/2024_01_11_152535_create_content_pages_table.php @@ -0,0 +1,22 @@ +id(); + $table->string('title_en'); + $table->string('title_nl')->nullable(); + $table->string('slug')->unique(); + $table->mediumText('body_en'); + $table->mediumText('body_nl')->nullable(); + $table->timestamps(); + }); + } +}; diff --git a/database/migrations/2024_01_16_155719_change_personal_data_nl_column_type.php b/database/migrations/2024_01_16_155719_change_personal_data_nl_column_type.php new file mode 100644 index 0000000..684d10e --- /dev/null +++ b/database/migrations/2024_01_16_155719_change_personal_data_nl_column_type.php @@ -0,0 +1,20 @@ +mediumText('personal_data_nl')->after('personal_data_en')->change(); + }); + + Schema::table('concept_tools', function (Blueprint $table): void { + $table->mediumText('personal_data_nl')->after('personal_data_en')->change(); + }); + } +}; diff --git a/database/migrations/2024_02_01_111932_drop_rating_colum_from_experiences.php b/database/migrations/2024_02_01_111932_drop_rating_colum_from_experiences.php new file mode 100644 index 0000000..7cdfb55 --- /dev/null +++ b/database/migrations/2024_02_01_111932_drop_rating_colum_from_experiences.php @@ -0,0 +1,16 @@ +dropColumn('rating'); + }); + } +}; diff --git a/database/migrations/2024_02_06_123006_create_tool_followers_table.php b/database/migrations/2024_02_06_123006_create_tool_followers_table.php new file mode 100644 index 0000000..5d6e759 --- /dev/null +++ b/database/migrations/2024_02_06_123006_create_tool_followers_table.php @@ -0,0 +1,31 @@ +id(); + + $table->unsignedBigInteger('tool_id'); + $table->unsignedBigInteger('user_id'); + + $table->foreign('tool_id') + ->references('id')->on('tools') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onUpdate('restrict') + ->onDelete('cascade'); + + $table->timestamps(); + }); + } +}; diff --git a/database/migrations/2024_02_08_085005_add_impersonated_institute_to_users.php b/database/migrations/2024_02_08_085005_add_impersonated_institute_to_users.php new file mode 100644 index 0000000..ba597a8 --- /dev/null +++ b/database/migrations/2024_02_08_085005_add_impersonated_institute_to_users.php @@ -0,0 +1,21 @@ +unsignedBigInteger('impersonated_institute_id')->nullable()->after('institute_id'); + + $table->foreign('impersonated_institute_id') + ->references('id')->on('institutes') + ->onUpdate('restrict') + ->nullOnDelete(); + }); + } +}; diff --git a/database/migrations/2024_02_26_141649_simplify_experiences_table.php b/database/migrations/2024_02_26_141649_simplify_experiences_table.php new file mode 100644 index 0000000..712f326 --- /dev/null +++ b/database/migrations/2024_02_26_141649_simplify_experiences_table.php @@ -0,0 +1,23 @@ +mediumText('message')->after('title')->nullable(); + $table->dropColumn([ + 'tool_usage', + 'didactic_experience', + 'recommend', + 'pros', + 'cons', + ]); + }); + } +}; diff --git a/database/migrations/2024_02_26_155436_change_size_of_conditions_textfields.php b/database/migrations/2024_02_26_155436_change_size_of_conditions_textfields.php new file mode 100644 index 0000000..1d173fe --- /dev/null +++ b/database/migrations/2024_02_26_155436_change_size_of_conditions_textfields.php @@ -0,0 +1,22 @@ +mediumText('conditions_en')->change(); + $table->mediumText('conditions_nl')->change(); + }); + + Schema::table('concept_institute_tools', function (Blueprint $table): void { + $table->mediumText('conditions_en')->change(); + $table->mediumText('conditions_nl')->change(); + }); + } +}; diff --git a/database/migrations/2024_02_26_160620_change_request_access_to_rich_text.php b/database/migrations/2024_02_26_160620_change_request_access_to_rich_text.php new file mode 100644 index 0000000..122d3e3 --- /dev/null +++ b/database/migrations/2024_02_26_160620_change_request_access_to_rich_text.php @@ -0,0 +1,36 @@ +performMigrationFor('institute_tool'); + $this->performMigrationFor('concept_institute_tools'); + } + + private function performMigrationFor(string $tableName): void + { + Schema::table($tableName, function (Blueprint $table): void { + $table->renameColumn('request_access_url', 'request_access_en'); + }); + + Schema::table($tableName, function (Blueprint $table): void { + $table->mediumText('request_access_en')->change(); + $table->mediumText('request_access_nl')->nullable()->after('request_access_en'); + }); + + $linkConversionSql = 'CONCAT("", request_access_en, "")'; + DB::table($tableName) + ->whereNotNull('request_access_en') + ->update([ + 'request_access_en' => DB::raw($linkConversionSql), + 'request_access_nl' => DB::raw('request_access_en'), + ]); + } +}; diff --git a/database/migrations/2024_03_07_093348_make_full_name_bilingual_for_institutes.php b/database/migrations/2024_03_07_093348_make_full_name_bilingual_for_institutes.php new file mode 100644 index 0000000..546c858 --- /dev/null +++ b/database/migrations/2024_03_07_093348_make_full_name_bilingual_for_institutes.php @@ -0,0 +1,17 @@ +string('full_name_nl')->after('full_name'); + $table->renameColumn('full_name', 'full_name_en'); + }); + } +}; diff --git a/database/migrations/2024_03_19_114016_delete_tags_for_classifications_by_institution.php b/database/migrations/2024_03_19_114016_delete_tags_for_classifications_by_institution.php new file mode 100644 index 0000000..3048b61 --- /dev/null +++ b/database/migrations/2024_03_19_114016_delete_tags_for_classifications_by_institution.php @@ -0,0 +1,13 @@ +where('type', 'classifications_by_institution')->delete(); + } +}; diff --git a/database/migrations/2024_03_25_114211_create_alternative_concept_institute_tools_table.php b/database/migrations/2024_03_25_114211_create_alternative_concept_institute_tools_table.php new file mode 100644 index 0000000..ed898d3 --- /dev/null +++ b/database/migrations/2024_03_25_114211_create_alternative_concept_institute_tools_table.php @@ -0,0 +1,47 @@ +bigInteger('concept_institute_tool_id')->unsigned(); + $table->foreignId('tool_id')->constrained()->cascadeOnDelete(); + + $table + ->foreign('concept_institute_tool_id', 'alternative_concept_institute_tool_foreign') + ->references('id') + ->on('concept_institute_tools') + ->onDelete('cascade'); + + $table->unique(['concept_institute_tool_id', 'tool_id'], 'concept_institute_tool_and_tool_id_unique'); + }); + + $this->linkOldAlternativeTools(); + + Schema::table('concept_institute_tools', function (Blueprint $table): void { + $table->dropForeign('concept_institute_tools_alternative_tool_id_foreign'); + $table->dropColumn('alternative_tool_id'); + }); + } + + public function linkOldAlternativeTools(): void + { + $oldAlternativeIds = DB::table('concept_institute_tools') + ->select('id', 'alternative_tool_id') + ->whereNotNull('alternative_tool_id') + ->get(); + + foreach ($oldAlternativeIds as $oldAlternativeId) { + DB::table('alternative_concept_institute_tools')->insert([ + 'concept_institute_tool_id' => $oldAlternativeId->id, + 'tool_id' => $oldAlternativeId->alternative_tool_id, + ]); + } + } +}; diff --git a/database/migrations/2024_03_25_115242_create_alternative_institute_tool_tools_table.php b/database/migrations/2024_03_25_115242_create_alternative_institute_tool_tools_table.php new file mode 100644 index 0000000..ad0bddd --- /dev/null +++ b/database/migrations/2024_03_25_115242_create_alternative_institute_tool_tools_table.php @@ -0,0 +1,47 @@ +bigInteger('institute_tool_id')->unsigned(); + $table->foreignId('tool_id')->constrained()->cascadeOnDelete(); + + $table + ->foreign('institute_tool_id', 'alternative_institute_tool_foreign') + ->references('id') + ->on('institute_tool') + ->onDelete('cascade'); + + $table->unique(['institute_tool_id', 'tool_id'], 'institute_tool_and_tool_unique'); + }); + + $this->linkOldAlternativeTools(); + + Schema::table('institute_tool', function (Blueprint $table): void { + $table->dropForeign('institute_tool_alternative_tool_id_foreign'); + $table->dropColumn('alternative_tool_id'); + }); + } + + public function linkOldAlternativeTools(): void + { + $oldAlternativeIds = DB::table('institute_tool') + ->select('id', 'alternative_tool_id') + ->whereNotNull('alternative_tool_id') + ->get(); + + foreach ($oldAlternativeIds as $oldAlternativeId) { + DB::table('alternative_tool_institute_tools')->insert([ + 'institute_tool_id' => $oldAlternativeId->id, + 'tool_id' => $oldAlternativeId->alternative_tool_id, + ]); + } + } +}; diff --git a/database/seeders/ContentPageSeeder.php b/database/seeders/ContentPageSeeder.php new file mode 100644 index 0000000..cd26751 --- /dev/null +++ b/database/seeders/ContentPageSeeder.php @@ -0,0 +1,21 @@ +create(); + $this->advanceProgressBar(); + } + + protected function getProgressBarCount(): int + { + return 1; + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a847d7f..e1cf1c3 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -17,8 +17,14 @@ public function run(): void PredefinedToolSeeder::class, ToolSeeder::class, - CategorySeeder::class, ExperienceSeeder::class, + + LanguageSeeder::class, + PendingToolEditSeeder::class, + ToolLogSeeder::class, + TagSeeder::class, + TaggableSeeder::class, + ContentPageSeeder::class, ]); } } diff --git a/database/seeders/ExperienceSeeder.php b/database/seeders/ExperienceSeeder.php index 51a4754..aaef3bb 100644 --- a/database/seeders/ExperienceSeeder.php +++ b/database/seeders/ExperienceSeeder.php @@ -16,6 +16,8 @@ public function handle(): void Tool::each(function (Tool $tool) use ($allUsers): void { if (!rand(0, 4)) { + $this->advanceProgressBar(); + return; } diff --git a/database/seeders/LanguageSeeder.php b/database/seeders/LanguageSeeder.php new file mode 100644 index 0000000..0617b50 --- /dev/null +++ b/database/seeders/LanguageSeeder.php @@ -0,0 +1,22 @@ +activated()->create(['locale' => 'nl']); + + $this->advanceProgressBar(); + } + + protected function getProgressBarCount(): int + { + return 1; + } +} diff --git a/database/seeders/PendingToolEditSeeder.php b/database/seeders/PendingToolEditSeeder.php new file mode 100644 index 0000000..c000408 --- /dev/null +++ b/database/seeders/PendingToolEditSeeder.php @@ -0,0 +1,40 @@ +advanceProgressBar(); + + return; + } + + foreach ($allUsers->random(rand(1, 3)) as $user) { + PendingToolEdit::factory()->create([ + 'user_id' => $user->id, + 'tool_id' => $tool->id, + 'institute_id' => $user->isInformationManager() ? $user->institute->id : null, + ]); + } + + $this->advanceProgressBar(); + }); + } + + protected function getProgressBarCount(): int + { + return Tool::count(); + } +} diff --git a/database/seeders/PredefinedToolSeeder.php b/database/seeders/PredefinedToolSeeder.php index b9f4d49..021c72a 100644 --- a/database/seeders/PredefinedToolSeeder.php +++ b/database/seeders/PredefinedToolSeeder.php @@ -6,7 +6,6 @@ use App\Enums\InstituteTool\Status; use App\Helpers\File; -use App\Models\Feature; use App\Models\Institute; use App\Models\InstituteTool; use App\Models\Tool; @@ -25,16 +24,13 @@ public function handle(): void foreach ($this->predefinedTools() as $toolName) { $tool = Tool::factory()->withImages()->published()->create([ - 'name' => $toolName, - 'image_filename' => $this->prepareToolImage($toolName), + 'name' => $toolName, + 'logo_filename' => $this->prepareToolLogo($toolName), ]); - $tool->features()->attach(Feature::get()->random(rand(1, 4))); - $factory = InstituteTool::factory() ->for($institute) ->for($tool) - ->withImages() ->published(); if (!empty($requiredStatuses)) { @@ -52,7 +48,7 @@ protected function getProgressBarCount(): int return $this->totalTools; } - private function prepareToolImage(string $toolName): string + private function prepareToolLogo(string $toolName): string { $srcFilename = Str::slug($toolName); $srcFile = resource_path('seeding/tools/main/' . $srcFilename . '.png'); diff --git a/database/seeders/TagSeeder.php b/database/seeders/TagSeeder.php new file mode 100644 index 0000000..19fa08a --- /dev/null +++ b/database/seeders/TagSeeder.php @@ -0,0 +1,78 @@ +seedTags(); + $this->seedCategoryTags(); + } + + protected function getProgressBarCount(): int + { + return count(Arr::flatten($this->getTags())) + Institute::count(); + } + + private function getTags(): array + { + return [ + TagTypes::FEATURES => [ + 'Chat', 'Create learning materials', 'Edit video, sound or image', 'Exams and assignments', + 'Feedback', 'File share', 'Mindmaps', 'Notebook', 'Presenting', 'Project Planning', + 'Quiz, Games or Polls', 'Revision', 'Schedule or Roster', 'Surveys', 'Whiteboard', + ], + TagTypes::SOFTWARE_TYPES => ['Install software', 'plugin', 'cloud'], + TagTypes::DEVICES => ['smartphone', 'tablet', 'PC'], + TagTypes::STANDARDS => ['SURFconext', 'LTI', 'SAML', 'OOAPI', 'xAPI'], + TagTypes::OPERATING_SYSTEMS => ['Linux', 'Windows', 'macOS', 'IOS', 'Android'], + TagTypes::DATA_PROCESSING_LOCATIONS => ['Inside EU', 'Outside EU'], + TagTypes::CERTIFICATIONS => ['ISO27001'], + TagTypes::WORKING_METHODS => ['Working method 1', 'Working method 2'], + TagTypes::TARGET_GROUPS => ['Target group 1', 'Target group 2'], + TagTypes::COMPLEXITY => ['basis', 'experienced', 'expert'], + ]; + } + + private function seedTags(): void + { + $tags = $this->getTags(); + + foreach (TagTypes::toArray() as $tagType) { + if ($tagType === TagTypes::CATEGORIES) { + // Categories are seeded separately by institute + continue; + } + + foreach ($tags[$tagType] as $tag) { + Tag::factory()->create([ + 'name' => $tag, + 'type' => $tagType, + ]); + + $this->advanceProgressBar(); + } + } + } + + private function seedCategoryTags(): void + { + foreach (Institute::all() as $institute) { + Tag::factory(rand(1, 20)) + ->withInstitute($institute) + ->create([ + 'type' => TagTypes::CATEGORIES, + ]); + + $this->advanceProgressBar(); + } + } +} diff --git a/database/seeders/TaggableSeeder.php b/database/seeders/TaggableSeeder.php new file mode 100644 index 0000000..6f91dd1 --- /dev/null +++ b/database/seeders/TaggableSeeder.php @@ -0,0 +1,52 @@ +addTags($tool); + $this->advanceProgressBar(); + } + } + + protected function getProgressBarCount(): int + { + return Tool::count(); + } + + private function addTags(Tool $tool): void + { + foreach (TagTypes::toArray() as $tagType) { + $tagsWithoutInstitute = Tag::withoutInstitute()->where('type', $tagType)->get(); + $this->attachSomeTags($tool, $tagsWithoutInstitute); + + foreach ($tool->institutes as $institute) { + $tagsWithInstitute = Tag::forInstitute($institute)->where('type', $tagType)->get(); + $this->attachSomeTags($tool, $tagsWithInstitute); + } + } + } + + private function attachSomeTags(Tool $tool, Collection $tags): void + { + foreach ($tags as $tag) { + if (rand(0, 1)) { + continue; + } + + $tool->attachTag($tag); + } + } +} diff --git a/database/seeders/ToolLogSeeder.php b/database/seeders/ToolLogSeeder.php new file mode 100644 index 0000000..5a1048c --- /dev/null +++ b/database/seeders/ToolLogSeeder.php @@ -0,0 +1,40 @@ +advanceProgressBar(); + + return; + } + + foreach ($allUsers->random(rand(2, 5)) as $user) { + ToolLog::factory()->count(rand(10, 20))->create([ + 'user_id' => $user->id, + 'tool_id' => $tool->id, + 'institute_id' => $user->isInformationManager() ? $user->institute->id : null, + ]); + } + + $this->advanceProgressBar(); + }); + } + + protected function getProgressBarCount(): int + { + return Tool::count(); + } +} diff --git a/database/seeders/ToolSeeder.php b/database/seeders/ToolSeeder.php index bca2ae8..928f85c 100644 --- a/database/seeders/ToolSeeder.php +++ b/database/seeders/ToolSeeder.php @@ -4,7 +4,6 @@ namespace Database\Seeders; -use App\Models\Feature; use App\Models\Institute; use App\Models\InstituteTool; use App\Models\Tool; @@ -18,11 +17,9 @@ public function handle(): void for ($index = 0; $index < $this->totalTools; $index++) { $tool = Tool::factory()->withImages()->create(); - $tool->features()->attach(Feature::get()->random(rand(1, 4))); - if ($tool->is_published) { Institute::get()->random(rand(1, 4))->each(function (Institute $institute) use ($tool): void { - InstituteTool::factory()->for($institute)->for($tool)->withImages()->create(); + InstituteTool::factory()->for($institute)->for($tool)->create(); }); } diff --git a/lang/en/action.php b/lang/en/action.php new file mode 100644 index 0000000..fe78ff1 --- /dev/null +++ b/lang/en/action.php @@ -0,0 +1,37 @@ + 'Add', + 'back' => 'Back', + 'cancel' => 'Cancel', + 'create' => 'Create', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'edit_concept' => 'Edit Concept', + 'publish_concept' => 'Publish Concept', + 'discard_concept' => 'Discard Concept', + 'login' => 'Login', + 'login-with-surfconext' => 'Login with SURFconext', + 'login-as-super-admin' => 'Login as super admin', + 'logout' => 'Logout', + 'publish' => 'Publish', + 'unpublish' => 'Unpublish', + 'store' => 'Save', + 'add_and_close' => 'Add & Close', + 'store_and_close' => 'Save & Close', + 'view' => 'View', + 'add_url' => 'Add URL', + 'add_more_tools' => 'Add more tools', + 'send' => 'Send', + + 'switch-to-institute' => 'Institutes', + 'logout-from-institute' => 'Logout from :institute', + + 'file_upload' => [ + 'text' => 'Drag and drop here or', + 'clickable' => 'Browse files', + 'remove' => 'Remove', + ], +]; diff --git a/lang/en/alert.php b/lang/en/alert.php new file mode 100644 index 0000000..362e56d --- /dev/null +++ b/lang/en/alert.php @@ -0,0 +1,10 @@ + [ + 'part_1' => 'You are viewing a concept version. Colleague ', + 'part_2' => ' has opened it on ', + ], +]; diff --git a/lang/en/aria.php b/lang/en/aria.php new file mode 100644 index 0000000..fb44334 --- /dev/null +++ b/lang/en/aria.php @@ -0,0 +1,7 @@ + 'Tabs', +]; diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..b7d90c1 --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,7 @@ + 'Login', +]; diff --git a/lang/en/confirm.php b/lang/en/confirm.php new file mode 100644 index 0000000..368ebb6 --- /dev/null +++ b/lang/en/confirm.php @@ -0,0 +1,20 @@ + 'Confirmation', + 'text' => 'Are you sure you want to perform this action?', + + 'actions' => [ + 'confirm' => 'Yes', + 'cancel' => 'Cancel', + ], + + 'delete-entity' => 'Are you sure you want to delete ":entity"?', + + 'publish-tool' => 'Are you sure you wish to publish this tool for your institute?', + 'unpublish-tool' => 'Are you sure you wish to undo publication of this tool for your institute?', + + 'delete-experience' => 'Are you sure you wish to delete your experience?', +]; diff --git a/lang/en/content-page.php b/lang/en/content-page.php new file mode 100644 index 0000000..de0e0b9 --- /dev/null +++ b/lang/en/content-page.php @@ -0,0 +1,26 @@ + [ + 'title_en' => 'Title (EN)', + 'title_nl' => 'Title (NL)', + + 'body_en' => 'Body (EN)', + 'body_nl' => 'Body (NL)', + + 'slug' => 'Slug', + + 'url' => 'Url', + ], + + 'index' => [ + 'heading' => 'All content pages', + 'title' => 'All content pages', + ], + + 'tool_tips' => [ + 'slug' => 'The slug will be prefixed with /path/', + ], +]; diff --git a/lang/en/custom-field.php b/lang/en/custom-field.php new file mode 100644 index 0000000..befa140 --- /dev/null +++ b/lang/en/custom-field.php @@ -0,0 +1,26 @@ + 'Custom field', + 'plural' => 'Custom fields', + + 'attributes' => [ + 'title' => 'Title', + 'title_en' => 'Title (EN)', + 'title_nl' => 'Title (NL)', + 'sortkey' => 'Sorteersleutel (numeriek)', + 'tab_type' => 'Tab Type', + ], + + 'tab_types' => [ + Tabs::PRODUCT => 'Product', + Tabs::TECHNICAL => 'Technical', + Tabs::PRIVACY_AND_SECURITY => 'Privacy & Security', + Tabs::SUPPORT => 'Support', + Tabs::EDUCATION => 'Education', + ], +]; diff --git a/lang/en/email.php b/lang/en/email.php new file mode 100644 index 0000000..95eef90 --- /dev/null +++ b/lang/en/email.php @@ -0,0 +1,8 @@ + 'All rights reserved.', + 'signature' => 'Kind regards,
PEA', +]; diff --git a/lang/en/experience.php b/lang/en/experience.php new file mode 100644 index 0000000..90c9c0b --- /dev/null +++ b/lang/en/experience.php @@ -0,0 +1,15 @@ + 'Experience', + 'plural' => 'Experiences', + + 'attributes' => [ + 'title' => 'Title', + 'message' => 'Message', + ], + + 'user_outside_institute' => 'Employee', +]; diff --git a/lang/en/footer.php b/lang/en/footer.php new file mode 100644 index 0000000..8b137e1 --- /dev/null +++ b/lang/en/footer.php @@ -0,0 +1,31 @@ + [ + 'link' => 'https://www.paqt.com', + 'link-title' => 'Custom software development PAQT.com', + 'link-content' => 'Custom software', + 'link-append' => 'by PAQT.com', + ], + 'disclaimer' => 'No rights can be derived from the content of the Tools.', + 'links' => [ + 'link1' => [ + 'url' => '/', + 'text' => 'Community Guidelines', + ], + 'link2' => [ + 'url' => '/', + 'text' => 'Terms of Use', + ], + 'link3' => [ + 'url' => '/', + 'text' => 'Privacy', + ], + 'link4' => [ + 'url' => '/', + 'text' => 'Cookies', + ], + ], +]; diff --git a/lang/en/institute.php b/lang/en/institute.php new file mode 100644 index 0000000..24077ed --- /dev/null +++ b/lang/en/institute.php @@ -0,0 +1,192 @@ + [ + 'short_name' => 'Code', + 'full_name' => 'Name', + 'full_name_en' => 'Name (EN)', + 'full_name_nl' => 'Name (NL)', + 'domain' => 'Domain', + ], + + 'tool' => [ + 'singular' => 'Tool', + 'plural' => 'Tools', + + 'attributes' => [ + 'alternative_tools' => 'Alternative tools', + + 'status' => 'Status', + 'category' => 'Category', + 'categories' => 'Categories', + 'conditions' => 'Conditions', + 'conditions_en' => 'Conditions (EN)', + 'conditions_nl' => 'Conditions (NL)', + + 'links_with_other_tools' => 'Links with other tools', + 'links_with_other_tools_en' => 'Links with other tools (EN)', + 'links_with_other_tools_nl' => 'Links with other tools (NL)', + 'sla_url' => 'SLA - URL', + + 'privacy_contact' => 'Privacy contact', + 'privacy_evaluation_url' => 'Privacy evaluation - URL', + 'security_evaluation_url' => 'Security evaluation - URL', + 'data_classification' => 'Data classification', + + 'how_to_login' => 'How to login', + 'how_to_login_en' => 'How to login (EN)', + 'how_to_login_nl' => 'How to login (NL)', + 'availability' => 'Availability', + 'availability_en' => 'Availability (EN)', + 'availability_nl' => 'Availability (NL)', + 'licensing' => 'License', + 'licensing_en' => 'License (EN)', + 'licensing_nl' => 'License (NL)', + 'request_access' => 'Request access', + 'request_access_en' => 'Request access (EN)', + 'request_access_nl' => 'Request access (NL)', + 'instructions' => 'Instructions', + 'instructions_en' => 'Instructions (EN)', + 'instructions_nl' => 'Instructions (NL)', + 'instructions_manual_1_url' => 'Instructions 1 - URL', + 'instructions_manual_2_url' => 'Instructions 2 - URL', + 'instructions_manual_3_url' => 'Instructions 3 - URL', + + 'faq' => 'FAQ', + 'faq_en' => 'FAQ (EN)', + 'faq_nl' => 'FAQ (NL)', + 'examples_of_usage' => 'Examples of usage', + 'examples_of_usage_en' => 'Examples of usage (EN)', + 'examples_of_usage_nl' => 'Examples of usage (NL)', + 'additional_info_heading_en' => 'Additional info heading (EN)', + 'additional_info_heading_nl' => 'Additional info heading (NL)', + 'additional_info_text_en' => 'Additional info text (EN)', + 'additional_info_text_nl' => 'Additional info text (NL)', + + 'why_unfit' => 'Why is this tool unfit?', + 'why_unfit_en' => 'Why is this tool unfit? (EN)', + 'why_unfit_nl' => 'Why is this tool unfit? (NL)', + + 'prohibited_tools' => 'The following alternative tools were previously selected but are now marked as prohibited. They will be removed as alternatives when you save this tool:', + ], + 'tooltip' => [ + 'marked_as_fit' => 'Tooltip: marked_as_fit', + + 'status' => 'Tooltip: status', + 'categories' => 'Tooltip: categories', + 'conditions_en' => 'Tooltip: conditions_en', + 'conditions_nl' => 'Tooltip: conditions_nl', + 'addons' => 'Tooltip: addons', + 'updated_at' => 'Tooltip: updated_at', + + 'links_with_other_tools_en' => 'Tooltip: links_with_other_tools_en', + 'links_with_other_tools_nl' => 'Tooltip: links_with_other_tools_nl', + 'sla_url' => 'Tooltip: sla_url', + 'system_requirements' => 'Tooltip: system_requirements', + 'software_types' => 'Tooltip: software_types', + 'devices' => 'Tooltip: devices', + 'operating_systems' => 'Tooltip: operating_systems', + 'accessibility_facilities' => 'Tooltip: accessibility_facilities', + + 'privacy_contact' => 'Tooltip: privacy_contact', + 'privacy_evaluation_url' => 'Tooltip: privacy_evaluation_url', + 'security_evaluation_url' => 'Tooltip: security_evaluation_url', + 'data_classification' => 'Tooltip: data_classification', + 'privacy_analysis' => 'Tooltip: privacy_analysis', + 'personal_data' => 'Tooltip: personal_data', + 'supplier_country' => 'Tooltip: supplier_country', + 'certifications' => 'Tooltip: certifications', + 'data_processing_locations' => 'Tooltip: data_processing_locations', + + 'how_to_login_en' => 'Tooltip: how_to_login_en', + 'how_to_login_nl' => 'Tooltip: how_to_login_nl', + 'availability_en' => 'Tooltip: availability_en', + 'availability_nl' => 'Tooltip: availability_nl', + 'licensing_en' => 'Tooltip: licensing_en', + 'licensing_nl' => 'Tooltip: licensing_nl', + 'request_access_en' => 'Tooltip: request_access_en', + 'request_access_nl' => 'Tooltip: request_access_nl', + 'instructions_en' => 'Tooltip: instructions_en', + 'instructions_nl' => 'Tooltip: instructions_nl', + 'instructions_manual_1_url' => 'Tooltip: instructions_manual_1_url', + 'instructions_manual_2_url' => 'Tooltip: instructions_manual_2_url', + 'instructions_manual_3_url' => 'Tooltip: instructions_manual_3_url', + 'support_for_teachers' => 'Tooltip: support_for_teachers', + + 'faq_en' => 'Tooltip: faq_en', + 'faq_nl' => 'Tooltip: faq_nl', + 'examples_of_usage_en' => 'Tooltip: examples_of_usage_en', + 'examples_of_usage_nl' => 'Tooltip: examples_of_usage_nl', + 'additional_info_heading_en' => 'Tooltip: additional_info_heading_en', + 'additional_info_heading_nl' => 'Tooltip: additional_info_heading_nl', + 'additional_info_text_en' => 'Tooltip: additional_info_text_en', + 'additional_info_text_nl' => 'Tooltip: additional_info_text_nl', + + 'why_unfit' => 'Tooltip: why_unfit', + 'why_unfit_en' => 'Tooltip: why_unfit_en', + 'why_unfit_nl' => 'Tooltip: why_unfit_nl', + + 'alternative_tools' => 'Tooltip: alternative_tools', + + 'privacy_policy_url' => 'Tooltip: privacy_policy_url', + 'model_processor_agreement_url' => 'Tooltip: model_processor_agreement_url', + 'dtia_by_external_url' => 'Tooltip: dtia_by_external_url', + 'dpia_by_external_url' => 'Tooltip: dpia_by_external_url', + 'jurisdiction' => 'Tooltip: jurisdiction', + 'standards' => 'Tooltip: standards', + ], + + 'data_classifications' => [ + DataClassification::PUBLIC => 'Public', + DataClassification::INTERNAL => 'Internal', + DataClassification::CONFIDENTIAL => 'Confidential', + DataClassification::SECRET => 'Secret', + ], + + 'statuses' => [ + Status::ALLOWED => 'Allowed', + Status::ALLOWED_UNDER_CONDITIONS => 'Allowed under conditions', + Status::DISALLOWED => 'Disallowed', + Status::UNRATED => 'Unrated', + Status::UNPUBLISHED => 'Unpublished', + ], + + 'no-alternative-tools' => 'There are currently no alternative tools available to select.', + + 'sort' => [ + Sort::UPDATED_AT_ASC => 'Last updated oldest - latest', + Sort::UPDATED_AT_DESC => 'Last updated latest - oldest', + ], + ], + + 'homepage-information' => [ + 'homepage' => 'Homepage', + + 'attributes' => [ + 'title_en' => 'Title (EN)', + 'body_en' => 'Body (EN)', + 'title_nl' => 'Title (NL)', + 'body_nl' => 'Body (NL)', + ], + ], + + 'notifications' => [ + 'create' => 'Followers', + 'title' => 'Update followers', + + 'attributes' => [ + 'tool_name' => ':tool (:count Follower)|:tool (:count Followers)', + 'tool' => 'Tool', + 'subject' => 'Subject', + 'message' => 'Message', + ], + ], +]; diff --git a/lang/en/log.php b/lang/en/log.php new file mode 100644 index 0000000..8583bb3 --- /dev/null +++ b/lang/en/log.php @@ -0,0 +1,11 @@ + [ + 'edited-on' => 'Edited on', + 'editor' => 'Name editor', + 'no-data' => 'There are no known changes for this tool', + ], +]; diff --git a/lang/en/mailable.php b/lang/en/mailable.php new file mode 100644 index 0000000..ea95bad --- /dev/null +++ b/lang/en/mailable.php @@ -0,0 +1,24 @@ + 'PEA Logo', + 'greeting' => 'Dear Sir / Madam,', + 'greeting_name' => 'Dear :salutation :name,', + 'regards' => 'We hope to have informed you sufficiently.', + 'sender' => 'PEA', + 'copyright' => 'All rights reserved.', + + 'tool_updated' => [ + 'subject' => 'There has been a change in Tool: :tool', + + 'there_has_been_a_change' => 'There has been a change on the highest level in a tool that is in your institute\'s collection.', + 'view_tool_action' => 'View tool', + ], + + 'institute_tool_notification' => [ + 'intro' => 'You are subscribed to updates regarding :tool', + 'view_tool_action' => 'View tool', + ], +]; diff --git a/lang/en/message.php b/lang/en/message.php new file mode 100644 index 0000000..d6ef97f --- /dev/null +++ b/lang/en/message.php @@ -0,0 +1,54 @@ + 'The data has been saved.', + 'entity-deleted' => ':Entity has been deleted.', + 'entity-published' => ':Entity has been published.', + 'entity-unpublished' => 'Publication of :Entity has been undone.', + + 'concept-published' => 'The concept version of :Entity has been published.', + 'concept-discarded' => 'The concept version of :Entity has been discarded.', + + 'experience' => [ + 'shared' => 'Your experience has been shared.', + 'updated' => 'Your experience has been updated.', + 'deleted' => 'Your experience has been deleted.', + ], + + 'request_for_change_sent' => 'Your request for change has been sent. You will receive a confirmation by e-mail.', + + 'update-sent' => 'Your message is sent.', + + 'file-too-large' => 'The file is too large.', + 'file-is-uploaded' => 'File ":file" has been uploaded.', + + 'following-tool' => 'You will now receive updates for this application', + 'stopped-following-tool' => 'You will no longer receive updates for this application', + + 'no-data' => 'There is no data.', + + 'error' => [ + 'api' => [ + 'unauthenticated' => 'Not logged in.', + 'not-found' => 'Not found.', + 'csrf-failed' => 'CSRF token validation failed.', + 'unauthorized' => 'You are not allowed to perform this action.', + ], + 'general' => 'An unexpected error has occurred. We apologize for the inconvenience. Try again later.', + 'maintenance' => 'We are busy with maintenance for a while. Try again later.', + 'not-found' => 'The page could not be found.', + 'validation' => 'The validation failed. Please correct the errors and try again. ', + 'forbidden' => 'You are not authorized to perform this action.', + 'expired' => 'The page has expired. Please go back and try again.', + 'inactivity' => 'You have been automatically logged out due to prolonged inactivity.', + 'unauthorized' => 'You are not authorized to access this page.', + + 'login' => [ + 'unknown_institute' => 'Unknown institute', + 'invalid_affiliation' => 'Invalid affiliation', + 'invalid_roles' => 'Invalid roles', + ], + ], +]; diff --git a/lang/en/modal.php b/lang/en/modal.php new file mode 100644 index 0000000..38440a2 --- /dev/null +++ b/lang/en/modal.php @@ -0,0 +1,71 @@ + [ + 'experience_form' => [ + 'select_stars' => 'Select amount of stars', + 'experience_of' => 'Experience of', + 'title' => 'Title', + 'message' => 'What do you use the tool for?', + + 'info' => [ + 'max_length' => 'The maximum character limit for this field is :max', + 'placeholder' => 'Describe your application and experience of this tool. For instance: purpose, target, use, experience, practical tips for other teachers, etc.', + ], + ], + ], + + 'share_experience' => [ + 'title' => 'Share your experience', + + 'actions' => [ + 'share' => 'Share experience', + 'cancel' => 'Cancel', + ], + ], + + 'edit_experience' => [ + 'title' => 'Edit your experience', + + 'actions' => [ + 'update' => 'Save experience', + 'cancel' => 'Cancel', + ], + ], + + 'status_legend' => [ + 'title' => 'Status legend', + 'description' => 'Statuses are defined as badges and are mostly used within Our Tools. It indicates the level + at which information managers encourage you to use the tool for any purpose within our institute.', + + 'statuses' => [ + Status::ALLOWED => 'The tool is supported by our institution, which means that it is safe to use + and there is a license within the institution. Difference with a recommended tool is that this status + means it is optional to use.', + Status::ALLOWED_UNDER_CONDITIONS => 'Our institution does not recommend this tool, which can be due to + unclear terms and regulations, difficult to use, or because of a preferred alternative.', + Status::DISALLOWED => 'You are not allowed to use this tool due to f.e. safety issues, privacy + risks, or other technical concerns.', + Status::UNRATED => 'This tool has not yet been examined by our institution, and therefore not given + a status yet.', + ], + ], + + 'request_for_change' => [ + 'title' => 'Request a change for tool: :tool', + 'description' => 'Your request for change will be e-mailed to us and you will receive a confirmation e-mail.', + + 'label' => 'Describe as detailed as possible what you would like to see differently on this page.', + + 'actions' => [ + 'submit' => 'Send', + 'cancel' => 'Cancel', + ], + ], +]; diff --git a/lang/en/notification.php b/lang/en/notification.php new file mode 100644 index 0000000..90984f2 --- /dev/null +++ b/lang/en/notification.php @@ -0,0 +1,11 @@ + 'Dear user,', + 'greeting_error' => 'Unfortunately, something went wrong.', + 'regards' => 'Sincerely,', + 'trouble_viewing' => 'If you have trouble clicking the ":actionText" button, + copy and paste the URL below into your browser:', +]; diff --git a/lang/en/page.php b/lang/en/page.php new file mode 100644 index 0000000..65fdb34 --- /dev/null +++ b/lang/en/page.php @@ -0,0 +1,436 @@ + 'Open menu', + 'select-tab' => 'Select a tab', + 'search' => 'Search', + 'sort' => 'Sort', + + 'app-name' => 'Project educatieve applicaties', + + 'menu' => [ + 'all-tools' => 'All tools', + 'manage-our-tools' => 'Manage our tools', + 'manage-all-tools' => 'Manage all tools', + 'manage-all-tags' => 'Manage all tags', + 'about' => 'About', + ], + + 'shared' => [ + 'section-header' => [ + 'search-tools' => 'Search within tools', + ], + + 'tool' => [ + 'experiences' => 'Experiences', + 'total_experiences' => ':count total', + 'no_experiences' => 'No experiences have been shared yet.', + 'share_experience' => 'Share experience', + + 'actions' => [ + 'request_for_change' => 'Request a change', + ], + + 'card' => [ + 'total_experiences' => ':count experience|:count total experiences', + ], + ], + ], + + 'login' => [ + 'disclaimer' => 'Through this website you can enter the application of Project Educatieve Applicaties. + This is a project which is in the Proof of Concept phase, and currently undergoing tests and evaluations. + In case you have general questions, please contact + pytrik.dijkstra@surf.nl', + ], + + 'navbar' => [ + 'project' => 'project', + 'project-name' => 'educatieve applicaties', + ], + + 'account' => [ + 'login' => [ + 'title' => 'Login', + ], + ], + + 'translation' => [ + 'index' => [ + 'title' => 'Translations', + ], + ], + + 'home' => [ + 'index' => [ + 'title' => 'Home', + 'heading' => 'Home', + 'section-header' => [ + 'title' => 'Discover the best tools for learning', + 'subtitle' => 'Within :institute and beyond', + 'learn-more' => 'Learn more about PEA', + ], + ], + ], + + 'about' => [ + 'index' => [ + 'title' => 'About', + 'section-header' => [ + 'title' => 'About', + 'subtitle' => 'About SURF and :institute', + ], + 'sections' => [ + 'how-to-use' => [ + 'title' => 'What is this website about?', + 'text' => [ + 'Through this website you can find educational applications that you would like to use and that meet your, and your institutions’ requirements. Within ‘our tools’ you will find all applications that are checked by your institution and reviewed by your peers. You can publish your experience working with these particular apps and therefore create useful information for colleagues.', + + 'If the application you are looking for is not available within your institution, please either use the search field or browse through ‘other tools’. These are the applications that are not yet identified within your institution, but are known within the market or sometimes used by other institutions. To notify the people within your institution of your interest, you can request to use a certain application.', + ], + ], + 'pea-support' => [ + 'title' => 'Project Educatieve Applicaties: support at our institute', + + 'text' => 'In a later stage, you can find information from our institution concerning the usage of this platform here. For example about the design, processes, support and so on. Because the project is still in a Proof-of-Concept stage, there is no specific information here yet.', + ], + 'about-edutools-project-and-surf-title' => [ + 'title' => 'Background information Project Educatieve Applicaties and SURF', + + 'text' => 'Several institutions have expressed the need to gain insight, overview and control over their own application landscape, in other words the applications that are used within the institutions. This need has so far led to a number of individual initiatives at institutions, which have many similarities. Because these solutions partly contain the same information, SURF investigated whether we can work together on this at a national level. The Project Educatieve Applicaties has been started in consultation with a number of institutions in The Netherlands. They worked together on the design, plus building this platform. For more information, please check: https://www.surf.nl/project-educatieve-applicaties', + ], + ], + ], + ], + + 'other' => [ + 'tool' => [ + 'index' => [ + 'title' => 'Other tools', + 'heading' => 'Results (:count)', + 'subtitle' => "Find tools that aren't available in our institution yet", + ], + 'show' => [ + 'title' => ':name', + 'heading' => ':name', + + 'header' => [ + 'status' => 'Status', + 'experiences' => 'Experiences', + 'total_experiences' => ':count total', + + 'info' => [ + 'text' => 'This tool has not been published or prohibited yet for your institution', + 'add' => 'Add to collection', + 'prohibit' => 'Make prohibited', + ], + ], + + 'tabs' => [ + 'product' => 'Product', + 'technical' => 'Technical', + 'privacy_and_security' => 'Privacy & Security', + 'support' => 'Support', + 'education' => 'Education', + ], + + 'headings' => [ + 'request_a_change' => 'Request a change', + 'features' => 'Features', + 'institutes' => 'Used by :count institute|Used by :count institutes', + ], + ], + ], + ], + + 'our' => [ + 'tool' => [ + 'index' => [ + 'title' => 'Our tools', + 'heading' => 'Results (:count)', + 'other_tools' => [ + 'title' => 'Tools', + 'explanation' => 'Not used within our organisation', + ], + + 'current_filters' => 'Current filters', + 'remove_all_filters' => 'Remove all filters', + + 'results_without_filter_or_search' => 'There are no results within your chosen filters or search query. Turn off one or more filters or adjust your search to see results.', + ], + 'show' => [ + 'title' => ':name', + 'heading' => ':name', + + 'header' => [ + 'for_institute' => 'For :institute', + 'experiences' => 'Experiences', + 'total_experiences' => ':count total', + ], + + 'tabs' => [ + 'product' => 'Product', + 'technical' => 'Technical', + 'privacy_and_security' => 'Privacy & Security', + 'support' => 'Support', + 'education' => 'Education', + ], + + 'headings' => [ + 'alternative_tools' => 'Alternative tools', + 'request_a_change' => 'Request a change', + 'features' => 'Features', + 'categories' => ':institute categories', + 'custom_fields' => ':institute custom fields', + ], + + 'content_manager_filled_out' => 'The following information on this tool has been filled out by the content manager', + 'none' => 'none', + ], + ], + ], + + 'content-manager' => [ + 'tool' => [ + 'form' => [ + 'headings' => [ + 'product' => 'Product', + 'technical' => 'Technical', + 'privacy_and_security' => 'Privacy & Security', + 'support' => 'Support', + 'education' => 'Education', + ], + 'captions' => [ + 'image-format-sm' => 'Image must be .PNG or .JPEG, at least 300x300, square format', + 'short-description' => 'Describe in two lines what the tool can do', + 'image-format-lg' => 'Image must be .PNG or .JPEG, at least 1080 x 566, landscape format', + ], + ], + + 'index' => [ + 'title' => 'All tools', + 'heading' => 'All tools', + ], + 'create' => [ + 'title' => 'Add a new tool', + 'heading' => 'Add a new tool', + ], + 'edit' => [ + 'title' => 'Edit :name', + 'heading' => 'Edit :name', + 'view_log' => 'View log', + ], + 'log' => [ + 'title' => 'Edit log', + ], + ], + + 'tag' => [ + 'form' => [ + 'headings' => [ + 'general' => 'General', + ], + ], + + 'index' => [ + 'title' => 'All tags', + 'heading' => 'All tags', + ], + + 'create' => [ + 'title' => 'Create new tag', + 'heading' => 'Create new tag', + ], + ], + ], + + 'information-manager' => [ + 'tool' => [ + 'form' => [ + 'marked-as-fit' => 'This tool has been marked as fit.', + 'marked-as-unfit' => 'This tool is marked as unfit.', + + 'change-to-fit' => 'Add to our tools', + 'change-to-unfit' => 'Change to prohibited', + + 'headings' => [ + 'product' => 'Product', + 'technical' => 'Technical', + 'privacy_and_security' => 'Privacy & Security', + 'support' => 'Support', + 'education' => 'Education', + 'custom-fields' => 'Custom fields', + ], + 'captions' => [ + 'image-format' => 'Image must be .PNG or .JPEG', + ], + ], + + 'create' => [ + 'title' => 'Add :tool', + ], + 'edit' => [ + 'title' => 'Edit :tool', + 'view_log' => 'View log', + ], + 'index' => [ + 'title' => 'Manage our tools', + ], + 'log' => [ + 'title' => 'Edit log', + ], + ], + + 'category' => [ + 'form' => [ + 'headings' => [ + 'general' => 'General', + ], + 'captions' => [ + 'character-limit' => 'The maximum character limit for this field is 1024', + ], + ], + + 'index' => [ + 'title' => 'All categories', + 'heading' => 'All categories', + ], + 'create' => [ + 'title' => 'Add a new category', + 'heading' => 'Add a new category', + ], + 'edit' => [ + 'title' => 'Edit :name', + 'heading' => 'Edit :name', + ], + ], + + 'tag' => [ + 'form' => [ + 'headings' => [ + 'general' => 'General', + ], + ], + + 'index' => [ + 'title' => 'All Categories', + 'heading' => 'All categories', + ], + 'edit' => [ + 'title' => 'Edit :name', + 'heading' => 'Edit :name', + ], + 'create' => [ + 'title' => 'Add a new category', + 'heading' => 'Add a new category', + ], + ], + + 'custom-field' => [ + 'form' => [ + 'headings' => [ + 'general' => 'General', + ], + 'captions' => [ + 'character-limit' => 'The maximum character limit for this field is 1024', + ], + ], + + 'index' => [ + 'title' => 'All custom fields', + 'heading' => 'All custom fields', + ], + 'create' => [ + 'title' => 'Add a new custom field', + 'heading' => 'Add a new custom field', + ], + 'edit' => [ + 'title' => 'Edit :title', + 'heading' => 'Edit :title', + ], + ], + + 'homepage-information' => [ + 'edit' => [ + 'title' => 'Edit homepage information', + 'heading' => 'Edit homepage information', + ], + ], + + 'notifications' => [ + 'title' => 'Update followers', + 'heading' => 'Send update to followers', + + 'form' => [ + 'tool' => 'Select a tool...', + 'subject' => 'Enter a subject for the e-mail', + 'message' => 'Type a message to the followers', + ], + ], + ], + + 'manage-our-tools' => [ + 'index' => [ + 'title' => 'Manage our tools', + ], + ], + + 'tool' => [ + 'index' => [ + 'title' => 'All tools', + 'heading' => 'Results (:count)', + ], + + 'tip' => [ + 'tip' => 'Tip', + 'title' => 'Looking for something else?', + 'text' => 'Is the tool you are looking for not listed? Send an email to the PEA support team.', + ], + + 'follow' => [ + 'button' => [ + 'following' => 'Unfollow', + 'not-following' => 'Follow', + ], + + 'tooltip' => [ + 'following' => 'Click this button to stop receiving updates related to this application', + 'not-following' => 'Click this button to receive updates related to this application', + ], + ], + ], + + 'content-page' => [ + 'form' => [ + 'headings' => [ + 'general' => 'General', + ], + ], + + 'index' => [ + 'title' => 'Content pages', + ], + + 'create' => [ + 'heading' => 'Add a new content page', + ], + + 'edit' => [ + 'title' => 'Edit :title', + 'heading' => 'Edit :title', + ], + ], + + 'admin' => [ + 'institutes' => [ + 'index' => [ + 'title' => 'Institutes', + 'heading' => 'Institutes', + ], + ], + ], +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..f0269c9 --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,8 @@ + '« Previous', + 'next' => 'Next »', +]; diff --git a/lang/en/tag.php b/lang/en/tag.php new file mode 100644 index 0000000..111af35 --- /dev/null +++ b/lang/en/tag.php @@ -0,0 +1,43 @@ + 'Tag', + 'plural' => 'Tags', + + 'index' => [ + 'heading' => 'Tags', + ], + + 'attributes' => [ + 'name' => 'Name', + 'type' => 'Type', + 'name_en' => 'Name (EN)', + 'name_nl' => 'Name (NL)', + 'description_en' => 'Description (EN)', + 'description_nl' => 'Description (NL)', + ], + + 'tag_types' => [ + TagTypes::FEATURES => 'Features', + TagTypes::SOFTWARE_TYPES => 'Software type', + TagTypes::DEVICES => 'Devices', + TagTypes::STANDARDS => 'Standards', + TagTypes::OPERATING_SYSTEMS => 'Operating system', + TagTypes::DATA_PROCESSING_LOCATIONS => 'Data processing location', + TagTypes::CERTIFICATIONS => 'Certifications', + TagTypes::WORKING_METHODS => 'Working methods', + TagTypes::TARGET_GROUPS => 'Target group', + TagTypes::COMPLEXITY => 'Complexity', + TagTypes::CATEGORIES => 'Categories', + ], + + 'filter' => [ + 'placeholder' => 'Select a filter', + 'select_label' => 'Click or enter to select', + 'selected_label' => 'Selected', + ], +]; diff --git a/lang/en/tool.php b/lang/en/tool.php new file mode 100644 index 0000000..d212288 --- /dev/null +++ b/lang/en/tool.php @@ -0,0 +1,109 @@ + 'Tool', + 'plural' => 'Tools', + + 'attributes' => [ + 'logo_filename' => 'Logo', + 'image_1_filename' => 'Image 1', + 'image_2_filename' => 'Image 2', + 'name' => 'Name', + 'supplier' => 'Supplier', + 'supplier_url' => 'Supplier URL', + 'description_short' => 'Short description', + 'description_short_en' => 'Short description (EN)', + 'description_short_nl' => 'Short description (NL)', + 'features' => 'Features', + 'addons' => 'Add-ons', + 'addons_en' => 'Add-ons (EN)', + 'addons_nl' => 'Add-ons (NL)', + 'updated_at' => 'Last updated', + + 'software_types' => 'Software type', + 'devices' => 'Devices', + 'system_requirements' => 'System requirements', + 'system_requirements_en' => 'System requirements (EN)', + 'system_requirements_nl' => 'System requirements (NL)', + 'standards' => 'Standards', + 'operating_systems' => 'Operating system', + + 'supplier_country' => 'Location organization', + 'supplier_country_display' => 'Location organization', + + 'personal_data' => 'Personal data', + 'personal_data_en' => 'Personal data (EN)', + 'personal_data_nl' => 'Personal data (NL)', + + 'data_processing_locations' => 'Data processing location', + 'privacy_policy_url' => 'Privacy policy - URL', + 'model_processor_agreement_url' => 'Model Processor Agreement - URL', + 'privacy_analysis' => 'Privacy Analysis', + 'supplier_agrees_with_surf_standards' => 'Supplier agrees with SURF Standards', + 'certifications' => 'Certifications', + 'dtia_by_external_url' => 'External DTIA - URL', + 'dpia_by_external_url' => 'External DPIA - URL', + 'jurisdiction' => 'Jurisdiction', + + 'instructions_manual_1_url' => 'Instruction and manual 1 - URL', + 'instructions_manual_1_url_en' => 'Instruction and manual 1 - URL (EN)', + 'instructions_manual_1_url_nl' => 'Instruction and manual 1 - URL (NL)', + 'instructions_manual_2_url' => 'Instruction and manual 2 - URL', + 'instructions_manual_2_url_en' => 'Instruction and manual 2 - URL (EN)', + 'instructions_manual_2_url_nl' => 'Instruction and manual 2 - URL (NL)', + 'instructions_manual_3_url' => 'Instruction and manual 3 - URL', + 'instructions_manual_3_url_en' => 'Instruction and manual 3 - URL (EN)', + 'instructions_manual_3_url_nl' => 'Instruction and manual 3 - URL (NL)', + 'support_for_teachers' => 'Support', + 'support_for_teachers_en' => 'Support (EN)', + 'support_for_teachers_nl' => 'Support (NL)', + 'availability_surf' => 'SURF offer', + 'accessibility_facilities' => 'Digital accessibility', + 'accessibility_facilities_en' => 'Digital accessibility (EN)', + 'accessibility_facilities_nl' => 'Digital accessibility (NL)', + + 'description_long' => 'What is it?', + 'description_long_en' => 'What is it? (EN)', + 'description_long_nl' => 'What is it (NL)', + 'use_for_education' => 'Use for education', + 'use_for_education_en' => 'Use for education (EN)', + 'use_for_education_nl' => 'Use for education (NL)', + 'working_methods' => 'Working methods', + 'target_groups' => 'Target group', + 'how_does_it_work' => 'How does it work', + 'how_does_it_work_en' => 'How does it work (EN)', + 'how_does_it_work_nl' => 'How does it work (NL)', + 'complexity' => 'Complexity', + 'has_concept' => 'Concept available', + + 'is_true' => 'Yes', + 'is_false' => 'No', + ], + + 'prefills' => [ + 'privacy_analysis' => 'Who are sub-processors and where are they located?

What data does the software share with other parties?

Is this shared data used for marketing purposes?

Does the company indicate what measures they take to protect the data?', + 'use_for_education' => 'How can you use it?

Pros and cons

Tips', + ], + + 'total_experiences' => 'Total experiences', + 'status' => 'Status', + + 'statuses' => [ + Status::CONCEPT => 'Concept', + Status::PUBLISHED => 'Published', + ], + + 'supplier_agrees_with_surf_standards' => [ + 'yes' => 'Ja', + 'no' => 'Nee', + ], + + 'has_concept' => [ + 'yes' => 'Yes', + 'no' => 'No', + ], +]; diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..69419c3 --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,210 @@ + '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.', + 'ascii' => 'The :attribute must only contain single-byte alphanumeric characters and symbols.', + '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.', + 'decimal' => 'The :attribute must have :decimal decimal places.', + '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.', + 'lowercase' => 'The :attribute must be lowercase.', + '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.', + 'missing' => 'The :attribute field must be missing.', + 'missing_if' => 'The :attribute field must be missing when :other is :value.', + 'missing_unless' => 'The :attribute field must be missing unless :other is :value.', + 'missing_with' => 'The :attribute field must be missing when :values is present.', + 'missing_with_all' => 'The :attribute field must be missing when :values are present.', + '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.', + 'uppercase' => 'The :attribute must be uppercase.', + 'url' => 'The :attribute must be a valid URL.', + 'ulid' => 'The :attribute must be a valid ULID.', + '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' => [ + ], + + /* + |-------------------------------------------------------------------------- + | 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' => [ + 'alternative_tools_ids' => 'alternative tools', + ], + + // Vendor validation rules + 'phone' => 'The :attribute must be valid for the selected country or use the international notation.', + + // Custom validation rules + 'db_string' => 'This field is longer than :length characters or no valid text', + 'db_text' => 'This field is longer than :length characters or no valid text', + 'valid_wizard_option' => 'The chosen :attribute is not valid for this quotation.', + 'various_not_together' => 'You can only choose 1 of the following options: :articleNumbers.', + 'various_mandatory_options_selected' => 'Since you have chosen BOSS steel, BOPW is mandatory.', + 'valid_arch_size' => 'The chosen arch size is not valid for this quotation.', + 'matches_active_account_email' => 'The email address or password is incorrect.', + 'postal_code' => 'This field must have the following format: 1234 AB', + 'vat_number' => 'This field does not contain a valid VAT number.', + 'chamber_of_commerce_number' => 'This field does not contain a valid Chamber of Commerce number.', + 'not_in_recent_passwords' => 'You cannot reuse your last :amount passwords', + 'csv_has_header' => 'The CSV file is missing a required column', + 'strong_password' => 'The password must contain the following: + at least 8 characters, a capital letter, a lowercase letter, + a number and a special character (! @ # $ % ^ & * _ -).', + 'wysiwyg' => [ + 'url' => 'Must be a valid URL. For example, https://www.google.com', + ], + 'uri' => ':attribute must be a valid URL.', + 'disallowed_alternative_tools' => 'The :tool has a disallowed status', +]; diff --git a/lintHook.sh b/lintHook.sh index 887a578..4c9cde2 100755 --- a/lintHook.sh +++ b/lintHook.sh @@ -17,7 +17,7 @@ if [ -f ~/.nvm/nvm.sh ]; then fi echo "====== Running linters =======" -nvm use 14 +nvm use 20 for app in admin do @@ -27,8 +27,8 @@ do if [ -f package.json ]; then find . -maxdepth 1 -name package.json | grep package > /dev/null 2>&1 if [ $? == 0 ]; then - echo "= NPM =" - npm install --no-ansi --no-color + echo "= PNPM install =" + pnpm install --frozen-lockfile --no-color if [ $? != 0 ]; then exit 1 fi diff --git a/modules/Way2Translate/Config/way2translate.php b/modules/Way2Translate/Config/way2translate.php index 6d51c58..2236119 100644 --- a/modules/Way2Translate/Config/way2translate.php +++ b/modules/Way2Translate/Config/way2translate.php @@ -8,11 +8,11 @@ 'locales' => [], 'cache-duration' => 30, 'register-breadcrumbs' => false, - 'editable-languages' => false, + 'editable-languages' => true, // The key is the namespace and the value is the actual folder 'language-folders' => [ - '*' => resource_path('lang'), + '*' => base_path('lang'), 'Way2Translate' => base_path('modules/Way2Translate/resources/lang'), ], diff --git a/modules/Way2Translate/Console/Commands/ExportTranslationsJsCommand.php b/modules/Way2Translate/Console/Commands/ExportTranslationsJsCommand.php index eb8e5a0..0781208 100644 --- a/modules/Way2Translate/Console/Commands/ExportTranslationsJsCommand.php +++ b/modules/Way2Translate/Console/Commands/ExportTranslationsJsCommand.php @@ -5,10 +5,11 @@ namespace Modules\Way2Translate\Console\Commands; use Illuminate\Console\Command; +use Illuminate\Contracts\Console\Isolatable; use Modules\Way2Translate\Generators\JsGenerator; use Modules\Way2Translate\Models\Translation; -class ExportTranslationsJsCommand extends Command +class ExportTranslationsJsCommand extends Command implements Isolatable { /** @var string */ protected $signature = 'w2w:export-translations-js'; diff --git a/modules/Way2Translate/Console/Commands/ImportTranslationsCommand.php b/modules/Way2Translate/Console/Commands/ImportTranslationsCommand.php index a349344..b9855dd 100644 --- a/modules/Way2Translate/Console/Commands/ImportTranslationsCommand.php +++ b/modules/Way2Translate/Console/Commands/ImportTranslationsCommand.php @@ -5,6 +5,7 @@ namespace Modules\Way2Translate\Console\Commands; use Illuminate\Console\Command; +use Illuminate\Contracts\Console\Isolatable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\File; use Modules\Way2Translate\Models\Language; @@ -17,7 +18,7 @@ * Heavily inspired by: * https://github.com/hpolthof/laravel-translations-db/blob/master/src/Console/Commands/FetchCommand.php */ -class ImportTranslationsCommand extends Command +class ImportTranslationsCommand extends Command implements Isolatable { /** @var string */ protected $signature = 'w2w:import-translations'; diff --git a/modules/Way2Translate/Controllers/TranslationsController.php b/modules/Way2Translate/Controllers/TranslationsController.php index faf12b2..37ac60c 100644 --- a/modules/Way2Translate/Controllers/TranslationsController.php +++ b/modules/Way2Translate/Controllers/TranslationsController.php @@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Event; use Illuminate\View\View; use Modules\Way2Translate\Events\ModifiedTranslations; +use Modules\Way2Translate\Helpers\Route; use Modules\Way2Translate\Models\Language; use Modules\Way2Translate\Models\Locale; use Modules\Way2Translate\Models\Translation; @@ -21,12 +22,12 @@ class TranslationsController extends BaseController /** @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse */ public function index() { - $this->authorize('viewAny', Translation::class); - if (!Translation::hasDefaultTranslations()) { return redirect()->route('way2translate.missing-translations'); } + $this->authorize('viewAny', Translation::class); + return view('way2translate::index', [ 'translatedLocales' => Locale::getTranslated(), 'nonTranslatedLocalesTarget' => Locale::getNonTranslated()->pluck('name', 'code'), @@ -77,7 +78,7 @@ public function add(Request $request): RedirectResponse $localeTarget = $request->get('locale_target'); $translations = Translation::where('locale', Config::get('way2translate.default-locale'))->get(); - if (empty($translations)) { + if ($translations->isEmpty()) { return redirect()->route('way2translate.index'); } @@ -130,7 +131,7 @@ public function groupSave(Request $request, string $localeCode, string $group, s if (!empty($request->get('value'))) { foreach ($request->get('value') as $id => $value) { - Translation::where('id', $id)->update(['value' => $value]); + Translation::where('id', $id)->update(['value' => $value ?? '']); } } @@ -139,6 +140,7 @@ public function groupSave(Request $request, string $localeCode, string $group, s Event::dispatch(new ModifiedTranslations($localeCode, $group, $namespace)); Locale::clearCache(); + Route::clearCache(); if (config('way2translate.js-translations.auto-generate')) { Artisan::call('w2w:export-translations-js'); diff --git a/modules/Way2Translate/Generators/JsGenerator.php b/modules/Way2Translate/Generators/JsGenerator.php index b3d514c..020e0c4 100644 --- a/modules/Way2Translate/Generators/JsGenerator.php +++ b/modules/Way2Translate/Generators/JsGenerator.php @@ -22,6 +22,40 @@ public function __construct() $this->file = App::get('files'); } + public static function fromFileOrDatabase(): string + { + $filePath = config('way2translate.js-translations.path-absolute'); + if (file_exists($filePath)) { + return file_get_contents($filePath); + } + + return (new self())->content(); + } + + public function content(): string + { + $messages = $this->getMessagesFromDatabase(); + + $target = config('way2translate.js-translations.path-absolute'); + $this->prepareTarget($target); + + $template = $this->file->get(__DIR__ . '/Templates/langjs-with-messages.js'); + + $langjs = ''; + if (config('way2translate.js-translations.include-lang-js')) { + $langjs = $this->file->get(__DIR__ . '/Lib/lang.min.js'); + } + + $template = str_replace('\'{ langjs }\';', $langjs, $template); + $template = str_replace('\'{ messages }\'', json_encode($messages), $template); + + if (config('way2translate.js-translations.minify-js')) { + $template = Minifier::minify($template); + } + + return $template; + } + public function generate(bool $fromDatabase = true): int { if ($fromDatabase) { @@ -93,7 +127,7 @@ protected function getMessagesFromFilesystem(): array foreach ($folders as $namespace => $folder) { $path = $folder . DIRECTORY_SEPARATOR . $locale; if (!$this->file->exists($path)) { - throw new Exception($path . 'does not exists!'); + throw new Exception($path . ' does not exist!'); } foreach ($this->file->allFiles($path) as $file) { diff --git a/modules/Way2Translate/Helpers/Route.php b/modules/Way2Translate/Helpers/Route.php new file mode 100644 index 0000000..fcd9962 --- /dev/null +++ b/modules/Way2Translate/Helpers/Route.php @@ -0,0 +1,20 @@ + */ protected $fillable = [ 'locale', ]; - /** @var array */ - protected $dates = [ - 'activated_at', - 'created_at', - 'updated_at', + /** @var array */ + protected $casts = [ + 'activated_at' => 'immutable_datetime', ]; + protected static function newFactory(): Factory + { + return LanguageFactory::new(); + } + public static function activate(string $localeCode): void { if (self::where('locale', $localeCode)->doesntExist()) { diff --git a/modules/Way2Translate/Models/Locale.php b/modules/Way2Translate/Models/Locale.php index 739aa05..347f69b 100644 --- a/modules/Way2Translate/Models/Locale.php +++ b/modules/Way2Translate/Models/Locale.php @@ -38,7 +38,7 @@ function () { $allLocales[] = $locale; } - return collect($allLocales)->sortBy('name'); + return (new Collection($allLocales))->sortBy('name'); } ); } @@ -57,7 +57,7 @@ public static function getByCode(string $code): array { $allLocales = self::get(); - return $allLocales->where('code', $code)->first(); + return (array) $allLocales->where('code', $code)->first(); } public static function getActive(): Collection diff --git a/modules/Way2Translate/Models/Translation.php b/modules/Way2Translate/Models/Translation.php index a58df75..59ee7c8 100644 --- a/modules/Way2Translate/Models/Translation.php +++ b/modules/Way2Translate/Models/Translation.php @@ -17,7 +17,7 @@ class Translation extends Model /** @var string */ protected $table = 'way2translate_translations'; - /** @var array */ + /** @var array */ protected $fillable = [ 'namespace', 'locale', @@ -28,12 +28,6 @@ class Translation extends Model 'in_latest_import', ]; - /** @var array */ - protected $dates = [ - 'created_at', - 'updated_at', - ]; - public function scopeForContext(Builder $query, string $locale, string $namespace, string $group): void { $query->where('locale', $locale) diff --git a/modules/Way2Translate/Providers/Way2TranslateProvider.php b/modules/Way2Translate/Providers/Way2TranslateProvider.php index 8f4aad4..2f21fbe 100644 --- a/modules/Way2Translate/Providers/Way2TranslateProvider.php +++ b/modules/Way2Translate/Providers/Way2TranslateProvider.php @@ -4,7 +4,6 @@ namespace Modules\Way2Translate\Providers; -use Diglactic\Breadcrumbs\Breadcrumbs; use Illuminate\Routing\Router; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\DB; @@ -64,14 +63,12 @@ private function loadLocales(): void ->select('locale') ->get(); - if (!empty($dbActivatedLocales)) { - foreach ($dbActivatedLocales as $activatedLocale) { - if (!isset($allLocales[$activatedLocale->locale])) { - continue; - } - - $availableLocales[$activatedLocale->locale] = $allLocales[$activatedLocale->locale]; + foreach ($dbActivatedLocales as $activatedLocale) { + if (!isset($allLocales[$activatedLocale->locale])) { + continue; } + + $availableLocales[$activatedLocale->locale] = $allLocales[$activatedLocale->locale]; } // we must have the active locale @@ -100,8 +97,6 @@ public function boot(Router $router, CacheService $cacheService): void $this->loadViewsFrom(__DIR__ . '/../Views', 'way2translate'); - $this->registerBreadcrumbs(); - $router->aliasMiddleware('non-editable-languages', NonEditableLanguages::class); View::composer('way2translate::*', function ($view): void { @@ -118,30 +113,4 @@ public function boot(Router $router, CacheService $cacheService): void $cacheService->enforceCacheIntegrity(); } } - - private function registerBreadcrumbs(): void - { - $registerBreadcrumbs = config('way2translate.register-breadcrumbs'); - $languagesAreEditable = config('way2translate.editable-languages'); - $breadcrumbsExist = class_exists('Breadcrumbs'); - - if (!$registerBreadcrumbs || !$languagesAreEditable || !$breadcrumbsExist) { - return; - } - - Breadcrumbs::register('way2translate.index', function ($breadcrumbs): void { - $breadcrumbs->push( - trans('Way2Translate::page.manage-translations'), - route('way2translate.index') - ); - }); - - Breadcrumbs::register('way2translate.group.index', function ($breadcrumbs, $localeCode, $group = null): void { - $breadcrumbs->parent('way2translate.index'); - $breadcrumbs->push( - trans('Way2Translate::page.group-translations'), - route('way2translate.group.index', [$localeCode, $group]) - ); - }); - } } diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/disable.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/disable.blade.php new file mode 100644 index 0000000..f7bd6b3 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/disable.blade.php @@ -0,0 +1,12 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/enable.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/enable.blade.php new file mode 100644 index 0000000..9c762c9 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/enable.blade.php @@ -0,0 +1,12 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/link.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/link.blade.php new file mode 100644 index 0000000..90f50c1 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/link.blade.php @@ -0,0 +1,13 @@ + + {{ $slot }} + + diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/primary.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/primary.blade.php new file mode 100644 index 0000000..0766b13 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/primary.blade.php @@ -0,0 +1,12 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/submit.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/submit.blade.php new file mode 100644 index 0000000..450bfeb --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/buttons/submit.blade.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/form/error.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/form/error.blade.php new file mode 100644 index 0000000..d82b190 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/form/error.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/form/group.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/form/group.blade.php new file mode 100644 index 0000000..57a4554 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/form/group.blade.php @@ -0,0 +1,3 @@ +
+ {{ $slot }} +
diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-heading.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-heading.blade.php new file mode 100644 index 0000000..df7041e --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-heading.blade.php @@ -0,0 +1 @@ +

{{ $heading }}

diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-item.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-item.blade.php new file mode 100644 index 0000000..bc6928c --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group-item.blade.php @@ -0,0 +1,10 @@ + + {{ $item }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group.blade.php new file mode 100644 index 0000000..a68ddd7 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/list/group.blade.php @@ -0,0 +1,3 @@ +
+ {{ $slot }} +
\ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/progress/bar.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/progress/bar.blade.php new file mode 100644 index 0000000..86abaab --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/progress/bar.blade.php @@ -0,0 +1,10 @@ +
+
+ {{ $currentPercentage }}% +
+
\ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/table/row.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/row.blade.php new file mode 100644 index 0000000..8e6aef3 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/row.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/table/table.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/table.blade.php new file mode 100644 index 0000000..c4550cf --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/table.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} +
\ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/table/tbody.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/tbody.blade.php new file mode 100644 index 0000000..e7ec96c --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/tbody.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/table/td.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/td.blade.php new file mode 100644 index 0000000..e431f49 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/td.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/table/th.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/th.blade.php new file mode 100644 index 0000000..3ee32a2 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/th.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/components/table/thead.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/thead.blade.php new file mode 100644 index 0000000..bd09b2e --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/components/table/thead.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/master.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/master.blade.php new file mode 100644 index 0000000..b4c5d99 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/master.blade.php @@ -0,0 +1,20 @@ +@extends('way2translate::master') + +@section('way2translate') +
+
+
+

@yield('heading')

+
+
+ @yield('body') +
+ + @if (view()->hasSection('actions')) + + @endif +
+
+@endsection diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/pages/error.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/pages/error.blade.php new file mode 100644 index 0000000..4bc00c4 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/pages/error.blade.php @@ -0,0 +1,7 @@ +@extends($themesPath . '.bootstrap-3.master') + +@section('body') +

+ @yield('text') +

+@endsection \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/pages/group.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/pages/group.blade.php new file mode 100644 index 0000000..12c03f0 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/pages/group.blade.php @@ -0,0 +1,21 @@ +@extends($themesPath . '.bootstrap-3.master') + +@section('body') +
+
+ @yield('groups') + +
@yield('progress-bar-heading')
+ @yield('progress-bar') +
+
+ @yield('translations-table') +
+
+@endsection + +@section('actions') + @yield('back-button') + + @yield('save-button') +@endsection \ No newline at end of file diff --git a/modules/Way2Translate/Views/themes/bootstrap-3/pages/index.blade.php b/modules/Way2Translate/Views/themes/bootstrap-3/pages/index.blade.php new file mode 100644 index 0000000..06388d7 --- /dev/null +++ b/modules/Way2Translate/Views/themes/bootstrap-3/pages/index.blade.php @@ -0,0 +1,16 @@ +@extends($themesPath . '.bootstrap-3.master') + +@section('body') +
+
+

@yield('translations-heading')

+ + @yield('translations-table') +
+
+

@yield('new-language-heading')

+ + @yield('new-language-form') +
+
+@endsection \ No newline at end of file diff --git a/modules/Way2Translate/breadcrumbs.php b/modules/Way2Translate/breadcrumbs.php new file mode 100644 index 0000000..a184c97 --- /dev/null +++ b/modules/Way2Translate/breadcrumbs.php @@ -0,0 +1,50 @@ +push( + trans('Way2Translate::page.manage-translations'), + route('way2translate.index') + ); + } +); + +\Diglactic\Breadcrumbs\Breadcrumbs::for( + 'way2translate.group.index', + function ($breadcrumbs, $localeCode, $group = null): void { + $breadcrumbs->parent('way2translate.index'); + $breadcrumbs->push( + trans('Way2Translate::page.group-translations'), + route('way2translate.group.index', [$localeCode, $group]) + ); + } +); + +\Diglactic\Breadcrumbs\Breadcrumbs::for( + 'way2translate.missing-translations', + function ($breadcrumbs): void { + $breadcrumbs->push( + trans('Way2Translate::page.missing-translations'), + route('way2translate.missing-translations') + ); + } +); diff --git a/modules/Way2Translate/routes.php b/modules/Way2Translate/routes.php index 6b98583..3ec12a7 100644 --- a/modules/Way2Translate/routes.php +++ b/modules/Way2Translate/routes.php @@ -2,8 +2,12 @@ declare(strict_types=1); +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Route; use Modules\Way2Translate\Controllers\TranslationsController; +use Modules\Way2Translate\Generators\JsGenerator; +use Modules\Way2Translate\Helpers\Route as RouteHelper; Route::group( [ @@ -49,3 +53,30 @@ function (): void { ); } ); +Route::group( + [ + 'prefix' => 'way2translate', + 'as' => 'way2translate.', + ], + function (): void { + Route::get('lang', function () { + if (App::environment('local')) { + $lang = JsGenerator::fromFileOrDatabase(); + } else { + $lang = Cache::remember( + RouteHelper::getCacheKey(), + 60000, + function () { + return (new JsGenerator())->content(); + } + ); + } + + $response = response($lang, 200); + $response->header('Content-Type', 'application/javascript'); + + return $response; + }) + ->name('lang'); + } +); diff --git a/phpstan.neon b/phpstan.neon index 7b31243..d3d499b 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -13,22 +13,35 @@ parameters: - routes ignoreErrors: - # Macro support false positives - - '#Call to static method register\(\) on an unknown class Diglactic\\Breadcrumbs\\Breadcrumbs.#' + # Mixed issues + - '#Cannot call method (.*) on mixed.#' + - '#Cannot access offset (.*) on mixed.#' + - '#Argument of an invalid type mixed supplied for foreach, only iterables are supported.#' + - '#Cannot cast mixed to (.*).#' + - '#Cannot access property (.*) on mixed.#' + + # Spatie tags model is hard type hinted but we override it + - '#expects Spatie\\Tags\\Tag.#' # Unexplainable false positives - - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\|Illuminate\Database\\Eloquent\\Model::(.*)\(\).#' - - '#(.*) \(App\\Models\\(.*)\) does not accept Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model.#' - - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Factories\\Factory::(.*)\(\)#' - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Builder::(.*).#' - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany::(.*).#' # Mockery causes issues - - '#Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage::(.*).#' - - '#Parameter (.*) expects (.*), Mockery\\LegacyMockInterface given.#' + - message: '#Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage::(.*).#' + paths: + - tests/**/* + + - message: '#Parameter (.*) expects (.*), Mockery\\LegacyMockInterface given.#' + paths: + - tests/**/* + + - identifier: missingType.iterableValue + - identifier: missingType.generics + - checkMissingIterableValueType: false checkUnionTypes: false + checkModelProperties: true universalObjectCratesClasses: # This can be removed once we start annotating our models, otherwise properties and methods can not be resolved properly diff --git a/public/dist/admin/images/surf-logo.svg b/public/dist/admin/images/surf-logo.svg new file mode 100644 index 0000000..9eb00e7 --- /dev/null +++ b/public/dist/admin/images/surf-logo.svg @@ -0,0 +1 @@ + diff --git a/public_html/favicon.ico b/public/favicon.ico similarity index 100% rename from public_html/favicon.ico rename to public/favicon.ico diff --git a/public_html/index.php b/public/index.php similarity index 100% rename from public_html/index.php rename to public/index.php diff --git a/public_html/robots.txt b/public/robots.txt similarity index 100% rename from public_html/robots.txt rename to public/robots.txt diff --git a/public_html/svg/403.svg b/public/svg/403.svg similarity index 100% rename from public_html/svg/403.svg rename to public/svg/403.svg diff --git a/public_html/svg/404.svg b/public/svg/404.svg similarity index 100% rename from public_html/svg/404.svg rename to public/svg/404.svg diff --git a/public_html/svg/500.svg b/public/svg/500.svg similarity index 100% rename from public_html/svg/500.svg rename to public/svg/500.svg diff --git a/public_html/svg/503.svg b/public/svg/503.svg similarity index 100% rename from public_html/svg/503.svg rename to public/svg/503.svg diff --git a/public_html/svg/support-icon.svg b/public/svg/support-icon.svg similarity index 100% rename from public_html/svg/support-icon.svg rename to public/svg/support-icon.svg diff --git a/public_html/uploads/.gitignore b/public/uploads/.gitignore similarity index 100% rename from public_html/uploads/.gitignore rename to public/uploads/.gitignore diff --git a/public_html/vendor/telescope/app-dark.css b/public_html/vendor/telescope/app-dark.css deleted file mode 100644 index 18b1f26..0000000 --- a/public_html/vendor/telescope/app-dark.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8"; -/*! - * Bootstrap v4.6.0 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#494444;--primary:#adadff;--secondary:#494444;--success:#1f9d55;--info:#1c3d5a;--warning:#684f1d;--danger:#621b18;--light:#f8f9fa;--dark:#494444;--breakpoint-xs:0;--breakpoint-sm:2px;--breakpoint-md:8px;--breakpoint-lg:9px;--breakpoint-xl:10px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#1c1c1c;color:#e2edf4;font-family:Nunito,sans-serif;font-size:.95rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#adadff;text-decoration:none}a:hover{color:#6161ff;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6c757d;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.375rem}.h2,h2{font-size:1.9rem}.h3,h3{font-size:1.6625rem}.h4,h4{font-size:1.425rem}.h5,h5{font-size:1.1875rem}.h6,h6{font-size:.95rem}.lead{font-size:1.1875rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:80%;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.1875rem;margin-bottom:1rem}.blockquote-footer{color:#6c757d;display:block;font-size:80%}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#1c1c1c;border:1px solid #dee2e6;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#6c757d;font-size:90%}code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>code{color:inherit}kbd{background-color:#212529;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:700;padding:0}pre{color:#212529;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:2px){.container,.container-sm{max-width:1137px}}@media (min-width:8px){.container,.container-md,.container-sm{max-width:1138px}}@media (min-width:9px){.container,.container-lg,.container-md,.container-sm{max-width:1139px}}@media (min-width:10px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:2px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:8px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:9px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:10px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{color:#e2edf4;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #343434;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #343434;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #343434}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #343434}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:#343434;color:#e2edf4}.table-primary,.table-primary>td,.table-primary>th{background-color:#e8e8ff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#d4d4ff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#cfcfff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#cccbcb}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#a09e9e}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#bfbebe}.table-success,.table-success>td,.table-success>th{background-color:#c0e4cf}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8bcca7}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aedcc1}.table-info,.table-info>td,.table-info>th{background-color:#bfc9d1}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#899aa9}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#b0bcc6}.table-warning,.table-warning>td,.table-warning>th{background-color:#d5cec0}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#b0a389}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#cbc2b1}.table-danger,.table-danger>td,.table-danger>th{background-color:#d3bfbe}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ad8887}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#c9b0af}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#cccbcb}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#a09e9e}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#bfbebe}.table-active,.table-active>td,.table-active>th{background-color:#343434}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#272727}.table .thead-dark th{background-color:#494444;border-color:#5d5656;color:#fff}.table .thead-light th{background-color:#e9ecef;border-color:#343434;color:#495057}.table-dark{background-color:#494444;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#5d5656}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:1.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:7.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:8.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:9.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#242424;border:1px solid #343434;border-radius:.25rem;color:#e2edf4;display:block;font-size:.95rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #e2edf4}.form-control:focus{background-color:#242424;border-color:#fff;box-shadow:0 0 0 .2rem rgba(173,173,255,.25);color:#e2edf4;outline:0}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{background-color:#242424;color:#e2edf4}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.1875rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.83125rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#e2edf4;display:block;font-size:.95rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.83125rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:.3rem;font-size:1.1875rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#1f9d55;display:none;font-size:80%;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(31,157,85,.9);border-radius:.25rem;color:#fff;display:none;font-size:.83125rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%231f9d55' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#1f9d55;padding-right:calc(1.5em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#1f9d55;box-shadow:0 0 0 .2rem rgba(31,157,85,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23494444' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#242424 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%231f9d55' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#1f9d55;padding-right:calc(.75em + 2.3125rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#1f9d55;box-shadow:0 0 0 .2rem rgba(31,157,85,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#1f9d55}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#1f9d55}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#1f9d55}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#27c86c;border-color:#27c86c}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(31,157,85,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#1f9d55}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#1f9d55}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#1f9d55;box-shadow:0 0 0 .2rem rgba(31,157,85,.25)}.invalid-feedback{color:#621b18;display:none;font-size:80%;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(98,27,24,.9);border-radius:.25rem;color:#fff;display:none;font-size:.83125rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23621b18'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23621b18' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#621b18;padding-right:calc(1.5em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#621b18;box-shadow:0 0 0 .2rem rgba(98,27,24,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23494444' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#242424 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23621b18'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23621b18' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#621b18;padding-right:calc(.75em + 2.3125rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#621b18;box-shadow:0 0 0 .2rem rgba(98,27,24,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#621b18}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#621b18}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#621b18}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#8b2622;border-color:#8b2622}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(98,27,24,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#621b18}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#621b18}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#621b18;box-shadow:0 0 0 .2rem rgba(98,27,24,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:2px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#e2edf4;display:inline-block;font-size:.95rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#e2edf4;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(173,173,255,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#adadff;border-color:#adadff;color:#212529}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#8787ff;border-color:#7a7aff;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(152,153,223,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#adadff;border-color:#adadff;color:#212529}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#7a7aff;border-color:#6d6dff;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(152,153,223,.5)}.btn-secondary{background-color:#494444;border-color:#494444;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#353232;border-color:#2f2b2b;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem hsla(0,2%,38%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#494444;border-color:#494444;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#2f2b2b;border-color:#282525;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(0,2%,38%,.5)}.btn-success{background-color:#1f9d55;border-color:#1f9d55;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#197d44;border-color:#17723e;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(65,172,111,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#1f9d55;border-color:#1f9d55;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#17723e;border-color:#146838;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(65,172,111,.5)}.btn-info{background-color:#1c3d5a;border-color:#1c3d5a;color:#fff}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#13293d;border-color:#102333;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(62,90,115,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#1c3d5a;border-color:#1c3d5a;color:#fff}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#102333;border-color:#0d1c29;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(62,90,115,.5)}.btn-warning{background-color:#684f1d;border-color:#684f1d;color:#fff}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#4a3815;border-color:#403112;color:#fff}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(127,105,63,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#684f1d;border-color:#684f1d;color:#fff}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#403112;border-color:#36290f;color:#fff}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(127,105,63,.5)}.btn-danger{background-color:#621b18;border-color:#621b18;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#431310;border-color:#39100e;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(122,61,59,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#621b18;border-color:#621b18;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#39100e;border-color:#2f0d0b;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(122,61,59,.5)}.btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5)}.btn-dark{background-color:#494444;border-color:#494444;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#353232;border-color:#2f2b2b;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem hsla(0,2%,38%,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#494444;border-color:#494444;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#2f2b2b;border-color:#282525;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(0,2%,38%,.5)}.btn-outline-primary{border-color:#adadff;color:#adadff}.btn-outline-primary:hover{background-color:#adadff;border-color:#adadff;color:#212529}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(173,173,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#adadff}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#adadff;border-color:#adadff;color:#212529}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(173,173,255,.5)}.btn-outline-secondary{border-color:#494444;color:#494444}.btn-outline-secondary:hover{background-color:#494444;border-color:#494444;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(73,68,68,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#494444}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#494444;border-color:#494444;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(73,68,68,.5)}.btn-outline-success{border-color:#1f9d55;color:#1f9d55}.btn-outline-success:hover{background-color:#1f9d55;border-color:#1f9d55;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(31,157,85,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#1f9d55}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#1f9d55;border-color:#1f9d55;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(31,157,85,.5)}.btn-outline-info{border-color:#1c3d5a;color:#1c3d5a}.btn-outline-info:hover{background-color:#1c3d5a;border-color:#1c3d5a;color:#fff}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(28,61,90,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#1c3d5a}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#1c3d5a;border-color:#1c3d5a;color:#fff}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(28,61,90,.5)}.btn-outline-warning{border-color:#684f1d;color:#684f1d}.btn-outline-warning:hover{background-color:#684f1d;border-color:#684f1d;color:#fff}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(104,79,29,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#684f1d}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#684f1d;border-color:#684f1d;color:#fff}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(104,79,29,.5)}.btn-outline-danger{border-color:#621b18;color:#621b18}.btn-outline-danger:hover{background-color:#621b18;border-color:#621b18;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(98,27,24,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#621b18}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#621b18;border-color:#621b18;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(98,27,24,.5)}.btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{border-color:#494444;color:#494444}.btn-outline-dark:hover{background-color:#494444;border-color:#494444;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(73,68,68,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#494444}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#494444;border-color:#494444;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(73,68,68,.5)}.btn-link{color:#adadff;font-weight:400;text-decoration:none}.btn-link:hover{color:#6161ff}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:.3rem;font-size:1.1875rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.83125rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#181818;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#e2edf4;display:none;float:left;font-size:.95rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:2px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:8px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:9px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:10px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e9ecef;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#fff;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e9ecef;color:#16181b;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#adadff;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#adb5bd;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#6c757d;display:block;font-size:.83125rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#fff;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e9ecef;border:1px solid #343434;border-radius:.25rem;color:#e2edf4;display:flex;font-size:.95rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:.3rem;font-size:1.1875rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.83125rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{-webkit-print-color-adjust:exact;color-adjust:exact;display:block;min-height:1.425rem;padding-left:1.5rem;position:relative;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.2125rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#adadff;border-color:#adadff;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(173,173,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#fff}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#fff;border-color:#fff;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#242424;border:1px solid #adb5bd;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.2125rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#adadff;border-color:#adadff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(173,173,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(173,173,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(173,173,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#adb5bd;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.2125rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#242424;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(173,173,255,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#242424 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23494444' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #343434;border-radius:.25rem;color:#e2edf4;display:inline-block;font-size:.95rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#fff;box-shadow:0 0 0 .2rem rgba(173,173,255,.25);outline:0}.custom-select:focus::-ms-value{background-color:#242424;color:#e2edf4}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e9ecef;color:#6c757d}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #e2edf4}.custom-select-sm{font-size:.83125rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.1875rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#fff;box-shadow:0 0 0 .2rem rgba(173,173,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#242424;border:1px solid #343434;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#e2edf4;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #1c1c1c,0 0 0 .2rem rgba(173,173,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #1c1c1c,0 0 0 .2rem rgba(173,173,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #1c1c1c,0 0 0 .2rem rgba(173,173,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#adadff;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#fff}.custom-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#adadff;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#fff}.custom-range::-moz-range-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#adadff;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#fff}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#6c757d}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#1c1c1c;border-color:#dee2e6 #dee2e6 #1c1c1c;color:#495057}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#adadff;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.1875rem;line-height:inherit;margin-right:1rem;padding-bottom:.321875rem;padding-top:.321875rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.1875rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:1.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:2px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:7.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:8px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:8.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:9px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:9.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:10px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#120f12;border:1px solid rgba(0,0,0,.125);border-radius:.25rem;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:#120f12;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{background-color:#120f12;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:calc(.25rem - 1px);bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:2px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:2px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:2px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e9ecef;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#6c757d;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #dee2e6;color:#adadff;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e9ecef;border-color:#dee2e6;color:#6161ff;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(173,173,255,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#adadff;border-color:#adadff;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#dee2e6;color:#6c757d;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.1875rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{font-size:.83125rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:.95rem;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#adadff;color:#212529}a.badge-primary:focus,a.badge-primary:hover{background-color:#7a7aff;color:#212529}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(173,173,255,.5);outline:0}.badge-secondary{background-color:#494444;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#2f2b2b;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem rgba(73,68,68,.5);outline:0}.badge-success{background-color:#1f9d55;color:#fff}a.badge-success:focus,a.badge-success:hover{background-color:#17723e;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(31,157,85,.5);outline:0}.badge-info{background-color:#1c3d5a;color:#fff}a.badge-info:focus,a.badge-info:hover{background-color:#102333;color:#fff}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(28,61,90,.5);outline:0}.badge-warning{background-color:#684f1d;color:#fff}a.badge-warning:focus,a.badge-warning:hover{background-color:#403112;color:#fff}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(104,79,29,.5);outline:0}.badge-danger{background-color:#621b18;color:#fff}a.badge-danger:focus,a.badge-danger:hover{background-color:#39100e;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(98,27,24,.5);outline:0}.badge-light{background-color:#f8f9fa;color:#212529}a.badge-light:focus,a.badge-light:hover{background-color:#dae0e5;color:#212529}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5);outline:0}.badge-dark{background-color:#494444;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#2f2b2b;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(73,68,68,.5);outline:0}.jumbotron{background-color:#e9ecef;border-radius:.3rem;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:2px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.925rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#efefff;border-color:#e8e8ff;color:#5a5a85}.alert-primary hr{border-top-color:#cfcfff}.alert-primary .alert-link{color:#454567}.alert-secondary{background-color:#dbdada;border-color:#cccbcb;color:#262323}.alert-secondary hr{border-top-color:#bfbebe}.alert-secondary .alert-link{color:#0b0b0b}.alert-success{background-color:#d2ebdd;border-color:#c0e4cf;color:#10522c}.alert-success hr{border-top-color:#aedcc1}.alert-success .alert-link{color:#082715}.alert-info{background-color:#d2d8de;border-color:#bfc9d1;color:#0f202f}.alert-info hr{border-top-color:#b0bcc6}.alert-info .alert-link{color:#030608}.alert-warning{background-color:#e1dcd2;border-color:#d5cec0;color:#36290f}.alert-warning hr{border-top-color:#cbc2b1}.alert-warning .alert-link{color:#0e0b04}.alert-danger{background-color:#e0d1d1;border-color:#d3bfbe;color:#330e0c}.alert-danger hr{border-top-color:#c9b0af}.alert-danger .alert-link{color:#0a0302}.alert-light{background-color:#fefefe;border-color:#fdfdfe;color:#818182}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{background-color:#dbdada;border-color:#cccbcb;color:#262323}.alert-dark hr{border-top-color:#bfbebe}.alert-dark .alert-link{color:#0b0b0b}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e9ecef;border-radius:.25rem;font-size:.7125rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#adadff;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#495057;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f8f9fa;color:#495057;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e9ecef;color:#e2edf4}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#6c757d;pointer-events:none}.list-group-item.active{background-color:#adadff;border-color:#adadff;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:2px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:8px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:9px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:10px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#e8e8ff;color:#5a5a85}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#cfcfff;color:#5a5a85}.list-group-item-primary.list-group-item-action.active{background-color:#5a5a85;border-color:#5a5a85;color:#fff}.list-group-item-secondary{background-color:#cccbcb;color:#262323}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#bfbebe;color:#262323}.list-group-item-secondary.list-group-item-action.active{background-color:#262323;border-color:#262323;color:#fff}.list-group-item-success{background-color:#c0e4cf;color:#10522c}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#aedcc1;color:#10522c}.list-group-item-success.list-group-item-action.active{background-color:#10522c;border-color:#10522c;color:#fff}.list-group-item-info{background-color:#bfc9d1;color:#0f202f}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#b0bcc6;color:#0f202f}.list-group-item-info.list-group-item-action.active{background-color:#0f202f;border-color:#0f202f;color:#fff}.list-group-item-warning{background-color:#d5cec0;color:#36290f}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#cbc2b1;color:#36290f}.list-group-item-warning.list-group-item-action.active{background-color:#36290f;border-color:#36290f;color:#fff}.list-group-item-danger{background-color:#d3bfbe;color:#330e0c}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#c9b0af;color:#330e0c}.list-group-item-danger.list-group-item-action.active{background-color:#330e0c;border-color:#330e0c;color:#fff}.list-group-item-light{background-color:#fdfdfe;color:#818182}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#ececf6;color:#818182}.list-group-item-light.list-group-item-action.active{background-color:#818182;border-color:#818182;color:#fff}.list-group-item-dark{background-color:#cccbcb;color:#262323}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#bfbebe;color:#262323}.list-group-item-dark.list-group-item-action.active{background-color:#262323;border-color:#262323;color:#fff}.close{color:#000;float:right;font-size:1.425rem;font-weight:700;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#6c757d;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#181818;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#7e7e7e;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #343434;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.5;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px);border-top:1px solid #343434;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:2px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:9px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:10px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Nunito,sans-serif;font-size:.83125rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;font-family:Nunito,sans-serif;font-size:.83125rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 .3rem;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:.95rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#e2edf4;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:text-bottom;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite;background-color:currentColor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:text-bottom;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#adadff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#7a7aff!important}.bg-secondary{background-color:#494444!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#2f2b2b!important}.bg-success{background-color:#1f9d55!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#17723e!important}.bg-info{background-color:#1c3d5a!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#102333!important}.bg-warning{background-color:#684f1d!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#403112!important}.bg-danger{background-color:#621b18!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#39100e!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#494444!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#2f2b2b!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #efefef!important}.border-top{border-top:1px solid #efefef!important}.border-right{border-right:1px solid #efefef!important}.border-bottom{border-bottom:1px solid #efefef!important}.border-left{border-left:1px solid #efefef!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#adadff!important}.border-secondary{border-color:#494444!important}.border-success{border-color:#1f9d55!important}.border-info{border-color:#1c3d5a!important}.border-warning{border-color:#684f1d!important}.border-danger{border-color:#621b18!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#494444!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:2px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:8px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:9px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:10px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.8571428571%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:2px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:8px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:9px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:10px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:2px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:8px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:9px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:10px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:2px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:8px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:9px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:10px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:2px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:8px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:9px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:10px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#adadff!important}a.text-primary:focus,a.text-primary:hover{color:#6161ff!important}.text-secondary{color:#494444!important}a.text-secondary:focus,a.text-secondary:hover{color:#211f1f!important}.text-success{color:#1f9d55!important}a.text-success:focus,a.text-success:hover{color:#125d32!important}.text-info{color:#1c3d5a!important}a.text-info:focus,a.text-info:hover{color:#0a1520!important}.text-warning{color:#684f1d!important}a.text-warning:focus,a.text-warning:hover{color:#2c220c!important}.text-danger{color:#621b18!important}a.text-danger:focus,a.text-danger:hover{color:#250a09!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#494444!important}a.text-dark:focus,a.text-dark:hover{color:#211f1f!important}.text-body{color:#e2edf4!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:9px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#343434}.table .thead-dark th{border-color:#343434;color:inherit}}.vjs-tree{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.vjs-tree .vjs-tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs-tree .vjs-tree__node{cursor:pointer}.vjs-tree .vjs-tree__node:hover{color:#20a0ff}.vjs-tree .vjs-checkbox{left:-30px;position:absolute}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__null,.vjs-tree .vjs-value__number{color:#a291f5!important}.vjs-tree .vjs-value__string{color:#dacb4d!important}.hljs-addition,.hljs-attr,.hljs-keyword,.hljs-selector-tag{color:#13ce66}.hljs-bullet,.hljs-meta,.hljs-name,.hljs-string,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable{color:#dacb4d}.hljs-comment,.hljs-deletion,.hljs-quote{color:#bfcbd9}.hljs-literal,.hljs-number,.hljs-title{color:#a291f5!important}body{padding-bottom:20px}.container{width:1140px}html{min-width:1140px}[v-cloak]{display:none}svg.icon{height:1rem;width:1rem}.header{border-bottom:1px solid #343434}.header svg.logo{height:1.7rem;width:1.7rem}.sidebar .nav-item a{color:#6e6b6b;padding:.5rem 0}.sidebar .nav-item a svg{fill:#9f9898;height:1rem;margin-right:15px;width:1rem}.sidebar .nav-item a.active{color:#adadff}.sidebar .nav-item a.active svg{fill:#adadff}.card{border:none;box-shadow:0 2px 3px #1c1c1c}.card .bottom-radius{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card .card-header{background-color:#120f12;border-bottom:none;padding-bottom:.7rem;padding-top:.7rem}.card .card-header .btn-group .btn{padding:.2rem .5rem}.card .card-header h5{margin:0}.card .table td,.card .table th{padding:.75rem 1.25rem}.card .table.table-sm td,.card .table.table-sm th{padding:1rem 1.25rem}.card .table th{background-color:#181818;border-bottom:0;font-weight:400;padding:.5rem 1.25rem}.card .table:not(.table-borderless) td{border-top:1px solid #343434}.card .table.penultimate-column-right td:nth-last-child(2),.card .table.penultimate-column-right th:nth-last-child(2){text-align:right}.card .table td.table-fit,.card .table th.table-fit{white-space:nowrap;width:1%}.fill-text-color{fill:#e2edf4}.fill-danger{fill:#621b18}.fill-warning{fill:#684f1d}.fill-info{fill:#1c3d5a}.fill-success{fill:#1f9d55}.fill-primary{fill:#adadff}button:hover .fill-primary{fill:#fff}.btn-outline-primary.active .fill-primary{fill:#1c1c1c}.btn-outline-primary:not(:disabled):not(.disabled).active:focus{box-shadow:none!important}.control-action svg{fill:#ccd2df;height:1.2rem;width:1.2rem}.control-action svg:hover{fill:#adadff}.paginator .btn{color:#9ea7ac;text-decoration:none}.paginator .btn:hover{color:#adadff}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spin{-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.card .nav-pills .nav-link.active{background:none;border-bottom:2px solid #adadff;color:#adadff}.card .nav-pills .nav-link{border-radius:0;color:#e2edf4;font-size:.9rem;padding:.75rem 1.25rem}.list-enter-active:not(.dontanimate){transition:background 1s linear}.list-enter:not(.dontanimate),.list-leave-to:not(.dontanimate){background:#505e4a}#indexScreen td{vertical-align:middle!important}.card-bg-secondary,.code-bg{background:#262525}.disabled-watcher{background:#621b18;color:#fff;padding:.75rem} diff --git a/public_html/vendor/telescope/app.css b/public_html/vendor/telescope/app.css deleted file mode 100644 index 378b603..0000000 --- a/public_html/vendor/telescope/app.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8"; -/*! - * Bootstrap v4.6.0 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#4040c8;--secondary:#dae1e7;--success:#51d88a;--info:#bcdefa;--warning:#fff382;--danger:#ef5753;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:2px;--breakpoint-md:8px;--breakpoint-lg:9px;--breakpoint-xl:10px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#edf1f3;color:#212529;font-family:Nunito,sans-serif;font-size:.95rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#4040c8;text-decoration:none}a:hover{color:#2a2a92;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6c757d;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.375rem}.h2,h2{font-size:1.9rem}.h3,h3{font-size:1.6625rem}.h4,h4{font-size:1.425rem}.h5,h5{font-size:1.1875rem}.h6,h6{font-size:.95rem}.lead{font-size:1.1875rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:80%;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.1875rem;margin-bottom:1rem}.blockquote-footer{color:#6c757d;display:block;font-size:80%}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#edf1f3;border:1px solid #dee2e6;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#6c757d;font-size:90%}code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>code{color:inherit}kbd{background-color:#212529;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:700;padding:0}pre{color:#212529;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:2px){.container,.container-sm{max-width:1137px}}@media (min-width:8px){.container,.container-md,.container-sm{max-width:1138px}}@media (min-width:9px){.container,.container-lg,.container-md,.container-sm{max-width:1139px}}@media (min-width:10px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:2px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:8px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:9px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:10px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{color:#212529;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #efefef;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #efefef;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #efefef}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #efefef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:#f1f7fa;color:#212529}.table-primary,.table-primary>td,.table-primary>th{background-color:#cacaf0}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#9c9ce2}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6b6ea}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#f5f7f8}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#eceff3}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#e6ebee}.table-success,.table-success>td,.table-success>th{background-color:#cef4de}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#a5ebc2}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b9efd0}.table-info,.table-info>td,.table-info>th{background-color:#ecf6fe}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#dceefc}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#d4ebfd}.table-warning,.table-warning>td,.table-warning>th{background-color:#fffcdc}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#fff9be}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fffac3}.table-danger,.table-danger>td,.table-danger>th{background-color:#fbd0cf}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#f7a8a6}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f9b9b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:#f1f7fa}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#deecf3}.table .thead-dark th{background-color:#343a40;border-color:#454d55;color:#fff}.table .thead-light th{background-color:#e9ecef;border-color:#efefef;color:#495057}.table-dark{background-color:#343a40;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:1.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:7.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:8.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:9.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:block;font-size:.95rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{background-color:#fff;border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);color:#495057;outline:0}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{background-color:#fff;color:#495057}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.1875rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.83125rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#212529;display:block;font-size:.95rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.83125rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:.3rem;font-size:1.1875rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#51d88a;display:none;font-size:80%;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(81,216,138,.9);border-radius:.25rem;color:#212529;display:none;font-size:.83125rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2351d88a' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#51d88a;padding-right:calc(1.5em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#51d88a;box-shadow:0 0 0 .2rem rgba(81,216,138,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2351d88a' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#51d88a;padding-right:calc(.75em + 2.3125rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#51d88a;box-shadow:0 0 0 .2rem rgba(81,216,138,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#51d88a}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#51d88a}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#51d88a}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#7be1a6;border-color:#7be1a6}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(81,216,138,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#51d88a}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#51d88a}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#51d88a;box-shadow:0 0 0 .2rem rgba(81,216,138,.25)}.invalid-feedback{color:#ef5753;display:none;font-size:80%;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(239,87,83,.9);border-radius:.25rem;color:#fff;display:none;font-size:.83125rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ef5753'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23ef5753' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#ef5753;padding-right:calc(1.5em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#ef5753;box-shadow:0 0 0 .2rem rgba(239,87,83,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ef5753'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23ef5753' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#ef5753;padding-right:calc(.75em + 2.3125rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#ef5753;box-shadow:0 0 0 .2rem rgba(239,87,83,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#ef5753}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#ef5753}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#ef5753}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#f38582;border-color:#f38582}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(239,87,83,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#ef5753}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#ef5753}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#ef5753;box-shadow:0 0 0 .2rem rgba(239,87,83,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:2px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#212529;display:inline-block;font-size:.95rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#3232af;border-color:#3030a5;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 0 rgba(93,93,208,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#3030a5;border-color:#2d2d9b;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(93,93,208,.5)}.btn-secondary{background-color:#dae1e7;border-color:#dae1e7;color:#212529}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#c3ced8;border-color:#bbc8d3;color:#212529}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 0 rgba(190,197,203,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#dae1e7;border-color:#dae1e7;color:#212529}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#bbc8d3;border-color:#b3c2ce;color:#212529}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(190,197,203,.5)}.btn-success{background-color:#51d88a;border-color:#51d88a;color:#212529}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#32d175;border-color:#2dc96f;color:#212529}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 0 rgba(74,189,123,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#51d88a;border-color:#51d88a;color:#212529}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#2dc96f;border-color:#2bbf69;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(74,189,123,.5)}.btn-info{background-color:#bcdefa;border-color:#bcdefa;color:#212529}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#98ccf7;border-color:#8dc7f6;color:#212529}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 0 rgba(165,194,219,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#bcdefa;border-color:#bcdefa;color:#212529}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#8dc7f6;border-color:#81c1f6;color:#212529}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(165,194,219,.5)}.btn-warning{background-color:#fff382;border-color:#fff382;color:#212529}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#ffef5c;border-color:#ffee4f;color:#212529}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 0 hsla(54,61%,66%,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#fff382;border-color:#fff382;color:#212529}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#ffee4f;border-color:#ffed42;color:#212529}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(54,61%,66%,.5)}.btn-danger{background-color:#ef5753;border-color:#ef5753;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#ec3530;border-color:#eb2924;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 0 hsla(1,82%,69%,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#ef5753;border-color:#ef5753;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#eb2924;border-color:#ea1e19;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(1,82%,69%,.5)}.btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 0 hsla(220,4%,85%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(220,4%,85%,.5)}.btn-dark{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#23272b;border-color:#1d2124;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 0 rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#1d2124;border-color:#171a1d;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(82,88,93,.5)}.btn-outline-primary{border-color:#4040c8;color:#4040c8}.btn-outline-primary:hover{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 0 rgba(64,64,200,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#4040c8}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(64,64,200,.5)}.btn-outline-secondary{border-color:#dae1e7;color:#dae1e7}.btn-outline-secondary:hover{background-color:#dae1e7;border-color:#dae1e7;color:#212529}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 0 rgba(218,225,231,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#dae1e7}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#dae1e7;border-color:#dae1e7;color:#212529}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(218,225,231,.5)}.btn-outline-success{border-color:#51d88a;color:#51d88a}.btn-outline-success:hover{background-color:#51d88a;border-color:#51d88a;color:#212529}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 0 rgba(81,216,138,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#51d88a}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#51d88a;border-color:#51d88a;color:#212529}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(81,216,138,.5)}.btn-outline-info{border-color:#bcdefa;color:#bcdefa}.btn-outline-info:hover{background-color:#bcdefa;border-color:#bcdefa;color:#212529}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 0 rgba(188,222,250,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#bcdefa}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#bcdefa;border-color:#bcdefa;color:#212529}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(188,222,250,.5)}.btn-outline-warning{border-color:#fff382;color:#fff382}.btn-outline-warning:hover{background-color:#fff382;border-color:#fff382;color:#212529}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 0 rgba(255,243,130,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#fff382}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#fff382;border-color:#fff382;color:#212529}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(255,243,130,.5)}.btn-outline-danger{border-color:#ef5753;color:#ef5753}.btn-outline-danger:hover{background-color:#ef5753;border-color:#ef5753;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 0 rgba(239,87,83,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#ef5753}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#ef5753;border-color:#ef5753;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(239,87,83,.5)}.btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 0 rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(248,249,250,.5)}.btn-outline-dark{border-color:#343a40;color:#343a40}.btn-outline-dark:hover{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 0 rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(52,58,64,.5)}.btn-link{color:#4040c8;font-weight:400;text-decoration:none}.btn-link:hover{color:#2a2a92}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:.3rem;font-size:1.1875rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.83125rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#212529;display:none;float:left;font-size:.95rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:2px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:8px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:9px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:10px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e9ecef;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#212529;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e9ecef;color:#16181b;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#4040c8;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#adb5bd;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#6c757d;display:block;font-size:.83125rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#212529;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:flex;font-size:.95rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:.3rem;font-size:1.1875rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.83125rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{-webkit-print-color-adjust:exact;color-adjust:exact;display:block;min-height:1.425rem;padding-left:1.5rem;position:relative;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.2125rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a3a3e5}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cbcbf0;border-color:#cbcbf0;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#fff;border:1px solid #adb5bd;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.2125rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#adb5bd;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.2125rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:inline-block;font-size:.95rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.custom-select:focus::-ms-value{background-color:#fff;color:#495057}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e9ecef;color:#6c757d}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{font-size:.83125rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.1875rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#495057;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #edf1f3,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #edf1f3,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #edf1f3,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cbcbf0}.custom-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cbcbf0}.custom-range::-moz-range-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cbcbf0}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#6c757d}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#edf1f3;border-color:#dee2e6 #dee2e6 #edf1f3;color:#495057}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#4040c8;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.1875rem;line-height:inherit;margin-right:1rem;padding-bottom:.321875rem;padding-top:.321875rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.1875rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:1.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:2px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:7.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:8px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:8.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:9px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:9.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:10px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:#fff;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{background-color:#fff;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:calc(.25rem - 1px);bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:2px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:2px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:2px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e9ecef;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#6c757d;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #dee2e6;color:#4040c8;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e9ecef;border-color:#dee2e6;color:#2a2a92;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#dee2e6;color:#6c757d;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.1875rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{font-size:.83125rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:.95rem;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#4040c8;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#3030a5;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5);outline:0}.badge-secondary{background-color:#dae1e7;color:#212529}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#bbc8d3;color:#212529}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem rgba(218,225,231,.5);outline:0}.badge-success{background-color:#51d88a;color:#212529}a.badge-success:focus,a.badge-success:hover{background-color:#2dc96f;color:#212529}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(81,216,138,.5);outline:0}.badge-info{background-color:#bcdefa;color:#212529}a.badge-info:focus,a.badge-info:hover{background-color:#8dc7f6;color:#212529}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(188,222,250,.5);outline:0}.badge-warning{background-color:#fff382;color:#212529}a.badge-warning:focus,a.badge-warning:hover{background-color:#ffee4f;color:#212529}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(255,243,130,.5);outline:0}.badge-danger{background-color:#ef5753;color:#fff}a.badge-danger:focus,a.badge-danger:hover{background-color:#eb2924;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(239,87,83,.5);outline:0}.badge-light{background-color:#f8f9fa;color:#212529}a.badge-light:focus,a.badge-light:hover{background-color:#dae0e5;color:#212529}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5);outline:0}.badge-dark{background-color:#343a40;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#1d2124;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5);outline:0}.jumbotron{background-color:#e9ecef;border-radius:.3rem;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:2px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.925rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d9d9f4;border-color:#cacaf0;color:#212168}.alert-primary hr{border-top-color:#b6b6ea}.alert-primary .alert-link{color:#151541}.alert-secondary{background-color:#f8f9fa;border-color:#f5f7f8;color:#717578}.alert-secondary hr{border-top-color:#e6ebee}.alert-secondary .alert-link{color:#585b5e}.alert-success{background-color:#dcf7e8;border-color:#cef4de;color:#2a7048}.alert-success hr{border-top-color:#b9efd0}.alert-success .alert-link{color:#1c4b30}.alert-info{background-color:#f2f8fe;border-color:#ecf6fe;color:#627382}.alert-info hr{border-top-color:#d4ebfd}.alert-info .alert-link{color:#4c5965}.alert-warning{background-color:#fffde6;border-color:#fffcdc;color:#857e44}.alert-warning hr{border-top-color:#fffac3}.alert-warning .alert-link{color:#635e33}.alert-danger{background-color:#fcdddd;border-color:#fbd0cf;color:#7c2d2b}.alert-danger hr{border-top-color:#f9b9b7}.alert-danger .alert-link{color:#561f1e}.alert-light{background-color:#fefefe;border-color:#fdfdfe;color:#818182}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{background-color:#d6d8d9;border-color:#c6c8ca;color:#1b1e21}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e9ecef;border-radius:.25rem;font-size:.7125rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#4040c8;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#495057;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f8f9fa;color:#495057;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e9ecef;color:#212529}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#6c757d;pointer-events:none}.list-group-item.active{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:2px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:8px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:9px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:10px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#cacaf0;color:#212168}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b6b6ea;color:#212168}.list-group-item-primary.list-group-item-action.active{background-color:#212168;border-color:#212168;color:#fff}.list-group-item-secondary{background-color:#f5f7f8;color:#717578}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#e6ebee;color:#717578}.list-group-item-secondary.list-group-item-action.active{background-color:#717578;border-color:#717578;color:#fff}.list-group-item-success{background-color:#cef4de;color:#2a7048}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#b9efd0;color:#2a7048}.list-group-item-success.list-group-item-action.active{background-color:#2a7048;border-color:#2a7048;color:#fff}.list-group-item-info{background-color:#ecf6fe;color:#627382}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#d4ebfd;color:#627382}.list-group-item-info.list-group-item-action.active{background-color:#627382;border-color:#627382;color:#fff}.list-group-item-warning{background-color:#fffcdc;color:#857e44}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#fffac3;color:#857e44}.list-group-item-warning.list-group-item-action.active{background-color:#857e44;border-color:#857e44;color:#fff}.list-group-item-danger{background-color:#fbd0cf;color:#7c2d2b}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f9b9b7;color:#7c2d2b}.list-group-item-danger.list-group-item-action.active{background-color:#7c2d2b;border-color:#7c2d2b;color:#fff}.list-group-item-light{background-color:#fdfdfe;color:#818182}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#ececf6;color:#818182}.list-group-item-light.list-group-item-action.active{background-color:#818182;border-color:#818182;color:#fff}.list-group-item-dark{background-color:#c6c8ca;color:#1b1e21}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b9bbbe;color:#1b1e21}.list-group-item-dark.list-group-item-action.active{background-color:#1b1e21;border-color:#1b1e21;color:#fff}.close{color:#000;float:right;font-size:1.425rem;font-weight:700;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#6c757d;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #efefef;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.5;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px);border-top:1px solid #efefef;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:2px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:9px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:10px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Nunito,sans-serif;font-size:.83125rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;font-family:Nunito,sans-serif;font-size:.83125rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 .3rem;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:.95rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#212529;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:text-bottom;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite;background-color:currentColor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:text-bottom;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#4040c8!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#3030a5!important}.bg-secondary{background-color:#dae1e7!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#bbc8d3!important}.bg-success{background-color:#51d88a!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#2dc96f!important}.bg-info{background-color:#bcdefa!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#8dc7f6!important}.bg-warning{background-color:#fff382!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#ffee4f!important}.bg-danger{background-color:#ef5753!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#eb2924!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #efefef!important}.border-top{border-top:1px solid #efefef!important}.border-right{border-right:1px solid #efefef!important}.border-bottom{border-bottom:1px solid #efefef!important}.border-left{border-left:1px solid #efefef!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#4040c8!important}.border-secondary{border-color:#dae1e7!important}.border-success{border-color:#51d88a!important}.border-info{border-color:#bcdefa!important}.border-warning{border-color:#fff382!important}.border-danger{border-color:#ef5753!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:2px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:8px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:9px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:10px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.8571428571%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:2px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:8px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:9px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:10px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:2px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:8px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:9px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:10px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:2px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:8px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:9px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:10px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:2px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:8px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:9px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:10px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#4040c8!important}a.text-primary:focus,a.text-primary:hover{color:#2a2a92!important}.text-secondary{color:#dae1e7!important}a.text-secondary:focus,a.text-secondary:hover{color:#acbbc9!important}.text-success{color:#51d88a!important}a.text-success:focus,a.text-success:hover{color:#28b463!important}.text-info{color:#bcdefa!important}a.text-info:focus,a.text-info:hover{color:#75bbf5!important}.text-warning{color:#fff382!important}a.text-warning:focus,a.text-warning:hover{color:#ffec36!important}.text-danger{color:#ef5753!important}a.text-danger:focus,a.text-danger:hover{color:#e11a15!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:9px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#efefef}.table .thead-dark th{border-color:#efefef;color:inherit}}.vjs-tree{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.vjs-tree .vjs-tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs-tree .vjs-tree__node{cursor:pointer}.vjs-tree .vjs-tree__node:hover{color:#20a0ff}.vjs-tree .vjs-checkbox{left:-30px;position:absolute}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__null,.vjs-tree .vjs-value__number{color:#a291f5!important}.vjs-tree .vjs-value__string{color:#dacb4d!important}.hljs-addition,.hljs-attr,.hljs-keyword,.hljs-selector-tag{color:#13ce66}.hljs-bullet,.hljs-meta,.hljs-name,.hljs-string,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable{color:#dacb4d}.hljs-comment,.hljs-deletion,.hljs-quote{color:#bfcbd9}.hljs-literal,.hljs-number,.hljs-title{color:#a291f5!important}body{padding-bottom:20px}.container{width:1140px}html{min-width:1140px}[v-cloak]{display:none}svg.icon{height:1rem;width:1rem}.header{border-bottom:1px solid #d5dfe9}.header svg.logo{height:1.7rem;width:1.7rem}.sidebar .nav-item a{color:#2a5164;padding:.5rem 0}.sidebar .nav-item a svg{fill:#c3cbd3;height:1rem;margin-right:15px;width:1rem}.sidebar .nav-item a.active{color:#4040c8}.sidebar .nav-item a.active svg{fill:#4040c8}.card{border:none;box-shadow:0 2px 3px #cdd8df}.card .bottom-radius{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card .card-header{background-color:#fff;border-bottom:none;padding-bottom:.7rem;padding-top:.7rem}.card .card-header .btn-group .btn{padding:.2rem .5rem}.card .card-header h5{margin:0}.card .table td,.card .table th{padding:.75rem 1.25rem}.card .table.table-sm td,.card .table.table-sm th{padding:1rem 1.25rem}.card .table th{background-color:#f3f4f6;border-bottom:0;font-weight:400;padding:.5rem 1.25rem}.card .table:not(.table-borderless) td{border-top:1px solid #efefef}.card .table.penultimate-column-right td:nth-last-child(2),.card .table.penultimate-column-right th:nth-last-child(2){text-align:right}.card .table td.table-fit,.card .table th.table-fit{white-space:nowrap;width:1%}.fill-text-color{fill:#212529}.fill-danger{fill:#ef5753}.fill-warning{fill:#fff382}.fill-info{fill:#bcdefa}.fill-success{fill:#51d88a}.fill-primary{fill:#4040c8}button:hover .fill-primary{fill:#fff}.btn-outline-primary.active .fill-primary{fill:#edf1f3}.btn-outline-primary:not(:disabled):not(.disabled).active:focus{box-shadow:none!important}.control-action svg{fill:#ccd2df;height:1.2rem;width:1.2rem}.control-action svg:hover{fill:#4040c8}.paginator .btn{color:#9ea7ac;text-decoration:none}.paginator .btn:hover{color:#4040c8}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spin{-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.card .nav-pills .nav-link.active{background:none;border-bottom:2px solid #4040c8;color:#4040c8}.card .nav-pills .nav-link{border-radius:0;color:#212529;font-size:.9rem;padding:.75rem 1.25rem}.list-enter-active:not(.dontanimate){transition:background 1s linear}.list-enter:not(.dontanimate),.list-leave-to:not(.dontanimate){background:#fffee9}#indexScreen td{vertical-align:middle!important}.card-bg-secondary{background:#f1f7fa}.code-bg{background:#120f12}.disabled-watcher{background:#ef5753;color:#fff;padding:.75rem} diff --git a/public_html/vendor/telescope/app.js b/public_html/vendor/telescope/app.js deleted file mode 100644 index e24ab6c..0000000 --- a/public_html/vendor/telescope/app.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see app.js.LICENSE.txt */ -(()=>{var e,t={9669:(e,t,n)=>{e.exports=n(1609)},5448:(e,t,n)=>{"use strict";var r=n(4867),o=n(6026),i=n(4372),a=n(5327),c=n(4097),s=n(4109),l=n(7985),u=n(5061);e.exports=function(e){return new Promise((function(t,n){var f=e.data,d=e.headers,p=e.responseType;r.isFormData(f)&&delete d["Content-Type"];var h=new XMLHttpRequest;if(e.auth){var M=e.auth.username||"",v=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(M+":"+v)}var b=c(e.baseURL,e.url);function m(){if(h){var r="getAllResponseHeaders"in h?s(h.getAllResponseHeaders()):null,i={data:p&&"text"!==p&&"json"!==p?h.response:h.responseText,status:h.status,statusText:h.statusText,headers:r,config:e,request:h};o(t,n,i),h=null}}if(h.open(e.method.toUpperCase(),a(b,e.params,e.paramsSerializer),!0),h.timeout=e.timeout,"onloadend"in h?h.onloadend=m:h.onreadystatechange=function(){h&&4===h.readyState&&(0!==h.status||h.responseURL&&0===h.responseURL.indexOf("file:"))&&setTimeout(m)},h.onabort=function(){h&&(n(u("Request aborted",e,"ECONNABORTED",h)),h=null)},h.onerror=function(){n(u("Network Error",e,null,h)),h=null},h.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(u(t,e,e.transitional&&e.transitional.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",h)),h=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||l(b))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}"setRequestHeader"in h&&r.forEach(d,(function(e,t){void 0===f&&"content-type"===t.toLowerCase()?delete d[t]:h.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(h.withCredentials=!!e.withCredentials),p&&"json"!==p&&(h.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&h.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&h.upload&&h.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){h&&(h.abort(),n(e),h=null)})),f||(f=null),h.send(f)}))}},1609:(e,t,n)=>{"use strict";var r=n(4867),o=n(1849),i=n(321),a=n(7185);function c(e){var t=new i(e),n=o(i.prototype.request,t);return r.extend(n,i.prototype,t),r.extend(n,t),n}var s=c(n(5655));s.Axios=i,s.create=function(e){return c(a(s.defaults,e))},s.Cancel=n(5263),s.CancelToken=n(4972),s.isCancel=n(6502),s.all=function(e){return Promise.all(e)},s.spread=n(8713),s.isAxiosError=n(6268),e.exports=s,e.exports.default=s},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,n)=>{"use strict";var r=n(5263);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,n)=>{"use strict";var r=n(4867),o=n(5327),i=n(782),a=n(3572),c=n(7185),s=n(4875),l=s.validators;function u(e){this.defaults=e,this.interceptors={request:new i,response:new i}}u.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=c(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=e.transitional;void 0!==t&&s.assertOptions(t,{silentJSONParsing:l.transitional(l.boolean,"1.0.0"),forcedJSONParsing:l.transitional(l.boolean,"1.0.0"),clarifyTimeoutError:l.transitional(l.boolean,"1.0.0")},!1);var n=[],r=!0;this.interceptors.request.forEach((function(t){"function"==typeof t.runWhen&&!1===t.runWhen(e)||(r=r&&t.synchronous,n.unshift(t.fulfilled,t.rejected))}));var o,i=[];if(this.interceptors.response.forEach((function(e){i.push(e.fulfilled,e.rejected)})),!r){var u=[a,void 0];for(Array.prototype.unshift.apply(u,n),u.concat(i),o=Promise.resolve(e);u.length;)o=o.then(u.shift(),u.shift());return o}for(var f=e;n.length;){var d=n.shift(),p=n.shift();try{f=d(f)}catch(e){p(e);break}}try{o=a(f)}catch(e){return Promise.reject(e)}for(;i.length;)o=o.then(i.shift(),i.shift());return o},u.prototype.getUri=function(e){return e=c(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},r.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,n){return this.request(c(n||{},{method:e,url:t,data:(n||{}).data}))}})),r.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,n,r){return this.request(c(r||{},{method:e,url:t,data:n}))}})),e.exports=u},782:(e,t,n)=>{"use strict";var r=n(4867);function o(){this.handlers=[]}o.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},4097:(e,t,n)=>{"use strict";var r=n(1793),o=n(7303);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},5061:(e,t,n)=>{"use strict";var r=n(481);e.exports=function(e,t,n,o,i){var a=new Error(e);return r(a,t,n,o,i)}},3572:(e,t,n)=>{"use strict";var r=n(4867),o=n(8527),i=n(6502),a=n(5655);function c(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return c(e),e.headers=e.headers||{},e.data=o.call(e,e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||a.adapter)(e).then((function(t){return c(e),t.data=o.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(c(e),t&&t.response&&(t.response.data=o.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,n)=>{"use strict";var r=n(4867);e.exports=function(e,t){t=t||{};var n={},o=["url","method","data"],i=["headers","auth","proxy","params"],a=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];function s(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function l(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(n[o]=s(void 0,e[o])):n[o]=s(e[o],t[o])}r.forEach(o,(function(e){r.isUndefined(t[e])||(n[e]=s(void 0,t[e]))})),r.forEach(i,l),r.forEach(a,(function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(n[o]=s(void 0,e[o])):n[o]=s(void 0,t[o])})),r.forEach(c,(function(r){r in t?n[r]=s(e[r],t[r]):r in e&&(n[r]=s(void 0,e[r]))}));var u=o.concat(i).concat(a).concat(c),f=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===u.indexOf(e)}));return r.forEach(f,l),n}},6026:(e,t,n)=>{"use strict";var r=n(5061);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},8527:(e,t,n)=>{"use strict";var r=n(4867),o=n(5655);e.exports=function(e,t,n){var i=this||o;return r.forEach(n,(function(n){e=n.call(i,e,t)})),e}},5655:(e,t,n)=>{"use strict";var r=n(4155),o=n(4867),i=n(6016),a=n(481),c={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!o.isUndefined(e)&&o.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,u={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==r&&"[object process]"===Object.prototype.toString.call(r))&&(l=n(5448)),l),transformRequest:[function(e,t){return i(t,"Accept"),i(t,"Content-Type"),o.isFormData(e)||o.isArrayBuffer(e)||o.isBuffer(e)||o.isStream(e)||o.isFile(e)||o.isBlob(e)?e:o.isArrayBufferView(e)?e.buffer:o.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):o.isObject(e)||t&&"application/json"===t["Content-Type"]?(s(t,"application/json"),JSON.stringify(e)):e}],transformResponse:[function(e){var t=this.transitional,n=t&&t.silentJSONParsing,r=t&&t.forcedJSONParsing,i=!n&&"json"===this.responseType;if(i||r&&o.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(i){if("SyntaxError"===e.name)throw a(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},o.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),o.forEach(["post","put","patch"],(function(e){u.headers[e]=o.merge(c)})),e.exports=u},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r{"use strict";var r=n(4867);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(r.isURLSearchParams(t))i=t.toString();else{var a=[];r.forEach(t,(function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+"="+o(e))})))})),i=a.join("&")}if(i){var c=e.indexOf("#");-1!==c&&(e=e.slice(0,c)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,n)=>{"use strict";var r=n(4867);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,a){var c=[];c.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&c.push("expires="+new Date(n).toGMTString()),r.isString(o)&&c.push("path="+o),r.isString(i)&&c.push("domain="+i),!0===a&&c.push("secure"),document.cookie=c.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,n)=>{"use strict";var r=n(4867);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},6016:(e,t,n)=>{"use strict";var r=n(4867);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},4109:(e,t,n)=>{"use strict";var r=n(4867),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,a={};return e?(r.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(a[t]&&o.indexOf(t)>=0)return;a[t]="set-cookie"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+", "+n:n}})),a):a}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4875:(e,t,n)=>{"use strict";var r=n(8593),o={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){o[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var i={},a=r.version.split(".");function c(e,t){for(var n=t?t.split("."):a,r=e.split("."),o=0;o<3;o++){if(n[o]>r[o])return!0;if(n[o]0;){var i=r[o],a=t[i];if(a){var c=e[i],s=void 0===c||a(c,i,e);if(!0!==s)throw new TypeError("option "+i+" must be "+s)}else if(!0!==n)throw Error("Unknown option "+i)}},validators:o}},4867:(e,t,n)=>{"use strict";var r=n(1849),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function a(e){return void 0===e}function c(e){return null!==e&&"object"==typeof e}function s(e){if("[object Object]"!==o.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Function]"===o.call(e)}function u(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),i(e))for(var n=0,r=e.length;n{"use strict";var r=Object.freeze({});function o(e){return null==e}function i(e){return null!=e}function a(e){return!0===e}function c(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function s(e){return null!==e&&"object"==typeof e}var l=Object.prototype.toString;function u(e){return"[object Object]"===l.call(e)}function f(e){return"[object RegExp]"===l.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return i(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||u(e)&&e.toString===l?JSON.stringify(e,null,2):String(e)}function M(e){var t=parseFloat(e);return isNaN(t)?e:t}function v(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o-1)return e.splice(n,1)}}var A=Object.prototype.hasOwnProperty;function _(e,t){return A.call(e,t)}function y(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var E=/-(\w)/g,T=y((function(e){return e.replace(E,(function(e,t){return t?t.toUpperCase():""}))})),O=y((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),N=/\B([A-Z])/g,z=y((function(e){return e.replace(N,"-$1").toLowerCase()}));var L=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function C(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function w(e,t){for(var n in t)e[n]=t[n];return e}function S(e){for(var t={},n=0;n0,ee=Z&&Z.indexOf("edge/")>0,te=(Z&&Z.indexOf("android"),Z&&/iphone|ipad|ipod|ios/.test(Z)||"ios"===K),ne=(Z&&/chrome\/\d+/.test(Z),Z&&/phantomjs/.test(Z),Z&&Z.match(/firefox\/(\d+)/)),re={}.watch,oe=!1;if(V)try{var ie={};Object.defineProperty(ie,"passive",{get:function(){oe=!0}}),window.addEventListener("test-passive",null,ie)}catch(e){}var ae=function(){return void 0===$&&($=!V&&!Y&&void 0!==n.g&&(n.g.process&&"server"===n.g.process.env.VUE_ENV)),$},ce=V&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function se(e){return"function"==typeof e&&/native code/.test(e.toString())}var le,ue="undefined"!=typeof Symbol&&se(Symbol)&&"undefined"!=typeof Reflect&&se(Reflect.ownKeys);le="undefined"!=typeof Set&&se(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var fe=R,de=0,pe=function(){this.id=de++,this.subs=[]};pe.prototype.addSub=function(e){this.subs.push(e)},pe.prototype.removeSub=function(e){g(this.subs,e)},pe.prototype.depend=function(){pe.target&&pe.target.addDep(this)},pe.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(i&&!_(o,"default"))a=!1;else if(""===a||a===z(e)){var s=He(String,o.type);(s<0||c0&&(ht((r=Mt(r,(t||"")+"_"+n))[0])&&ht(l)&&(u[s]=Ae(l.text+r[0].text),r.shift()),u.push.apply(u,r)):c(r)?ht(l)?u[s]=Ae(l.text+r):""!==r&&u.push(Ae(r)):ht(r)&&ht(l)?u[s]=Ae(l.text+r.text):(a(e._isVList)&&i(r.tag)&&o(r.key)&&i(t)&&(r.key="__vlist"+t+"_"+n+"__"),u.push(r)));return u}function vt(e,t){if(e){for(var n=Object.create(null),r=ue?Reflect.ownKeys(e):Object.keys(e),o=0;o0,a=e?!!e.$stable:!i,c=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&n&&n!==r&&c===n.$key&&!i&&!n.$hasNormal)return n;for(var s in o={},e)e[s]&&"$"!==s[0]&&(o[s]=At(t,s,e[s]))}else o={};for(var l in t)l in o||(o[l]=_t(t,l));return e&&Object.isExtensible(e)&&(e._normalized=o),H(o,"$stable",a),H(o,"$key",c),H(o,"$hasNormal",i),o}function At(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:pt(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function _t(e,t){return function(){return e[t]}}function yt(e,t){var n,r,o,a,c;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;rdocument.createEvent("Event").timeStamp&&(Mn=function(){return vn.now()})}function bn(){var e,t;for(hn=Mn(),dn=!0,sn.sort((function(e,t){return e.id-t.id})),pn=0;pnpn&&sn[n].id>e.id;)n--;sn.splice(n+1,0,e)}else sn.push(e);fn||(fn=!0,ot(bn))}}(this)},gn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||s(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Fe(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},gn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},gn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},gn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var An={enumerable:!0,configurable:!0,get:R,set:R};function _n(e,t,n){An.get=function(){return this[t][n]},An.set=function(e){this[t][n]=e},Object.defineProperty(e,n,An)}function yn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[];e.$parent&&Ne(!1);var i=function(i){o.push(i);var a=Pe(i,t,n,e);Ce(r,i,a),i in e||_n(e,"_props",i)};for(var a in t)i(a);Ne(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?R:L(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?function(e,t){Me();try{return e.call(t,t)}catch(e){return Fe(e,t,"data()"),{}}finally{ve()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);for(;o--;){var i=n[o];0,r&&_(r,i)||U(i)||_n(e,"_data",i)}Le(t,!0)}(e):Le(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=ae();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new gn(e,a||R,R,En)),o in e||Tn(e,o,i)}}(e,t.computed),t.watch&&t.watch!==re&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function xn(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var c=Rn(a.componentOptions);c&&!t(c)&&Wn(n,i,r,o)}}}function Wn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,g(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=Ln++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=De(Cn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&en(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,o=n&&n.context;e.$slots=bt(t._renderChildren,o),e.$scopedSlots=r,e._c=function(t,n,r,o){return Ht(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return Ht(e,t,n,r,o,!0)};var i=n&&n.data;Ce(e,"$attrs",i&&i.attrs||r,null,!0),Ce(e,"$listeners",t._parentListeners||r,null,!0)}(t),cn(t,"beforeCreate"),function(e){var t=vt(e.$options.inject,e);t&&(Ne(!1),Object.keys(t).forEach((function(n){Ce(e,n,t[n])})),Ne(!0))}(t),yn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),cn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=we,e.prototype.$delete=Se,e.prototype.$watch=function(e,t,n){var r=this;if(u(t))return zn(r,e,t,n);(n=n||{}).user=!0;var o=new gn(r,e,t,n);if(n.immediate)try{t.call(r,o.value)}catch(e){Fe(e,r,'callback for immediate watcher "'+o.expression+'"')}return function(){o.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var o=0,i=e.length;o1?C(n):n;for(var r=C(arguments,1),o='event handler for "'+e+'"',i=0,a=n.length;iparseInt(this.max)&&Wn(a,c[0],c,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return P}};Object.defineProperty(e,"config",t),e.util={warn:fe,extend:w,mergeOptions:De,defineReactive:Ce},e.set=we,e.delete=Se,e.nextTick=ot,e.observable=function(e){return Le(e),e},e.options=Object.create(null),D.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,w(e.options.components,Bn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=C(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Sn(e),function(e){D.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(wn),Object.defineProperty(wn.prototype,"$isServer",{get:ae}),Object.defineProperty(wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,"FunctionalRenderContext",{value:Bt}),wn.version="2.6.12";var In=v("style,class"),Dn=v("input,textarea,option,select,progress"),Xn=function(e,t,n){return"value"===n&&Dn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Pn=v("contenteditable,draggable,spellcheck"),jn=v("events,caret,typing,plaintext-only"),Un=v("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Hn="http://www.w3.org/1999/xlink",Fn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},$n=function(e){return Fn(e)?e.slice(6,e.length):""},Gn=function(e){return null==e||!1===e};function Vn(e){for(var t=e.data,n=e,r=e;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=Yn(r.data,t));for(;i(n=n.parent);)n&&n.data&&(t=Yn(t,n.data));return function(e,t){if(i(e)||i(t))return Kn(e,Zn(t));return""}(t.staticClass,t.class)}function Yn(e,t){return{staticClass:Kn(e.staticClass,t.staticClass),class:i(e.class)?[e.class,t.class]:t.class}}function Kn(e,t){return e?t?e+" "+t:e:t||""}function Zn(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,o=e.length;r-1?yr(e,t,n):Un(t)?Gn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Pn(t)?e.setAttribute(t,function(e,t){return Gn(t)||"false"===t?"false":"contenteditable"===e&&jn(t)?t:"true"}(t,n)):Fn(t)?Gn(n)?e.removeAttributeNS(Hn,$n(t)):e.setAttributeNS(Hn,t,n):yr(e,t,n)}function yr(e,t,n){if(Gn(n))e.removeAttribute(t);else{if(Q&&!J&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Er={create:Ar,update:Ar};function Tr(e,t){var n=t.elm,r=t.data,a=e.data;if(!(o(r.staticClass)&&o(r.class)&&(o(a)||o(a.staticClass)&&o(a.class)))){var c=Vn(t),s=n._transitionClasses;i(s)&&(c=Kn(c,Zn(s))),c!==n._prevClass&&(n.setAttribute("class",c),n._prevClass=c)}}var Or,Nr,zr,Lr,Cr,wr,Sr={create:Tr,update:Tr},Rr=/[\w).+\-_$\]]/;function qr(e){var t,n,r,o,i,a=!1,c=!1,s=!1,l=!1,u=0,f=0,d=0,p=0;for(r=0;r=0&&" "===(M=e.charAt(h));h--);M&&Rr.test(M)||(l=!0)}}else void 0===o?(p=r+1,o=e.slice(0,r).trim()):v();function v(){(i||(i=[])).push(e.slice(p,r).trim()),p=r+1}if(void 0===o?o=e.slice(0,r).trim():0!==p&&v(),i)for(r=0;r-1?{exp:e.slice(0,Lr),key:'"'+e.slice(Lr+1)+'"'}:{exp:e,key:null};Nr=e,Lr=Cr=wr=0;for(;!Kr();)Zr(zr=Yr())?Jr(zr):91===zr&&Qr(zr);return{exp:e.slice(0,Cr),key:e.slice(Cr+1,wr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Yr(){return Nr.charCodeAt(++Lr)}function Kr(){return Lr>=Or}function Zr(e){return 34===e||39===e}function Qr(e){var t=1;for(Cr=Lr;!Kr();)if(Zr(e=Yr()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){wr=Lr;break}}function Jr(e){for(var t=e;!Kr()&&(e=Yr())!==t;);}var eo,to="__r";function no(e,t,n){var r=eo;return function o(){var i=t.apply(null,arguments);null!==i&&io(e,o,n,r)}}var ro=Ke&&!(ne&&Number(ne[1])<=53);function oo(e,t,n,r){if(ro){var o=hn,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}eo.addEventListener(e,t,oe?{capture:n,passive:r}:n)}function io(e,t,n,r){(r||eo).removeEventListener(e,t._wrapper||t,n)}function ao(e,t){if(!o(e.data.on)||!o(t.data.on)){var n=t.data.on||{},r=e.data.on||{};eo=t.elm,function(e){if(i(e.__r)){var t=Q?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}i(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),ut(n,r,oo,io,no,t.context),eo=void 0}}var co,so={create:ao,update:ao};function lo(e,t){if(!o(e.data.domProps)||!o(t.data.domProps)){var n,r,a=t.elm,c=e.data.domProps||{},s=t.data.domProps||{};for(n in i(s.__ob__)&&(s=t.data.domProps=w({},s)),c)n in s||(a[n]="");for(n in s){if(r=s[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),r===c[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var l=o(r)?"":String(r);uo(a,l)&&(a.value=l)}else if("innerHTML"===n&&er(a.tagName)&&o(a.innerHTML)){(co=co||document.createElement("div")).innerHTML=""+r+"";for(var u=co.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;u.firstChild;)a.appendChild(u.firstChild)}else if(r!==c[n])try{a[n]=r}catch(e){}}}}function uo(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(i(r)){if(r.number)return M(n)!==M(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var fo={create:lo,update:lo},po=y((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}})),t}));function ho(e){var t=Mo(e.style);return e.staticStyle?w(e.staticStyle,t):t}function Mo(e){return Array.isArray(e)?S(e):"string"==typeof e?po(e):e}var vo,bo=/^--/,mo=/\s*!important$/,go=function(e,t,n){if(bo.test(t))e.style.setProperty(t,n);else if(mo.test(n))e.style.setProperty(z(t),n.replace(mo,""),"important");else{var r=_o(t);if(Array.isArray(n))for(var o=0,i=n.length;o-1?t.split(To).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function No(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(To).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function zo(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&w(t,Lo(e.name||"v")),w(t,e),t}return"string"==typeof e?Lo(e):void 0}}var Lo=y((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),Co=V&&!J,wo="transition",So="animation",Ro="transition",qo="transitionend",xo="animation",Wo="animationend";Co&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ro="WebkitTransition",qo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(xo="WebkitAnimation",Wo="webkitAnimationEnd"));var ko=V?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Bo(e){ko((function(){ko(e)}))}function Io(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),Oo(e,t))}function Do(e,t){e._transitionClasses&&g(e._transitionClasses,t),No(e,t)}function Xo(e,t,n){var r=jo(e,t),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var c=o===wo?qo:Wo,s=0,l=function(){e.removeEventListener(c,u),n()},u=function(t){t.target===e&&++s>=a&&l()};setTimeout((function(){s0&&(n=wo,u=a,f=i.length):t===So?l>0&&(n=So,u=l,f=s.length):f=(n=(u=Math.max(a,l))>0?a>l?wo:So:null)?n===wo?i.length:s.length:0,{type:n,timeout:u,propCount:f,hasTransform:n===wo&&Po.test(r[Ro+"Property"])}}function Uo(e,t){for(;e.length1}function Yo(e,t){!0!==t.data.show&&Fo(t)}var Ko=function(e){var t,n,r={},s=e.modules,l=e.nodeOps;for(t=0;th?g(e,o(n[b+1])?null:n[b+1].elm,n,p,b,r):p>b&&_(t,d,h)}(d,v,b,n,u):i(b)?(i(e.text)&&l.setTextContent(d,""),g(d,null,b,0,b.length-1,n)):i(v)?_(v,0,v.length-1):i(e.text)&&l.setTextContent(d,""):e.text!==t.text&&l.setTextContent(d,t.text),i(h)&&i(p=h.hook)&&i(p=p.postpatch)&&p(e,t)}}}function O(e,t,n){if(a(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(W(ti(a),r))return void(e.selectedIndex!==c&&(e.selectedIndex=c));o||(e.selectedIndex=-1)}}function ei(e,t){return t.every((function(t){return!W(t,e)}))}function ti(e){return"_value"in e?e._value:e.value}function ni(e){e.target.composing=!0}function ri(e){e.target.composing&&(e.target.composing=!1,oi(e.target,"input"))}function oi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function ii(e){return!e.componentInstance||e.data&&e.data.transition?e:ii(e.componentInstance._vnode)}var ai={bind:function(e,t,n){var r=t.value,o=(n=ii(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,Fo(n,(function(){e.style.display=i}))):e.style.display=r?i:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=ii(n)).data&&n.data.transition?(n.data.show=!0,r?Fo(n,(function(){e.style.display=e.__vOriginalDisplay})):$o(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}},ci={model:Zo,show:ai},si={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function li(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?li(Kt(t.children)):e}function ui(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[T(i)]=o[i];return t}function fi(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var di=function(e){return e.tag||Yt(e)},pi=function(e){return"show"===e.name},hi={name:"transition",props:si,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(di)).length){0;var r=this.mode;0;var o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=li(o);if(!i)return o;if(this._leaving)return fi(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:c(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=ui(this),l=this._vnode,u=li(l);if(i.data.directives&&i.data.directives.some(pi)&&(i.data.show=!0),u&&u.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,u)&&!Yt(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var f=u.data.transition=w({},s);if("out-in"===r)return this._leaving=!0,ft(f,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),fi(e,o);if("in-out"===r){if(Yt(i))return l;var d,p=function(){d()};ft(s,"afterEnter",p),ft(s,"enterCancelled",p),ft(f,"delayLeave",(function(e){d=e}))}}return o}}},Mi=w({tag:String,moveClass:String},si);delete Mi.mode;var vi={props:Mi,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=nn(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ui(this),c=0;c-1?rr[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:rr[e]=/HTMLUnknownElement/.test(t.toString())},w(wn.options.directives,ci),w(wn.options.components,Ai),wn.prototype.__patch__=V?Ko:R,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ge),cn(e,"beforeMount"),r=function(){e._update(e._render(),n)},new gn(e,r,R,{before:function(){e._isMounted&&!e._isDestroyed&&cn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,cn(e,"mounted")),e}(this,e=e&&V?ir(e):void 0,t)},V&&setTimeout((function(){P.devtools&&ce&&ce.emit("init",wn)}),0);var _i=/\{\{((?:.|\r?\n)+?)\}\}/g,yi=/[-.*+?^${}()|[\]\/\\]/g,Ei=y((function(e){var t=e[0].replace(yi,"\\$&"),n=e[1].replace(yi,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var Ti={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Hr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Ur(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var Oi,Ni={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Hr(e,"style");n&&(e.staticStyle=JSON.stringify(po(n)));var r=Ur(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},zi=function(e){return(Oi=Oi||document.createElement("div")).innerHTML=e,Oi.textContent},Li=v("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Ci=v("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),wi=v("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Si=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ri=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,qi="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+j.source+"]*",xi="((?:"+qi+"\\:)?"+qi+")",Wi=new RegExp("^<"+xi),ki=/^\s*(\/?)>/,Bi=new RegExp("^<\\/"+xi+"[^>]*>"),Ii=/^]+>/i,Di=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Hi=/&(?:lt|gt|quot|amp|#39);/g,Fi=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,$i=v("pre,textarea",!0),Gi=function(e,t){return e&&$i(e)&&"\n"===t[0]};function Vi(e,t){var n=t?Fi:Hi;return e.replace(n,(function(e){return Ui[e]}))}var Yi,Ki,Zi,Qi,Ji,ea,ta,na,ra=/^@|^v-on:/,oa=/^v-|^@|^:|^#/,ia=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,aa=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ca=/^\(|\)$/g,sa=/^\[.*\]$/,la=/:(.*)$/,ua=/^:|^\.|^v-bind:/,fa=/\.[^.\]]+(?=[^\]]*$)/g,da=/^v-slot(:|$)|^#/,pa=/[\r\n]/,ha=/\s+/g,Ma=y(zi),va="_empty_";function ba(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:Ta(t),rawAttrsMap:{},parent:n,children:[]}}function ma(e,t){Yi=t.warn||Wr,ea=t.isPreTag||q,ta=t.mustUseProp||q,na=t.getTagNamespace||q;var n=t.isReservedTag||q;(function(e){return!!e.component||!n(e.tag)}),Zi=kr(t.modules,"transformNode"),Qi=kr(t.modules,"preTransformNode"),Ji=kr(t.modules,"postTransformNode"),Ki=t.delimiters;var r,o,i=[],a=!1!==t.preserveWhitespace,c=t.whitespace,s=!1,l=!1;function u(e){if(f(e),s||e.processed||(e=ga(e,t)),i.length||e===r||r.if&&(e.elseif||e.else)&&_a(r,{exp:e.elseif,block:e}),o&&!e.forbidden)if(e.elseif||e.else)a=e,c=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(o.children),c&&c.if&&_a(c,{exp:a.elseif,block:a});else{if(e.slotScope){var n=e.slotTarget||'"default"';(o.scopedSlots||(o.scopedSlots={}))[n]=e}o.children.push(e),e.parent=o}var a,c;e.children=e.children.filter((function(e){return!e.slotScope})),f(e),e.pre&&(s=!1),ea(e.tag)&&(l=!1);for(var u=0;u]*>)","i")),d=e.replace(f,(function(e,n,r){return l=r.length,Pi(u)||"noscript"===u||(n=n.replace(//g,"$1").replace(//g,"$1")),Gi(u,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));s+=e.length-d.length,e=d,N(u,s-l,s)}else{var p=e.indexOf("<");if(0===p){if(Di.test(e)){var h=e.indexOf("--\x3e");if(h>=0){t.shouldKeepComment&&t.comment(e.substring(4,h),s,s+h+3),E(h+3);continue}}if(Xi.test(e)){var M=e.indexOf("]>");if(M>=0){E(M+2);continue}}var v=e.match(Ii);if(v){E(v[0].length);continue}var b=e.match(Bi);if(b){var m=s;E(b[0].length),N(b[1],m,s);continue}var g=T();if(g){O(g),Gi(g.tagName,e)&&E(1);continue}}var A=void 0,_=void 0,y=void 0;if(p>=0){for(_=e.slice(p);!(Bi.test(_)||Wi.test(_)||Di.test(_)||Xi.test(_)||(y=_.indexOf("<",1))<0);)p+=y,_=e.slice(p);A=e.substring(0,p)}p<0&&(A=e),A&&E(A.length),t.chars&&A&&t.chars(A,s-A.length,s)}if(e===n){t.chars&&t.chars(e);break}}function E(t){s+=t,e=e.substring(t)}function T(){var t=e.match(Wi);if(t){var n,r,o={tagName:t[1],attrs:[],start:s};for(E(t[0].length);!(n=e.match(ki))&&(r=e.match(Ri)||e.match(Si));)r.start=s,E(r[0].length),r.end=s,o.attrs.push(r);if(n)return o.unarySlash=n[1],E(n[0].length),o.end=s,o}}function O(e){var n=e.tagName,s=e.unarySlash;i&&("p"===r&&wi(n)&&N(r),c(n)&&r===n&&N(n));for(var l=a(n)||!!s,u=e.attrs.length,f=new Array(u),d=0;d=0&&o[a].lowerCasedTag!==c;a--);else a=0;if(a>=0){for(var l=o.length-1;l>=a;l--)t.end&&t.end(o[l].tag,n,i);o.length=a,r=a&&o[a-1].tag}else"br"===c?t.start&&t.start(e,[],!0,n,i):"p"===c&&(t.start&&t.start(e,[],!1,n,i),t.end&&t.end(e,n,i))}N()}(e,{warn:Yi,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,a,c,f){var d=o&&o.ns||na(e);Q&&"svg"===d&&(n=function(e){for(var t=[],n=0;ns&&(c.push(i=e.slice(s,o)),a.push(JSON.stringify(i)));var l=qr(r[1].trim());a.push("_s("+l+")"),c.push({"@binding":l}),s=o+r[0].length}return s-1"+("true"===i?":("+t+")":":_q("+t+","+i+")")),jr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+i+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+o+")":o)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Vr(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Vr(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Vr(t,"$$c")+"}",null,!0)}(e,r,o);else if("input"===i&&"radio"===a)!function(e,t,n){var r=n&&n.number,o=Ur(e,"value")||"null";Br(e,"checked","_q("+t+","+(o=r?"_n("+o+")":o)+")"),jr(e,"change",Vr(t,o),null,!0)}(e,r,o);else if("input"===i||"textarea"===i)!function(e,t,n){var r=e.attrsMap.type;0;var o=n||{},i=o.lazy,a=o.number,c=o.trim,s=!i&&"range"!==r,l=i?"change":"range"===r?to:"input",u="$event.target.value";c&&(u="$event.target.value.trim()");a&&(u="_n("+u+")");var f=Vr(t,u);s&&(f="if($event.target.composing)return;"+f);Br(e,"value","("+t+")"),jr(e,l,f,null,!0),(c||a)&&jr(e,"blur","$forceUpdate()")}(e,r,o);else{if(!P.isReservedTag(i))return Gr(e,r,o),!1}return!0},text:function(e,t){t.value&&Br(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Br(e,"innerHTML","_s("+t.value+")",t)}},qa={expectHTML:!0,modules:Ca,directives:Ra,isPreTag:function(e){return"pre"===e},isUnaryTag:Li,mustUseProp:Xn,canBeLeftOpenTag:Ci,isReservedTag:tr,getTagNamespace:nr,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(Ca)},xa=y((function(e){return v("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function Wa(e,t){e&&(wa=xa(t.staticKeys||""),Sa=t.isReservedTag||q,ka(e),Ba(e,!1))}function ka(e){if(e.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||b(e.tag)||!Sa(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(wa)))}(e),1===e.type){if(!Sa(e.tag)&&"slot"!==e.tag&&null==e.attrsMap["inline-template"])return;for(var t=0,n=e.children.length;t|^function(?:\s+[\w$]+)?\s*\(/,Da=/\([^)]*?\);*$/,Xa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Pa={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},ja={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ua=function(e){return"if("+e+")return null;"},Ha={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ua("$event.target !== $event.currentTarget"),ctrl:Ua("!$event.ctrlKey"),shift:Ua("!$event.shiftKey"),alt:Ua("!$event.altKey"),meta:Ua("!$event.metaKey"),left:Ua("'button' in $event && $event.button !== 0"),middle:Ua("'button' in $event && $event.button !== 1"),right:Ua("'button' in $event && $event.button !== 2")};function Fa(e,t){var n=t?"nativeOn:":"on:",r="",o="";for(var i in e){var a=$a(e[i]);e[i]&&e[i].dynamic?o+=i+","+a+",":r+='"'+i+'":'+a+","}return r="{"+r.slice(0,-1)+"}",o?n+"_d("+r+",["+o.slice(0,-1)+"])":n+r}function $a(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return $a(e)})).join(",")+"]";var t=Xa.test(e.value),n=Ia.test(e.value),r=Xa.test(e.value.replace(Da,""));if(e.modifiers){var o="",i="",a=[];for(var c in e.modifiers)if(Ha[c])i+=Ha[c],Pa[c]&&a.push(c);else if("exact"===c){var s=e.modifiers;i+=Ua(["ctrl","shift","alt","meta"].filter((function(e){return!s[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else a.push(c);return a.length&&(o+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ga).join("&&")+")return null;"}(a)),i&&(o+=i),"function($event){"+o+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ga(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Pa[e],r=ja[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Va={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:R},Ya=function(e){this.options=e,this.warn=e.warn||Wr,this.transforms=kr(e.modules,"transformCode"),this.dataGenFns=kr(e.modules,"genData"),this.directives=w(w({},Va),e.directives);var t=e.isReservedTag||q;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Ka(e,t){var n=new Ya(t);return{render:"with(this){return "+(e?Za(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Za(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Qa(e,t);if(e.once&&!e.onceProcessed)return Ja(e,t);if(e.for&&!e.forProcessed)return nc(e,t);if(e.if&&!e.ifProcessed)return ec(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=ac(e,t),o="_t("+n+(r?","+r:""),i=e.attrs||e.dynamicAttrs?lc((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:T(e.name),value:e.value,dynamic:e.dynamic}}))):null,a=e.attrsMap["v-bind"];!i&&!a||r||(o+=",null");i&&(o+=","+i);a&&(o+=(i?"":",null")+","+a);return o+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:ac(t,n,!0);return"_c("+e+","+rc(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=rc(e,t));var o=e.inlineTemplate?null:ac(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(o?","+o:"")+")"}for(var i=0;i>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var i=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var r=Ka(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);i&&(n+=i+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+lc(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function oc(e){return 1===e.type&&("slot"===e.tag||e.children.some(oc))}function ic(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return ec(e,t,ic,"null");if(e.for&&!e.forProcessed)return nc(e,t,ic);var r=e.slotScope===va?"":String(e.slotScope),o="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(ac(e,t)||"undefined")+":undefined":ac(e,t)||"undefined":Za(e,t))+"}",i=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+o+i+"}"}function ac(e,t,n,r,o){var i=e.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var c=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Za)(a,t)+c}var s=n?function(e,t){for(var n=0,r=0;r':'
',hc.innerHTML.indexOf(" ")>0}var gc=!!V&&mc(!1),Ac=!!V&&mc(!0),_c=y((function(e){var t=ir(e);return t&&t.innerHTML})),yc=wn.prototype.$mount;wn.prototype.$mount=function(e,t){if((e=e&&ir(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=_c(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){0;var o=bc(r,{outputSourceRange:!1,shouldDecodeNewlines:gc,shouldDecodeNewlinesForHref:Ac,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a}}return yc.call(this,e,t)},wn.compile=bc;const Ec=wn;var Tc=n(6486),Oc=n.n(Tc),Nc=n(8),zc=n.n(Nc);const Lc={computed:{Telescope:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){return Telescope}))},methods:{timeAgo:function(e){zc().updateLocale("en",{relativeTime:{future:"in %s",past:"%s ago",s:function(e){return e+"s ago"},ss:"%ds ago",m:"1m ago",mm:"%dm ago",h:"1h ago",hh:"%dh ago",d:"1d ago",dd:"%dd ago",M:"a month ago",MM:"%d months ago",y:"a year ago",yy:"%d years ago"}});var t=zc()().diff(e,"seconds"),n=zc()("2018-01-01").startOf("day").seconds(t);return t>300?zc()(e).fromNow(!0):t<60?n.format("s")+"s ago":n.format("m:ss")+"m ago"},localTime:function(e){return zc()(e).local().format("MMMM Do YYYY, h:mm:ss A")},truncate:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:70;return Oc().truncate(e,{length:t,separator:/,? +/})},debouncer:Oc().debounce((function(e){return e()}),500),alertError:function(e){this.$root.alert.type="error",this.$root.alert.autoClose=!1,this.$root.alert.message=e},alertSuccess:function(e,t){this.$root.alert.type="success",this.$root.alert.autoClose=t,this.$root.alert.message=e},alertConfirm:function(e,t,n){this.$root.alert.type="confirmation",this.$root.alert.autoClose=!1,this.$root.alert.message=e,this.$root.alert.confirmationProceed=t,this.$root.alert.confirmationCancel=n}}};var Cc=n(9669),wc=n.n(Cc);const Sc=[{path:"/",redirect:"/requests"},{path:"/mail/:id",name:"mail-preview",component:n(417).Z},{path:"/mail",name:"mail",component:n(2553).Z},{path:"/exceptions/:id",name:"exception-preview",component:n(143).Z},{path:"/exceptions",name:"exceptions",component:n(4945).Z},{path:"/dumps",name:"dumps",component:n(2191).Z},{path:"/logs/:id",name:"log-preview",component:n(4926).Z},{path:"/logs",name:"logs",component:n(9261).Z},{path:"/notifications/:id",name:"notification-preview",component:n(4159).Z},{path:"/notifications",name:"notifications",component:n(3661).Z},{path:"/jobs/:id",name:"job-preview",component:n(7430).Z},{path:"/jobs",name:"jobs",component:n(121).Z},{path:"/batches/:id",name:"batch-preview",component:n(1168).Z},{path:"/batches",name:"batches",component:n(9660).Z},{path:"/events/:id",name:"event-preview",component:n(749).Z},{path:"/events",name:"events",component:n(5367).Z},{path:"/cache/:id",name:"cache-preview",component:n(3414).Z},{path:"/cache",name:"cache",component:n(2589).Z},{path:"/queries/:id",name:"query-preview",component:n(715).Z},{path:"/queries",name:"queries",component:n(1595).Z},{path:"/models/:id",name:"model-preview",component:n(3787).Z},{path:"/models",name:"models",component:n(6762).Z},{path:"/requests/:id",name:"request-preview",component:n(2916).Z},{path:"/requests",name:"requests",component:n(7332).Z},{path:"/commands/:id",name:"command-preview",component:n(4656).Z},{path:"/commands",name:"commands",component:n(1163).Z},{path:"/schedule/:id",name:"schedule-preview",component:n(8153).Z},{path:"/schedule",name:"schedule",component:n(7572).Z},{path:"/redis/:id",name:"redis-preview",component:n(8795).Z},{path:"/redis",name:"redis",component:n(5480).Z},{path:"/monitored-tags",name:"monitored-tags",component:n(477).Z},{path:"/gates/:id",name:"gate-preview",component:n(3605).Z},{path:"/gates",name:"gates",component:n(8421).Z},{path:"/views/:id",name:"view-preview",component:n(8813).Z},{path:"/views",name:"views",component:n(5711).Z},{path:"/client-requests/:id",name:"client-request-preview",component:n(9440).Z},{path:"/client-requests",name:"client-requests",component:n(601).Z}];function Rc(e,t){for(var n in t)e[n]=t[n];return e}var qc=/[!'()*]/g,xc=function(e){return"%"+e.charCodeAt(0).toString(16)},Wc=/%2C/g,kc=function(e){return encodeURIComponent(e).replace(qc,xc).replace(Wc,",")};function Bc(e){try{return decodeURIComponent(e)}catch(e){0}return e}var Ic=function(e){return null==e||"object"==typeof e?e:String(e)};function Dc(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=Bc(n.shift()),o=n.length>0?Bc(n.join("=")):null;void 0===t[r]?t[r]=o:Array.isArray(t[r])?t[r].push(o):t[r]=[t[r],o]})),t):t}function Xc(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return kc(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(kc(t)):r.push(kc(t)+"="+kc(e)))})),r.join("&")}return kc(t)+"="+kc(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var Pc=/\/?$/;function jc(e,t,n,r){var o=r&&r.options.stringifyQuery,i=t.query||{};try{i=Uc(i)}catch(e){}var a={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:i,params:t.params||{},fullPath:$c(t,o),matched:e?Fc(e):[]};return n&&(a.redirectedFrom=$c(n,o)),Object.freeze(a)}function Uc(e){if(Array.isArray(e))return e.map(Uc);if(e&&"object"==typeof e){var t={};for(var n in e)t[n]=Uc(e[n]);return t}return e}var Hc=jc(null,{path:"/"});function Fc(e){for(var t=[];e;)t.unshift(e),e=e.parent;return t}function $c(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var o=e.hash;return void 0===o&&(o=""),(n||"/")+(t||Xc)(r)+o}function Gc(e,t,n){return t===Hc?e===t:!!t&&(e.path&&t.path?e.path.replace(Pc,"")===t.path.replace(Pc,"")&&(n||e.hash===t.hash&&Vc(e.query,t.query)):!(!e.name||!t.name)&&(e.name===t.name&&(n||e.hash===t.hash&&Vc(e.query,t.query)&&Vc(e.params,t.params))))}function Vc(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,o){var i=e[n];if(r[o]!==n)return!1;var a=t[n];return null==i||null==a?i===a:"object"==typeof i&&"object"==typeof a?Vc(i,a):String(i)===String(a)}))}function Yc(e){for(var t=0;t=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(o.path||""),l=t&&t.path||"/",u=s.path?Qc(s.path,l,n||o.append):l,f=function(e,t,n){void 0===t&&(t={});var r,o=n||Dc;try{r=o(e||"")}catch(e){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(Ic):Ic(a)}return r}(s.query,o.query,r&&r.options.parseQuery),d=o.hash||s.hash;return d&&"#"!==d.charAt(0)&&(d="#"+d),{_normalized:!0,path:u,query:f,hash:d}}var As,_s=function(){},ys={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,c=o.href,s={},l=n.options.linkActiveClass,u=n.options.linkExactActiveClass,f=null==l?"router-link-active":l,d=null==u?"router-link-exact-active":u,p=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?d:this.exactActiveClass,M=a.redirectedFrom?jc(null,gs(a.redirectedFrom),null,n):a;s[h]=Gc(r,M,this.exactPath),s[p]=this.exact||this.exactPath?s[h]:function(e,t){return 0===e.path.replace(Pc,"/").indexOf(t.path.replace(Pc,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,M);var v=s[h]?this.ariaCurrentValue:null,b=function(e){Es(e)&&(t.replace?n.replace(i,_s):n.push(i,_s))},m={click:Es};Array.isArray(this.event)?this.event.forEach((function(e){m[e]=b})):m[this.event]=b;var g={class:s},A=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:a,navigate:b,isActive:s[p],isExactActive:s[h]});if(A){if(1===A.length)return A[0];if(A.length>1||!A.length)return 0===A.length?e():e("span",{},A)}if("a"===this.tag)g.on=m,g.attrs={href:c,"aria-current":v};else{var _=Ts(this.$slots.default);if(_){_.isStatic=!1;var y=_.data=Rc({},_.data);for(var E in y.on=y.on||{},y.on){var T=y.on[E];E in m&&(y.on[E]=Array.isArray(T)?T:[T])}for(var O in m)O in y.on?y.on[O].push(m[O]):y.on[O]=b;var N=_.data.attrs=Rc({},_.data.attrs);N.href=c,N["aria-current"]=v}else g.on=m}return e(this.tag,g,this.$slots.default)}};function Es(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){var t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Ts(e){if(e)for(var t,n=0;n-1&&(c.params[d]=n.params[d]);return c.path=ms(u.path,c.params),s(u,c,a)}if(c.path){c.params={};for(var p=0;p=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}var Zs={redirected:2,aborted:4,cancelled:8,duplicated:16};function Qs(e,t){return el(e,t,Zs.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return tl.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function Js(e,t){return el(e,t,Zs.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function el(e,t,n,r){var o=new Error(r);return o._isRouter=!0,o.from=e,o.to=t,o.type=n,o}var tl=["params","query","hash"];function nl(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function rl(e,t){return nl(e)&&e._isRouter&&(null==t||e.type===t)}function ol(e){return function(t,n,r){var o=!1,i=0,a=null;il(e,(function(e,t,n,c){if("function"==typeof e&&void 0===e.cid){o=!0,i++;var s,l=sl((function(t){var o;((o=t).__esModule||cl&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:As.extend(t),n.components[c]=t,--i<=0&&r()})),u=sl((function(e){var t="Failed to resolve async component "+c+": "+e;a||(a=nl(e)?e:new Error(t),r(a))}));try{s=e(l,u)}catch(e){u(e)}if(s)if("function"==typeof s.then)s.then(l,u);else{var f=s.component;f&&"function"==typeof f.then&&f.then(l,u)}}})),o||r()}}function il(e,t){return al(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function al(e){return Array.prototype.concat.apply([],e)}var cl="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function sl(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var ll=function(e,t){this.router=e,this.base=function(e){if(!e)if(Os){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=Hc,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function ul(e,t,n,r){var o=il(e,(function(e,r,o,i){var a=function(e,t){"function"!=typeof e&&(e=As.extend(e));return e.options[t]}(e,t);if(a)return Array.isArray(a)?a.map((function(e){return n(e,r,o,i)})):n(a,r,o,i)}));return al(r?o.reverse():o)}function fl(e,t){if(t)return function(){return e.apply(t,arguments)}}ll.prototype.listen=function(e){this.cb=e},ll.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},ll.prototype.onError=function(e){this.errorCbs.push(e)},ll.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&(rl(e,Zs.redirected)&&i===Hc||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},ll.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var i,a,c=function(e){!rl(e)&&nl(e)&&r.errorCbs.length&&r.errorCbs.forEach((function(t){t(e)})),n&&n(e)},s=e.matched.length-1,l=o.matched.length-1;if(Gc(e,o)&&s===l&&e.matched[s]===o.matched[l])return this.ensureURL(),c(((a=el(i=o,e,Zs.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var u=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=Gs&&n;r&&this.listeners.push(Bs());var o=function(){var n=e.current,o=pl(e.base);e.current===Hc&&o===e._startLocation||e.transitionTo(o,(function(e){r&&Is(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Vs(Jc(r.base+e.fullPath)),Is(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Ys(Jc(r.base+e.fullPath)),Is(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(pl(this.base)!==this.current.fullPath){var t=Jc(this.base+this.current.fullPath);e?Vs(t):Ys(t)}},t.prototype.getCurrentLocation=function(){return pl(this.base)},t}(ll);function pl(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var hl=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=pl(e);if(!/^\/#/.test(t))return window.location.replace(Jc(e+"/#"+t)),!0}(this.base)||Ml()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=Gs&&t;n&&this.listeners.push(Bs());var r=function(){var t=e.current;Ml()&&e.transitionTo(vl(),(function(r){n&&Is(e.router,r,t,!0),Gs||gl(r.fullPath)}))},o=Gs?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ml(e.fullPath),Is(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){gl(e.fullPath),Is(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;vl()!==t&&(e?ml(t):gl(t))},t.prototype.getCurrentLocation=function(){return vl()},t}(ll);function Ml(){var e=vl();return"/"===e.charAt(0)||(gl("/"+e),!1)}function vl(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function bl(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function ml(e){Gs?Vs(bl(e)):window.location.hash=e}function gl(e){Gs?Ys(bl(e)):window.location.replace(bl(e))}var Al=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){rl(e,Zs.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(ll),_l=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Cs(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!Gs&&!1!==e.fallback,this.fallback&&(t="hash"),Os||(t="abstract"),this.mode=t,t){case"history":this.history=new dl(this,e.base);break;case"hash":this.history=new hl(this,e.base,this.fallback);break;case"abstract":this.history=new Al(this,e.base)}},yl={currentRoute:{configurable:!0}};function El(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}_l.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},yl.currentRoute.get=function(){return this.history&&this.history.current},_l.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof dl||n instanceof hl){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;Gs&&o&&"fullPath"in e&&Is(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},_l.prototype.beforeEach=function(e){return El(this.beforeHooks,e)},_l.prototype.beforeResolve=function(e){return El(this.resolveHooks,e)},_l.prototype.afterEach=function(e){return El(this.afterHooks,e)},_l.prototype.onReady=function(e,t){this.history.onReady(e,t)},_l.prototype.onError=function(e){this.history.onError(e)},_l.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},_l.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},_l.prototype.go=function(e){this.history.go(e)},_l.prototype.back=function(){this.go(-1)},_l.prototype.forward=function(){this.go(1)},_l.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},_l.prototype.resolve=function(e,t,n){var r=gs(e,t=t||this.history.current,n,this),o=this.match(r,t),i=o.redirectedFrom||o.fullPath,a=function(e,t,n){var r="hash"===n?"#"+t:t;return e?Jc(e+"/"+r):r}(this.history.base,i,this.mode);return{location:r,route:o,href:a,normalizedTo:r,resolved:o}},_l.prototype.getRoutes=function(){return this.matcher.getRoutes()},_l.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==Hc&&this.history.transitionTo(this.history.getCurrentLocation())},_l.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==Hc&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(_l.prototype,yl),_l.install=function e(t){if(!e.installed||As!==t){e.installed=!0,As=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",Kc),t.component("RouterLink",ys);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},_l.version="3.5.1",_l.isNavigationFailure=rl,_l.NavigationFailureType=Zs,_l.START_LOCATION=Hc,Os&&window.Vue&&window.Vue.use(_l);const Tl=_l;var Ol=n(4566),Nl=n.n(Ol),zl=n(3379),Ll=n.n(zl),Cl=n(8041),wl={insert:"head",singleton:!1};Ll()(Cl.Z,wl);Cl.Z.locals;n(3734);var Sl=document.head.querySelector('meta[name="csrf-token"]');Sl&&(wc().defaults.headers.common["X-CSRF-TOKEN"]=Sl.content),Ec.use(Tl),window.Popper=n(8981).default,zc().tz.setDefault(Telescope.timezone),window.Telescope.basePath="/"+window.Telescope.path;var Rl=window.Telescope.basePath+"/";""!==window.Telescope.path&&"/"!==window.Telescope.path||(Rl="/",window.Telescope.basePath="");var ql=new Tl({routes:Sc,mode:"history",base:Rl});Ec.component("vue-json-pretty",Nl()),Ec.component("related-entries",n(1479).Z),Ec.component("index-screen",n(5539).Z),Ec.component("preview-screen",n(9932).Z),Ec.component("alert",n(9633).Z),Ec.mixin(Lc),new Ec({el:"#telescope",router:ql,data:function(){return{alert:{type:null,autoClose:0,message:"",confirmationProceed:null,confirmationCancel:null},autoLoadsNewEntries:"1"===localStorage.autoLoadsNewEntries,recording:Telescope.recording}},methods:{autoLoadNewEntries:function(){this.autoLoadsNewEntries?(this.autoLoadsNewEntries=!1,localStorage.autoLoadsNewEntries=0):(this.autoLoadsNewEntries=!0,localStorage.autoLoadsNewEntries=1)},toggleRecording:function(){wc().post(Telescope.basePath+"/telescope-api/toggle-recording"),window.Telescope.recording=!Telescope.recording,this.recording=!this.recording},clearEntries:function(){confirm("Are you sure you want to delete all Telescope data?")&&wc().delete(Telescope.basePath+"/telescope-api/entries").then((function(e){return location.reload()}))}}})},3064:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r={methods:{cacheActionTypeClass:function(e){return"hit"===e?"success":"set"===e?"info":"forget"===e?"warning":"missed"===e?"danger":void 0},composerTypeClass:function(e){return"composer"===e?"info":"creator"===e?"success":void 0},gateResultClass:function(e){return"allowed"===e?"success":"denied"===e?"danger":void 0},jobStatusClass:function(e){return"pending"===e?"secondary":"processed"===e?"success":"failed"===e?"danger":void 0},logLevelClass:function(e){return"debug"===e?"success":"info"===e?"info":"notice"===e?"secondary":"warning"===e?"warning":"error"===e||"critical"===e||"alert"===e||"emergency"===e?"danger":void 0},modelActionClass:function(e){return"created"==e?"success":"updated"==e?"info":"retrieved"==e?"secondary":"deleted"==e||"forceDeleted"==e?"danger":void 0},requestStatusClass:function(e){return e?e<300?"secondary":e<400?"info":e<500?"warning":e>=500?"danger":void 0:"danger"},requestMethodClass:function(e){return"GET"==e||"OPTIONS"==e?"secondary":"POST"==e||"PATCH"==e||"PUT"==e?"info":"DELETE"==e?"danger":void 0}}}},3734:function(e,t,n){!function(e,t,n){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=r(t),i=r(n);function a(e,t){for(var n=0;n=a)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};b.jQueryDetection(),v();var m="alert",g="4.6.0",A="bs.alert",_="."+A,y=".data-api",E=o.default.fn[m],T='[data-dismiss="alert"]',O="close"+_,N="closed"+_,z="click"+_+y,L="alert",C="fade",w="show",S=function(){function e(e){this._element=e}var t=e.prototype;return t.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},t.dispose=function(){o.default.removeData(this._element,A),this._element=null},t._getRootElement=function(e){var t=b.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n||(n=o.default(e).closest("."+L)[0]),n},t._triggerCloseEvent=function(e){var t=o.default.Event(O);return o.default(e).trigger(t),t},t._removeElement=function(e){var t=this;if(o.default(e).removeClass(w),o.default(e).hasClass(C)){var n=b.getTransitionDurationFromElement(e);o.default(e).one(b.TRANSITION_END,(function(n){return t._destroyElement(e,n)})).emulateTransitionEnd(n)}else this._destroyElement(e)},t._destroyElement=function(e){o.default(e).detach().trigger(N).remove()},e._jQueryInterface=function(t){return this.each((function(){var n=o.default(this),r=n.data(A);r||(r=new e(this),n.data(A,r)),"close"===t&&r[t](this)}))},e._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},c(e,null,[{key:"VERSION",get:function(){return g}}]),e}();o.default(document).on(z,T,S._handleDismiss(new S)),o.default.fn[m]=S._jQueryInterface,o.default.fn[m].Constructor=S,o.default.fn[m].noConflict=function(){return o.default.fn[m]=E,S._jQueryInterface};var R="button",q="4.6.0",x="bs.button",W="."+x,k=".data-api",B=o.default.fn[R],I="active",D="btn",X="focus",P='[data-toggle^="button"]',j='[data-toggle="buttons"]',U='[data-toggle="button"]',H='[data-toggle="buttons"] .btn',F='input:not([type="hidden"])',$=".active",G=".btn",V="click"+W+k,Y="focus"+W+k+" blur"+W+k,K="load"+W+k,Z=function(){function e(e){this._element=e,this.shouldAvoidTriggerChange=!1}var t=e.prototype;return t.toggle=function(){var e=!0,t=!0,n=o.default(this._element).closest(j)[0];if(n){var r=this._element.querySelector(F);if(r){if("radio"===r.type)if(r.checked&&this._element.classList.contains(I))e=!1;else{var i=n.querySelector($);i&&o.default(i).removeClass(I)}e&&("checkbox"!==r.type&&"radio"!==r.type||(r.checked=!this._element.classList.contains(I)),this.shouldAvoidTriggerChange||o.default(r).trigger("change")),r.focus(),t=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(I)),e&&o.default(this._element).toggleClass(I))},t.dispose=function(){o.default.removeData(this._element,x),this._element=null},e._jQueryInterface=function(t,n){return this.each((function(){var r=o.default(this),i=r.data(x);i||(i=new e(this),r.data(x,i)),i.shouldAvoidTriggerChange=n,"toggle"===t&&i[t]()}))},c(e,null,[{key:"VERSION",get:function(){return q}}]),e}();o.default(document).on(V,P,(function(e){var t=e.target,n=t;if(o.default(t).hasClass(D)||(t=o.default(t).closest(G)[0]),!t||t.hasAttribute("disabled")||t.classList.contains("disabled"))e.preventDefault();else{var r=t.querySelector(F);if(r&&(r.hasAttribute("disabled")||r.classList.contains("disabled")))return void e.preventDefault();"INPUT"!==n.tagName&&"LABEL"===t.tagName||Z._jQueryInterface.call(o.default(t),"toggle","INPUT"===n.tagName)}})).on(Y,P,(function(e){var t=o.default(e.target).closest(G)[0];o.default(t).toggleClass(X,/^focus(in)?$/.test(e.type))})),o.default(window).on(K,(function(){for(var e=[].slice.call(document.querySelectorAll(H)),t=0,n=e.length;t0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=e.prototype;return t.next=function(){this._isSliding||this._slide(ue)},t.nextWhenVisible=function(){var e=o.default(this._element);!document.hidden&&e.is(":visible")&&"hidden"!==e.css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(fe)},t.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(De)&&(b.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(e){var t=this;this._activeElement=this._element.querySelector(ke);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)o.default(this._element).one(Me,(function(){return t.to(e)}));else{if(n===e)return this.pause(),void this.cycle();var r=e>n?ue:fe;this._slide(r,this._items[e])}},t.dispose=function(){o.default(this._element).off(te),o.default.removeData(this._element,ee),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(e){return e=s({},se,e),b.typeCheckConfig(Q,e,le),e},t._handleSwipe=function(){var e=Math.abs(this.touchDeltaX);if(!(e<=ce)){var t=e/this.touchDeltaX;this.touchDeltaX=0,t>0&&this.prev(),t<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&o.default(this._element).on(ve,(function(t){return e._keydown(t)})),"hover"===this._config.pause&&o.default(this._element).on(be,(function(t){return e.pause(t)})).on(me,(function(t){return e.cycle(t)})),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var e=this;if(this._touchSupported){var t=function(t){e._pointerEvent&&Ue[t.originalEvent.pointerType.toUpperCase()]?e.touchStartX=t.originalEvent.clientX:e._pointerEvent||(e.touchStartX=t.originalEvent.touches[0].clientX)},n=function(t){t.originalEvent.touches&&t.originalEvent.touches.length>1?e.touchDeltaX=0:e.touchDeltaX=t.originalEvent.touches[0].clientX-e.touchStartX},r=function(t){e._pointerEvent&&Ue[t.originalEvent.pointerType.toUpperCase()]&&(e.touchDeltaX=t.originalEvent.clientX-e.touchStartX),e._handleSwipe(),"hover"===e._config.pause&&(e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout((function(t){return e.cycle(t)}),ae+e._config.interval))};o.default(this._element.querySelectorAll(Ie)).on(Te,(function(e){return e.preventDefault()})),this._pointerEvent?(o.default(this._element).on(ye,(function(e){return t(e)})),o.default(this._element).on(Ee,(function(e){return r(e)})),this._element.classList.add(xe)):(o.default(this._element).on(ge,(function(e){return t(e)})),o.default(this._element).on(Ae,(function(e){return n(e)})),o.default(this._element).on(_e,(function(e){return r(e)})))}},t._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case oe:e.preventDefault(),this.prev();break;case ie:e.preventDefault(),this.next()}},t._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll(Be)):[],this._items.indexOf(e)},t._getItemByDirection=function(e,t){var n=e===ue,r=e===fe,o=this._getItemIndex(t),i=this._items.length-1;if((r&&0===o||n&&o===i)&&!this._config.wrap)return t;var a=(o+(e===fe?-1:1))%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},t._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),r=this._getItemIndex(this._element.querySelector(ke)),i=o.default.Event(he,{relatedTarget:e,direction:t,from:r,to:n});return o.default(this._element).trigger(i),i},t._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(We));o.default(t).removeClass(Le);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&o.default(n).addClass(Le)}},t._updateInterval=function(){var e=this._activeElement||this._element.querySelector(ke);if(e){var t=parseInt(e.getAttribute("data-interval"),10);t?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=t):this._config.interval=this._config.defaultInterval||this._config.interval}},t._slide=function(e,t){var n,r,i,a=this,c=this._element.querySelector(ke),s=this._getItemIndex(c),l=t||c&&this._getItemByDirection(e,c),u=this._getItemIndex(l),f=Boolean(this._interval);if(e===ue?(n=Se,r=Re,i=de):(n=we,r=qe,i=pe),l&&o.default(l).hasClass(Le))this._isSliding=!1;else if(!this._triggerSlideEvent(l,i).isDefaultPrevented()&&c&&l){this._isSliding=!0,f&&this.pause(),this._setActiveIndicatorElement(l),this._activeElement=l;var d=o.default.Event(Me,{relatedTarget:l,direction:i,from:s,to:u});if(o.default(this._element).hasClass(Ce)){o.default(l).addClass(r),b.reflow(l),o.default(c).addClass(n),o.default(l).addClass(n);var p=b.getTransitionDurationFromElement(c);o.default(c).one(b.TRANSITION_END,(function(){o.default(l).removeClass(n+" "+r).addClass(Le),o.default(c).removeClass(Le+" "+r+" "+n),a._isSliding=!1,setTimeout((function(){return o.default(a._element).trigger(d)}),0)})).emulateTransitionEnd(p)}else o.default(c).removeClass(Le),o.default(l).addClass(Le),this._isSliding=!1,o.default(this._element).trigger(d);f&&this.cycle()}},e._jQueryInterface=function(t){return this.each((function(){var n=o.default(this).data(ee),r=s({},se,o.default(this).data());"object"==typeof t&&(r=s({},r,t));var i="string"==typeof t?t:r.slide;if(n||(n=new e(this,r),o.default(this).data(ee,n)),"number"==typeof t)n.to(t);else if("string"==typeof i){if(void 0===n[i])throw new TypeError('No method named "'+i+'"');n[i]()}else r.interval&&r.ride&&(n.pause(),n.cycle())}))},e._dataApiClickHandler=function(t){var n=b.getSelectorFromElement(this);if(n){var r=o.default(n)[0];if(r&&o.default(r).hasClass(ze)){var i=s({},o.default(r).data(),o.default(this).data()),a=this.getAttribute("data-slide-to");a&&(i.interval=!1),e._jQueryInterface.call(o.default(r),i),a&&o.default(r).data(ee).to(a),t.preventDefault()}}},c(e,null,[{key:"VERSION",get:function(){return J}},{key:"Default",get:function(){return se}}]),e}();o.default(document).on(Ne,Pe,He._dataApiClickHandler),o.default(window).on(Oe,(function(){for(var e=[].slice.call(document.querySelectorAll(je)),t=0,n=e.length;t0&&(this._selector=a,this._triggerArray.push(i))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=e.prototype;return t.toggle=function(){o.default(this._element).hasClass(ot)?this.hide():this.show()},t.show=function(){var t,n,r=this;if(!(this._isTransitioning||o.default(this._element).hasClass(ot)||(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(ut)).filter((function(e){return"string"==typeof r._config.parent?e.getAttribute("data-parent")===r._config.parent:e.classList.contains(it)}))).length&&(t=null),t&&(n=o.default(t).not(this._selector).data(Ge))&&n._isTransitioning))){var i=o.default.Event(Je);if(o.default(this._element).trigger(i),!i.isDefaultPrevented()){t&&(e._jQueryInterface.call(o.default(t).not(this._selector),"hide"),n||o.default(t).data(Ge,null));var a=this._getDimension();o.default(this._element).removeClass(it).addClass(at),this._element.style[a]=0,this._triggerArray.length&&o.default(this._triggerArray).removeClass(ct).attr("aria-expanded",!0),this.setTransitioning(!0);var c=function(){o.default(r._element).removeClass(at).addClass(it+" "+ot),r._element.style[a]="",r.setTransitioning(!1),o.default(r._element).trigger(et)},s="scroll"+(a[0].toUpperCase()+a.slice(1)),l=b.getTransitionDurationFromElement(this._element);o.default(this._element).one(b.TRANSITION_END,c).emulateTransitionEnd(l),this._element.style[a]=this._element[s]+"px"}}},t.hide=function(){var e=this;if(!this._isTransitioning&&o.default(this._element).hasClass(ot)){var t=o.default.Event(tt);if(o.default(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",b.reflow(this._element),o.default(this._element).addClass(at).removeClass(it+" "+ot);var r=this._triggerArray.length;if(r>0)for(var i=0;i0},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=s({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var e={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(e.modifiers.applyStyle={enabled:!1}),s({},e,this._config.popperConfig)},e._jQueryInterface=function(t){return this.each((function(){var n=o.default(this).data(Mt);if(n||(n=new e(this,"object"==typeof t?t:null),o.default(this).data(Mt,n)),"string"==typeof t){if(void 0===n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},e._clearMenus=function(t){if(!t||t.which!==Tt&&("keyup"!==t.type||t.which===_t))for(var n=[].slice.call(document.querySelectorAll(Pt)),r=0,i=n.length;r0&&a--,t.which===Et&&adocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(Cn);var r=b.getTransitionDurationFromElement(this._dialog);o.default(this._element).off(b.TRANSITION_END),o.default(this._element).one(b.TRANSITION_END,(function(){e._element.classList.remove(Cn),n||o.default(e._element).one(b.TRANSITION_END,(function(){e._element.style.overflowY=""})).emulateTransitionEnd(e._element,r)})).emulateTransitionEnd(r),this._element.focus()}},t._showElement=function(e){var t=this,n=o.default(this._element).hasClass(zn),r=this._dialog?this._dialog.querySelector(Sn):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),o.default(this._dialog).hasClass(En)&&r?r.scrollTop=0:this._element.scrollTop=0,n&&b.reflow(this._element),o.default(this._element).addClass(Ln),this._config.focus&&this._enforceFocus();var i=o.default.Event(Mn,{relatedTarget:e}),a=function(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,o.default(t._element).trigger(i)};if(n){var c=b.getTransitionDurationFromElement(this._dialog);o.default(this._dialog).one(b.TRANSITION_END,a).emulateTransitionEnd(c)}else a()},t._enforceFocus=function(){var e=this;o.default(document).off(vn).on(vn,(function(t){document!==t.target&&e._element!==t.target&&0===o.default(e._element).has(t.target).length&&e._element.focus()}))},t._setEscapeEvent=function(){var e=this;this._isShown?o.default(this._element).on(gn,(function(t){e._config.keyboard&&t.which===sn?(t.preventDefault(),e.hide()):e._config.keyboard||t.which!==sn||e._triggerBackdropTransition()})):this._isShown||o.default(this._element).off(gn)},t._setResizeEvent=function(){var e=this;this._isShown?o.default(window).on(bn,(function(t){return e.handleUpdate(t)})):o.default(window).off(bn)},t._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){o.default(document.body).removeClass(Nn),e._resetAdjustments(),e._resetScrollbar(),o.default(e._element).trigger(pn)}))},t._removeBackdrop=function(){this._backdrop&&(o.default(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(e){var t=this,n=o.default(this._element).hasClass(zn)?zn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=On,n&&this._backdrop.classList.add(n),o.default(this._backdrop).appendTo(document.body),o.default(this._element).on(mn,(function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&("static"===t._config.backdrop?t._triggerBackdropTransition():t.hide())})),n&&b.reflow(this._backdrop),o.default(this._backdrop).addClass(Ln),!e)return;if(!n)return void e();var r=b.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(b.TRANSITION_END,e).emulateTransitionEnd(r)}else if(!this._isShown&&this._backdrop){o.default(this._backdrop).removeClass(Ln);var i=function(){t._removeBackdrop(),e&&e()};if(o.default(this._element).hasClass(zn)){var a=b.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(b.TRANSITION_END,i).emulateTransitionEnd(a)}else i()}else e&&e()},t._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(e.left+e.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:In,popperConfig:null},er="show",tr="out",nr={HIDE:"hide"+$n,HIDDEN:"hidden"+$n,SHOW:"show"+$n,SHOWN:"shown"+$n,INSERTED:"inserted"+$n,CLICK:"click"+$n,FOCUSIN:"focusin"+$n,FOCUSOUT:"focusout"+$n,MOUSEENTER:"mouseenter"+$n,MOUSELEAVE:"mouseleave"+$n},rr="fade",or="show",ir=".tooltip-inner",ar=".arrow",cr="hover",sr="focus",lr="click",ur="manual",fr=function(){function e(e,t){if(void 0===i.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var t=e.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=o.default(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),o.default(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass(or))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var t=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(t);var n=b.findShadowRoot(this.element),r=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!r)return;var a=this.getTipElement(),c=b.getUID(this.constructor.NAME);a.setAttribute("id",c),this.element.setAttribute("aria-describedby",c),this.setContent(),this.config.animation&&o.default(a).addClass(rr);var s="function"==typeof this.config.placement?this.config.placement.call(this,a,this.element):this.config.placement,l=this._getAttachment(s);this.addAttachmentClass(l);var u=this._getContainer();o.default(a).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(a).appendTo(u),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new i.default(this.element,a,this._getPopperConfig(l)),o.default(a).addClass(or),o.default(a).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var f=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,o.default(e.element).trigger(e.constructor.Event.SHOWN),t===tr&&e._leave(null,e)};if(o.default(this.tip).hasClass(rr)){var d=b.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(b.TRANSITION_END,f).emulateTransitionEnd(d)}else f()}},t.hide=function(e){var t=this,n=this.getTipElement(),r=o.default.Event(this.constructor.Event.HIDE),i=function(){t._hoverState!==er&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),o.default(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(o.default(this.element).trigger(r),!r.isDefaultPrevented()){if(o.default(n).removeClass(or),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger[lr]=!1,this._activeTrigger[sr]=!1,this._activeTrigger[cr]=!1,o.default(this.tip).hasClass(rr)){var a=b.getTransitionDurationFromElement(n);o.default(n).one(b.TRANSITION_END,i).emulateTransitionEnd(a)}else i();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(e){o.default(this.getTipElement()).addClass(Vn+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},t.setContent=function(){var e=this.getTipElement();this.setElementContent(o.default(e.querySelectorAll(ir)),this.getTitle()),o.default(e).removeClass(rr+" "+or)},t.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=jn(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?o.default(t).parent().is(e)||e.empty().append(t):e.text(o.default(t).text())},t.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},t._getPopperConfig=function(e){var t=this;return s({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:ar},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},this.config.popperConfig)},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=s({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:b.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},t._getAttachment=function(e){return Qn[e.toUpperCase()]},t._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach((function(t){if("click"===t)o.default(e.element).on(e.constructor.Event.CLICK,e.config.selector,(function(t){return e.toggle(t)}));else if(t!==ur){var n=t===cr?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,r=t===cr?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;o.default(e.element).on(n,e.config.selector,(function(t){return e._enter(t)})).on(r,e.config.selector,(function(t){return e._leave(t)}))}})),this._hideModalHandler=function(){e.element&&e.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=s({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||o.default(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),o.default(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?sr:cr]=!0),o.default(t.getTipElement()).hasClass(or)||t._hoverState===er?t._hoverState=er:(clearTimeout(t._timeout),t._hoverState=er,t.config.delay&&t.config.delay.show?t._timeout=setTimeout((function(){t._hoverState===er&&t.show()}),t.config.delay.show):t.show())},t._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||o.default(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),o.default(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?sr:cr]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=tr,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout((function(){t._hoverState===tr&&t.hide()}),t.config.delay.hide):t.hide())},t._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},t._getConfig=function(e){var t=o.default(this.element).data();return Object.keys(t).forEach((function(e){-1!==Kn.indexOf(e)&&delete t[e]})),"number"==typeof(e=s({},this.constructor.Default,t,"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),b.typeCheckConfig(Un,e,this.constructor.DefaultType),e.sanitize&&(e.template=jn(e.template,e.whiteList,e.sanitizeFn)),e},t._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},t._cleanTipClass=function(){var e=o.default(this.getTipElement()),t=e.attr("class").match(Yn);null!==t&&t.length&&e.removeClass(t.join(""))},t._handlePopperPlacementChange=function(e){this.tip=e.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},t._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(o.default(e).removeClass(rr),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},e._jQueryInterface=function(t){return this.each((function(){var n=o.default(this),r=n.data(Fn),i="object"==typeof t&&t;if((r||!/dispose|hide/.test(t))&&(r||(r=new e(this,i),n.data(Fn,r)),"string"==typeof t)){if(void 0===r[t])throw new TypeError('No method named "'+t+'"');r[t]()}}))},c(e,null,[{key:"VERSION",get:function(){return Hn}},{key:"Default",get:function(){return Jn}},{key:"NAME",get:function(){return Un}},{key:"DATA_KEY",get:function(){return Fn}},{key:"Event",get:function(){return nr}},{key:"EVENT_KEY",get:function(){return $n}},{key:"DefaultType",get:function(){return Zn}}]),e}();o.default.fn[Un]=fr._jQueryInterface,o.default.fn[Un].Constructor=fr,o.default.fn[Un].noConflict=function(){return o.default.fn[Un]=Gn,fr._jQueryInterface};var dr="popover",pr="4.6.0",hr="bs.popover",Mr="."+hr,vr=o.default.fn[dr],br="bs-popover",mr=new RegExp("(^|\\s)"+br+"\\S+","g"),gr=s({},fr.Default,{placement:"right",trigger:"click",content:"",template:''}),Ar=s({},fr.DefaultType,{content:"(string|element|function)"}),_r="fade",yr="show",Er=".popover-header",Tr=".popover-body",Or={HIDE:"hide"+Mr,HIDDEN:"hidden"+Mr,SHOW:"show"+Mr,SHOWN:"shown"+Mr,INSERTED:"inserted"+Mr,CLICK:"click"+Mr,FOCUSIN:"focusin"+Mr,FOCUSOUT:"focusout"+Mr,MOUSEENTER:"mouseenter"+Mr,MOUSELEAVE:"mouseleave"+Mr},Nr=function(e){function t(){return e.apply(this,arguments)||this}l(t,e);var n=t.prototype;return n.isWithContent=function(){return this.getTitle()||this._getContent()},n.addAttachmentClass=function(e){o.default(this.getTipElement()).addClass(br+"-"+e)},n.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},n.setContent=function(){var e=o.default(this.getTipElement());this.setElementContent(e.find(Er),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(Tr),t),e.removeClass(_r+" "+yr)},n._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},n._cleanTipClass=function(){var e=o.default(this.getTipElement()),t=e.attr("class").match(mr);null!==t&&t.length>0&&e.removeClass(t.join(""))},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(hr),r="object"==typeof e?e:null;if((n||!/dispose|hide/.test(e))&&(n||(n=new t(this,r),o.default(this).data(hr,n)),"string"==typeof e)){if(void 0===n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},c(t,null,[{key:"VERSION",get:function(){return pr}},{key:"Default",get:function(){return gr}},{key:"NAME",get:function(){return dr}},{key:"DATA_KEY",get:function(){return hr}},{key:"Event",get:function(){return Or}},{key:"EVENT_KEY",get:function(){return Mr}},{key:"DefaultType",get:function(){return Ar}}]),t}(fr);o.default.fn[dr]=Nr._jQueryInterface,o.default.fn[dr].Constructor=Nr,o.default.fn[dr].noConflict=function(){return o.default.fn[dr]=vr,Nr._jQueryInterface};var zr="scrollspy",Lr="4.6.0",Cr="bs.scrollspy",wr="."+Cr,Sr=".data-api",Rr=o.default.fn[zr],qr={offset:10,method:"auto",target:""},xr={offset:"number",method:"string",target:"(string|element)"},Wr="activate"+wr,kr="scroll"+wr,Br="load"+wr+Sr,Ir="dropdown-item",Dr="active",Xr='[data-spy="scroll"]',Pr=".nav, .list-group",jr=".nav-link",Ur=".nav-item",Hr=".list-group-item",Fr=".dropdown",$r=".dropdown-item",Gr=".dropdown-toggle",Vr="offset",Yr="position",Kr=function(){function e(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+jr+","+this._config.target+" "+Hr+","+this._config.target+" "+$r,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on(kr,(function(e){return n._process(e)})),this.refresh(),this._process()}var t=e.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?Vr:Yr,n="auto"===this._config.method?t:this._config.method,r=n===Yr?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(e){var t,i=b.getSelectorFromElement(e);if(i&&(t=document.querySelector(i)),t){var a=t.getBoundingClientRect();if(a.width||a.height)return[o.default(t)[n]().top+r,i]}return null})).filter((function(e){return e})).sort((function(e,t){return e[0]-t[0]})).forEach((function(t){e._offsets.push(t[0]),e._targets.push(t[1])}))},t.dispose=function(){o.default.removeData(this._element,Cr),o.default(this._scrollElement).off(wr),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(e){if("string"!=typeof(e=s({},qr,"object"==typeof e&&e?e:{})).target&&b.isElement(e.target)){var t=o.default(e.target).attr("id");t||(t=b.getUID(zr),o.default(e.target).attr("id",t)),e.target="#"+t}return b.typeCheckConfig(zr,e,xr),e},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){var r=this._targets[this._targets.length-1];this._activeTarget!==r&&this._activate(r)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&e>=this._offsets[o]&&(void 0===this._offsets[o+1]||e{"use strict";n.d(t,{Z:()=>i});var r=n(3645),o=n.n(r)()((function(e){return e[1]}));o.push([e.id,'.vjs-checkbox{color:#1f2d3d;left:-30px;position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vjs-checkbox.is-checked .vjs-checkbox__inner{background-color:#1890ff;border-color:#0076e4}.vjs-checkbox.is-checked .vjs-checkbox__inner:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.vjs-checkbox .vjs-checkbox__inner{background-color:#fff;border:1px solid #bfcbd9;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block;height:16px;position:relative;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);-o-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);vertical-align:middle;width:16px;z-index:1}.vjs-checkbox .vjs-checkbox__inner:after{border:2px solid #fff;border-left:0;border-top:0;-webkit-box-sizing:content-box;box-sizing:content-box;content:"";height:8px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);-webkit-transform-origin:center;transform-origin:center;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;-o-transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;width:4px}.vjs-checkbox .vjs-checkbox__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.vjs-radio{color:#1f2d3d;left:-30px;position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vjs-radio.is-checked .vjs-radio__inner{background-color:#1890ff;border-color:#0076e4}.vjs-radio.is-checked .vjs-radio__inner:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.vjs-radio .vjs-radio__inner{background-color:#fff;border:1px solid #bfcbd9;border-radius:100%;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:16px}.vjs-radio .vjs-radio__inner:after{background-color:#fff;border-radius:100%;content:"";height:4px;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;-o-transition:transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in;width:4px}.vjs-radio .vjs-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.vjs-tree{font-family:Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace;font-size:14px}.vjs-tree.is-root{position:relative}.vjs-tree.is-root.has-selectable-control{margin-left:30px}.vjs-tree.is-mouseover{background-color:#e6f7ff}.vjs-tree.is-highlight-selected{background-color:#ccefff}.vjs-tree .vjs-tree__content{padding-left:1em}.vjs-tree .vjs-tree__content.has-line{border-left:1px dotted #bfcbd9}.vjs-tree .vjs-tree__brackets{cursor:pointer}.vjs-tree .vjs-tree__brackets:hover{color:#1890ff}.vjs-tree .vjs-comment{color:#bfcbd9}.vjs-tree .vjs-value__null{color:#ff4949}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__number{color:#1d8ce0}.vjs-tree .vjs-value__string{color:#13ce66}',""]);const i=o},7543:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(3645),o=n.n(r)()((function(e){return e[1]}));o.push([e.id,"#alertModal{background:rgba(0,0,0,.5);z-index:99999}",""]);const i=o},361:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(3645),o=n.n(r)()((function(e){return e[1]}));o.push([e.id,".highlight[data-v-71bb8c56]{background-color:#ff647a}",""]);const i=o},7683:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(3645),o=n.n(r)()((function(e){return e[1]}));o.push([e.id,"td[data-v-4f60eafe]{vertical-align:middle!important}",""]);const i=o},1776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(3645),o=n.n(r)()((function(e){return e[1]}));o.push([e.id,"pre.sf-dump,pre.sf-dump .sf-dump-default{background:none!important}pre.sf-dump{padding-left:0!important}.entryPointDescription{background:#000;padding-left:5px;padding-right:5px}.entryPointDescription a{color:#fff;font:12px Menlo,Monaco,Consolas,monospace;text-decoration:underline}",""]);const i=o},9317:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(3645),o=n.n(r)()((function(e){return e[1]}));o.push([e.id,"iframe[data-v-906ddadc]{border:none}",""]);const i=o},3645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(r)for(var i=0;i0&&t-1 in e)}T.fn=T.prototype={jquery:E,constructor:T,length:0,toArray:function(){return c.call(this)},get:function(e){return null==e?c.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=T.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return T.each(this,e)},map:function(e){return this.pushStack(T.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(c.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(T.grep(this,(function(e,t){return(t+1)%2})))},odd:function(){return this.pushStack(T.grep(this,(function(e,t){return t%2})))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),F=new RegExp(B+"|>"),$=new RegExp(X),G=new RegExp("^"+I+"$"),V={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+D),PSEUDO:new RegExp("^"+X),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+k+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,K=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,oe=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ie=function(){d()},ae=Ae((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{q.apply(w=x.call(_.childNodes),_.childNodes),w[_.childNodes.length].nodeType}catch(e){q={apply:w.length?function(e,t){R.apply(e,x.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function ce(e,t,r,o){var i,c,l,u,f,h,b,m=t&&t.ownerDocument,_=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==_&&9!==_&&11!==_)return r;if(!o&&(d(t),t=t||p,M)){if(11!==_&&(f=J.exec(e)))if(i=f[1]){if(9===_){if(!(l=t.getElementById(i)))return r;if(l.id===i)return r.push(l),r}else if(m&&(l=m.getElementById(i))&&g(t,l)&&l.id===i)return r.push(l),r}else{if(f[2])return q.apply(r,t.getElementsByTagName(e)),r;if((i=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return q.apply(r,t.getElementsByClassName(i)),r}if(n.qsa&&!z[e+" "]&&(!v||!v.test(e))&&(1!==_||"object"!==t.nodeName.toLowerCase())){if(b=e,m=t,1===_&&(F.test(e)||H.test(e))){for((m=ee.test(e)&&be(t.parentNode)||t)===t&&n.scope||((u=t.getAttribute("id"))?u=u.replace(re,oe):t.setAttribute("id",u=A)),c=(h=a(e)).length;c--;)h[c]=(u?"#"+u:":scope")+" "+ge(h[c]);b=h.join(",")}try{return q.apply(r,m.querySelectorAll(b)),r}catch(t){z(e,!0)}finally{u===A&&t.removeAttribute("id")}}}return s(e.replace(j,"$1"),t,r,o)}function se(){var e=[];return function t(n,o){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=o}}function le(e){return e[A]=!0,e}function ue(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){for(var n=e.split("|"),o=n.length;o--;)r.attrHandle[n[o]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function pe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function he(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function Me(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ae(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function ve(e){return le((function(t){return t=+t,le((function(n,r){for(var o,i=e([],n.length,t),a=i.length;a--;)n[o=i[a]]&&(n[o]=!(r[o]=n[o]))}))}))}function be(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ce.support={},i=ce.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},d=ce.setDocument=function(e){var t,o,a=e?e.ownerDocument||e:_;return a!=p&&9===a.nodeType&&a.documentElement?(h=(p=a).documentElement,M=!i(p),_!=p&&(o=p.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",ie,!1):o.attachEvent&&o.attachEvent("onunload",ie)),n.scope=ue((function(e){return h.appendChild(e).appendChild(p.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),n.attributes=ue((function(e){return e.className="i",!e.getAttribute("className")})),n.getElementsByTagName=ue((function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length})),n.getElementsByClassName=Q.test(p.getElementsByClassName),n.getById=ue((function(e){return h.appendChild(e).id=A,!p.getElementsByName||!p.getElementsByName(A).length})),n.getById?(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&M){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&M){var n,r,o,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&M)return t.getElementsByClassName(e)},b=[],v=[],(n.qsa=Q.test(p.querySelectorAll))&&(ue((function(e){var t;h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+k+")"),e.querySelectorAll("[id~="+A+"-]").length||v.push("~="),(t=p.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+A+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")})),ue((function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")}))),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue((function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),b.push("!=",X)})),v=v.length&&new RegExp(v.join("|")),b=b.length&&new RegExp(b.join("|")),t=Q.test(h.compareDocumentPosition),g=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},L=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e==p||e.ownerDocument==_&&g(_,e)?-1:t==p||t.ownerDocument==_&&g(_,t)?1:u?W(u,e)-W(u,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],c=[t];if(!o||!i)return e==p?-1:t==p?1:o?-1:i?1:u?W(u,e)-W(u,t):0;if(o===i)return de(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)c.unshift(n);for(;a[r]===c[r];)r++;return r?de(a[r],c[r]):a[r]==_?-1:c[r]==_?1:0},p):p},ce.matches=function(e,t){return ce(e,null,null,t)},ce.matchesSelector=function(e,t){if(d(e),n.matchesSelector&&M&&!z[t+" "]&&(!b||!b.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){z(t,!0)}return ce(t,p,null,[e]).length>0},ce.contains=function(e,t){return(e.ownerDocument||e)!=p&&d(e),g(e,t)},ce.attr=function(e,t){(e.ownerDocument||e)!=p&&d(e);var o=r.attrHandle[t.toLowerCase()],i=o&&C.call(r.attrHandle,t.toLowerCase())?o(e,t,!M):void 0;return void 0!==i?i:n.attributes||!M?e.getAttribute(t):(i=e.getAttributeNode(t))&&i.specified?i.value:null},ce.escape=function(e){return(e+"").replace(re,oe)},ce.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,r=[],o=0,i=0;if(f=!n.detectDuplicates,u=!n.sortStable&&e.slice(0),e.sort(L),f){for(;t=e[i++];)t===e[i]&&(o=r.push(i));for(;o--;)e.splice(r[o],1)}return u=null,e},o=ce.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=o(t);return n},r=ce.selectors={cacheLength:50,createPseudo:le,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ce.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ce.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&$.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=T[e+" "];return t||(t=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+e+"("+B+"|$)"))&&T(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var o=ce.attr(r,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&o.indexOf(n)>-1:"$="===t?n&&o.slice(-n.length)===n:"~="===t?(" "+o.replace(P," ")+" ").indexOf(n)>-1:"|="===t&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),a="last"!==e.slice(-4),c="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,s){var l,u,f,d,p,h,M=i!==a?"nextSibling":"previousSibling",v=t.parentNode,b=c&&t.nodeName.toLowerCase(),m=!s&&!c,g=!1;if(v){if(i){for(;M;){for(d=t;d=d[M];)if(c?d.nodeName.toLowerCase()===b:1===d.nodeType)return!1;h=M="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){for(g=(p=(l=(u=(f=(d=v)[A]||(d[A]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===y&&l[1])&&l[2],d=p&&v.childNodes[p];d=++p&&d&&d[M]||(g=p=0)||h.pop();)if(1===d.nodeType&&++g&&d===t){u[e]=[y,p,g];break}}else if(m&&(g=p=(l=(u=(f=(d=t)[A]||(d[A]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===y&&l[1]),!1===g)for(;(d=++p&&d&&d[M]||(g=p=0)||h.pop())&&((c?d.nodeName.toLowerCase()!==b:1!==d.nodeType)||!++g||(m&&((u=(f=d[A]||(d[A]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[y,g]),d!==t)););return(g-=o)===r||g%r==0&&g/r>=0}}},PSEUDO:function(e,t){var n,o=r.pseudos[e]||r.setFilters[e.toLowerCase()]||ce.error("unsupported pseudo: "+e);return o[A]?o(t):o.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?le((function(e,n){for(var r,i=o(e,t),a=i.length;a--;)e[r=W(e,i[a])]=!(n[r]=i[a])})):function(e){return o(e,0,n)}):o}},pseudos:{not:le((function(e){var t=[],n=[],r=c(e.replace(j,"$1"));return r[A]?le((function(e,t,n,o){for(var i,a=r(e,null,o,[]),c=e.length;c--;)(i=a[c])&&(e[c]=!(t[c]=i))})):function(e,o,i){return t[0]=e,r(t,null,i,n),t[0]=null,!n.pop()}})),has:le((function(e){return function(t){return ce(e,t).length>0}})),contains:le((function(e){return e=e.replace(te,ne),function(t){return(t.textContent||o(t)).indexOf(e)>-1}})),lang:le((function(e){return G.test(e||"")||ce.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=M?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:Me(!1),disabled:Me(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Z.test(e.nodeName)},input:function(e){return K.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve((function(){return[0]})),last:ve((function(e,t){return[t-1]})),eq:ve((function(e,t,n){return[n<0?n+t:n]})),even:ve((function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e})),gt:ve((function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function ye(e,t,n,r,o){for(var i,a=[],c=0,s=e.length,l=null!=t;c-1&&(i[l]=!(a[l]=f))}}else b=ye(b===a?b.splice(h,b.length):b),o?o(null,a,b,s):q.apply(a,b)}))}function Te(e){for(var t,n,o,i=e.length,a=r.relative[e[0].type],c=a||r.relative[" "],s=a?1:0,u=Ae((function(e){return e===t}),c,!0),f=Ae((function(e){return W(t,e)>-1}),c,!0),d=[function(e,n,r){var o=!a&&(r||n!==l)||((t=n).nodeType?u(e,n,r):f(e,n,r));return t=null,o}];s1&&_e(d),s>1&&ge(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(j,"$1"),n,s0,o=e.length>0,i=function(i,a,c,s,u){var f,h,v,b=0,m="0",g=i&&[],A=[],_=l,E=i||o&&r.find.TAG("*",u),T=y+=null==_?1:Math.random()||.1,O=E.length;for(u&&(l=a==p||a||u);m!==O&&null!=(f=E[m]);m++){if(o&&f){for(h=0,a||f.ownerDocument==p||(d(f),c=!M);v=e[h++];)if(v(f,a||p,c)){s.push(f);break}u&&(y=T)}n&&((f=!v&&f)&&b--,i&&g.push(f))}if(b+=m,n&&m!==b){for(h=0;v=t[h++];)v(g,A,a,c);if(i){if(b>0)for(;m--;)g[m]||A[m]||(A[m]=S.call(s));A=ye(A)}q.apply(s,A),u&&!i&&A.length>0&&b+t.length>1&&ce.uniqueSort(s)}return u&&(y=T,l=_),g};return n?le(i):i}(i,o)),c.selector=e}return c},s=ce.select=function(e,t,n,o){var i,s,l,u,f,d="function"==typeof e&&e,p=!o&&a(e=d.selector||e);if(n=n||[],1===p.length){if((s=p[0]=p[0].slice(0)).length>2&&"ID"===(l=s[0]).type&&9===t.nodeType&&M&&r.relative[s[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(te,ne),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(s.shift().value.length)}for(i=V.needsContext.test(e)?0:s.length;i--&&(l=s[i],!r.relative[u=l.type]);)if((f=r.find[u])&&(o=f(l.matches[0].replace(te,ne),ee.test(s[0].type)&&be(t.parentNode)||t))){if(s.splice(i,1),!(e=o.length&&ge(s)))return q.apply(n,o),n;break}}return(d||c(e,p))(o,t,!M,n,!t||ee.test(e)&&be(t.parentNode)||t),n},n.sortStable=A.split("").sort(L).join("")===A,n.detectDuplicates=!!f,d(),n.sortDetached=ue((function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))})),ue((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||fe("type|href|height|width",(function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),n.attributes&&ue((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||fe("value",(function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),ue((function(e){return null==e.getAttribute("disabled")}))||fe(k,(function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null})),ce}(r);T.find=N,T.expr=N.selectors,T.expr[":"]=T.expr.pseudos,T.uniqueSort=T.unique=N.uniqueSort,T.text=N.getText,T.isXMLDoc=N.isXML,T.contains=N.contains,T.escapeSelector=N.escape;var z=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&T(e).is(n))break;r.push(e)}return r},L=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},C=T.expr.match.needsContext;function w(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var S=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function R(e,t,n){return b(t)?T.grep(e,(function(e,r){return!!t.call(e,r,e)!==n})):t.nodeType?T.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?T.grep(e,(function(e){return u.call(t,e)>-1!==n})):T.filter(t,e,n)}T.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?T.find.matchesSelector(r,e)?[r]:[]:T.find.matches(e,T.grep(t,(function(e){return 1===e.nodeType})))},T.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(T(e).filter((function(){for(t=0;t1?T.uniqueSort(n):n},filter:function(e){return this.pushStack(R(this,e||[],!1))},not:function(e){return this.pushStack(R(this,e||[],!0))},is:function(e){return!!R(this,"string"==typeof e&&C.test(e)?T(e):e||[],!1).length}});var q,x=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(T.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:x.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof T?t[0]:t,T.merge(this,T.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:g,!0)),S.test(r[1])&&T.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(o=g.getElementById(r[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(T):T.makeArray(e,this)}).prototype=T.fn,q=T(g);var W=/^(?:parents|prev(?:Until|All))/,k={children:!0,contents:!0,next:!0,prev:!0};function B(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}T.fn.extend({has:function(e){var t=T(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&T.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?T.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?u.call(T(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(T.uniqueSort(T.merge(this.get(),T(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),T.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return z(e,"parentNode")},parentsUntil:function(e,t,n){return z(e,"parentNode",n)},next:function(e){return B(e,"nextSibling")},prev:function(e){return B(e,"previousSibling")},nextAll:function(e){return z(e,"nextSibling")},prevAll:function(e){return z(e,"previousSibling")},nextUntil:function(e,t,n){return z(e,"nextSibling",n)},prevUntil:function(e,t,n){return z(e,"previousSibling",n)},siblings:function(e){return L((e.parentNode||{}).firstChild,e)},children:function(e){return L(e.firstChild)},contents:function(e){return null!=e.contentDocument&&a(e.contentDocument)?e.contentDocument:(w(e,"template")&&(e=e.content||e),T.merge([],e.childNodes))}},(function(e,t){T.fn[e]=function(n,r){var o=T.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=T.filter(r,o)),this.length>1&&(k[e]||T.uniqueSort(o),W.test(e)&&o.reverse()),this.pushStack(o)}}));var I=/[^\x20\t\r\n\f]+/g;function D(e){return e}function X(e){throw e}function P(e,t,n,r){var o;try{e&&b(o=e.promise)?o.call(e).done(t).fail(n):e&&b(o=e.then)?o.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}T.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return T.each(e.match(I)||[],(function(e,n){t[n]=!0})),t}(e):T.extend({},e);var t,n,r,o,i=[],a=[],c=-1,s=function(){for(o=o||e.once,r=t=!0;a.length;c=-1)for(n=a.shift();++c-1;)i.splice(n,1),n<=c&&c--})),this},has:function(e){return e?T.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},T.extend({Deferred:function(e){var t=[["notify","progress",T.Callbacks("memory"),T.Callbacks("memory"),2],["resolve","done",T.Callbacks("once memory"),T.Callbacks("once memory"),0,"resolved"],["reject","fail",T.Callbacks("once memory"),T.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return T.Deferred((function(n){T.each(t,(function(t,r){var o=b(e[r[4]])&&e[r[4]];i[r[1]]((function(){var e=o&&o.apply(this,arguments);e&&b(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,o?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,o){var i=0;function a(e,t,n,o){return function(){var c=this,s=arguments,l=function(){var r,l;if(!(e=i&&(n!==X&&(c=void 0,s=[r]),t.rejectWith(c,s))}};e?u():(T.Deferred.getStackHook&&(u.stackTrace=T.Deferred.getStackHook()),r.setTimeout(u))}}return T.Deferred((function(r){t[0][3].add(a(0,r,b(o)?o:D,r.notifyWith)),t[1][3].add(a(0,r,b(e)?e:D)),t[2][3].add(a(0,r,b(n)?n:X))})).promise()},promise:function(e){return null!=e?T.extend(e,o):o}},i={};return T.each(t,(function(e,r){var a=r[2],c=r[5];o[r[1]]=a.add,c&&a.add((function(){n=c}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),a.add(r[3].fire),i[r[0]]=function(){return i[r[0]+"With"](this===i?void 0:this,arguments),this},i[r[0]+"With"]=a.fireWith})),o.promise(i),e&&e.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=c.call(arguments),i=T.Deferred(),a=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?c.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(P(e,i.done(a(n)).resolve,i.reject,!t),"pending"===i.state()||b(o[n]&&o[n].then)))return i.then();for(;n--;)P(o[n],a(n),i.reject);return i.promise()}});var j=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;T.Deferred.exceptionHook=function(e,t){r.console&&r.console.warn&&e&&j.test(e.name)&&r.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},T.readyException=function(e){r.setTimeout((function(){throw e}))};var U=T.Deferred();function H(){g.removeEventListener("DOMContentLoaded",H),r.removeEventListener("load",H),T.ready()}T.fn.ready=function(e){return U.then(e).catch((function(e){T.readyException(e)})),this},T.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--T.readyWait:T.isReady)||(T.isReady=!0,!0!==e&&--T.readyWait>0||U.resolveWith(g,[T]))}}),T.ready.then=U.then,"complete"===g.readyState||"loading"!==g.readyState&&!g.documentElement.doScroll?r.setTimeout(T.ready):(g.addEventListener("DOMContentLoaded",H),r.addEventListener("load",H));var F=function(e,t,n,r,o,i,a){var c=0,s=e.length,l=null==n;if("object"===y(n))for(c in o=!0,n)F(e,t,c,n[c],!0,i,a);else if(void 0!==r&&(o=!0,b(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(T(e),n)})),t))for(;c1,null,!0)},removeData:function(e){return this.each((function(){J.remove(this,e)}))}}),T.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,T.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=T.queue(e,t),r=n.length,o=n.shift(),i=T._queueHooks(e,t);"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,(function(){T.dequeue(e,t)}),i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:T.Callbacks("once memory").add((function(){Q.remove(e,[t+"queue",n])}))})}}),T.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,me=/^$|^module$|\/(?:java|ecma)script/i;he=g.createDocumentFragment().appendChild(g.createElement("div")),(Me=g.createElement("input")).setAttribute("type","radio"),Me.setAttribute("checked","checked"),Me.setAttribute("name","t"),he.appendChild(Me),v.checkClone=he.cloneNode(!0).cloneNode(!0).lastChild.checked,he.innerHTML="",v.noCloneChecked=!!he.cloneNode(!0).lastChild.defaultValue,he.innerHTML="",v.option=!!he.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Ae(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&w(e,t)?T.merge([e],n):n}function _e(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function Ee(e,t,n,r,o){for(var i,a,c,s,l,u,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p-1)o&&o.push(i);else if(l=ce(i),a=Ae(f.appendChild(i),"script"),l&&_e(a),n)for(u=0;i=a[u++];)me.test(i.type||"")&&n.push(i);return f}var Te=/^([^.]*)(?:\.(.+)|)/;function Oe(){return!0}function Ne(){return!1}function ze(e,t){return e===function(){try{return g.activeElement}catch(e){}}()==("focus"===t)}function Le(e,t,n,r,o,i){var a,c;if("object"==typeof t){for(c in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,c,n,r,t[c],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),!1===o)o=Ne;else if(!o)return e;return 1===i&&(a=o,o=function(e){return T().off(e),a.apply(this,arguments)},o.guid=a.guid||(a.guid=T.guid++)),e.each((function(){T.event.add(this,t,o,r,n)}))}function Ce(e,t,n){n?(Q.set(e,t,!1),T.event.add(e,t,{namespace:!1,handler:function(e){var r,o,i=Q.get(this,t);if(1&e.isTrigger&&this[t]){if(i.length)(T.event.special[t]||{}).delegateType&&e.stopPropagation();else if(i=c.call(arguments),Q.set(this,t,i),r=n(this,t),this[t](),i!==(o=Q.get(this,t))||r?Q.set(this,t,!1):o={},i!==o)return e.stopImmediatePropagation(),e.preventDefault(),o&&o.value}else i.length&&(Q.set(this,t,{value:T.event.trigger(T.extend(i[0],T.Event.prototype),i.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,t)&&T.event.add(e,t,Oe)}T.event={global:{},add:function(e,t,n,r,o){var i,a,c,s,l,u,f,d,p,h,M,v=Q.get(e);if(K(e))for(n.handler&&(n=(i=n).handler,o=i.selector),o&&T.find.matchesSelector(ae,o),n.guid||(n.guid=T.guid++),(s=v.events)||(s=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(t){return void 0!==T&&T.event.triggered!==t.type?T.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;l--;)p=M=(c=Te.exec(t[l])||[])[1],h=(c[2]||"").split(".").sort(),p&&(f=T.event.special[p]||{},p=(o?f.delegateType:f.bindType)||p,f=T.event.special[p]||{},u=T.extend({type:p,origType:M,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&T.expr.match.needsContext.test(o),namespace:h.join(".")},i),(d=s[p])||((d=s[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,u),u.handler.guid||(u.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,u):d.push(u),T.event.global[p]=!0)},remove:function(e,t,n,r,o){var i,a,c,s,l,u,f,d,p,h,M,v=Q.hasData(e)&&Q.get(e);if(v&&(s=v.events)){for(l=(t=(t||"").match(I)||[""]).length;l--;)if(p=M=(c=Te.exec(t[l])||[])[1],h=(c[2]||"").split(".").sort(),p){for(f=T.event.special[p]||{},d=s[p=(r?f.delegateType:f.bindType)||p]||[],c=c[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=i=d.length;i--;)u=d[i],!o&&M!==u.origType||n&&n.guid!==u.guid||c&&!c.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(d.splice(i,1),u.selector&&d.delegateCount--,f.remove&&f.remove.call(e,u));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||T.removeEvent(e,p,v.handle),delete s[p])}else for(p in s)T.event.remove(e,p+t[l],n,r,!0);T.isEmptyObject(s)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,a,c=new Array(arguments.length),s=T.event.fix(e),l=(Q.get(this,"events")||Object.create(null))[s.type]||[],u=T.event.special[s.type]||{};for(c[0]=s,t=1;t=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(i=[],a={},n=0;n-1:T.find(o,this,null,[l]).length),a[o]&&i.push(r);i.length&&c.push({elem:l,handlers:i})}return l=this,s\s*$/g;function qe(e,t){return w(e,"table")&&w(11!==t.nodeType?t:t.firstChild,"tr")&&T(e).children("tbody")[0]||e}function xe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function ke(e,t){var n,r,o,i,a,c;if(1===t.nodeType){if(Q.hasData(e)&&(c=Q.get(e).events))for(o in Q.remove(t,"handle events"),c)for(n=0,r=c[o].length;n1&&"string"==typeof h&&!v.checkClone&&Se.test(h))return e.each((function(o){var i=e.eq(o);M&&(t[0]=h.call(this,o,i.html())),Ie(i,t,n,r)}));if(d&&(i=(o=Ee(t,e[0].ownerDocument,!1,e,r)).firstChild,1===o.childNodes.length&&(o=i),i||r)){for(c=(a=T.map(Ae(o,"script"),xe)).length;f0&&_e(a,!s&&Ae(e,"script")),c},cleanData:function(e){for(var t,n,r,o=T.event.special,i=0;void 0!==(n=e[i]);i++)if(K(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)o[r]?T.event.remove(n,r):T.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),T.fn.extend({detach:function(e){return De(this,e,!0)},remove:function(e){return De(this,e)},text:function(e){return F(this,(function(e){return void 0===e?T.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Ie(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)}))},prepend:function(){return Ie(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Ie(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Ie(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(T.cleanData(Ae(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return T.clone(this,e,t)}))},html:function(e){return F(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!we.test(e)&&!ge[(be.exec(e)||["",""])[1].toLowerCase()]){e=T.htmlPrefilter(e);try{for(;n=0&&(s+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-i-s-c-.5))||0),s}function nt(e,t,n){var r=Pe(e),o=(!v.boxSizingReliable()||n)&&"border-box"===T.css(e,"boxSizing",!1,r),i=o,a=He(e,t,r),c="offset"+t[0].toUpperCase()+t.slice(1);if(Xe.test(a)){if(!n)return a;a="auto"}return(!v.boxSizingReliable()&&o||!v.reliableTrDimensions()&&w(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===T.css(e,"display",!1,r))&&e.getClientRects().length&&(o="border-box"===T.css(e,"boxSizing",!1,r),(i=c in e)&&(a=e[c])),(a=parseFloat(a)||0)+tt(e,t,n||(o?"border":"content"),i,r,a)+"px"}function rt(e,t,n,r,o){return new rt.prototype.init(e,t,n,r,o)}T.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=He(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,a,c=Y(t),s=Ze.test(t),l=e.style;if(s||(t=Ye(c)),a=T.cssHooks[t]||T.cssHooks[c],void 0===n)return a&&"get"in a&&void 0!==(o=a.get(e,!1,r))?o:l[t];"string"===(i=typeof n)&&(o=oe.exec(n))&&o[1]&&(n=ue(e,t,o),i="number"),null!=n&&n==n&&("number"!==i||s||(n+=o&&o[3]||(T.cssNumber[c]?"":"px")),v.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(s?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var o,i,a,c=Y(t);return Ze.test(t)||(t=Ye(c)),(a=T.cssHooks[t]||T.cssHooks[c])&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=He(e,t,r)),"normal"===o&&t in Je&&(o=Je[t]),""===n||n?(i=parseFloat(o),!0===n||isFinite(i)?i||0:o):o}}),T.each(["height","width"],(function(e,t){T.cssHooks[t]={get:function(e,n,r){if(n)return!Ke.test(T.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?nt(e,t,r):je(e,Qe,(function(){return nt(e,t,r)}))},set:function(e,n,r){var o,i=Pe(e),a=!v.scrollboxSize()&&"absolute"===i.position,c=(a||r)&&"border-box"===T.css(e,"boxSizing",!1,i),s=r?tt(e,t,r,c,i):0;return c&&a&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(i[t])-tt(e,t,"border",!1,i)-.5)),s&&(o=oe.exec(n))&&"px"!==(o[3]||"px")&&(e.style[t]=n,n=T.css(e,t)),et(0,n,s)}}})),T.cssHooks.marginLeft=Fe(v.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(He(e,"marginLeft"))||e.getBoundingClientRect().left-je(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),T.each({margin:"",padding:"",border:"Width"},(function(e,t){T.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i="string"==typeof n?n.split(" "):[n];r<4;r++)o[e+ie[r]+t]=i[r]||i[r-2]||i[0];return o}},"margin"!==e&&(T.cssHooks[e+t].set=et)})),T.fn.extend({css:function(e,t){return F(this,(function(e,t,n){var r,o,i={},a=0;if(Array.isArray(t)){for(r=Pe(e),o=t.length;a1)}}),T.Tween=rt,rt.prototype={constructor:rt,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||T.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(T.cssNumber[n]?"":"px")},cur:function(){var e=rt.propHooks[this.prop];return e&&e.get?e.get(this):rt.propHooks._default.get(this)},run:function(e){var t,n=rt.propHooks[this.prop];return this.options.duration?this.pos=t=T.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rt.propHooks._default.set(this),this}},rt.prototype.init.prototype=rt.prototype,rt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=T.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){T.fx.step[e.prop]?T.fx.step[e.prop](e):1!==e.elem.nodeType||!T.cssHooks[e.prop]&&null==e.elem.style[Ye(e.prop)]?e.elem[e.prop]=e.now:T.style(e.elem,e.prop,e.now+e.unit)}}},rt.propHooks.scrollTop=rt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},T.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},T.fx=rt.prototype.init,T.fx.step={};var ot,it,at=/^(?:toggle|show|hide)$/,ct=/queueHooks$/;function st(){it&&(!1===g.hidden&&r.requestAnimationFrame?r.requestAnimationFrame(st):r.setTimeout(st,T.fx.interval),T.fx.tick())}function lt(){return r.setTimeout((function(){ot=void 0})),ot=Date.now()}function ut(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)o["margin"+(n=ie[r])]=o["padding"+n]=e;return t&&(o.opacity=o.width=e),o}function ft(e,t,n){for(var r,o=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),i=0,a=o.length;i1)},removeAttr:function(e){return this.each((function(){T.removeAttr(this,e)}))}}),T.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return void 0===e.getAttribute?T.prop(e,t,n):(1===i&&T.isXMLDoc(e)||(o=T.attrHooks[t.toLowerCase()]||(T.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void T.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:null==(r=T.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!v.radioValue&&"radio"===t&&w(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(I);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?T.removeAttr(e,n):e.setAttribute(n,n),n}},T.each(T.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=ht[t]||T.find.attr;ht[t]=function(e,t,r){var o,i,a=t.toLowerCase();return r||(i=ht[a],ht[a]=o,o=null!=n(e,t,r)?a:null,ht[a]=i),o}}));var Mt=/^(?:input|select|textarea|button)$/i,vt=/^(?:a|area)$/i;function bt(e){return(e.match(I)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function gt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(I)||[]}T.fn.extend({prop:function(e,t){return F(this,T.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[T.propFix[e]||e]}))}}),T.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&T.isXMLDoc(e)||(t=T.propFix[t]||t,o=T.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=T.find.attr(e,"tabindex");return t?parseInt(t,10):Mt.test(e.nodeName)||vt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),v.optSelected||(T.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),T.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){T.propFix[this.toLowerCase()]=this})),T.fn.extend({addClass:function(e){var t,n,r,o,i,a,c,s=0;if(b(e))return this.each((function(t){T(this).addClass(e.call(this,t,mt(this)))}));if((t=gt(e)).length)for(;n=this[s++];)if(o=mt(n),r=1===n.nodeType&&" "+bt(o)+" "){for(a=0;i=t[a++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");o!==(c=bt(r))&&n.setAttribute("class",c)}return this},removeClass:function(e){var t,n,r,o,i,a,c,s=0;if(b(e))return this.each((function(t){T(this).removeClass(e.call(this,t,mt(this)))}));if(!arguments.length)return this.attr("class","");if((t=gt(e)).length)for(;n=this[s++];)if(o=mt(n),r=1===n.nodeType&&" "+bt(o)+" "){for(a=0;i=t[a++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");o!==(c=bt(r))&&n.setAttribute("class",c)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):b(e)?this.each((function(n){T(this).toggleClass(e.call(this,n,mt(this),t),t)})):this.each((function(){var t,o,i,a;if(r)for(o=0,i=T(this),a=gt(e);t=a[o++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||((t=mt(this))&&Q.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":Q.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+bt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var At=/\r/g;T.fn.extend({val:function(e){var t,n,r,o=this[0];return arguments.length?(r=b(e),this.each((function(n){var o;1===this.nodeType&&(null==(o=r?e.call(this,n,T(this).val()):e)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=T.map(o,(function(e){return null==e?"":e+""}))),(t=T.valHooks[this.type]||T.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))}))):o?(t=T.valHooks[o.type]||T.valHooks[o.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(At,""):null==n?"":n:void 0}}),T.extend({valHooks:{option:{get:function(e){var t=T.find.attr(e,"value");return null!=t?t:bt(T.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,a="select-one"===e.type,c=a?null:[],s=a?i+1:o.length;for(r=i<0?s:a?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),T.each(["radio","checkbox"],(function(){T.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=T.inArray(T(e).val(),t)>-1}},v.checkOn||(T.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),v.focusin="onfocusin"in r;var _t=/^(?:focusinfocus|focusoutblur)$/,yt=function(e){e.stopPropagation()};T.extend(T.event,{trigger:function(e,t,n,o){var i,a,c,s,l,u,f,d,h=[n||g],M=p.call(e,"type")?e.type:e,v=p.call(e,"namespace")?e.namespace.split("."):[];if(a=d=c=n=n||g,3!==n.nodeType&&8!==n.nodeType&&!_t.test(M+T.event.triggered)&&(M.indexOf(".")>-1&&(v=M.split("."),M=v.shift(),v.sort()),l=M.indexOf(":")<0&&"on"+M,(e=e[T.expando]?e:new T.Event(M,"object"==typeof e&&e)).isTrigger=o?2:3,e.namespace=v.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:T.makeArray(t,[e]),f=T.event.special[M]||{},o||!f.trigger||!1!==f.trigger.apply(n,t))){if(!o&&!f.noBubble&&!m(n)){for(s=f.delegateType||M,_t.test(s+M)||(a=a.parentNode);a;a=a.parentNode)h.push(a),c=a;c===(n.ownerDocument||g)&&h.push(c.defaultView||c.parentWindow||r)}for(i=0;(a=h[i++])&&!e.isPropagationStopped();)d=a,e.type=i>1?s:f.bindType||M,(u=(Q.get(a,"events")||Object.create(null))[e.type]&&Q.get(a,"handle"))&&u.apply(a,t),(u=l&&a[l])&&u.apply&&K(a)&&(e.result=u.apply(a,t),!1===e.result&&e.preventDefault());return e.type=M,o||e.isDefaultPrevented()||f._default&&!1!==f._default.apply(h.pop(),t)||!K(n)||l&&b(n[M])&&!m(n)&&((c=n[l])&&(n[l]=null),T.event.triggered=M,e.isPropagationStopped()&&d.addEventListener(M,yt),n[M](),e.isPropagationStopped()&&d.removeEventListener(M,yt),T.event.triggered=void 0,c&&(n[l]=c)),e.result}},simulate:function(e,t,n){var r=T.extend(new T.Event,n,{type:e,isSimulated:!0});T.event.trigger(r,null,t)}}),T.fn.extend({trigger:function(e,t){return this.each((function(){T.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return T.event.trigger(e,t,n,!0)}}),v.focusin||T.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){T.event.simulate(t,e.target,T.event.fix(e))};T.event.special[t]={setup:function(){var r=this.ownerDocument||this.document||this,o=Q.access(r,t);o||r.addEventListener(e,n,!0),Q.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this.document||this,o=Q.access(r,t)-1;o?Q.access(r,t,o):(r.removeEventListener(e,n,!0),Q.remove(r,t))}}}));var Et=r.location,Tt={guid:Date.now()},Ot=/\?/;T.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new r.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||T.error("Invalid XML: "+(n?T.map(n.childNodes,(function(e){return e.textContent})).join("\n"):e)),t};var Nt=/\[\]$/,zt=/\r?\n/g,Lt=/^(?:submit|button|image|reset|file)$/i,Ct=/^(?:input|select|textarea|keygen)/i;function wt(e,t,n,r){var o;if(Array.isArray(t))T.each(t,(function(t,o){n||Nt.test(e)?r(e,o):wt(e+"["+("object"==typeof o&&null!=o?t:"")+"]",o,n,r)}));else if(n||"object"!==y(t))r(e,t);else for(o in t)wt(e+"["+o+"]",t[o],n,r)}T.param=function(e,t){var n,r=[],o=function(e,t){var n=b(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!T.isPlainObject(e))T.each(e,(function(){o(this.name,this.value)}));else for(n in e)wt(n,e[n],t,o);return r.join("&")},T.fn.extend({serialize:function(){return T.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=T.prop(this,"elements");return e?T.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!T(this).is(":disabled")&&Ct.test(this.nodeName)&&!Lt.test(e)&&(this.checked||!ve.test(e))})).map((function(e,t){var n=T(this).val();return null==n?null:Array.isArray(n)?T.map(n,(function(e){return{name:t.name,value:e.replace(zt,"\r\n")}})):{name:t.name,value:n.replace(zt,"\r\n")}})).get()}});var St=/%20/g,Rt=/#.*$/,qt=/([?&])_=[^&]*/,xt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Wt=/^(?:GET|HEAD)$/,kt=/^\/\//,Bt={},It={},Dt="*/".concat("*"),Xt=g.createElement("a");function Pt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,o=0,i=t.toLowerCase().match(I)||[];if(b(n))for(;r=i[o++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function jt(e,t,n,r){var o={},i=e===It;function a(c){var s;return o[c]=!0,T.each(e[c]||[],(function(e,c){var l=c(t,n,r);return"string"!=typeof l||i||o[l]?i?!(s=l):void 0:(t.dataTypes.unshift(l),a(l),!1)})),s}return a(t.dataTypes[0])||!o["*"]&&a("*")}function Ut(e,t){var n,r,o=T.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&T.extend(!0,e,r),e}Xt.href=Et.href,T.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":T.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ut(Ut(e,T.ajaxSettings),t):Ut(T.ajaxSettings,e)},ajaxPrefilter:Pt(Bt),ajaxTransport:Pt(It),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var n,o,i,a,c,s,l,u,f,d,p=T.ajaxSetup({},t),h=p.context||p,M=p.context&&(h.nodeType||h.jquery)?T(h):T.event,v=T.Deferred(),b=T.Callbacks("once memory"),m=p.statusCode||{},A={},_={},y="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=xt.exec(i);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return l?i:null},setRequestHeader:function(e,t){return null==l&&(e=_[e.toLowerCase()]=_[e.toLowerCase()]||e,A[e]=t),this},overrideMimeType:function(e){return null==l&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)E.always(e[E.status]);else for(t in e)m[t]=[m[t],e[t]];return this},abort:function(e){var t=e||y;return n&&n.abort(t),O(0,t),this}};if(v.promise(E),p.url=((e||p.url||Et.href)+"").replace(kt,Et.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(I)||[""],null==p.crossDomain){s=g.createElement("a");try{s.href=p.url,s.href=s.href,p.crossDomain=Xt.protocol+"//"+Xt.host!=s.protocol+"//"+s.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=T.param(p.data,p.traditional)),jt(Bt,p,t,E),l)return E;for(f in(u=T.event&&p.global)&&0==T.active++&&T.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Wt.test(p.type),o=p.url.replace(Rt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(St,"+")):(d=p.url.slice(o.length),p.data&&(p.processData||"string"==typeof p.data)&&(o+=(Ot.test(o)?"&":"?")+p.data,delete p.data),!1===p.cache&&(o=o.replace(qt,"$1"),d=(Ot.test(o)?"&":"?")+"_="+Tt.guid+++d),p.url=o+d),p.ifModified&&(T.lastModified[o]&&E.setRequestHeader("If-Modified-Since",T.lastModified[o]),T.etag[o]&&E.setRequestHeader("If-None-Match",T.etag[o])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&E.setRequestHeader("Content-Type",p.contentType),E.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dt+"; q=0.01":""):p.accepts["*"]),p.headers)E.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(!1===p.beforeSend.call(h,E,p)||l))return E.abort();if(y="abort",b.add(p.complete),E.done(p.success),E.fail(p.error),n=jt(It,p,t,E)){if(E.readyState=1,u&&M.trigger("ajaxSend",[E,p]),l)return E;p.async&&p.timeout>0&&(c=r.setTimeout((function(){E.abort("timeout")}),p.timeout));try{l=!1,n.send(A,O)}catch(e){if(l)throw e;O(-1,e)}}else O(-1,"No Transport");function O(e,t,a,s){var f,d,g,A,_,y=t;l||(l=!0,c&&r.clearTimeout(c),n=void 0,i=s||"",E.readyState=e>0?4:0,f=e>=200&&e<300||304===e,a&&(A=function(e,t,n){for(var r,o,i,a,c=e.contents,s=e.dataTypes;"*"===s[0];)s.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(o in c)if(c[o]&&c[o].test(r)){s.unshift(o);break}if(s[0]in n)i=s[0];else{for(o in n){if(!s[0]||e.converters[o+" "+s[0]]){i=o;break}a||(a=o)}i=i||a}if(i)return i!==s[0]&&s.unshift(i),n[i]}(p,E,a)),!f&&T.inArray("script",p.dataTypes)>-1&&T.inArray("json",p.dataTypes)<0&&(p.converters["text script"]=function(){}),A=function(e,t,n,r){var o,i,a,c,s,l={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(i=u.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!s&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),s=i,i=u.shift())if("*"===i)i=s;else if("*"!==s&&s!==i){if(!(a=l[s+" "+i]||l["* "+i]))for(o in l)if((c=o.split(" "))[1]===i&&(a=l[s+" "+c[0]]||l["* "+c[0]])){!0===a?a=l[o]:!0!==l[o]&&(i=c[0],u.unshift(c[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+s+" to "+i}}}return{state:"success",data:t}}(p,A,E,f),f?(p.ifModified&&((_=E.getResponseHeader("Last-Modified"))&&(T.lastModified[o]=_),(_=E.getResponseHeader("etag"))&&(T.etag[o]=_)),204===e||"HEAD"===p.type?y="nocontent":304===e?y="notmodified":(y=A.state,d=A.data,f=!(g=A.error))):(g=y,!e&&y||(y="error",e<0&&(e=0))),E.status=e,E.statusText=(t||y)+"",f?v.resolveWith(h,[d,y,E]):v.rejectWith(h,[E,y,g]),E.statusCode(m),m=void 0,u&&M.trigger(f?"ajaxSuccess":"ajaxError",[E,p,f?d:g]),b.fireWith(h,[E,y]),u&&(M.trigger("ajaxComplete",[E,p]),--T.active||T.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return T.get(e,t,n,"json")},getScript:function(e,t){return T.get(e,void 0,t,"script")}}),T.each(["get","post"],(function(e,t){T[t]=function(e,n,r,o){return b(n)&&(o=o||r,r=n,n=void 0),T.ajax(T.extend({url:e,type:t,dataType:o,data:n,success:r},T.isPlainObject(e)&&e))}})),T.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),T._evalUrl=function(e,t,n){return T.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){T.globalEval(e,t,n)}})},T.fn.extend({wrapAll:function(e){var t;return this[0]&&(b(e)&&(e=e.call(this[0])),t=T(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return b(e)?this.each((function(t){T(this).wrapInner(e.call(this,t))})):this.each((function(){var t=T(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=b(e);return this.each((function(n){T(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){T(this).replaceWith(this.childNodes)})),this}}),T.expr.pseudos.hidden=function(e){return!T.expr.pseudos.visible(e)},T.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},T.ajaxSettings.xhr=function(){try{return new r.XMLHttpRequest}catch(e){}};var Ht={0:200,1223:204},Ft=T.ajaxSettings.xhr();v.cors=!!Ft&&"withCredentials"in Ft,v.ajax=Ft=!!Ft,T.ajaxTransport((function(e){var t,n;if(v.cors||Ft&&!e.crossDomain)return{send:function(o,i){var a,c=e.xhr();if(c.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)c[a]=e.xhrFields[a];for(a in e.mimeType&&c.overrideMimeType&&c.overrideMimeType(e.mimeType),e.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)c.setRequestHeader(a,o[a]);t=function(e){return function(){t&&(t=n=c.onload=c.onerror=c.onabort=c.ontimeout=c.onreadystatechange=null,"abort"===e?c.abort():"error"===e?"number"!=typeof c.status?i(0,"error"):i(c.status,c.statusText):i(Ht[c.status]||c.status,c.statusText,"text"!==(c.responseType||"text")||"string"!=typeof c.responseText?{binary:c.response}:{text:c.responseText},c.getAllResponseHeaders()))}},c.onload=t(),n=c.onerror=c.ontimeout=t("error"),void 0!==c.onabort?c.onabort=n:c.onreadystatechange=function(){4===c.readyState&&r.setTimeout((function(){t&&n()}))},t=t("abort");try{c.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),T.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),T.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return T.globalEval(e),e}}}),T.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),T.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,o){t=T(" diff --git a/resources/assets/admin/src/components/ArrowIcon.vue b/resources/assets/admin/src/components/ArrowIcon.vue index 8a9123e..0802329 100644 --- a/resources/assets/admin/src/components/ArrowIcon.vue +++ b/resources/assets/admin/src/components/ArrowIcon.vue @@ -1,5 +1,11 @@ + + diff --git a/resources/assets/admin/src/components/ConfirmDialog.vue b/resources/assets/admin/src/components/ConfirmDialog.vue index 60a5ebe..3dd1971 100644 --- a/resources/assets/admin/src/components/ConfirmDialog.vue +++ b/resources/assets/admin/src/components/ConfirmDialog.vue @@ -1,11 +1,23 @@ diff --git a/resources/assets/admin/src/components/ProseParagraph.vue b/resources/assets/admin/src/components/ProseParagraph.vue new file mode 100644 index 0000000..7462fb8 --- /dev/null +++ b/resources/assets/admin/src/components/ProseParagraph.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/assets/admin/src/components/RequestForChangeBtn.vue b/resources/assets/admin/src/components/RequestForChangeBtn.vue new file mode 100644 index 0000000..0aff142 --- /dev/null +++ b/resources/assets/admin/src/components/RequestForChangeBtn.vue @@ -0,0 +1,67 @@ + + + diff --git a/resources/assets/admin/src/components/ReviewComponent.vue b/resources/assets/admin/src/components/ReviewComponent.vue index c04eb8c..b9e3756 100644 --- a/resources/assets/admin/src/components/ReviewComponent.vue +++ b/resources/assets/admin/src/components/ReviewComponent.vue @@ -1,36 +1,62 @@ diff --git a/resources/assets/admin/src/components/SearchIcon.vue b/resources/assets/admin/src/components/SearchIcon.vue index 5d86c61..a7ce1d2 100644 --- a/resources/assets/admin/src/components/SearchIcon.vue +++ b/resources/assets/admin/src/components/SearchIcon.vue @@ -1,5 +1,11 @@ + + diff --git a/resources/assets/admin/src/components/StatusPill.vue b/resources/assets/admin/src/components/StatusPill.vue index 75f623f..0ccde40 100644 --- a/resources/assets/admin/src/components/StatusPill.vue +++ b/resources/assets/admin/src/components/StatusPill.vue @@ -1,5 +1,7 @@ diff --git a/resources/assets/admin/src/components/TabSubheading.vue b/resources/assets/admin/src/components/TabSubheading.vue new file mode 100644 index 0000000..025aeed --- /dev/null +++ b/resources/assets/admin/src/components/TabSubheading.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/assets/admin/src/components/TagPill.vue b/resources/assets/admin/src/components/TagPill.vue index 2ebe6af..ef73806 100644 --- a/resources/assets/admin/src/components/TagPill.vue +++ b/resources/assets/admin/src/components/TagPill.vue @@ -1,9 +1,55 @@ + + diff --git a/resources/assets/admin/src/components/ToolCard.vue b/resources/assets/admin/src/components/ToolCard.vue index 3d1c415..a66861c 100644 --- a/resources/assets/admin/src/components/ToolCard.vue +++ b/resources/assets/admin/src/components/ToolCard.vue @@ -1,34 +1,53 @@ diff --git a/resources/assets/admin/src/components/Url.vue b/resources/assets/admin/src/components/Url.vue new file mode 100644 index 0000000..521fbdc --- /dev/null +++ b/resources/assets/admin/src/components/Url.vue @@ -0,0 +1,61 @@ + + + diff --git a/resources/assets/admin/src/components/Wysiwyg.vue b/resources/assets/admin/src/components/Wysiwyg.vue new file mode 100644 index 0000000..0a7c218 --- /dev/null +++ b/resources/assets/admin/src/components/Wysiwyg.vue @@ -0,0 +1,221 @@ + + + diff --git a/resources/assets/admin/src/components/WysiwygOutput.vue b/resources/assets/admin/src/components/WysiwygOutput.vue new file mode 100644 index 0000000..bc79a05 --- /dev/null +++ b/resources/assets/admin/src/components/WysiwygOutput.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/assets/admin/src/components/attribute/AttributeItem.vue b/resources/assets/admin/src/components/attribute/AttributeItem.vue index 18b5c46..feda361 100644 --- a/resources/assets/admin/src/components/attribute/AttributeItem.vue +++ b/resources/assets/admin/src/components/attribute/AttributeItem.vue @@ -5,10 +5,15 @@ {{ label }} - + +
+
@@ -22,7 +27,6 @@ export default { default: null, }, }, - computed: { /** * Determine whether or not a value can be shown. diff --git a/resources/assets/admin/src/components/attribute/AttributeList.vue b/resources/assets/admin/src/components/attribute/AttributeList.vue index 1b597e5..08adab8 100644 --- a/resources/assets/admin/src/components/attribute/AttributeList.vue +++ b/resources/assets/admin/src/components/attribute/AttributeList.vue @@ -1,6 +1,11 @@ diff --git a/resources/assets/admin/src/pages/content-manager/tag/EditPage.vue b/resources/assets/admin/src/pages/content-manager/tag/EditPage.vue new file mode 100644 index 0000000..fa09fc6 --- /dev/null +++ b/resources/assets/admin/src/pages/content-manager/tag/EditPage.vue @@ -0,0 +1,102 @@ + + + diff --git a/resources/assets/admin/src/pages/content-manager/tag/IndexPage.vue b/resources/assets/admin/src/pages/content-manager/tag/IndexPage.vue new file mode 100644 index 0000000..feeb93f --- /dev/null +++ b/resources/assets/admin/src/pages/content-manager/tag/IndexPage.vue @@ -0,0 +1,140 @@ + + + diff --git a/resources/assets/admin/src/pages/content-manager/tag/components/TagForm.vue b/resources/assets/admin/src/pages/content-manager/tag/components/TagForm.vue new file mode 100644 index 0000000..bfd2c47 --- /dev/null +++ b/resources/assets/admin/src/pages/content-manager/tag/components/TagForm.vue @@ -0,0 +1,56 @@ + + diff --git a/resources/assets/admin/src/pages/content-manager/tool/CreatePage.vue b/resources/assets/admin/src/pages/content-manager/tool/CreatePage.vue index 7d4783a..a2edb6c 100644 --- a/resources/assets/admin/src/pages/content-manager/tool/CreatePage.vue +++ b/resources/assets/admin/src/pages/content-manager/tool/CreatePage.vue @@ -3,26 +3,52 @@ -
+ - + + > + {{ trans('action.cancel') }} + - + {{ trans('action.store') }} + + + {{ trans('action.store_and_close') }} +
@@ -30,16 +56,19 @@ diff --git a/resources/assets/admin/src/pages/content-manager/tool/components/ToolForm.vue b/resources/assets/admin/src/pages/content-manager/tool/components/ToolForm.vue index e9a32f8..84f622b 100644 --- a/resources/assets/admin/src/pages/content-manager/tool/components/ToolForm.vue +++ b/resources/assets/admin/src/pages/content-manager/tool/components/ToolForm.vue @@ -1,18 +1,10 @@