Repository: Relaticle/relaticle Branch: main Commit: 6ab18e87f8da Files: 911 Total size: 7.3 MB Directory structure: gitextract_xr43z_zf/ ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .githooks/ │ └── pre-commit ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── 1-bug_report.yml │ │ └── config.yml │ ├── copilot-instructions.md │ └── workflows/ │ ├── docker-publish.yml │ ├── filament-view-monitor-simple.yml │ └── tests.yml ├── .gitignore ├── CLAUDE.md ├── Dockerfile ├── LICENSE ├── README.md ├── TODOS.md ├── app/ │ ├── Actions/ │ │ ├── Company/ │ │ │ ├── CreateCompany.php │ │ │ ├── DeleteCompany.php │ │ │ ├── ListCompanies.php │ │ │ └── UpdateCompany.php │ │ ├── Fortify/ │ │ │ ├── CreateNewSocialUser.php │ │ │ ├── PasswordValidationRules.php │ │ │ ├── ResetUserPassword.php │ │ │ ├── UpdateUserPassword.php │ │ │ └── UpdateUserProfileInformation.php │ │ ├── Jetstream/ │ │ │ ├── AddTeamMember.php │ │ │ ├── CreateTeam.php │ │ │ ├── DeleteTeam.php │ │ │ ├── DeleteUser.php │ │ │ ├── InviteTeamMember.php │ │ │ ├── RemoveTeamMember.php │ │ │ └── UpdateTeamName.php │ │ ├── Note/ │ │ │ ├── CreateNote.php │ │ │ ├── DeleteNote.php │ │ │ ├── ListNotes.php │ │ │ └── UpdateNote.php │ │ ├── Opportunity/ │ │ │ ├── CreateOpportunity.php │ │ │ ├── DeleteOpportunity.php │ │ │ ├── ListOpportunities.php │ │ │ └── UpdateOpportunity.php │ │ ├── People/ │ │ │ ├── CreatePeople.php │ │ │ ├── DeletePeople.php │ │ │ ├── ListPeople.php │ │ │ └── UpdatePeople.php │ │ └── Task/ │ │ ├── CreateTask.php │ │ ├── DeleteTask.php │ │ ├── ListTasks.php │ │ ├── NotifyTaskAssignees.php │ │ └── UpdateTask.php │ ├── Concerns/ │ │ └── DetectsTeamInvitation.php │ ├── Console/ │ │ └── Commands/ │ │ ├── BackfillCustomFieldColorsCommand.php │ │ ├── CleanupExpiredInvitationsCommand.php │ │ ├── CreateSystemAdminCommand.php │ │ ├── GenerateSitemapCommand.php │ │ └── InstallCommand.php │ ├── Contracts/ │ │ └── User/ │ │ └── CreatesNewSocialUsers.php │ ├── Data/ │ │ └── SubscriberData.php │ ├── Enums/ │ │ ├── CreationSource.php │ │ ├── CustomFieldType.php │ │ ├── CustomFields/ │ │ │ ├── CompanyField.php │ │ │ ├── CustomFieldTrait.php │ │ │ ├── NoteField.php │ │ │ ├── OpportunityField.php │ │ │ ├── PeopleField.php │ │ │ └── TaskField.php │ │ ├── SocialiteProvider.php │ │ └── SubscriberTagEnum.php │ ├── Filament/ │ │ ├── Actions/ │ │ │ └── GenerateRecordSummaryAction.php │ │ ├── Components/ │ │ │ └── Infolists/ │ │ │ └── AvatarName.php │ │ ├── Exports/ │ │ │ ├── BaseExporter.php │ │ │ ├── CompanyExporter.php │ │ │ ├── NoteExporter.php │ │ │ ├── OpportunityExporter.php │ │ │ ├── PeopleExporter.php │ │ │ └── TaskExporter.php │ │ ├── Pages/ │ │ │ ├── AccessTokens.php │ │ │ ├── Auth/ │ │ │ │ ├── Login.php │ │ │ │ └── Register.php │ │ │ ├── CreateTeam.php │ │ │ ├── EditProfile.php │ │ │ ├── EditTeam.php │ │ │ ├── OpportunitiesBoard.php │ │ │ └── TasksBoard.php │ │ └── Resources/ │ │ ├── CompanyResource/ │ │ │ ├── Pages/ │ │ │ │ ├── ListCompanies.php │ │ │ │ └── ViewCompany.php │ │ │ └── RelationManagers/ │ │ │ ├── NotesRelationManager.php │ │ │ ├── PeopleRelationManager.php │ │ │ └── TasksRelationManager.php │ │ ├── CompanyResource.php │ │ ├── NoteResource/ │ │ │ ├── Forms/ │ │ │ │ └── NoteForm.php │ │ │ └── Pages/ │ │ │ └── ManageNotes.php │ │ ├── NoteResource.php │ │ ├── OpportunityResource/ │ │ │ ├── Forms/ │ │ │ │ └── OpportunityForm.php │ │ │ ├── Pages/ │ │ │ │ ├── ListOpportunities.php │ │ │ │ └── ViewOpportunity.php │ │ │ └── RelationManagers/ │ │ │ ├── NotesRelationManager.php │ │ │ └── TasksRelationManager.php │ │ ├── OpportunityResource.php │ │ ├── PeopleResource/ │ │ │ ├── Pages/ │ │ │ │ ├── ListPeople.php │ │ │ │ └── ViewPeople.php │ │ │ └── RelationManagers/ │ │ │ ├── NotesRelationManager.php │ │ │ └── TasksRelationManager.php │ │ ├── PeopleResource.php │ │ ├── TaskResource/ │ │ │ ├── Forms/ │ │ │ │ └── TaskForm.php │ │ │ └── Pages/ │ │ │ └── ManageTasks.php │ │ └── TaskResource.php │ ├── Health/ │ │ └── AnthropicModelCheck.php │ ├── Http/ │ │ ├── Controllers/ │ │ │ ├── AcceptTeamInvitationController.php │ │ │ ├── Api/ │ │ │ │ └── V1/ │ │ │ │ ├── CompaniesController.php │ │ │ │ ├── CustomFieldsController.php │ │ │ │ ├── NotesController.php │ │ │ │ ├── OpportunitiesController.php │ │ │ │ ├── PeopleController.php │ │ │ │ └── TasksController.php │ │ │ ├── Auth/ │ │ │ │ ├── CallbackController.php │ │ │ │ └── RedirectController.php │ │ │ ├── ContactController.php │ │ │ ├── HomeController.php │ │ │ ├── PrivacyPolicyController.php │ │ │ └── TermsOfServiceController.php │ │ ├── Middleware/ │ │ │ ├── ApplyTenantScopes.php │ │ │ ├── EnsureTokenHasAbility.php │ │ │ ├── ForceJsonResponse.php │ │ │ ├── SetApiTeamContext.php │ │ │ ├── SubdomainRootResponse.php │ │ │ └── ValidateSignature.php │ │ ├── Requests/ │ │ │ ├── Api/ │ │ │ │ └── V1/ │ │ │ │ ├── IndexCustomFieldsRequest.php │ │ │ │ ├── IndexRequest.php │ │ │ │ ├── StoreCompanyRequest.php │ │ │ │ ├── StoreNoteRequest.php │ │ │ │ ├── StoreOpportunityRequest.php │ │ │ │ ├── StorePeopleRequest.php │ │ │ │ ├── StoreTaskRequest.php │ │ │ │ ├── UpdateCompanyRequest.php │ │ │ │ ├── UpdateNoteRequest.php │ │ │ │ ├── UpdateOpportunityRequest.php │ │ │ │ ├── UpdatePeopleRequest.php │ │ │ │ └── UpdateTaskRequest.php │ │ │ └── ContactRequest.php │ │ ├── Resources/ │ │ │ └── V1/ │ │ │ ├── CompanyResource.php │ │ │ ├── Concerns/ │ │ │ │ └── FormatsCustomFields.php │ │ │ ├── CustomFieldResource.php │ │ │ ├── NoteResource.php │ │ │ ├── OpportunityResource.php │ │ │ ├── PeopleResource.php │ │ │ ├── TaskResource.php │ │ │ └── UserResource.php │ │ └── Responses/ │ │ └── LoginResponse.php │ ├── Jobs/ │ │ ├── Email/ │ │ │ ├── CreateSubscriberJob.php │ │ │ └── UpdateSubscriberJob.php │ │ └── FetchFaviconForCompany.php │ ├── Listeners/ │ │ ├── CreateTeamCustomFields.php │ │ ├── Email/ │ │ │ └── NewSubscriberListener.php │ │ └── SwitchTeam.php │ ├── Livewire/ │ │ ├── App/ │ │ │ ├── AccessTokens/ │ │ │ │ ├── CreateAccessToken.php │ │ │ │ └── ManageAccessTokens.php │ │ │ ├── Profile/ │ │ │ │ ├── DeleteAccount.php │ │ │ │ ├── LogoutOtherBrowserSessions.php │ │ │ │ ├── UpdatePassword.php │ │ │ │ └── UpdateProfileInformation.php │ │ │ └── Teams/ │ │ │ ├── AddTeamMember.php │ │ │ ├── DeleteTeam.php │ │ │ ├── PendingTeamInvitations.php │ │ │ ├── TeamMembers.php │ │ │ └── UpdateTeamName.php │ │ ├── BaseLivewireComponent.php │ │ └── UpdateProfileInformationForm.php │ ├── Mail/ │ │ └── NewContactSubmissionMail.php │ ├── Mcp/ │ │ ├── Filters/ │ │ │ ├── CustomFieldFilter.php │ │ │ └── CustomFieldSort.php │ │ ├── Prompts/ │ │ │ └── CrmOverviewPrompt.php │ │ ├── Resources/ │ │ │ ├── CompanySchemaResource.php │ │ │ ├── Concerns/ │ │ │ │ └── ResolvesEntitySchema.php │ │ │ ├── CrmSummaryResource.php │ │ │ ├── NoteSchemaResource.php │ │ │ ├── OpportunitySchemaResource.php │ │ │ ├── PeopleSchemaResource.php │ │ │ └── TaskSchemaResource.php │ │ ├── Schema/ │ │ │ └── CustomFieldFilterSchema.php │ │ ├── Servers/ │ │ │ └── RelaticleServer.php │ │ └── Tools/ │ │ ├── BaseAttachTool.php │ │ ├── BaseCreateTool.php │ │ ├── BaseDeleteTool.php │ │ ├── BaseDetachTool.php │ │ ├── BaseListTool.php │ │ ├── BaseShowTool.php │ │ ├── BaseUpdateTool.php │ │ ├── Company/ │ │ │ ├── CreateCompanyTool.php │ │ │ ├── DeleteCompanyTool.php │ │ │ ├── GetCompanyTool.php │ │ │ ├── ListCompaniesTool.php │ │ │ └── UpdateCompanyTool.php │ │ ├── Concerns/ │ │ │ ├── BuildsRelationshipResponse.php │ │ │ ├── ChecksTokenAbility.php │ │ │ └── SerializesRelatedModels.php │ │ ├── Note/ │ │ │ ├── AttachNoteToEntitiesTool.php │ │ │ ├── CreateNoteTool.php │ │ │ ├── DeleteNoteTool.php │ │ │ ├── DetachNoteFromEntitiesTool.php │ │ │ ├── GetNoteTool.php │ │ │ ├── ListNotesTool.php │ │ │ └── UpdateNoteTool.php │ │ ├── Opportunity/ │ │ │ ├── CreateOpportunityTool.php │ │ │ ├── DeleteOpportunityTool.php │ │ │ ├── GetOpportunityTool.php │ │ │ ├── ListOpportunitiesTool.php │ │ │ └── UpdateOpportunityTool.php │ │ ├── People/ │ │ │ ├── CreatePeopleTool.php │ │ │ ├── DeletePeopleTool.php │ │ │ ├── GetPeopleTool.php │ │ │ ├── ListPeopleTool.php │ │ │ └── UpdatePeopleTool.php │ │ ├── Task/ │ │ │ ├── AttachTaskToEntitiesTool.php │ │ │ ├── CreateTaskTool.php │ │ │ ├── DeleteTaskTool.php │ │ │ ├── DetachTaskFromEntitiesTool.php │ │ │ ├── GetTaskTool.php │ │ │ ├── ListTasksTool.php │ │ │ └── UpdateTaskTool.php │ │ └── WhoAmiTool.php │ ├── Models/ │ │ ├── AiSummary.php │ │ ├── Company.php │ │ ├── Concerns/ │ │ │ ├── BelongsToTeamCreator.php │ │ │ ├── HasAiSummary.php │ │ │ ├── HasCreator.php │ │ │ ├── HasNotes.php │ │ │ ├── HasProfilePhoto.php │ │ │ ├── HasTeam.php │ │ │ └── InvalidatesRelatedAiSummaries.php │ │ ├── CustomField.php │ │ ├── CustomFieldOption.php │ │ ├── CustomFieldSection.php │ │ ├── CustomFieldValue.php │ │ ├── Export.php │ │ ├── Membership.php │ │ ├── Note.php │ │ ├── Opportunity.php │ │ ├── People.php │ │ ├── PersonalAccessToken.php │ │ ├── Scopes/ │ │ │ └── TeamScope.php │ │ ├── Task.php │ │ ├── Team.php │ │ ├── TeamInvitation.php │ │ ├── User.php │ │ └── UserSocialAccount.php │ ├── Observers/ │ │ ├── CompanyObserver.php │ │ ├── NoteObserver.php │ │ ├── OpportunityObserver.php │ │ ├── PeopleObserver.php │ │ └── TaskObserver.php │ ├── Policies/ │ │ ├── CompanyPolicy.php │ │ ├── NotePolicy.php │ │ ├── OpportunityPolicy.php │ │ ├── PeoplePolicy.php │ │ ├── TaskPolicy.php │ │ └── TeamPolicy.php │ ├── Providers/ │ │ ├── AppServiceProvider.php │ │ ├── FaviconServiceProvider.php │ │ ├── Filament/ │ │ │ └── AppPanelProvider.php │ │ ├── FortifyServiceProvider.php │ │ ├── HealthServiceProvider.php │ │ ├── HorizonServiceProvider.php │ │ ├── JetstreamServiceProvider.php │ │ └── MacroServiceProvider.php │ ├── Rules/ │ │ ├── ValidCustomFields.php │ │ └── ValidTeamSlug.php │ ├── Scribe/ │ │ └── Strategies/ │ │ └── GetFromSpatieQueryBuilder.php │ ├── Services/ │ │ ├── AI/ │ │ │ ├── RecordContextBuilder.php │ │ │ └── RecordSummaryService.php │ │ ├── AvatarService.php │ │ ├── Favicon/ │ │ │ └── Drivers/ │ │ │ ├── GoogleHighResDriver.php │ │ │ └── HighQualityDriver.php │ │ └── GitHubService.php │ ├── Support/ │ │ └── CustomFieldMerger.php │ └── View/ │ └── Components/ │ └── GuestLayout.php ├── artisan ├── bootstrap/ │ ├── app.php │ ├── cache/ │ │ └── .gitignore │ └── providers.php ├── compose.dev.yml ├── compose.yml ├── composer.json ├── config/ │ ├── app.php │ ├── auth.php │ ├── avatar.php │ ├── blade-icons.php │ ├── cache.php │ ├── custom-fields.php │ ├── data.php │ ├── database.php │ ├── eloquent-sortable.php │ ├── favicon-fetcher.php │ ├── filament.php │ ├── filesystems.php │ ├── fortify.php │ ├── health.php │ ├── horizon-watcher.php │ ├── horizon.php │ ├── jetstream.php │ ├── logging.php │ ├── login-link.php │ ├── mail.php │ ├── mailcoach-sdk.php │ ├── markdown-response.php │ ├── markdown.php │ ├── media-library.php │ ├── prism.php │ ├── queue.php │ ├── relaticle.php │ ├── sanctum.php │ ├── scribe.php │ ├── sentry.php │ ├── services.php │ ├── session.php │ └── sitemap.php ├── database/ │ ├── .gitignore │ ├── factories/ │ │ ├── CompanyFactory.php │ │ ├── CustomFieldFactory.php │ │ ├── NoteFactory.php │ │ ├── OpportunityFactory.php │ │ ├── PeopleFactory.php │ │ ├── SystemAdministratorFactory.php │ │ ├── TaskFactory.php │ │ ├── TeamFactory.php │ │ ├── TeamInvitationFactory.php │ │ ├── UserFactory.php │ │ └── UserSocialAccountFactory.php │ ├── migrations/ │ │ ├── 0001_01_01_000000_create_users_table.php │ │ ├── 0001_01_01_000001_create_cache_table.php │ │ ├── 0001_01_01_000002_create_jobs_table.php │ │ ├── 2024_08_23_110718_create_teams_table.php │ │ ├── 2024_08_23_110719_create_team_user_table.php │ │ ├── 2024_08_23_110720_create_team_invitations_table.php │ │ ├── 2024_08_24_133803_create_companies_table.php │ │ ├── 2024_09_11_114549_create_tasks_table.php │ │ ├── 2024_09_22_084119_create_notes_table.php │ │ ├── 2024_09_22_091034_create_people_table.php │ │ ├── 2024_09_22_092300_create_task_user_table.php │ │ ├── 2024_09_22_110651_add_two_factor_columns_to_users_table.php │ │ ├── 2024_09_22_110718_create_personal_access_tokens_table.php │ │ ├── 2024_09_22_114735_create_opportunities_table.php │ │ ├── 2024_09_26_160649_create_user_social_accounts_table.php │ │ ├── 2024_09_26_170133_create_notifications_table.php │ │ ├── 2025_02_07_192236_create_custom_fields_table.php │ │ ├── 2025_03_15_180559_create_taskables_table.php │ │ ├── 2025_03_15_192334_create_notables_table.php │ │ ├── 2025_03_17_180206_create_media_table.php │ │ ├── 2025_04_30_143551_add_creation_source_to_entity_tables.php │ │ ├── 2025_05_08_112613_create_imports_table.php │ │ ├── 2025_05_08_112614_create_exports_table.php │ │ ├── 2025_05_08_112615_create_failed_import_rows_table.php │ │ ├── 2025_07_05_093310_update_opportunity_amount_field_type_to_currency.php │ │ ├── 2025_08_12_202409_add_settings_to_custom_field_options_table.php │ │ ├── 2025_08_25_173222_update_order_column_to_flowforge_position_for_tasks_and_opportunities.php │ │ ├── 2025_08_26_124042_create_system_administrators_table.php │ │ ├── 2025_11_30_202612_create_ai_summaries_table.php │ │ ├── 2025_12_10_191207_update_people_emails_field_type_to_email.php │ │ ├── 2025_12_11_000001_update_company_domain_name_settings.php │ │ ├── 2025_12_20_000000_migrate_to_ulid.php │ │ ├── 2025_12_27_122241_convert_order_column_to_decimal_and_regenerate_positions.php │ │ ├── 2026_01_02_152157_update_phone_number_custom_fields_type.php │ │ ├── 2026_01_12_225824_upgrade_custom_fields_to_v3.php │ │ ├── 2026_02_11_232804_add_slug_to_teams_table.php │ │ ├── 2026_02_12_222910_expand_imports_table.php │ │ ├── 2026_02_13_002721_cleanup_imports_table.php │ │ ├── 2026_02_15_214730_drop_sessions_user_id_foreign_key.php │ │ ├── 2026_02_20_212853_add_team_id_to_personal_access_tokens_table.php │ │ ├── 2026_02_25_124942_add_team_id_indexes_to_entity_tables.php │ │ ├── 2026_03_15_201741_add_custom_field_value_filtering_indexes.php │ │ └── 2026_03_18_202956_add_expires_at_to_team_invitations_table.php │ └── seeders/ │ ├── DatabaseSeeder.php │ ├── LocalSeeder.php │ └── SystemAdministratorSeeder.php ├── lang/ │ └── en/ │ ├── access-tokens.php │ ├── profile.php │ └── teams.php ├── package.json ├── packages/ │ ├── Documentation/ │ │ ├── README.md │ │ ├── config/ │ │ │ └── documentation.php │ │ ├── resources/ │ │ │ ├── css/ │ │ │ │ └── documentation.css │ │ │ ├── js/ │ │ │ │ └── documentation.js │ │ │ ├── markdown/ │ │ │ │ ├── developer-guide.md │ │ │ │ ├── getting-started.md │ │ │ │ ├── import-guide.md │ │ │ │ ├── mcp-guide.md │ │ │ │ └── self-hosting-guide.md │ │ │ └── views/ │ │ │ ├── components/ │ │ │ │ ├── card.blade.php │ │ │ │ ├── layout.blade.php │ │ │ │ └── search-form.blade.php │ │ │ ├── index.blade.php │ │ │ ├── search.blade.php │ │ │ └── show.blade.php │ │ ├── routes/ │ │ │ └── web.php │ │ └── src/ │ │ ├── Components/ │ │ │ └── Card.php │ │ ├── Data/ │ │ │ ├── DocumentData.php │ │ │ ├── DocumentSearchRequest.php │ │ │ └── DocumentSearchResultData.php │ │ ├── DocumentationServiceProvider.php │ │ ├── Http/ │ │ │ └── Controllers/ │ │ │ └── DocumentationController.php │ │ └── Services/ │ │ └── DocumentationService.php │ ├── ImportWizard/ │ │ ├── config/ │ │ │ └── import-wizard.php │ │ ├── resources/ │ │ │ ├── lang/ │ │ │ │ └── en/ │ │ │ │ └── validation.php │ │ │ └── views/ │ │ │ ├── components/ │ │ │ │ ├── field-select.blade.php │ │ │ │ ├── multi-value-input.blade.php │ │ │ │ ├── select-menu.blade.php │ │ │ │ └── value-row-actions.blade.php │ │ │ ├── filament/ │ │ │ │ └── pages/ │ │ │ │ ├── import-history.blade.php │ │ │ │ └── import-page.blade.php │ │ │ └── livewire/ │ │ │ ├── import-wizard.blade.php │ │ │ ├── partials/ │ │ │ │ └── step-indicator.blade.php │ │ │ └── steps/ │ │ │ ├── mapping-step.blade.php │ │ │ ├── partials/ │ │ │ │ ├── value-row-choice.blade.php │ │ │ │ ├── value-row-date.blade.php │ │ │ │ ├── value-row-multi-value.blade.php │ │ │ │ ├── value-row-number.blade.php │ │ │ │ ├── value-row-skipped.blade.php │ │ │ │ └── value-row-text.blade.php │ │ │ ├── preview-step.blade.php │ │ │ ├── review-step.blade.php │ │ │ └── upload-step.blade.php │ │ ├── routes/ │ │ │ └── web.php │ │ └── src/ │ │ ├── Commands/ │ │ │ └── CleanupImportsCommand.php │ │ ├── Data/ │ │ │ ├── ColumnData.php │ │ │ ├── EntityLink.php │ │ │ ├── ImportField.php │ │ │ ├── ImportFieldCollection.php │ │ │ ├── InferenceResult.php │ │ │ ├── MatchableField.php │ │ │ └── RelationshipMatch.php │ │ ├── Enums/ │ │ │ ├── DateFormat.php │ │ │ ├── EntityLinkSource.php │ │ │ ├── EntityLinkStorage.php │ │ │ ├── ImportEntityType.php │ │ │ ├── ImportStatus.php │ │ │ ├── MatchBehavior.php │ │ │ ├── NumberFormat.php │ │ │ ├── ReviewFilter.php │ │ │ ├── RowMatchAction.php │ │ │ ├── SortDirection.php │ │ │ └── SortField.php │ │ ├── Filament/ │ │ │ └── Pages/ │ │ │ ├── ImportCompanies.php │ │ │ ├── ImportHistory.php │ │ │ ├── ImportNotes.php │ │ │ ├── ImportOpportunities.php │ │ │ ├── ImportPage.php │ │ │ ├── ImportPeople.php │ │ │ └── ImportTasks.php │ │ ├── Http/ │ │ │ └── Controllers/ │ │ │ └── DownloadFailedRowsController.php │ │ ├── ImportWizardNewServiceProvider.php │ │ ├── Importers/ │ │ │ ├── BaseImporter.php │ │ │ ├── CompanyImporter.php │ │ │ ├── Contracts/ │ │ │ │ └── ImporterContract.php │ │ │ ├── NoteImporter.php │ │ │ ├── OpportunityImporter.php │ │ │ ├── PeopleImporter.php │ │ │ └── TaskImporter.php │ │ ├── Jobs/ │ │ │ ├── ExecuteImportJob.php │ │ │ ├── ResolveMatchesJob.php │ │ │ └── ValidateColumnJob.php │ │ ├── Livewire/ │ │ │ ├── Concerns/ │ │ │ │ └── WithImportStore.php │ │ │ ├── ImportWizard.php │ │ │ └── Steps/ │ │ │ ├── MappingStep.php │ │ │ ├── PreviewStep.php │ │ │ ├── ReviewStep.php │ │ │ └── UploadStep.php │ │ ├── Models/ │ │ │ ├── FailedImportRow.php │ │ │ └── Import.php │ │ ├── Rules/ │ │ │ ├── ImportChoiceRule.php │ │ │ ├── ImportDateRule.php │ │ │ └── ImportNumberRule.php │ │ ├── Store/ │ │ │ ├── ImportRow.php │ │ │ └── ImportStore.php │ │ └── Support/ │ │ ├── DataTypeInferencer.php │ │ ├── EntityLinkResolver.php │ │ ├── EntityLinkStorage/ │ │ │ ├── CustomFieldValueStorage.php │ │ │ ├── EntityLinkStorageInterface.php │ │ │ ├── ForeignKeyStorage.php │ │ │ └── MorphToManyStorage.php │ │ ├── EntityLinkValidator.php │ │ ├── MatchResolver.php │ │ └── Validation/ │ │ ├── ColumnValidator.php │ │ └── ValidationError.php │ ├── OnboardSeed/ │ │ ├── README.md │ │ ├── resources/ │ │ │ ├── fixtures/ │ │ │ │ ├── companies/ │ │ │ │ │ ├── airbnb.yaml │ │ │ │ │ ├── apple.yaml │ │ │ │ │ ├── figma.yaml │ │ │ │ │ └── notion.yaml │ │ │ │ ├── notes/ │ │ │ │ │ ├── airbnb_note.yaml │ │ │ │ │ ├── apple_note.yaml │ │ │ │ │ ├── dylan_note.yaml │ │ │ │ │ ├── figma_note.yaml │ │ │ │ │ └── notion_note.yaml │ │ │ │ ├── opportunities/ │ │ │ │ │ ├── airbnb_analytics.yaml │ │ │ │ │ ├── apple_partnership.yaml │ │ │ │ │ ├── figma_enterprise.yaml │ │ │ │ │ └── notion_integration.yaml │ │ │ │ ├── people/ │ │ │ │ │ ├── brian.yaml │ │ │ │ │ ├── dylan.yaml │ │ │ │ │ ├── ivan.yaml │ │ │ │ │ └── tim.yaml │ │ │ │ └── tasks/ │ │ │ │ ├── brian_call.yaml │ │ │ │ ├── dylan_followup.yaml │ │ │ │ ├── ivan_meeting.yaml │ │ │ │ └── tim_proposal.yaml │ │ │ └── templates/ │ │ │ └── entity_template.yaml │ │ └── src/ │ │ ├── Contracts/ │ │ │ └── ModelSeederInterface.php │ │ ├── ModelSeeders/ │ │ │ ├── CompanySeeder.php │ │ │ ├── NoteSeeder.php │ │ │ ├── OpportunitySeeder.php │ │ │ ├── PeopleSeeder.php │ │ │ └── TaskSeeder.php │ │ ├── OnboardSeedManager.php │ │ ├── OnboardSeeder.php │ │ └── Support/ │ │ ├── BaseModelSeeder.php │ │ ├── BulkCustomFieldValueWriter.php │ │ ├── FixtureLoader.php │ │ └── FixtureRegistry.php │ └── SystemAdmin/ │ └── src/ │ ├── Enums/ │ │ └── SystemAdministratorRole.php │ ├── Filament/ │ │ ├── Exports/ │ │ │ └── CompanyExporter.php │ │ ├── Pages/ │ │ │ ├── Dashboard.php │ │ │ └── EngagementDashboard.php │ │ ├── Resources/ │ │ │ ├── CompanyResource/ │ │ │ │ └── Pages/ │ │ │ │ ├── CreateCompany.php │ │ │ │ ├── EditCompany.php │ │ │ │ ├── ListCompanies.php │ │ │ │ └── ViewCompany.php │ │ │ ├── CompanyResource.php │ │ │ ├── ImportResource/ │ │ │ │ ├── Pages/ │ │ │ │ │ ├── ListImports.php │ │ │ │ │ └── ViewImport.php │ │ │ │ └── RelationManagers/ │ │ │ │ └── FailedRowsRelationManager.php │ │ │ ├── ImportResource.php │ │ │ ├── NoteResource/ │ │ │ │ └── Pages/ │ │ │ │ ├── CreateNote.php │ │ │ │ ├── EditNote.php │ │ │ │ ├── ListNotes.php │ │ │ │ └── ViewNote.php │ │ │ ├── NoteResource.php │ │ │ ├── OpportunityResource/ │ │ │ │ └── Pages/ │ │ │ │ ├── CreateOpportunity.php │ │ │ │ ├── EditOpportunity.php │ │ │ │ ├── ListOpportunities.php │ │ │ │ └── ViewOpportunity.php │ │ │ ├── OpportunityResource.php │ │ │ ├── PeopleResource/ │ │ │ │ └── Pages/ │ │ │ │ ├── CreatePeople.php │ │ │ │ ├── EditPeople.php │ │ │ │ ├── ListPeople.php │ │ │ │ └── ViewPeople.php │ │ │ ├── PeopleResource.php │ │ │ ├── SystemAdministrators/ │ │ │ │ ├── Pages/ │ │ │ │ │ ├── CreateSystemAdministrator.php │ │ │ │ │ ├── EditSystemAdministrator.php │ │ │ │ │ ├── ListSystemAdministrators.php │ │ │ │ │ └── ViewSystemAdministrator.php │ │ │ │ ├── Schemas/ │ │ │ │ │ ├── SystemAdministratorForm.php │ │ │ │ │ └── SystemAdministratorInfolist.php │ │ │ │ ├── SystemAdministratorResource.php │ │ │ │ └── Tables/ │ │ │ │ └── SystemAdministratorsTable.php │ │ │ ├── TaskResource/ │ │ │ │ └── Pages/ │ │ │ │ ├── CreateTask.php │ │ │ │ ├── EditTask.php │ │ │ │ ├── ListTasks.php │ │ │ │ └── ViewTask.php │ │ │ ├── TaskResource.php │ │ │ ├── TeamResource/ │ │ │ │ ├── Pages/ │ │ │ │ │ ├── CreateTeam.php │ │ │ │ │ ├── EditTeam.php │ │ │ │ │ ├── ListTeams.php │ │ │ │ │ └── ViewTeam.php │ │ │ │ └── RelationManagers/ │ │ │ │ ├── CompaniesRelationManager.php │ │ │ │ ├── MembersRelationManager.php │ │ │ │ ├── NotesRelationManager.php │ │ │ │ ├── OpportunitiesRelationManager.php │ │ │ │ ├── PeopleRelationManager.php │ │ │ │ └── TasksRelationManager.php │ │ │ ├── TeamResource.php │ │ │ ├── UserResource/ │ │ │ │ ├── Pages/ │ │ │ │ │ ├── CreateUser.php │ │ │ │ │ ├── EditUser.php │ │ │ │ │ ├── ListUsers.php │ │ │ │ │ └── ViewUser.php │ │ │ │ └── RelationManagers/ │ │ │ │ ├── OwnedTeamsRelationManager.php │ │ │ │ └── TeamsRelationManager.php │ │ │ └── UserResource.php │ │ └── Widgets/ │ │ ├── ActivationRateWidget.php │ │ ├── Concerns/ │ │ │ └── HasPeriodComparison.php │ │ ├── PlatformGrowthStatsWidget.php │ │ ├── RecordDistributionChartWidget.php │ │ ├── SignupTrendChartWidget.php │ │ ├── TopTeamsTableWidget.php │ │ └── UserRetentionChartWidget.php │ ├── Models/ │ │ └── SystemAdministrator.php │ ├── Policies/ │ │ ├── CompanyPolicy.php │ │ ├── FailedImportRowPolicy.php │ │ ├── ImportPolicy.php │ │ ├── NotePolicy.php │ │ ├── OpportunityPolicy.php │ │ ├── PeoplePolicy.php │ │ ├── SystemAdministratorPolicy.php │ │ ├── TaskPolicy.php │ │ ├── TeamPolicy.php │ │ └── UserPolicy.php │ └── SystemAdminPanelProvider.php ├── phpstan.neon ├── phpunit.ci.xml ├── phpunit.xml ├── pint.json ├── public/ │ ├── .htaccess │ ├── css/ │ │ ├── asmit/ │ │ │ └── resized-column/ │ │ │ └── resized-column.css │ │ ├── filament/ │ │ │ ├── filament/ │ │ │ │ └── app.css │ │ │ ├── forms/ │ │ │ │ └── forms.css │ │ │ └── support/ │ │ │ └── support.css │ │ └── relaticle/ │ │ ├── custom-fields/ │ │ │ └── custom-fields.css │ │ └── flowforge/ │ │ └── flowforge.css │ ├── fonts/ │ │ └── filament/ │ │ └── filament/ │ │ └── inter/ │ │ └── index.css │ ├── index.php │ ├── js/ │ │ ├── asmit/ │ │ │ └── resized-column/ │ │ │ └── resized-column.js │ │ ├── filament/ │ │ │ ├── actions/ │ │ │ │ └── actions.js │ │ │ ├── filament/ │ │ │ │ ├── app.js │ │ │ │ └── echo.js │ │ │ ├── forms/ │ │ │ │ └── components/ │ │ │ │ ├── checkbox-list.js │ │ │ │ ├── code-editor.js │ │ │ │ ├── color-picker.js │ │ │ │ ├── date-time-picker.js │ │ │ │ ├── file-upload.js │ │ │ │ ├── key-value.js │ │ │ │ ├── markdown-editor.js │ │ │ │ ├── rich-editor.js │ │ │ │ ├── select.js │ │ │ │ ├── slider.js │ │ │ │ ├── tags-input.js │ │ │ │ └── textarea.js │ │ │ ├── notifications/ │ │ │ │ └── notifications.js │ │ │ ├── schemas/ │ │ │ │ ├── components/ │ │ │ │ │ ├── actions.js │ │ │ │ │ ├── tabs.js │ │ │ │ │ └── wizard.js │ │ │ │ └── schemas.js │ │ │ ├── support/ │ │ │ │ ├── async-alpine.js │ │ │ │ └── support.js │ │ │ ├── tables/ │ │ │ │ ├── components/ │ │ │ │ │ ├── columns/ │ │ │ │ │ │ ├── checkbox.js │ │ │ │ │ │ ├── select.js │ │ │ │ │ │ ├── text-input.js │ │ │ │ │ │ └── toggle.js │ │ │ │ │ └── table.js │ │ │ │ └── tables.js │ │ │ └── widgets/ │ │ │ └── components/ │ │ │ ├── chart.js │ │ │ └── stats-overview/ │ │ │ └── stat/ │ │ │ └── chart.js │ │ └── relaticle/ │ │ └── flowforge/ │ │ ├── components/ │ │ │ └── flowforge.js │ │ └── flowforge.js │ ├── manifest.webmanifest │ ├── robots.txt │ └── site.webmanifest ├── rector.php ├── resources/ │ ├── css/ │ │ ├── app.css │ │ ├── filament/ │ │ │ ├── admin/ │ │ │ │ └── theme.css │ │ │ └── app/ │ │ │ └── theme.css │ │ ├── fonts.css │ │ └── theme.css │ ├── js/ │ │ ├── app.js │ │ └── motion.js │ ├── markdown/ │ │ ├── brand-assets.md │ │ ├── font-sources.md │ │ ├── policy.md │ │ └── terms.md │ └── views/ │ ├── api/ │ │ └── api-token-manager.blade.php │ ├── components/ │ │ ├── action-message.blade.php │ │ ├── action-section.blade.php │ │ ├── application-logo.blade.php │ │ ├── application-mark.blade.php │ │ ├── authentication-card-logo.blade.php │ │ ├── authentication-card.blade.php │ │ ├── banner.blade.php │ │ ├── brand/ │ │ │ ├── logo-lockup.blade.php │ │ │ ├── logomark.blade.php │ │ │ └── wordmark.blade.php │ │ ├── browser-sessions.blade.php │ │ ├── button.blade.php │ │ ├── checkbox.blade.php │ │ ├── confirmation-modal.blade.php │ │ ├── confirms-password.blade.php │ │ ├── danger-button.blade.php │ │ ├── dialog-modal.blade.php │ │ ├── dropdown-link.blade.php │ │ ├── dropdown.blade.php │ │ ├── form-section.blade.php │ │ ├── input-error.blade.php │ │ ├── input.blade.php │ │ ├── label.blade.php │ │ ├── layout/ │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ └── mobile-menu.blade.php │ │ ├── legal-document.blade.php │ │ ├── marketing/ │ │ │ ├── button.blade.php │ │ │ ├── input.blade.php │ │ │ └── textarea.blade.php │ │ ├── modal.blade.php │ │ ├── nav-link.blade.php │ │ ├── responsive-nav-link.blade.php │ │ ├── secondary-button.blade.php │ │ ├── section-border.blade.php │ │ ├── section-title.blade.php │ │ ├── switchable-team.blade.php │ │ ├── theme-switcher.blade.php │ │ ├── validation-errors.blade.php │ │ └── welcome.blade.php │ ├── contact.blade.php │ ├── emails/ │ │ └── team-invitation.blade.php │ ├── filament/ │ │ ├── actions/ │ │ │ └── ai-summary.blade.php │ │ ├── app/ │ │ │ ├── analytics.blade.php │ │ │ ├── import-preview-alpine.blade.php │ │ │ ├── import-value-reviewer-alpine.blade.php │ │ │ ├── logo-empty.blade.php │ │ │ └── logo.blade.php │ │ ├── auth/ │ │ │ └── social_login_buttons.blade.php │ │ ├── components/ │ │ │ └── infolists/ │ │ │ └── avatar-name.blade.php │ │ ├── pages/ │ │ │ ├── access-tokens.blade.php │ │ │ ├── create-team.blade.php │ │ │ ├── dashboard.blade.php │ │ │ ├── edit-profile.blade.php │ │ │ └── edit-team.blade.php │ │ └── tables/ │ │ └── columns/ │ │ ├── avatar-name-column.blade.php │ │ └── logo-name-column.blade.php │ ├── home/ │ │ ├── index.blade.php │ │ └── partials/ │ │ ├── community.blade.php │ │ ├── faq.blade.php │ │ ├── features.blade.php │ │ ├── hero-agent-preview.blade.php │ │ ├── hero.blade.php │ │ └── start-building.blade.php │ ├── layouts/ │ │ └── guest.blade.php │ ├── livewire/ │ │ └── app/ │ │ ├── access-tokens/ │ │ │ ├── create-access-token.blade.php │ │ │ └── manage-access-tokens.blade.php │ │ ├── profile/ │ │ │ ├── delete-account.blade.php │ │ │ ├── logout-other-browser-sessions.blade.php │ │ │ ├── update-password.blade.php │ │ │ └── update-profile-information.blade.php │ │ └── teams/ │ │ ├── add-team-member.blade.php │ │ ├── delete-team.blade.php │ │ ├── pending-team-invitations.blade.php │ │ ├── team-members.blade.php │ │ └── update-team-name.blade.php │ ├── mail/ │ │ └── new-contact-submission.blade.php │ ├── policy.blade.php │ ├── pricing.blade.php │ ├── profile/ │ │ ├── delete-user-form.blade.php │ │ ├── logout-other-browser-sessions-form.blade.php │ │ ├── two-factor-authentication-form.blade.php │ │ ├── update-password-form.blade.php │ │ └── update-profile-information-form.blade.php │ ├── teams/ │ │ ├── create-team-form.blade.php │ │ ├── delete-team-form.blade.php │ │ ├── invitation-expired.blade.php │ │ ├── team-member-manager.blade.php │ │ └── update-team-name-form.blade.php │ ├── terms.blade.php │ └── vendor/ │ ├── filament-panels/ │ │ └── components/ │ │ └── layout/ │ │ └── index.blade.php │ ├── mail/ │ │ ├── html/ │ │ │ ├── button.blade.php │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ ├── message.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── table.blade.php │ │ │ └── themes/ │ │ │ └── default.css │ │ └── text/ │ │ ├── button.blade.php │ │ ├── footer.blade.php │ │ ├── header.blade.php │ │ ├── layout.blade.php │ │ ├── message.blade.php │ │ ├── panel.blade.php │ │ ├── subcopy.blade.php │ │ └── table.blade.php │ └── scribe/ │ ├── components/ │ │ ├── badges/ │ │ │ ├── auth.blade.php │ │ │ ├── base.blade.php │ │ │ ├── deprecated.blade.php │ │ │ └── http-method.blade.php │ │ ├── field-details.blade.php │ │ └── nested-fields.blade.php │ ├── external/ │ │ ├── elements.blade.php │ │ ├── rapidoc.blade.php │ │ └── scalar.blade.php │ ├── markdown/ │ │ ├── auth.blade.php │ │ └── intro.blade.php │ ├── partials/ │ │ └── example-requests/ │ │ ├── bash.md.blade.php │ │ ├── javascript.md.blade.php │ │ ├── php.md.blade.php │ │ └── python.md.blade.php │ └── themes/ │ ├── default/ │ │ ├── endpoint.blade.php │ │ ├── groups.blade.php │ │ ├── index.blade.php │ │ └── sidebar.blade.php │ └── elements/ │ ├── components/ │ │ ├── field-details.blade.php │ │ └── nested-fields.blade.php │ ├── endpoint.blade.php │ ├── groups.blade.php │ ├── index.blade.php │ ├── sidebar.blade.php │ └── try_it_out.blade.php ├── routes/ │ ├── ai.php │ ├── api.php │ └── web.php ├── storage/ │ ├── app/ │ │ └── .gitignore │ ├── clockwork/ │ │ └── .gitignore │ ├── framework/ │ │ ├── .gitignore │ │ ├── cache/ │ │ │ └── .gitignore │ │ ├── sessions/ │ │ │ └── .gitignore │ │ ├── testing/ │ │ │ └── .gitignore │ │ └── views/ │ │ └── .gitignore │ ├── logs/ │ │ └── .gitignore │ └── pail/ │ └── .gitignore ├── stubs/ │ └── Mailcoach.stub ├── tests/ │ ├── Arch/ │ │ └── ArchTest.php │ ├── Browser/ │ │ ├── Auth/ │ │ │ ├── LoginBrowserTest.php │ │ │ └── PasswordResetBrowserTest.php │ │ ├── CRM/ │ │ │ └── CompanyBrowserTest.php │ │ ├── ImportWizard/ │ │ │ └── ImportWizardBrowserTest.php │ │ ├── Onboarding/ │ │ │ └── OnboardingBrowserTest.php │ │ ├── SmokeBrowserTest.php │ │ └── Teams/ │ │ └── TeamBrowserTest.php │ ├── Feature/ │ │ ├── AI/ │ │ │ └── RecordSummaryServiceTest.php │ │ ├── AccessTokens/ │ │ │ ├── AccessTokenPermissionsTest.php │ │ │ ├── CreateAccessTokenTest.php │ │ │ └── DeleteAccessTokenTest.php │ │ ├── Api/ │ │ │ └── V1/ │ │ │ ├── ApiMiddlewareTest.php │ │ │ ├── ApiTeamScopingTest.php │ │ │ ├── CompaniesApiTest.php │ │ │ ├── CustomFieldsApiTest.php │ │ │ ├── NotesApiTest.php │ │ │ ├── OpportunitiesApiTest.php │ │ │ ├── PeopleApiTest.php │ │ │ ├── TasksApiTest.php │ │ │ ├── TokenAbilitiesApiTest.php │ │ │ └── UserEndpointTest.php │ │ ├── Auth/ │ │ │ ├── AuthenticationTest.php │ │ │ ├── PasswordResetTest.php │ │ │ ├── RegistrationTest.php │ │ │ ├── SocialiteLoginTest.php │ │ │ ├── TwoFactorAuthenticationSettingsTest.php │ │ │ └── UserModelTest.php │ │ ├── CRM/ │ │ │ └── CompanyModelTest.php │ │ ├── Commands/ │ │ │ └── InstallCommandTest.php │ │ ├── ContactFormTest.php │ │ ├── Filament/ │ │ │ └── App/ │ │ │ ├── Exports/ │ │ │ │ ├── CompanyExporterTest.php │ │ │ │ ├── NoteExporterTest.php │ │ │ │ ├── OpportunityExporterTest.php │ │ │ │ ├── PeopleExporterTest.php │ │ │ │ └── TaskExporterTest.php │ │ │ ├── Pages/ │ │ │ │ ├── OpportunitiesBoardTest.php │ │ │ │ └── TasksBoardTest.php │ │ │ └── Resources/ │ │ │ ├── CompanyResourceTest.php │ │ │ ├── NoteResourceTest.php │ │ │ ├── OpportunityResourceTest.php │ │ │ ├── PeopleResourceTest.php │ │ │ └── TaskResourceTest.php │ │ ├── HealthChecks/ │ │ │ └── HealthServiceProviderTest.php │ │ ├── ImportWizard/ │ │ │ ├── Commands/ │ │ │ │ └── CleanupImportsCommandTest.php │ │ │ ├── Components/ │ │ │ │ ├── MultiValueInputTest.php │ │ │ │ └── SelectMenuInvalidOptionsTest.php │ │ │ ├── Jobs/ │ │ │ │ ├── ExecuteImportJobTest.php │ │ │ │ ├── ResolveMatchesJobTest.php │ │ │ │ └── ValidateColumnJobTest.php │ │ │ ├── Livewire/ │ │ │ │ ├── ImportWizardTest.php │ │ │ │ ├── MappingStepTest.php │ │ │ │ ├── PreviewStepTest.php │ │ │ │ ├── ReviewStepTest.php │ │ │ │ └── UploadStepTest.php │ │ │ ├── Support/ │ │ │ │ └── EntityLinkResolverTest.php │ │ │ └── Validation/ │ │ │ ├── ColumnValidatorTest.php │ │ │ └── EntityLinkValidatorTest.php │ │ ├── Mcp/ │ │ │ ├── CompanyToolsTest.php │ │ │ ├── CrmSummaryResourceTest.php │ │ │ ├── Filters/ │ │ │ │ ├── CustomFieldFilterTest.php │ │ │ │ └── CustomFieldSortTest.php │ │ │ ├── McpToolFeaturesTest.php │ │ │ ├── NoteToolsTest.php │ │ │ ├── OpportunityToolsTest.php │ │ │ ├── PeopleToolsTest.php │ │ │ ├── RelaticleServerTest.php │ │ │ ├── SchemaResourcesTest.php │ │ │ ├── TaskToolsTest.php │ │ │ ├── TokenAbilitiesMcpTest.php │ │ │ └── WhoAmiToolTest.php │ │ ├── Migrations/ │ │ │ └── UlidMigrationTest.php │ │ ├── Models/ │ │ │ └── Scopes/ │ │ │ └── TeamScopeTest.php │ │ ├── Onboarding/ │ │ │ └── CreateTeamOnboardingTest.php │ │ ├── PersonalAccessToken/ │ │ │ └── TeamIdImmutabilityTest.php │ │ ├── Profile/ │ │ │ ├── AvatarServiceTest.php │ │ │ ├── BrowserSessionsTest.php │ │ │ ├── DeleteAccountTest.php │ │ │ ├── GitHubServiceTest.php │ │ │ ├── UpdatePasswordTest.php │ │ │ └── UpdateUserProfileInformationTest.php │ │ ├── Public/ │ │ │ └── PublicPagesTest.php │ │ ├── Routing/ │ │ │ ├── AppPanelRoutingTest.php │ │ │ └── SubdomainRoutingTest.php │ │ ├── SystemAdmin/ │ │ │ ├── ActivationRateWidgetTest.php │ │ │ ├── SystemAdminResourceTest.php │ │ │ ├── SystemAdminSecurityTest.php │ │ │ └── UserRetentionChartWidgetTest.php │ │ ├── Teams/ │ │ │ ├── AcceptTeamInvitationTest.php │ │ │ ├── CreateTeamTest.php │ │ │ ├── DeleteTeamTest.php │ │ │ ├── InvitationUxTest.php │ │ │ ├── InviteTeamMemberTest.php │ │ │ ├── LeaveTeamTest.php │ │ │ ├── ManageTeamInvitationsTest.php │ │ │ ├── RemoveTeamMemberTest.php │ │ │ ├── TeamModelTest.php │ │ │ ├── UpdateTeamMemberRoleTest.php │ │ │ └── UpdateTeamNameTest.php │ │ └── ValidTeamSlugTest.php │ ├── Pest.php │ ├── Smoke/ │ │ └── RouteTest.php │ ├── TestCase.php │ └── fixtures/ │ └── imports/ │ ├── companies.csv │ ├── companies.xlsx │ └── people.xlsx └── vite.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ # Git .git .gitignore .gitattributes .githooks # IDE .idea .vscode *.swp *.swo # Dependencies (will be installed during build) /vendor /node_modules # Build artifacts /public/build /public/hot /public/storage # Local environment files .env .env.local .env.*.local .env.backup # Testing .env.testing .env.ci /coverage /.phpunit.cache /phpunit.xml /phpunit.ci.xml /tests # Development tools .editorconfig .styleci.yml compose.dev.yml Makefile # Documentation *.md !README.md CLAUDE.md # Cache and logs /storage/app/* !/storage/app/.gitignore !/storage/app/public /storage/framework/cache/* !/storage/framework/cache/.gitignore /storage/framework/sessions/* !/storage/framework/sessions/.gitignore /storage/framework/views/* !/storage/framework/views/.gitignore /storage/logs/* !/storage/logs/.gitignore /storage/clockwork /storage/pail # Laravel specific /bootstrap/cache/*.php # Other *.log npm-debug.log* yarn-debug.log* yarn-error.log* .DS_Store Thumbs.db ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 end_of_line = lf indent_size = 4 indent_style = space insert_final_newline = true trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false [*.{yml,yaml}] indent_size = 2 [compose.{yml,dev.yml}] indent_size = 4 ================================================ FILE: .gitattributes ================================================ * text=auto eol=lf *.blade.php diff=html *.css diff=css *.html diff=html *.md diff=markdown *.php diff=php /.github export-ignore CHANGELOG.md export-ignore .styleci.yml export-ignore ================================================ FILE: .githooks/pre-commit ================================================ #!/bin/sh composer lint composer test ================================================ FILE: .github/ISSUE_TEMPLATE/1-bug_report.yml ================================================ name: Bug report description: Report a problem you're experiencing with Relaticle labels: ["bug", "unconfirmed"] projects: ["Relaticle/1"] body: - type: markdown attributes: value: | Before opening a bug report, please search the existing issues (both open and closed). --- Thank you for taking the time to file a bug report. To address this bug as fast as possible, we need some information. - type: input id: relaticle-version attributes: label: Relaticle Version description: What version of Relaticle are you running? placeholder: v2.0.8 validations: required: true - type: input id: php-version attributes: label: PHP Version description: What PHP version are you using? placeholder: 8.4.16 validations: required: true - type: dropdown id: database attributes: label: Database description: Which database are you using? options: - PostgreSQL 17+ - Other validations: required: true - type: dropdown id: deployment attributes: label: Deployment Method description: How are you running Relaticle? options: - Laravel Herd (local) - Docker (compose.yml) - Manual installation - Other - type: textarea id: description attributes: label: Problem description description: What happened when you experienced the problem? validations: required: true - type: textarea id: expectation attributes: label: Expected behavior description: What did you expect to happen instead? validations: required: true - type: textarea id: steps attributes: label: Steps to reproduce description: | Which steps do we need to take to reproduce the problem? Any code examples need to be **as short as possible**, remove any code that is unrelated to the bug. placeholder: | 1. Go to '...' 2. Click on '...' 3. Scroll down to '...' 4. See error validations: required: true - type: textarea id: logs attributes: label: Relevant log output description: If applicable, provide relevant log output from `storage/logs/laravel.log` or browser console. No need for backticks here. render: shell - type: checkboxes id: terms attributes: label: Code of Conduct description: By submitting this issue, you agree to follow our Code of Conduct options: - label: I agree to follow this project's Code of Conduct required: true ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Feature request or idea url: https://github.com/Relaticle/relaticle/discussions/new?category=ideas about: Share ideas for new features or improvements - name: Support question url: https://github.com/Relaticle/relaticle/discussions/new?category=q-a about: Ask the community for help - name: Discord Community url: https://discord.gg/jSfdU9zxTt about: Join our Discord server for quick help and community chat ================================================ FILE: .github/copilot-instructions.md ================================================ # Relaticle Code Review Guidelines ## Repository Context Multi-tenant SaaS CRM with paying customers. Tenant isolation is the highest-priority concern — a single cross-tenant data leak is a critical security incident. The app uses Filament panels with a per-request `TeamScope` global scope applied via middleware, not in model boot. `Model::unguard()` is enabled globally. Stack: PHP 8.4, Laravel 12, Filament 5, Livewire 4, Pest 4, Tailwind CSS 4. CI enforces: PHPStan level 7, Pint formatting, Rector, 99.9% type coverage, full test suite. CI does **not** enforce: code coverage percentage, mutation testing, or required reviewer count. ## Tenant Isolation — Flag These This app scopes data via `ApplyTenantScopes` middleware which registers `TeamScope` on: Company, People, Opportunity, Task, Note. Scoping happens per-request inside the Filament panel. Code running outside that middleware context (jobs, commands, API routes) has no automatic tenant filter. Flag any of these patterns: - `DB::table()` or `DB::select()` on a team-scoped table without a `WHERE team_id` clause - `withoutGlobalScopes()` that removes all scopes instead of only `SoftDeletingScope` - New Eloquent model on a team-scoped table missing the `HasTeam` trait - New model with `HasTeam` not added to `ApplyTenantScopes` middleware - New routes, Livewire components, or jobs that query team-scoped models without ensuring tenant context - Queries using `->toBase()` which strips all Eloquent scopes ```php // Correct: only strips soft delete scope, TeamScope remains active return parent::getEloquentQuery() ->withoutGlobalScopes([SoftDeletingScope::class]); // Dangerous: strips ALL scopes including TeamScope return parent::getEloquentQuery() ->withoutGlobalScopes(); ``` ## Authorization — Flag These Policies exist for Company, People, Opportunity, Task, Note. They check `$user->belongsToTeam($record->team)`. - New controller action or Livewire method without `$this->authorize()` or policy check - New Filament resource without a corresponding policy - Livewire actions that modify records without verifying the record belongs to the current team - Mass assignment from user-supplied request data — `Model::unguard()` is global, so `$fillable` is the only guard ```php // Correct: authorize before acting public function delete(string $id): void { $record = Company::findOrFail($id); $this->authorize('delete', $record); $record->delete(); } // Dangerous: no authorization, any authenticated user can delete any record public function delete(string $id): void { Company::findOrFail($id)->delete(); } ``` ## Data Safety — Flag These - Raw SQL with interpolated variables instead of parameter bindings (`?`) - `DB::table()->upsert()` or `DB::table()->insert()` on team-scoped tables without a `team_id` in the data payload - Export logic that doesn't filter data rows by `team_id` - New public routes without auth middleware - File uploads without MIME type and size validation - `env()` calls outside of `config/` files ```php // Correct: parameterized binding DB::select('SELECT * FROM companies WHERE team_id = ?', [$teamId]); // Dangerous: interpolated variable in SQL DB::select("SELECT * FROM companies WHERE team_id = {$teamId}"); ``` ## Test Coverage — Flag These New features or modified behavior should include corresponding Pest tests. There is no coverage gate in CI, so this must be caught in review. - New Filament resource, Livewire component, or controller action without tests - Modified business logic without updated tests - Tests that only check the happy path — also cover validation failures and authorization denials - Tests that create records without scoping to a specific team (relying on implicit scope rather than explicit `->for($team)`) ## PHP Standards - Every file: `declare(strict_types=1);` - Typed properties, explicit return types (including `void`), parameter type hints - Constructor property promotion: `public function __construct(private UserService $service) {}` - No empty zero-parameter constructors - Short nullable: `?string` not `string|null` - Always use curly braces, even single-line bodies - PHPDoc over inline comments; only comment genuinely complex logic - Enum keys: TitleCase (`FavoritePerson`, `Monthly`) ## Code Style - Happy path last — handle errors first, return early - Avoid `else` — use early returns - String interpolation over concatenation - Descriptive names: `$failedChecks` not `$checks` with a comment ## Laravel Conventions - `Model::query()` not `DB::` for team-scoped data - Eager load relationships to prevent N+1 - Form Request classes for validation, not inline - `config()` not `env()` outside config files - Named routes with `route()` - Policies and gates for authorization - Queued jobs with `ShouldQueue` for expensive operations - `casts()` method, not `$casts` property - Middleware in `bootstrap/app.php`, not a Kernel class - **PostgreSQL exclusively** — no SQLite/MySQL compatibility layers, driver checks, or conditional SQL - Migrations: only `up()` methods — no `down()` methods ## Filament 5 - Form fields: `Filament\Forms\Components\` - Layout (Grid, Section, Tabs): `Filament\Schemas\Components\` - Infolist entries: `Filament\Infolists\Components\` - Utilities (Get, Set): `Filament\Schemas\Components\Utilities\` - All actions: `Filament\Actions\` — no `Filament\Tables\Actions\` - Icons: `Heroicon` enum, not strings - File visibility: `private` by default - `Grid`, `Section`, `Fieldset` no longer span all columns by default - `deferFilters()` is now the default table behavior ## Livewire 4 - `wire:model` is deferred by default; `wire:model.live` for real-time - Namespace: `App\Livewire` - Events: `$this->dispatch()` - Validate and authorize in actions - `wire:key` in loops ## Testing - All tests use Pest with factories and factory states - `mutates(ClassName::class)` to declare coverage intent - Named assertions: `assertForbidden()` not `assertStatus(403)` - Datasets for repetitive validation tests ## Tailwind CSS 4 - No deprecated utilities: `bg-opacity-*` is `bg-black/*`, `flex-shrink-*` is `shrink-*` - Gap utilities for spacing, not margins between siblings - `dark:` variants when existing components support dark mode - CSS-first config with `@theme`, not `tailwind.config.js` ================================================ FILE: .github/workflows/docker-publish.yml ================================================ name: Build and Push Docker Image on: push: branches: [main] tags: ['v*'] pull_request: branches: [main] env: REGISTRY: ghcr.io DOCKERHUB_IMAGE: manukminasyan/relaticle jobs: build: runs-on: ${{ matrix.runner }} permissions: contents: read packages: write strategy: fail-fast: false matrix: include: - platform: linux/amd64 runner: ubuntu-latest - platform: linux/arm64 runner: ubuntu-24.04-arm steps: - name: Prepare run: | platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Checkout repository uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Log in to Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} ${{ env.DOCKERHUB_IMAGE }} tags: | type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha,prefix= type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} - name: Build and push by digest id: build uses: docker/build-push-action@v6 with: context: . target: production platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} ${{ env.DOCKERHUB_IMAGE }} cache-from: type=gha,scope=${{ matrix.platform }} cache-to: type=gha,mode=max,scope=${{ matrix.platform }} outputs: ${{ github.event_name != 'pull_request' && 'type=image,push-by-digest=true,name-canonical=true,push=true' || '' }} - name: Export digest if: github.event_name != 'pull_request' run: | mkdir -p ${{ runner.temp }}/digests digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest if: github.event_name != 'pull_request' uses: actions/upload-artifact@v4 with: name: digests-${{ env.PLATFORM_PAIR }} path: ${{ runner.temp }}/digests/* if-no-files-found: error retention-days: 1 merge: runs-on: ubuntu-latest if: github.event_name != 'pull_request' needs: build permissions: contents: read packages: write steps: - name: Prepare run: echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - name: Download digests uses: actions/download-artifact@v4 with: path: ${{ runner.temp }}/digests pattern: digests-* merge-multiple: true - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Extract metadata for GHCR id: meta-ghcr uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha,prefix= type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} - name: Extract metadata for Docker Hub id: meta-dockerhub uses: docker/metadata-action@v5 with: images: ${{ env.DOCKERHUB_IMAGE }} tags: | type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha,prefix= type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} - name: Create manifest list and push to GHCR working-directory: ${{ runner.temp }}/digests env: DOCKER_METADATA_OUTPUT_JSON: ${{ steps.meta-ghcr.outputs.json }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) - name: Create manifest list and push to Docker Hub working-directory: ${{ runner.temp }}/digests env: DOCKER_METADATA_OUTPUT_JSON: ${{ steps.meta-dockerhub.outputs.json }} run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.DOCKERHUB_IMAGE }}@sha256:%s ' *) - name: Inspect GHCR image run: | docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta-ghcr.outputs.version }} - name: Inspect Docker Hub image run: | docker buildx imagetools inspect ${{ env.DOCKERHUB_IMAGE }}:${{ steps.meta-dockerhub.outputs.version }} ================================================ FILE: .github/workflows/filament-view-monitor-simple.yml ================================================ name: Monitor Filament View Updates (Simple) on: schedule: # Run daily at 9 AM UTC - cron: '0 9 * * *' workflow_dispatch: # Allow manual trigger jobs: check-filament-updates: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.4' coverage: none - name: Install dependencies run: composer install --no-interaction --no-progress - name: Check for Filament view changes id: check run: | # Define the files we're monitoring FILES=( "vendor/filament/filament/resources/views/components/layout/index.blade.php" "vendor/filament/filament/resources/views/livewire/topbar.blade.php" ) # Calculate hash of current files CURRENT_HASH="" for FILE in "${FILES[@]}"; do if [ -f "$FILE" ]; then CURRENT_HASH="${CURRENT_HASH}$(sha256sum "$FILE" | cut -d' ' -f1)" fi done # Hash the combined hashes FINAL_HASH=$(echo -n "$CURRENT_HASH" | sha256sum | cut -d' ' -f1) echo "Current hash: $FINAL_HASH" # Compare with stored hash HASH_FILE=".github/filament-views-hash.txt" if [ -f "$HASH_FILE" ]; then STORED_HASH=$(cat "$HASH_FILE") echo "Stored hash: $STORED_HASH" if [ "$FINAL_HASH" != "$STORED_HASH" ]; then echo "changes_detected=true" >> $GITHUB_OUTPUT echo "🔔 Filament views have changed!" # Update the hash file echo "$FINAL_HASH" > "$HASH_FILE" else echo "changes_detected=false" >> $GITHUB_OUTPUT echo "✅ No changes detected" fi else # First run - save the hash echo "$FINAL_HASH" > "$HASH_FILE" echo "changes_detected=false" >> $GITHUB_OUTPUT echo "📝 Initial hash saved" fi - name: Get Filament version id: version if: steps.check.outputs.changes_detected == 'true' run: | VERSION=$(composer show filament/filament | grep "versions" | cut -d':' -f2 | xargs) echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Create issue notification if: steps.check.outputs.changes_detected == 'true' uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const today = new Date().toISOString().split('T')[0]; await github.rest.issues.create({ owner: context.repo.owner, repo: context.repo.repo, title: `🔔 Filament Views Updated - ${today}`, body: `## Filament view files have been updated! **Filament Version:** ${{ steps.version.outputs.version }} **Date:** ${today} The following Filament view files that you've published have been updated in the package: - \`components/layout/index.blade.php\` - \`livewire/topbar.blade.php\` ### What to do: 1. Check the [Filament changelog](https://github.com/filamentphp/filament/releases) 2. Review what changed in the views 3. Decide if you need to update your published versions ### How to review changes: \`\`\`bash # Compare your published views with the vendor versions diff -u resources/views/vendor/filament-panels/components/layout/index.blade.php \\ vendor/filament/filament/resources/views/components/layout/index.blade.php diff -u resources/views/vendor/filament-panels/livewire/topbar.blade.php \\ vendor/filament/filament/resources/views/livewire/topbar.blade.php \`\`\``, labels: ['filament-update', 'vendor-views'] }); console.log('✅ Issue created for Filament view updates'); - name: Commit hash update if: steps.check.outputs.changes_detected == 'true' run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git add .github/filament-views-hash.txt git diff --staged --quiet || git commit -m "Update Filament views hash [skip ci]" git push ================================================ FILE: .github/workflows/tests.yml ================================================ name: Tests on: [push] jobs: lint-and-static-analysis: runs-on: ubuntu-latest name: Code Quality Checks steps: - name: Checkout uses: actions/checkout@v5 - name: Cache Dependencies uses: actions/cache@v4 with: path: | ~/.composer/cache vendor key: ${{ runner.os }}-php-8.4-composer-${{ hashFiles('composer.lock') }} restore-keys: | ${{ runner.os }}-php-8.4-composer- - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: 8.4 extensions: json, dom, curl, libxml, mbstring, zip tools: composer:v2 - name: Install PHP dependencies run: composer install --no-interaction --no-progress --ansi --prefer-dist --optimize-autoloader - name: Prepare Laravel Application run: | cp .env.ci .env php artisan key:generate - name: Run Lint run: composer test:lint - name: Run Refactor Check run: composer test:refactor - name: Run Type Coverage run: composer test:type-coverage - name: Run Static Analysis run: composer test:types - name: Architecture Tests run: composer test:arch tests: runs-on: ubuntu-latest strategy: fail-fast: false matrix: php: [8.4] shard: [1, 2, 3, 4, 5] name: Tests (Shard ${{ matrix.shard }}/5) services: postgres: image: postgres:alpine env: POSTGRES_DB: relaticle_testing POSTGRES_PASSWORD: postgres POSTGRES_PORT: 5432 POSTGRES_USER: postgres options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout uses: actions/checkout@v5 - name: Cache Dependencies uses: actions/cache@v4 with: path: | ~/.composer/cache vendor key: ${{ runner.os }}-php-8.4-composer-${{ hashFiles('composer.lock') }} restore-keys: | ${{ runner.os }}-php-8.4-composer- - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: json, dom, curl, libxml, mbstring, zip tools: composer:v2 coverage: none - name: Set up Node & NPM uses: actions/setup-node@v5 with: node-version: '22.x' - name: Setup Problem Matches run: | echo "::add-matcher::${{ runner.tool_cache }}/php.json" echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - name: Install PHP dependencies run: composer install --no-interaction --no-progress --ansi --prefer-dist --optimize-autoloader - name: Get NPM cache directory id: npm-cache-dir shell: bash run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} - name: Cache dependencies id: npm-cache uses: actions/cache@v4 with: path: ${{ steps.npm-cache-dir.outputs.dir }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm ci - name: Build dependencies run: npm run build - name: Prepare Laravel run: | cp .env.ci .env php artisan key:generate - name: Tests run: composer test:pest:ci env: SHARD: ${{ matrix.shard }}/5 browser-tests: runs-on: ubuntu-latest name: Browser Tests services: postgres: image: postgres:alpine env: POSTGRES_DB: relaticle_testing POSTGRES_PASSWORD: postgres POSTGRES_PORT: 5432 POSTGRES_USER: postgres options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout uses: actions/checkout@v5 - name: Cache Dependencies uses: actions/cache@v4 with: path: | ~/.composer/cache vendor key: ${{ runner.os }}-php-8.4-composer-${{ hashFiles('composer.lock') }} restore-keys: | ${{ runner.os }}-php-8.4-composer- - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: 8.4 extensions: json, dom, curl, libxml, mbstring, zip tools: composer:v2 coverage: none - name: Set up Node & NPM uses: actions/setup-node@v5 with: node-version: '22.x' - name: Install PHP dependencies run: composer install --no-interaction --no-progress --ansi --prefer-dist --optimize-autoloader - name: Get NPM cache directory id: npm-cache-dir shell: bash run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} - name: Cache NPM dependencies uses: actions/cache@v4 with: path: ${{ steps.npm-cache-dir.outputs.dir }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Prepare Laravel run: | cp .env.ci .env php artisan key:generate - name: Install NPM dependencies run: npm ci - name: Build assets run: npm run build - name: Install Playwright run: npx playwright install --with-deps chromium - name: Browser Tests run: vendor/bin/pest tests/Browser/ --configuration phpunit.ci.xml ================================================ FILE: .gitignore ================================================ .DS_Store .superpowers /.phpunit.cache .scribe /node_modules /public/build /public/hot /public/storage /public/sitemap.xml /storage/*.key /vendor .env .env.backup .env.production .phpactor.json .phpunit.result.cache /coverage-html/ coverage.xml Homestead.json Homestead.yaml auth.json npm-debug.log yarn-error.log AGENTS.md boost.json .mcp.json /.ai/* !/.ai/guidelines/ /.ai/guidelines/* !/.ai/guidelines/relaticle/ /.github/skills /.fleet /.idea /.vscode /.claude /.superset /.cursor /.junie /.playwright-mcp /docs api.json .scribe/ /public/vendor/scribe /resources/views/scribe /storage/app/scribe /tests/Feature/Scribe .context polyscope.json /bin/setup-preview.sh .gstack/ ================================================ FILE: CLAUDE.md ================================================ === .ai/core rules === # Project This is production code for a commercial SaaS product with paying customers. Bugs directly impact revenue and user trust. Treat every change like it's going through senior code review: - No lazy shortcuts or placeholder code - Handle errors and edge cases properly - Write code that won't embarrass you in 6 months ## Database - This project uses **PostgreSQL exclusively** — do not add SQLite/MySQL compatibility layers, driver checks, or conditional SQL - Migrations must only have `up()` methods — do not write `down()` methods ## Pre-Commit Quality Checks Before committing any changes, always run these checks in order: 1. `vendor/bin/pint --dirty --format agent` — fix code style 2. `vendor/bin/rector --dry-run` — if rector suggests changes, apply them with `vendor/bin/rector` 3. `vendor/bin/phpstan analyse` — ensure no new static analysis errors 4. `composer test:type-coverage` — ensure type coverage stays at or above 99.9% 5. `php artisan test --compact` — run relevant tests (use `--filter` for targeted runs) Do not add new PHPStan errors to the baseline without approval. All parameters and return types must be explicitly typed — untyped closures/parameters will fail type coverage in CI. ## Icons (Remix Icon) - **Brand/social icons** (GitHub, Discord, Twitter, LinkedIn) → always `fill` variant - **UI/functional icons** (arrows, chevrons, checks, close) → always `line` variant - **Feature/section icons** → `line` variant, stay consistent within a section - **Status/emphasis icons** (success checkmarks, alerts) → `fill` variant ## Scheduling - All scheduled commands go in `bootstrap/app.php` via `withSchedule()` — not in `routes/console.php` ## Actions - All write operations (create, update, delete) must go through action classes in `app/Actions/` -- never inline business logic in controllers, MCP tools, Livewire components, or Filament resources - Actions are the single source of truth for business logic and side effects (notifications, syncs, etc.) - Filament CRUD may use native `CreateAction`/`EditAction` when the action only does `Model::create()`/`->update()` with no extra logic -- but side effects (e.g., notifications) must still be triggered via `->after()` hooks calling the appropriate action - When reviewing or refactoring code, extract inline business logic into action classes ## Testing - Do not write isolated unit tests for action classes, services, or similar internal code -- test them through their real entry points (API endpoints, Filament resources, Livewire components). Unit tests for internal classes create maintenance burden without catching real bugs. - Use `mutates(ClassName::class)` in test files to declare which source classes each test covers - Run mutation testing per-class: `php -d xdebug.mode=coverage vendor/bin/pest --mutate --class='App\MyClass' tests/path/` - No enforced `--min` threshold — use mutation testing as a code review tool, not a CI gate - Use `$this->travelTo()` in tests that depend on day-of-week or weekly intervals to avoid flaky boundary failures ## Custom Fields - Models using the `UsesCustomFields` trait handle `custom_fields` automatically — do NOT manually extract, strip, or call `saveCustomFields()` in actions - The trait merges `'custom_fields'` into `$fillable`, intercepts it during `saving`, and persists values during `saved` — just pass `custom_fields` through in the `$data` array to `create()`/`update()` - Tenant context for the custom-fields package is set in `SetApiTeamContext` middleware via `TenantContextService::setTenantId()` — actions don't need `withTenant()` wrappers - In Filament, the package's own `SetTenantContextMiddleware` handles tenant context — no action-level code needed there either - `CustomFieldValidationService` intentionally uses explicit `where('tenant_id', ...)` with `withoutGlobalScopes()` — this is defensive and correct, don't change it to rely on ambient state === .ai/v4 rules === ## Filament 4 ### Important Version 4 Changes - File visibility is now `private` by default. - The `deferFilters` method from Filament v3 is now the default behavior in Filament v4, so users must click a button before the filters are applied to the table. To disable this behavior, you can use the `deferFilters(false)` method. - The `Grid`, `Section`, and `Fieldset` layout components no longer span all columns by default. - The `all` pagination page method is not available for tables by default. - All action classes extend `Filament\Actions\Action`. No action classes exist in `Filament\Tables\Actions`. - The `Form` & `Infolist` layout components have been moved to `Filament\Schemas\Components`, for example `Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc. - A new `Repeater` component for Forms has been added. - Icons now use the `Filament\Support\Icons\Heroicon` Enum by default. Other options are available and documented. ### Organize Component Classes Structure - Schema components: `Schemas/Components/` - Table columns: `Tables/Columns/` - Table filters: `Tables/Filters/` - Actions: `Actions/` ### Form Components in v4 - Use `Filament\Forms\Components` for form fields like TextInput, Select, Textarea, etc. - Use `Filament\Schemas\Components` for layout components like Grid, Section, Fieldset, Tabs, Wizard. ### Actions in v4 ```php use Filament\Actions\Action; Action::make('send') ->label('Send Email') ->icon(Heroicon::OutlinedPaperAirplane) ->requiresConfirmation() ->action(fn (Model $record) => $record->sendEmail()); ``` ### Table Actions in v4 ```php use Filament\Actions\Action; use Filament\Actions\DeleteAction; use Filament\Actions\EditAction; public static function table(Table $table): Table { return $table ->actions([ EditAction::make(), DeleteAction::make(), Action::make('approve') ->action(fn (Model $record) => $record->approve()), ]); } ``` ### Icons in v4 ```php use Filament\Support\Icons\Heroicon; // Instead of string icons ->icon(Heroicon::OutlinedHome) ->icon(Heroicon::SolidUser) ``` ### Testing Filament 4 Resources ```php use function Pest\Livewire\livewire; it('can list records', function () { $records = Model::factory()->count(5)->create(); livewire(ListModels::class) ->assertCanSeeTableRecords($records); }); it('can create a record', function () { livewire(CreateModel::class) ->fillForm([ 'name' => 'Test Name', ]) ->call('create') ->assertHasNoFormErrors(); expect(Model::query()->where('name', 'Test Name')->exists())->toBeTrue(); }); it('can edit a record', function () { $record = Model::factory()->create(); livewire(EditModel::class, ['record' => $record->getRouteKey()]) ->fillForm([ 'name' => 'Updated Name', ]) ->call('save') ->assertHasNoFormErrors(); expect($record->refresh()->name)->toBe('Updated Name'); }); ``` === foundation rules === # Laravel Boost Guidelines The Laravel Boost guidelines are specifically curated by Laravel maintainers for this application. These guidelines should be followed closely to ensure the best experience when building Laravel applications. ## Foundational Context This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions. - php - 8.4 - filament/filament (FILAMENT) - v5 - laravel/fortify (FORTIFY) - v1 - laravel/framework (LARAVEL) - v12 - laravel/horizon (HORIZON) - v5 - laravel/mcp (MCP) - v0 - laravel/prompts (PROMPTS) - v0 - laravel/sanctum (SANCTUM) - v4 - laravel/socialite (SOCIALITE) - v5 - livewire/livewire (LIVEWIRE) - v4 - larastan/larastan (LARASTAN) - v3 - laravel/boost (BOOST) - v2 - laravel/pail (PAIL) - v1 - laravel/pint (PINT) - v1 - laravel/sail (SAIL) - v1 - pestphp/pest (PEST) - v4 - phpunit/phpunit (PHPUNIT) - v12 - rector/rector (RECTOR) - v2 - tailwindcss (TAILWINDCSS) - v4 ## Skills Activation This project has domain-specific skills available. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. - `laravel-best-practices` — Apply this skill whenever writing, reviewing, or refactoring Laravel PHP code. This includes creating or modifying controllers, models, migrations, form requests, policies, jobs, scheduled commands, service classes, and Eloquent queries. Triggers for N+1 and query performance issues, caching strategies, authorization and security patterns, validation, error handling, queue and job configuration, route definitions, and architectural decisions. Also use for Laravel code reviews and refactoring existing Laravel code to follow best practices. Covers any task involving Laravel backend PHP code patterns. - `configuring-horizon` — Use this skill whenever the user mentions Horizon by name in a Laravel context. Covers the full Horizon lifecycle: installing Horizon (horizon:install, Sail setup), configuring config/horizon.php (supervisor blocks, queue assignments, balancing strategies, minProcesses/maxProcesses), fixing the dashboard (authorization via Gate::define viewHorizon, blank metrics, horizon:snapshot scheduling), and troubleshooting production issues (worker crashes, timeout chain ordering, LongWaitDetected notifications, waits config). Also covers job tagging and silencing. Do not use for generic Laravel queues without Horizon, SQS or database drivers, standalone Redis setup, Linux supervisord, Telescope, or job batching. - `mcp-development` — Use this skill for Laravel MCP development only. Trigger when creating or editing MCP tools, resources, prompts, or servers in Laravel projects. Covers: artisan make:mcp-* generators, mcp:inspector, routes/ai.php, Tool/Resource/Prompt classes, schema validation, shouldRegister(), OAuth setup, URI templates, read-only attributes, and MCP debugging. Do not use for non-Laravel MCP projects or generic AI features without MCP. - `socialite-development` — Manages OAuth social authentication with Laravel Socialite. Activate when adding social login providers; configuring OAuth redirect/callback flows; retrieving authenticated user details; customizing scopes or parameters; setting up community providers; testing with Socialite fakes; or when the user mentions social login, OAuth, Socialite, or third-party authentication. - `livewire-development` — Use for any task or question involving Livewire. Activate if user mentions Livewire, wire: directives, or Livewire-specific concepts like wire:model, wire:click, wire:sort, or islands, invoke this skill. Covers building new components, debugging reactivity issues, real-time form validation, drag-and-drop, loading states, migrating from Livewire 3 to 4, converting component formats (SFC/MFC/class-based), and performance optimization. Do not use for non-Livewire reactive UI (React, Vue, Alpine-only, Inertia.js) or standard Laravel forms without Livewire. - `pest-testing` — Use this skill for Pest PHP testing in Laravel projects only. Trigger whenever any test is being written, edited, fixed, or refactored — including fixing tests that broke after a code change, adding assertions, converting PHPUnit to Pest, adding datasets, and TDD workflows. Always activate when the user asks how to write something in Pest, mentions test files or directories (tests/Feature, tests/Unit, tests/Browser), or needs browser testing, smoke testing multiple pages for JS errors, or architecture tests. Covers: it()/expect() syntax, datasets, mocking, browser testing (visit/click/fill), smoke testing, arch(), Livewire component tests, RefreshDatabase, and all Pest 4 features. Do not use for factories, seeders, migrations, controllers, models, or non-test PHP code. - `tailwindcss-development` — Always invoke when the user's message includes 'tailwind' in any form. Also invoke for: building responsive grid layouts (multi-column card grids, product grids), flex/grid page structures (dashboards with sidebars, fixed topbars, mobile-toggle navs), styling UI components (cards, tables, navbars, pricing sections, forms, inputs, badges), adding dark mode variants, fixing spacing or typography, and Tailwind v3/v4 work. The core use case: writing or fixing Tailwind utility classes in HTML templates (Blade, JSX, Vue). Skip for backend PHP logic, database queries, API routes, JavaScript with no HTML/CSS component, CSS file audits, build tool configuration, and vanilla CSS. - `custom-fields-development` — Adds dynamic custom fields to Eloquent models without migrations using Filament integration. Use when adding the UsesCustomFields trait to models, integrating custom fields in Filament forms/tables/infolists, configuring field types, working with field validation, or managing feature flags for conditional visibility, encryption, and multi-tenancy. - `flowforge-development` — Builds Kanban board interfaces for Eloquent models with drag-and-drop functionality. Use when creating board pages, configuring columns and cards, implementing drag-and-drop positioning, working with Filament board pages or standalone Livewire boards, or troubleshooting position-related issues. - `laravel-query-builder` — Build filtered, sorted, and included API endpoints using spatie/laravel-query-builder. Activates when working with QueryBuilder, AllowedFilter, AllowedSort, AllowedInclude, or when the user mentions query parameters, API filtering, sorting, includes, or spatie/laravel-query-builder. - `spatie-laravel-php-standards` — Apply Spatie's Laravel and PHP coding standards for any task that creates, edits, reviews, refactors, or formats Laravel/PHP code or Blade templates; use for controllers, Eloquent models, routes, config, validation, migrations, tests, and related files to align with Laravel conventions and PSR-12. ## Conventions - You must follow all existing code conventions used in this application. When creating or editing a file, check sibling files for the correct structure, approach, and naming. - Use descriptive names for variables and methods. For example, `isRegisteredForDiscounts`, not `discount()`. - Check for existing components to reuse before writing a new one. ## Verification Scripts - Do not create verification scripts or tinker when tests cover that functionality and prove they work. Unit and feature tests are more important. ## Application Structure & Architecture - Stick to existing directory structure; don't create new base folders without approval. - Do not change the application's dependencies without approval. ## Frontend Bundling - If the user doesn't see a frontend change reflected in the UI, it could mean they need to run `npm run build`, `npm run dev`, or `composer run dev`. Ask them. ## Documentation Files - You must only create documentation files if explicitly requested by the user. ## Replies - Be concise in your explanations - focus on what's important rather than explaining obvious details. === boost rules === # Laravel Boost ## Tools - Laravel Boost is an MCP server with tools designed specifically for this application. Prefer Boost tools over manual alternatives like shell commands or file reads. - Use `database-query` to run read-only queries against the database instead of writing raw SQL in tinker. - Use `database-schema` to inspect table structure before writing migrations or models. - Use `get-absolute-url` to resolve the correct scheme, domain, and port for project URLs. Always use this before sharing a URL with the user. - Use `browser-logs` to read browser logs, errors, and exceptions. Only recent logs are useful, ignore old entries. ## Searching Documentation (IMPORTANT) - Always use `search-docs` before making code changes. Do not skip this step. It returns version-specific docs based on installed packages automatically. - Pass a `packages` array to scope results when you know which packages are relevant. - Use multiple broad, topic-based queries: `['rate limiting', 'routing rate limiting', 'routing']`. Expect the most relevant results first. - Do not add package names to queries because package info is already shared. Use `test resource table`, not `filament 4 test resource table`. ### Search Syntax 1. Use words for auto-stemmed AND logic: `rate limit` matches both "rate" AND "limit". 2. Use `"quoted phrases"` for exact position matching: `"infinite scroll"` requires adjacent words in order. 3. Combine words and phrases for mixed queries: `middleware "rate limit"`. 4. Use multiple queries for OR logic: `queries=["authentication", "middleware"]`. ## Artisan - Run Artisan commands directly via the command line (e.g., `php artisan route:list`). Use `php artisan list` to discover available commands and `php artisan [command] --help` to check parameters. - Inspect routes with `php artisan route:list`. Filter with: `--method=GET`, `--name=users`, `--path=api`, `--except-vendor`, `--only-vendor`. - Read configuration values using dot notation: `php artisan config:show app.name`, `php artisan config:show database.default`. Or read config files directly from the `config/` directory. - To check environment variables, read the `.env` file directly. ## Tinker - Execute PHP in app context for debugging and testing code. Do not create models without user approval, prefer tests with factories instead. Prefer existing Artisan commands over custom tinker code. - Always use single quotes to prevent shell expansion: `php artisan tinker --execute 'Your::code();'` - Double quotes for PHP strings inside: `php artisan tinker --execute 'User::where("active", true)->count();'` === php rules === # PHP - Always declare `declare(strict_types=1);` at the top of every `.php` file. - Always use curly braces for control structures, even for single-line bodies. - Use PHP 8 constructor property promotion: `public function __construct(public GitHub $github) { }`. Do not leave empty zero-parameter `__construct()` methods unless the constructor is private. - Use explicit return type declarations and type hints for all method parameters: `function isAccessible(User $user, ?string $path = null): bool` - Use TitleCase for Enum keys: `FavoritePerson`, `BestLake`, `Monthly`. - Prefer PHPDoc blocks over inline comments. Only add inline comments for exceptionally complex logic. - Use array shape type definitions in PHPDoc blocks. === herd rules === # Laravel Herd - The application is served by Laravel Herd at `https?://[kebab-case-project-dir].test`. Use the `get-absolute-url` tool to generate valid URLs. Never run commands to serve the site. It is always available. - Use the `herd` CLI to manage services, PHP versions, and sites (e.g. `herd sites`, `herd services:start `, `herd php:list`). Run `herd list` to discover all available commands. === tests rules === # Test Enforcement - Every change must be programmatically tested. Write a new test or update an existing test, then run the affected tests to make sure they pass. - Run the minimum number of tests needed to ensure code quality and speed. Use `php artisan test --compact` with a specific filename or filter. === laravel/core rules === # Do Things the Laravel Way - Use `php artisan make:` commands to create new files (i.e. migrations, controllers, models, etc.). You can list available Artisan commands using `php artisan list` and check their parameters with `php artisan [command] --help`. - If you're creating a generic PHP class, use `php artisan make:class`. - Pass `--no-interaction` to all Artisan commands to ensure they work without user input. You should also pass the correct `--options` to ensure correct behavior. ### Model Creation - When creating new models, create useful factories and seeders for them too. Ask the user if they need any other things, using `php artisan make:model --help` to check the available options. ## APIs & Eloquent Resources - For APIs, default to using Eloquent API Resources and API versioning unless existing API routes do not, then you should follow existing application convention. ## URL Generation - When generating links to other pages, prefer named routes and the `route()` function. ## Testing - When creating models for tests, use the factories for the models. Check if the factory has custom states that can be used before manually setting up the model. - Faker: Use methods such as `$this->faker->word()` or `fake()->randomDigit()`. Follow existing conventions whether to use `$this->faker` or `fake()`. - When creating tests, make use of `php artisan make:test [options] {name}` to create a feature test, and pass `--unit` to create a unit test. Most tests should be feature tests. ## Vite Error - If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `npm run build` or ask the user to run `npm run dev` or `composer run dev`. === laravel/v12 rules === # Laravel 12 - CRITICAL: ALWAYS use `search-docs` tool for version-specific Laravel documentation and updated code examples. - Since Laravel 11, Laravel has a new streamlined file structure which this project uses. ## Laravel 12 Structure - In Laravel 12, middleware are no longer registered in `app/Http/Kernel.php`. - Middleware are configured declaratively in `bootstrap/app.php` using `Application::configure()->withMiddleware()`. - `bootstrap/app.php` is the file to register middleware, exceptions, and routing files. - `bootstrap/providers.php` contains application specific service providers. - The `app/Console/Kernel.php` file no longer exists; use `bootstrap/app.php` or `routes/console.php` for console configuration. - Console commands in `app/Console/Commands/` are automatically available and do not require manual registration. ## Database - When modifying a column, the migration must include all of the attributes that were previously defined on the column. Otherwise, they will be dropped and lost. - Laravel 12 allows limiting eagerly loaded records natively, without external packages: `$query->latest()->limit(10);`. ### Models - Casts can and likely should be set in a `casts()` method on a model rather than the `$casts` property. Follow existing conventions from other models. === livewire/core rules === # Livewire - Livewire allow to build dynamic, reactive interfaces in PHP without writing JavaScript. - You can use Alpine.js for client-side interactions instead of JavaScript frameworks. - Keep state server-side so the UI reflects it. Validate and authorize in actions as you would in HTTP requests. === pint/core rules === # Laravel Pint Code Formatter - If you have modified any PHP files, you must run `vendor/bin/pint --dirty --format agent` before finalizing changes to ensure your code matches the project's expected style. - Do not run `vendor/bin/pint --test --format agent`, simply run `vendor/bin/pint --format agent` to fix any formatting issues. === pest/core rules === ## Pest - This project uses Pest for testing. Create tests: `php artisan make:test --pest {name}`. - Run tests: `php artisan test --compact` or filter: `php artisan test --compact --filter=testName`. - Do NOT delete tests without approval. === filament/filament rules === ## Filament - Filament is used by this application. Follow the existing conventions for how and where it is implemented. - Filament is a Server-Driven UI (SDUI) framework for Laravel that lets you define user interfaces in PHP using structured configuration objects. Built on Livewire, Alpine.js, and Tailwind CSS. - Use the `search-docs` tool for official documentation on Artisan commands, code examples, testing, relationships, and idiomatic practices. If `search-docs` is unavailable, refer to https://filamentphp.com/docs. ### Artisan - Always use Filament-specific Artisan commands to create files. Find available commands with the `list-artisan-commands` tool, or run `php artisan --help`. - Always inspect required options before running a command, and always pass `--no-interaction`. ### Patterns Always use static `make()` methods to initialize components. Most configuration methods accept a `Closure` for dynamic values. Use `Get $get` to read other form field values for conditional logic: use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Schemas\Components\Utilities\Get; Select::make('type') ->options(CompanyType::class) ->required() ->live(), TextInput::make('company_name') ->required() ->visible(fn (Get $get): bool => $get('type') === 'business'), Use `state()` with a `Closure` to compute derived column values: use Filament\Tables\Columns\TextColumn; TextColumn::make('full_name') ->state(fn (User $record): string => "{$record->first_name} {$record->last_name}"), Actions encapsulate a button with an optional modal form and logic: use Filament\Actions\Action; use Filament\Forms\Components\TextInput; Action::make('updateEmail') ->schema([ TextInput::make('email') ->email() ->required(), ]) ->action(fn (array $data, User $record) => $record->update($data)) ### Testing Always authenticate before testing panel functionality. Filament uses Livewire, so use `Livewire::test()` or `livewire()` (available when `pestphp/pest-plugin-livewire` is in `composer.json`): use function Pest\Livewire\livewire; livewire(ListUsers::class) ->assertCanSeeTableRecords($users) ->searchTable($users->first()->name) ->assertCanSeeTableRecords($users->take(1)) ->assertCanNotSeeTableRecords($users->skip(1)); use function Pest\Laravel\assertDatabaseHas; use function Pest\Livewire\livewire; livewire(CreateUser::class) ->fillForm([ 'name' => 'Test', 'email' => 'test@example.com', ]) ->call('create') ->assertNotified() ->assertRedirect(); assertDatabaseHas(User::class, [ 'name' => 'Test', 'email' => 'test@example.com', ]); use function Pest\Livewire\livewire; livewire(CreateUser::class) ->fillForm([ 'name' => null, 'email' => 'invalid-email', ]) ->call('create') ->assertHasFormErrors([ 'name' => 'required', 'email' => 'email', ]) ->assertNotNotified(); use Filament\Actions\DeleteAction; use function Pest\Livewire\livewire; livewire(EditUser::class, ['record' => $user->id]) ->callAction(DeleteAction::class) ->assertNotified() ->assertRedirect(); use Filament\Actions\Testing\TestAction; use function Pest\Livewire\livewire; livewire(ListUsers::class) ->callAction(TestAction::make('promote')->table($user), [ 'role' => 'admin', ]) ->assertNotified(); ### Correct Namespaces - Form fields (`TextInput`, `Select`, etc.): `Filament\Forms\Components\` - Infolist entries (`TextEntry`, `IconEntry`, etc.): `Filament\Infolists\Components\` - Layout components (`Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc.): `Filament\Schemas\Components\` - Schema utilities (`Get`, `Set`, etc.): `Filament\Schemas\Components\Utilities\` - Actions (`DeleteAction`, `CreateAction`, etc.): `Filament\Actions\`. Never use `Filament\Tables\Actions\`, `Filament\Forms\Actions\`, or any other sub-namespace for actions. - Icons: `Filament\Support\Icons\Heroicon` enum (e.g., `Heroicon::PencilSquare`) ### Common Mistakes - **Never assume public file visibility.** File visibility is `private` by default. Always use `->visibility('public')` when public access is needed. - **Never assume full-width layout.** `Grid`, `Section`, and `Fieldset` do not span all columns by default. Explicitly set column spans when needed. === spatie/boost-spatie-guidelines rules === # Project Coding Guidelines - This codebase follows Spatie's Laravel & PHP guidelines. - Always activate the `spatie-laravel-php-standards` skill whenever writing, editing, reviewing, or formatting Laravel or PHP code. ================================================ FILE: Dockerfile ================================================ # syntax=docker/dockerfile:1 ########################################### # Stage 1: Composer dependencies ########################################### FROM composer:2 AS composer WORKDIR /app COPY composer.json composer.lock ./ RUN composer install \ --no-dev \ --no-interaction \ --no-scripts \ --no-autoloader \ --prefer-dist \ --ignore-platform-reqs ########################################### # Stage 2: Build frontend assets ########################################### FROM node:22-alpine AS frontend WORKDIR /app # Copy package files and install COPY package.json package-lock.json ./ RUN npm ci --ignore-scripts # Copy source files needed for build COPY vite.config.js ./ COPY resources ./resources COPY public ./public COPY packages ./packages # Copy vendor for Filament theme CSS COPY --from=composer /app/vendor ./vendor RUN npm run build ########################################### # Stage 3: Production image ########################################### FROM serversideup/php:8.4-fpm-nginx AS production LABEL org.opencontainers.image.title="Relaticle CRM" LABEL org.opencontainers.image.description="Modern, open-source CRM platform" LABEL org.opencontainers.image.source="https://github.com/Relaticle/relaticle" # Switch to root to install dependencies USER root # Install required PHP extensions RUN install-php-extensions intl exif gd imagick bcmath # Install PostgreSQL client for health checks RUN apt-get update \ && apt-get install -y --no-install-recommends postgresql-client \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Switch back to www-data USER www-data WORKDIR /var/www/html # Copy application source COPY --chown=www-data:www-data . . # Copy vendor from composer stage COPY --chown=www-data:www-data --from=composer /app/vendor ./vendor # Copy built frontend assets COPY --chown=www-data:www-data --from=frontend /app/public/build ./public/build # Generate optimized autoloader RUN composer dump-autoload --optimize --no-dev # Create storage directories RUN mkdir -p \ storage/app/public \ storage/framework/cache/data \ storage/framework/sessions \ storage/framework/views \ storage/logs \ bootstrap/cache # Default environment for serversideup/php Laravel automations ENV AUTORUN_ENABLED=true ENV AUTORUN_LARAVEL_STORAGE_LINK=true ENV AUTORUN_LARAVEL_MIGRATION=true ENV AUTORUN_LARAVEL_MIGRATION_ISOLATION=true ENV AUTORUN_LARAVEL_CONFIG_CACHE=true ENV AUTORUN_LARAVEL_ROUTE_CACHE=true ENV AUTORUN_LARAVEL_VIEW_CACHE=true ENV AUTORUN_LARAVEL_EVENT_CACHE=true ENV AUTORUN_LARAVEL_OPTIMIZE=false ENV PHP_OPCACHE_ENABLE=1 ENV SSL_MODE=off EXPOSE 8080 ================================================ FILE: LICENSE ================================================ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . ================================================ FILE: README.md ================================================

Relaticle logo

The Open-Source CRM Built for AI Agents

Tests 30 MCP Tools Laravel 12 PHP 8.4 License

Website · Documentation · MCP Server · Roadmap · Discussions

Relaticle Dashboard - Manage contacts, companies, and opportunities in a modern interface
Clean, modern interface built with Filament 5 and Livewire 4

--- # About Relaticle Relaticle is a self-hosted CRM with a production-grade MCP server. Connect any AI agent -- Claude, GPT, or open-source models -- with 30 tools for full CRM operations. 22 custom field types, REST API, and multi-team isolation. **Perfect for:** Developer-led teams, AI-forward startups, and SMBs who want AI agent integration without vendor lock-in. **Core Strengths:** - **Agent-Native Infrastructure** - MCP server with 30 tools, REST API with full CRUD, schema discovery for AI agents - **Customizable Data Model** - 22 field types including entity relationships, conditional visibility, and per-field encryption. No migrations needed. - **Multi-Team Isolation** - 5-layer authorization with team-scoped data and workspaces - **Modern Tech Stack** - Laravel 12, Filament 5, PHP 8.4, 1,100+ automated tests - **Privacy-First** - Self-hosted, AGPL-3.0, your data stays on your server **vs Other CRMs:** | | Self-Hosted | Open Source | MCP Tools | Custom Fields | Per-Seat Pricing | |---|---|---|---|---|---| | **Relaticle** | Yes | AGPL-3.0 | 30 | 22 types | No | | **HubSpot** | No | No | 9 | Limited | Yes | | **Salesforce** | No | No | 0 | Yes (complex) | Yes | | **Attio** | No | No | 0 | Yes | Yes | # Requirements - PHP 8.4+ - PostgreSQL 17+ - Composer 2 and Node.js 20+ - Redis for queues (optional for development) # Installation ```bash git clone https://github.com/Relaticle/relaticle.git cd relaticle && composer app-install ``` # Development ```bash # Start everything (server, queue, vite) composer dev # Run tests composer test # Format code composer lint ``` # Self-Hosting See the [Self-Hosting Guide](https://relaticle.com/docs/self-hosting) for Docker and manual deployment instructions. # Documentation Visit our [documentation](https://relaticle.com/docs) for guides on business usage, technical architecture, MCP server setup, REST API integration, and more. # Community & Support - [Report Issues](https://github.com/Relaticle/relaticle/issues) - [Request Features](https://github.com/Relaticle/relaticle/discussions/categories/ideas) - [Ask Questions](https://github.com/Relaticle/relaticle/discussions/categories/q-a) - [Discord](https://discord.gg/relaticle) - [Star us on GitHub](https://github.com/Relaticle/relaticle) to support the project # License Relaticle is open-source software licensed under the [AGPL-3.0 license](LICENSE). # Star History [![Star History Chart](https://api.star-history.com/svg?repos=Relaticle/relaticle&type=Date)](https://www.star-history.com/#Relaticle/relaticle&Date) ================================================ FILE: TODOS.md ================================================ # TODOs Deferred work from plan reviews. Each item includes context and reasoning so it can be picked up without the original conversation. --- ## Centralize Marketing Numbers **What:** Extract hardcoded marketing numbers (MCP tools count, custom field types, test count, authorization layers) into a single config or constants file. All marketing surfaces (hero, features, FAQ, pricing, schema markup, README) should reference this source of truth. **Why:** The MCP tools count drifted from 20 to 30 as tools were added, but marketing copy wasn't updated. This was caught during a manual audit but could happen again with any number. **Where numbers appear:** hero.blade.php, features.blade.php, faq.blade.php, community.blade.php, pricing.blade.php, index.blade.php (schema markup + OG description), layout.blade.php (documentation meta), mcp-guide.md, README.md. **Approach:** Create a `config/marketing.php` with keys like `mcp_tools_count`, `field_types_count`, `test_count`. Reference via `config('marketing.mcp_tools_count')` in Blade templates. For README.md (not rendered by Laravel), keep manual but add a comment noting the config source. **Effort:** S (CC: ~15min) | **Priority:** P2 | **Depends on:** Nothing --- ## Document the 5-Layer Authorization Model **What:** The marketing claim "5-layer authorization" is used across multiple surfaces but the actual 5 layers are never explicitly defined. Based on code analysis, the layers appear to be: (1) User authentication (Sanctum/Fortify), (2) Team membership, (3) Team roles, (4) Eloquent policies, (5) Multi-tenancy scoping. This should be documented. **Why:** If a technical evaluator asks "what are the 5 layers?", there's no answer in the docs. Undocumented marketing claims erode trust with developer audiences. **Where to document:** Either the developer guide (developer-guide.md) or a dedicated security/architecture section in the getting-started guide. **Effort:** S (CC: ~10min) | **Priority:** P2 | **Depends on:** Nothing ================================================ FILE: app/Actions/Company/CreateCompany.php ================================================ $data */ public function execute(User $user, array $data, CreationSource $source = CreationSource::WEB): Company { abort_unless($user->can('create', Company::class), 403); $attributes = Arr::only($data, ['name', 'custom_fields']); $attributes['creation_source'] = $source; $company = DB::transaction(fn (): Company => Company::query()->create($attributes)); return $company->load('customFieldValues.customField.options'); } } ================================================ FILE: app/Actions/Company/DeleteCompany.php ================================================ can('delete', $company), 403); $company->delete(); } } ================================================ FILE: app/Actions/Company/ListCompanies.php ================================================ $filters * @return CursorPaginator|LengthAwarePaginator */ public function execute( User $user, int $perPage = 15, bool $useCursor = false, array $filters = [], ?int $page = null, ?Request $request = null, ): CursorPaginator|LengthAwarePaginator { abort_unless($user->can('viewAny', Company::class), 403); $request ??= new Request(['filter' => $filters]); $filterSchema = new CustomFieldFilterSchema; $query = QueryBuilder::for(Company::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::partial('name'), AllowedFilter::custom('custom_fields', new CustomFieldFilter('company')), ) ->allowedFields('id', 'name', 'creator_id', 'account_owner_id', 'created_at', 'updated_at') ->allowedIncludes( 'creator', 'accountOwner', 'people', 'opportunities', AllowedInclude::count('peopleCount', 'people'), AllowedInclude::count('opportunitiesCount', 'opportunities'), AllowedInclude::count('tasksCount', 'tasks'), AllowedInclude::count('notesCount', 'notes'), ) ->allowedSorts( 'name', 'created_at', 'updated_at', ...$filterSchema->allowedSorts($user, 'company'), ) ->defaultSort('-created_at') ->orderBy('id'); if ($useCursor) { return $query->cursorPaginate($perPage); } return $query->paginate($perPage, ['*'], 'page', $page); } } ================================================ FILE: app/Actions/Company/UpdateCompany.php ================================================ $data */ public function execute(User $user, Company $company, array $data): Company { abort_unless($user->can('update', $company), 403); $attributes = Arr::only($data, ['name', 'custom_fields']); $attributes = CustomFieldMerger::merge($company, $attributes); return DB::transaction(function () use ($company, $attributes): Company { $company->update($attributes); return $company->refresh()->load('customFieldValues.customField.options'); }); } } ================================================ FILE: app/Actions/Fortify/CreateNewSocialUser.php ================================================ $input * * @throws Throwable */ public function create(array $input): User { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], ])->validate(); return DB::transaction(fn () => tap(User::query()->create([ 'name' => $input['name'], 'email' => $input['email'], ]), function (User $user): void { event(new Registered($user)); if ($user->markEmailAsVerified()) { event(new Verified($user)); } })); } } ================================================ FILE: app/Actions/Fortify/PasswordValidationRules.php ================================================ |string> */ protected function passwordRules(): array { return ['required', 'string', Password::default(), 'confirmed']; } } ================================================ FILE: app/Actions/Fortify/ResetUserPassword.php ================================================ $input */ public function reset(User $user, array $input): void { Validator::make($input, [ 'password' => $this->passwordRules(), ])->validate(); $user->forceFill([ 'password' => Hash::make($input['password']), ])->save(); } } ================================================ FILE: app/Actions/Fortify/UpdateUserPassword.php ================================================ $input */ public function update(User $user, array $input): void { Validator::make($input, [ 'current_password' => ['required', 'string', 'current_password:web'], 'password' => $this->passwordRules(), ], [ 'current_password.current_password' => __('The provided password does not match your current password.'), ])->validateWithBag('updatePassword'); $user->forceFill([ 'password' => Hash::make($input['password']), ])->save(); } } ================================================ FILE: app/Actions/Fortify/UpdateUserProfileInformation.php ================================================ $input */ public function update(User $user, array $input): void { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], 'profile_photo_path' => ['nullable', 'string', 'max:255'], ])->validateWithBag('updateProfileInformation'); if (array_key_exists('profile_photo_path', $input)) { if ($input['profile_photo_path']) { $user->updateProfilePhoto($input['profile_photo_path']); } else { $user->deleteProfilePhoto(); } } if ($input['email'] !== $user->email) { $this->updateVerifiedUser($user, $input); } else { $user->forceFill([ 'name' => $input['name'], 'email' => $input['email'], ])->save(); } } /** * Update the given verified user's profile information. * * @param array $input */ private function updateVerifiedUser(User $user, array $input): void { $user->forceFill([ 'name' => $input['name'], 'email' => $input['email'], 'email_verified_at' => null, ])->save(); $user->sendEmailVerificationNotification(); } } ================================================ FILE: app/Actions/Jetstream/AddTeamMember.php ================================================ authorize('addTeamMember', $team); $this->validate($team, $email, $role); $newTeamMember = Jetstream::findUserByEmailOrFail($email); event(new AddingTeamMember($team, $newTeamMember)); $team->users()->attach( $newTeamMember, ['role' => $role] ); event(new TeamMemberAdded($team, $newTeamMember)); } /** * Validate the add member operation. */ private function validate(Team $team, string $email, ?string $role): void { Validator::make([ 'email' => $email, 'role' => $role, ], $this->rules(), [ 'email.exists' => __('We were unable to find a registered user with this email address.'), ])->after( $this->ensureUserIsNotAlreadyOnTeam($team, $email) )->validateWithBag('addTeamMember'); } /** * Get the validation rules for adding a team member. * * @return array> */ private function rules(): array { return [ 'email' => ['required', 'email', 'exists:users'], 'role' => ['required', 'string', new Role], ]; } /** * Ensure that the user is not already on the team. */ private function ensureUserIsNotAlreadyOnTeam(Team $team, string $email): Closure { return function ($validator) use ($team, $email): void { // @pest-ignore-type $validator->errors()->addIf( $team->hasUserWithEmail($email), 'email', __('This user already belongs to the team.') ); }; } } ================================================ FILE: app/Actions/Jetstream/CreateTeam.php ================================================ $input */ public function create(User $user, array $input): Team { Gate::forUser($user)->authorize('create', Jetstream::newTeamModel()); Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'slug' => ['required', 'string', 'max:255', new ValidTeamSlug, 'unique:teams,slug'], ])->validateWithBag('createTeam'); $isFirstTeam = ! $user->ownedTeams()->exists(); event(new AddingTeam($user)); $user->switchTeam($team = $user->ownedTeams()->create([ 'name' => $input['name'], 'slug' => $input['slug'], 'personal_team' => $isFirstTeam, ])); /** @var Team $team */ return $team; } } ================================================ FILE: app/Actions/Jetstream/DeleteTeam.php ================================================ purge(); } } ================================================ FILE: app/Actions/Jetstream/DeleteUser.php ================================================ deleteTeams($user); $user->deleteProfilePhoto(); $user->tokens->each->delete(); $user->delete(); }); } /** * Delete the teams and team associations attached to the user. */ private function deleteTeams(User $user): void { $user->teams()->detach(); $user->ownedTeams->each(function (Model $team): void { /** @var Team $team */ $this->deletesTeams->delete($team); }); } } ================================================ FILE: app/Actions/Jetstream/InviteTeamMember.php ================================================ authorize('addTeamMember', $team); $this->validate($team, $email, $role); event(new InvitingTeamMember($team, $email, $role)); $expiryDays = (int) config('jetstream.invitation_expiry_days', 7); $invitation = $team->teamInvitations()->create([ 'email' => $email, 'role' => $role, 'expires_at' => now()->addDays($expiryDays), ]); /** @var TeamInvitationModel $invitation */ Mail::to($email)->send(new TeamInvitation($invitation)); } /** * Validate the invite member operation. */ private function validate(Team $team, string $email, ?string $role): void { Validator::make([ 'email' => $email, 'role' => $role, ], $this->rules($team), [ 'email.unique' => __('This user has already been invited to the team.'), ])->after( $this->ensureUserIsNotAlreadyOnTeam($team, $email) )->validateWithBag('addTeamMember'); } /** * Get the validation rules for inviting a team member. * * @return array> */ private function rules(Team $team): array { return [ 'email' => [ 'required', 'email', Rule::unique(Jetstream::teamInvitationModel())->where(function (Builder $query) use ($team): void { $query->where('team_id', $team->id); }), ], 'role' => ['required', 'string', new Role], ]; } /** * Ensure that the user is not already on the team. */ private function ensureUserIsNotAlreadyOnTeam(Team $team, string $email): Closure { return function ($validator) use ($team, $email): void { // @pest-ignore-type $validator->errors()->addIf( $team->hasUserWithEmail($email), 'email', __('This user already belongs to the team.') ); }; } } ================================================ FILE: app/Actions/Jetstream/RemoveTeamMember.php ================================================ authorize($user, $team, $teamMember); $this->ensureUserDoesNotOwnTeam($teamMember, $team); $team->removeUser($teamMember); event(new TeamMemberRemoved($team, $teamMember)); } /** * Authorize that the user can remove the team member. */ private function authorize(User $user, Team $team, User $teamMember): void { throw_if(! Gate::forUser($user)->check('removeTeamMember', $team) && $user->id !== $teamMember->id, AuthorizationException::class); } /** * Ensure that the currently authenticated user does not own the team. */ private function ensureUserDoesNotOwnTeam(User $teamMember, Team $team): void { /** @var User $owner */ $owner = $team->owner; if ($teamMember->id === $owner->id) { throw ValidationException::withMessages([ 'team' => [__('You may not leave a team that you created.')], ])->errorBag('removeTeamMember'); } } } ================================================ FILE: app/Actions/Jetstream/UpdateTeamName.php ================================================ $input */ public function update(User $user, Team $team, array $input): void { Gate::forUser($user)->authorize('update', $team); Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'slug' => ['required', 'string', 'max:255', new ValidTeamSlug(ignoreValue: $team->slug), "unique:teams,slug,{$team->id}"], ])->validateWithBag('updateTeamName'); $team->update([ 'name' => $input['name'], 'slug' => $input['slug'], ]); } } ================================================ FILE: app/Actions/Note/CreateNote.php ================================================ $data */ public function execute(User $user, array $data, CreationSource $source = CreationSource::WEB): Note { abort_unless($user->can('create', Note::class), 403); $companyIds = Arr::pull($data, 'company_ids'); $peopleIds = Arr::pull($data, 'people_ids'); $opportunityIds = Arr::pull($data, 'opportunity_ids'); $attributes = Arr::only($data, ['title', 'custom_fields']); $attributes['creation_source'] = $source; $note = DB::transaction(function () use ($attributes, $companyIds, $peopleIds, $opportunityIds): Note { $note = Note::query()->create($attributes); if ($companyIds !== null) { $note->companies()->sync($companyIds); } if ($peopleIds !== null) { $note->people()->sync($peopleIds); } if ($opportunityIds !== null) { $note->opportunities()->sync($opportunityIds); } return $note; }); return $note->load('customFieldValues.customField.options'); } } ================================================ FILE: app/Actions/Note/DeleteNote.php ================================================ can('delete', $note), 403); $note->delete(); } } ================================================ FILE: app/Actions/Note/ListNotes.php ================================================ $filters * @return CursorPaginator|LengthAwarePaginator */ public function execute( User $user, int $perPage = 15, bool $useCursor = false, array $filters = [], ?int $page = null, ?Request $request = null, ): CursorPaginator|LengthAwarePaginator { abort_unless($user->can('viewAny', Note::class), 403); $request ??= new Request(['filter' => $filters]); $filterSchema = new CustomFieldFilterSchema; $query = QueryBuilder::for(Note::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::partial('title'), AllowedFilter::scope('notable_type', 'forNotableType'), AllowedFilter::scope('notable_id', 'forNotableId'), AllowedFilter::custom('custom_fields', new CustomFieldFilter('note')), ) ->allowedFields('id', 'title', 'creator_id', 'created_at', 'updated_at') ->allowedIncludes( 'creator', 'companies', 'people', 'opportunities', AllowedInclude::count('companiesCount', 'companies'), AllowedInclude::count('peopleCount', 'people'), AllowedInclude::count('opportunitiesCount', 'opportunities'), ) ->allowedSorts( 'title', 'created_at', 'updated_at', ...$filterSchema->allowedSorts($user, 'note'), ) ->defaultSort('-created_at') ->orderBy('id'); if ($useCursor) { return $query->cursorPaginate($perPage); } return $query->paginate($perPage, ['*'], 'page', $page); } } ================================================ FILE: app/Actions/Note/UpdateNote.php ================================================ $data */ public function execute(User $user, Note $note, array $data): Note { abort_unless($user->can('update', $note), 403); $attributes = Arr::only($data, ['title', 'custom_fields']); $attributes = CustomFieldMerger::merge($note, $attributes); return DB::transaction(function () use ($note, $attributes, $data): Note { $note->update($attributes); if (array_key_exists('company_ids', $data)) { $note->companies()->sync($data['company_ids']); } if (array_key_exists('people_ids', $data)) { $note->people()->sync($data['people_ids']); } if (array_key_exists('opportunity_ids', $data)) { $note->opportunities()->sync($data['opportunity_ids']); } return $note->refresh()->load('customFieldValues.customField.options'); }); } } ================================================ FILE: app/Actions/Opportunity/CreateOpportunity.php ================================================ $data */ public function execute(User $user, array $data, CreationSource $source = CreationSource::WEB): Opportunity { abort_unless($user->can('create', Opportunity::class), 403); $attributes = Arr::only($data, ['name', 'company_id', 'contact_id', 'custom_fields']); $attributes['creation_source'] = $source; $opportunity = DB::transaction(fn (): Opportunity => Opportunity::query()->create($attributes)); return $opportunity->load('customFieldValues.customField.options'); } } ================================================ FILE: app/Actions/Opportunity/DeleteOpportunity.php ================================================ can('delete', $opportunity), 403); $opportunity->delete(); } } ================================================ FILE: app/Actions/Opportunity/ListOpportunities.php ================================================ $filters * @return CursorPaginator|LengthAwarePaginator */ public function execute( User $user, int $perPage = 15, bool $useCursor = false, array $filters = [], ?int $page = null, ?Request $request = null, ): CursorPaginator|LengthAwarePaginator { abort_unless($user->can('viewAny', Opportunity::class), 403); $request ??= new Request(['filter' => $filters]); $filterSchema = new CustomFieldFilterSchema; $query = QueryBuilder::for(Opportunity::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::partial('name'), AllowedFilter::exact('company_id'), AllowedFilter::exact('contact_id'), AllowedFilter::custom('custom_fields', new CustomFieldFilter('opportunity')), ) ->allowedFields('id', 'name', 'company_id', 'contact_id', 'creator_id', 'created_at', 'updated_at') ->allowedIncludes( 'creator', 'company', 'contact', AllowedInclude::count('tasksCount', 'tasks'), AllowedInclude::count('notesCount', 'notes'), ) ->allowedSorts( 'name', 'created_at', 'updated_at', ...$filterSchema->allowedSorts($user, 'opportunity'), ) ->defaultSort('-created_at') ->orderBy('id'); if ($useCursor) { return $query->cursorPaginate($perPage); } return $query->paginate($perPage, ['*'], 'page', $page); } } ================================================ FILE: app/Actions/Opportunity/UpdateOpportunity.php ================================================ $data */ public function execute(User $user, Opportunity $opportunity, array $data): Opportunity { abort_unless($user->can('update', $opportunity), 403); $attributes = Arr::only($data, ['name', 'company_id', 'contact_id', 'custom_fields']); $attributes = CustomFieldMerger::merge($opportunity, $attributes); return DB::transaction(function () use ($opportunity, $attributes): Opportunity { $opportunity->update($attributes); return $opportunity->refresh()->load('customFieldValues.customField.options'); }); } } ================================================ FILE: app/Actions/People/CreatePeople.php ================================================ $data */ public function execute(User $user, array $data, CreationSource $source = CreationSource::WEB): People { abort_unless($user->can('create', People::class), 403); $attributes = Arr::only($data, ['name', 'company_id', 'custom_fields']); $attributes['creation_source'] = $source; $person = DB::transaction(fn (): People => People::query()->create($attributes)); return $person->load('customFieldValues.customField.options'); } } ================================================ FILE: app/Actions/People/DeletePeople.php ================================================ can('delete', $people), 403); $people->delete(); } } ================================================ FILE: app/Actions/People/ListPeople.php ================================================ $filters * @return CursorPaginator|LengthAwarePaginator */ public function execute( User $user, int $perPage = 15, bool $useCursor = false, array $filters = [], ?int $page = null, ?Request $request = null, ): CursorPaginator|LengthAwarePaginator { abort_unless($user->can('viewAny', People::class), 403); $request ??= new Request(['filter' => $filters]); $filterSchema = new CustomFieldFilterSchema; $query = QueryBuilder::for(People::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::partial('name'), AllowedFilter::exact('company_id'), AllowedFilter::custom('custom_fields', new CustomFieldFilter('people')), ) ->allowedFields('id', 'name', 'company_id', 'creator_id', 'created_at', 'updated_at') ->allowedIncludes( 'creator', 'company', AllowedInclude::count('tasksCount', 'tasks'), AllowedInclude::count('notesCount', 'notes'), ) ->allowedSorts( 'name', 'created_at', 'updated_at', ...$filterSchema->allowedSorts($user, 'people'), ) ->defaultSort('-created_at') ->orderBy('id'); if ($useCursor) { return $query->cursorPaginate($perPage); } return $query->paginate($perPage, ['*'], 'page', $page); } } ================================================ FILE: app/Actions/People/UpdatePeople.php ================================================ $data */ public function execute(User $user, People $people, array $data): People { abort_unless($user->can('update', $people), 403); $attributes = Arr::only($data, ['name', 'company_id', 'custom_fields']); $attributes = CustomFieldMerger::merge($people, $attributes); return DB::transaction(function () use ($people, $attributes): People { $people->update($attributes); return $people->refresh()->load('customFieldValues.customField.options'); }); } } ================================================ FILE: app/Actions/Task/CreateTask.php ================================================ $data */ public function execute(User $user, array $data, CreationSource $source = CreationSource::WEB): Task { abort_unless($user->can('create', Task::class), 403); $companyIds = Arr::pull($data, 'company_ids'); $peopleIds = Arr::pull($data, 'people_ids'); $opportunityIds = Arr::pull($data, 'opportunity_ids'); $assigneeIds = Arr::pull($data, 'assignee_ids'); $attributes = Arr::only($data, ['title', 'custom_fields']); $attributes['creation_source'] = $source; $task = DB::transaction(function () use ($attributes, $companyIds, $peopleIds, $opportunityIds, $assigneeIds): Task { $task = Task::query()->create($attributes); if ($companyIds !== null) { $task->companies()->sync($companyIds); } if ($peopleIds !== null) { $task->people()->sync($peopleIds); } if ($opportunityIds !== null) { $task->opportunities()->sync($opportunityIds); } if ($assigneeIds !== null) { $task->assignees()->sync($assigneeIds); } return $task; }); $this->notifyAssignees->execute($task); return $task->load('customFieldValues.customField.options'); } } ================================================ FILE: app/Actions/Task/DeleteTask.php ================================================ can('delete', $task), 403); $task->delete(); } } ================================================ FILE: app/Actions/Task/ListTasks.php ================================================ $filters * @return CursorPaginator|LengthAwarePaginator */ public function execute( User $user, int $perPage = 15, bool $useCursor = false, array $filters = [], ?int $page = null, ?Request $request = null, ): CursorPaginator|LengthAwarePaginator { abort_unless($user->can('viewAny', Task::class), 403); $request ??= new Request(['filter' => $filters]); $filterSchema = new CustomFieldFilterSchema; $query = QueryBuilder::for(Task::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::partial('title'), AllowedFilter::callback('assigned_to_me', function (Builder $query, mixed $value) use ($user): void { if (filter_var($value, FILTER_VALIDATE_BOOLEAN)) { $query->whereHas('assignees', fn (Builder $q) => $q->where('users.id', $user->getKey())); } }), AllowedFilter::scope('company_id', 'forCompany'), AllowedFilter::scope('people_id', 'forPerson'), AllowedFilter::scope('opportunity_id', 'forOpportunity'), AllowedFilter::custom('custom_fields', new CustomFieldFilter('task')), ) ->allowedFields('id', 'title', 'creator_id', 'created_at', 'updated_at') ->allowedIncludes( 'creator', 'assignees', 'companies', 'people', 'opportunities', AllowedInclude::count('assigneesCount', 'assignees'), AllowedInclude::count('companiesCount', 'companies'), AllowedInclude::count('peopleCount', 'people'), AllowedInclude::count('opportunitiesCount', 'opportunities'), ) ->allowedSorts( 'title', 'created_at', 'updated_at', ...$filterSchema->allowedSorts($user, 'task'), ) ->defaultSort('-created_at') ->orderBy('id'); if ($useCursor) { return $query->cursorPaginate($perPage); } return $query->paginate($perPage, ['*'], 'page', $page); } } ================================================ FILE: app/Actions/Task/NotifyTaskAssignees.php ================================================ $previousAssigneeIds */ public function execute(Task $task, array $previousAssigneeIds = []): void { $currentIds = $task->assignees()->pluck('users.id')->all(); $newIds = array_diff($currentIds, $previousAssigneeIds); if ($newIds === []) { return; } $taskTitle = $task->title; $taskId = $task->id; $taskUrl = $this->resolveTaskUrl($task); defer(function () use ($newIds, $taskTitle, $taskId, $taskUrl): void { User::query() ->whereIn('id', $newIds) ->get() ->each(function (User $recipient) use ($taskTitle, $taskId, $taskUrl): void { Notification::make() ->title("New Task Assignment: {$taskTitle}") ->actions([ Action::make('view') ->button() ->label('View Task') ->url($taskUrl) ->markAsRead(), ]) ->icon(Heroicon::OutlinedCheckCircle) ->iconColor('primary') ->viewData(['task_id' => $taskId]) ->sendToDatabase($recipient); }); }); } private function resolveTaskUrl(Task $task): string { try { return ManageTasks::getUrl(['record' => $task]); } catch (\Throwable) { return '#'; } } } ================================================ FILE: app/Actions/Task/UpdateTask.php ================================================ $data * * @throws \Throwable */ public function execute(User $user, Task $task, array $data): Task { abort_unless($user->can('update', $task), 403); $attributes = Arr::only($data, ['title', 'custom_fields']); $attributes = CustomFieldMerger::merge($task, $attributes); $previousAssigneeIds = $task->assignees()->pluck('users.id')->all(); $task = DB::transaction(function () use ($task, $attributes, $data): Task { $task->update($attributes); if (array_key_exists('company_ids', $data)) { $task->companies()->sync($data['company_ids']); } if (array_key_exists('people_ids', $data)) { $task->people()->sync($data['people_ids']); } if (array_key_exists('opportunity_ids', $data)) { $task->opportunities()->sync($data['opportunity_ids']); } if (array_key_exists('assignee_ids', $data)) { $task->assignees()->sync($data['assignee_ids']); } return $task->refresh(); }); $this->notifyAssignees->execute($task, $previousAssigneeIds); return $task->load('customFieldValues.customField.options'); } } ================================================ FILE: app/Concerns/DetectsTeamInvitation.php ================================================ whereKey($segments[$invitationIndex + 1]) ->first(); } protected function getTeamInvitationSubheading(): ?Htmlable { $invitation = $this->getTeamInvitationFromSession(); if (! $invitation || $invitation->isExpired()) { return null; } return new HtmlString( __('You\'ve been invited to join :team', [ 'team' => e($invitation->team->name), ]) ); } protected function getInvitationContentHtml(): string { $subheading = $this->getTeamInvitationSubheading(); if ($subheading === null) { return ''; } return '

'.$subheading->toHtml().'

'; } } ================================================ FILE: app/Console/Commands/BackfillCustomFieldColorsCommand.php ================================================ info('🎨 Backfilling custom field colors...'); $dryRun = $this->option('dry-run'); $specificTeam = $this->option('team'); if ($dryRun) { $this->warn('🔍 DRY RUN MODE - No changes will be made'); } // Get fields to update $query = CustomField::with('options') ->whereIn('name', ['Status', 'Priority', 'Stage']) ->whereIn('entity_type', [Task::class, Opportunity::class]) ->where('type', 'select'); if ($specificTeam) { $query->where('tenant_id', $specificTeam); } $fields = $query->get(); $this->info("Found {$fields->count()} fields to process"); $updatedFields = 0; $updatedOptions = 0; foreach ($fields as $field) { $colorMapping = $this->getColorMappingForField($field); if ($colorMapping === null) { continue; } $this->info("Processing: {$field->name} for {$field->entity_type} (Team {$field->tenant_id})"); // Enable colors on the field if not already enabled if (! $field->settings->enable_option_colors) { if (! $dryRun) { $field->update([ 'settings' => new CustomFieldSettingsData( visible_in_list: $field->settings->visible_in_list ?? true, list_toggleable_hidden: $field->settings->list_toggleable_hidden, visible_in_view: $field->settings->visible_in_view ?? true, searchable: $field->settings->searchable ?? false, encrypted: $field->settings->encrypted ?? false, enable_option_colors: true, visibility: $field->settings->visibility ?? null, additional: $field->settings->additional ?? [], ), ]); } $this->line(' ✓ Enabled color options for field'); $updatedFields++; } else { $this->line(' ℹ Field already has color options enabled'); } // Apply colors to options foreach ($field->options as $option) { $color = $colorMapping[$option->name] ?? null; if ($color !== null) { $currentColor = $option->settings->color ?? null; if ($currentColor !== $color) { if (! $dryRun) { $option->update([ 'settings' => new CustomFieldOptionSettingsData(color: $color), ]); } $this->line(" ✓ Set color for '{$option->name}': $color"); $updatedOptions++; } else { $this->line(" ℹ '{$option->name}' already has correct color: $color"); } } else { $this->line(" ⚠ No color mapping found for option: '{$option->name}'"); } } } if ($dryRun) { $this->info('🔍 DRY RUN COMPLETE:'); $this->info(" - Would enable colors on $updatedFields fields"); $this->info(" - Would update colors on $updatedOptions options"); } else { $this->info('✅ BACKFILL COMPLETE:'); $this->info(" - Enabled colors on $updatedFields fields"); $this->info(" - Updated colors on $updatedOptions options"); } return self::SUCCESS; } /** * Get color mapping for a field based on its configuration */ /** * @return array|null */ private function getColorMappingForField(CustomField $field): ?array { return match ([$field->entity_type, $field->name]) { [Task::class, 'Status'] => TaskCustomField::STATUS->getOptionColors(), [Task::class, 'Priority'] => TaskCustomField::PRIORITY->getOptionColors(), [Opportunity::class, 'Stage'] => OpportunityCustomField::STAGE->getOptionColors(), default => null, }; } } ================================================ FILE: app/Console/Commands/CleanupExpiredInvitationsCommand.php ================================================ option('days'); $cutoff = now()->subDays($days); $deleted = TeamInvitation::query() ->where(function (Builder $query) use ($cutoff): void { $query->where('expires_at', '<', $cutoff) ->orWhere(function (Builder $query) use ($cutoff): void { $query->whereNull('expires_at') ->where('created_at', '<', $cutoff); }); }) ->delete(); $this->info("Purged {$deleted} expired invitation(s)."); } } ================================================ FILE: app/Console/Commands/CreateSystemAdminCommand.php ================================================ info('Create System Administrator Account'); $this->line('────────────────────────────────────'); $this->newLine(); try { // Check if any system administrators exist $existingCount = SystemAdministrator::query()->count(); if ($existingCount > 0) { $this->warn("There are currently {$existingCount} system administrator(s)."); if (! $this->option('no-interaction')) { $continue = confirm( label: 'Do you want to create another system administrator?', default: true ); if (! $continue) { $this->info('Operation cancelled.'); return self::SUCCESS; } } } // Get administrator details $name = $this->option('name') ?? text( label: 'Name', placeholder: 'John Doe', required: true, validate: fn (string $value): ?string => strlen($value) < 2 ? 'Name must be at least 2 characters' : null ); $email = $this->option('email') ?? text( label: 'Email address', placeholder: 'admin@example.com', required: true, validate: function (string $value): ?string { if (! filter_var($value, FILTER_VALIDATE_EMAIL)) { return 'Please enter a valid email address'; } if (SystemAdministrator::query()->where('email', $value)->exists()) { return "An administrator with email '{$value}' already exists"; } return null; } ); // Validate email from command option if ($this->option('email')) { if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { $this->error('Invalid email address provided.'); return self::FAILURE; } if (SystemAdministrator::query()->where('email', $email)->exists()) { $this->error("An administrator with email '{$email}' already exists."); return self::FAILURE; } } $password = $this->option('password') ?? password( label: 'Password', placeholder: 'Minimum 8 characters', required: true, validate: fn (string $value): ?string => strlen($value) < 8 ? 'Password must be at least 8 characters' : null ); // Validate password from command option if ($this->option('password') && strlen($password) < 8) { $this->error('Password must be at least 8 characters.'); return self::FAILURE; } // Show summary if (! $this->option('no-interaction') && ! ($this->option('name') && $this->option('email') && $this->option('password'))) { $this->newLine(); $this->info('Summary:'); $this->line(" Name: {$name}"); $this->line(" Email: {$email}"); $this->line(' Role: Super Administrator'); $this->newLine(); $confirmed = confirm( label: 'Create this system administrator?', default: true ); if (! $confirmed) { $this->info('Operation cancelled.'); return self::SUCCESS; } } // Create the system administrator $admin = SystemAdministrator::query()->create([ 'name' => $name, 'email' => $email, 'password' => bcrypt($password), 'email_verified_at' => now(), 'role' => SystemAdministratorRole::SuperAdministrator, ]); $this->newLine(); $this->info('✅ System Administrator created successfully!'); $this->newLine(); $this->line(' Details:'); $this->line(" ├─ Name: {$admin->name}"); $this->line(" ├─ Email: {$admin->email}"); $this->line(' ├─ Role: Super Administrator'); $this->line(' └─ Panel: /sysadmin'); $this->newLine(); $this->line(' You can now log in at: '.url('/sysadmin')); $this->newLine(); return self::SUCCESS; } catch (Throwable $e) { $this->error('Failed to create system administrator:'); $this->line($e->getMessage()); if ($this->option('verbose')) { $this->newLine(); $this->line($e->getTraceAsString()); } return self::FAILURE; } } } ================================================ FILE: app/Console/Commands/GenerateSitemapCommand.php ================================================ writeToFile(public_path('sitemap.xml')); } } ================================================ FILE: app/Console/Commands/InstallCommand.php ================================================ displayWelcome(); if (! $this->shouldProceed()) { return self::SUCCESS; } $config = $this->getConfiguration(); return $this->runInstallation($config); } private function displayWelcome(): void { $this->output->write(PHP_EOL.' ____ _ _ _ _ | _ \ ___| | __ _| |_(_) ___| | ___ | |_) / _ \ |/ _` | __| |/ __| |/ _ \ | _ < __/ | (_| | |_| | (__| | __/ |_| \_\___|_|\__,_|\__|_|\___|_|\___|'.PHP_EOL.PHP_EOL); } private function shouldProceed(): bool { if (! $this->option('force') && $this->isAlreadyInstalled()) { warning('Relaticle appears to be already installed.'); return confirm( label: 'Do you want to continue anyway?', default: false, hint: 'This may overwrite existing configuration' ); } return true; } private function isAlreadyInstalled(): bool { return File::exists($this->envPath()) && config('app.key') && File::exists(public_path('storage')); } /** @return array */ private function getConfiguration(): array { $this->info('Let\'s configure your Relaticle installation...'); $database = select( label: 'Which database would you like to use?', options: [ 'sqlite' => 'SQLite (Recommended for local development)', 'pgsql' => 'PostgreSQL (Recommended for production)', ], default: 'sqlite', hint: 'SQLite requires no additional setup' ); $installDemoData = confirm( label: 'Install demo data?', default: true, hint: 'Includes sample companies, contacts, and more' ); $createSysAdmin = confirm( label: 'Create system administrator account?', default: true, hint: 'You can create one later using: php artisan sysadmin:create' ); return [ 'database' => $database, 'demo_data' => $installDemoData, 'sysadmin_user' => $createSysAdmin, ]; } /** @param array $config */ private function runInstallation(array $config): int { /** @var array */ $installationSteps = [ 'System Requirements' => $this->checkSystemRequirements(...), 'Environment Setup' => fn (): bool => $this->setupEnvironment($config), 'Dependencies' => $this->installDependencies(...), 'Database' => $this->setupDatabase(...), 'Assets' => $this->buildAssets(...), 'Storage' => $this->setupStorage(...), 'Demo Data' => fn (): bool => $config['demo_data'] ? $this->seedDemoData() : true, ]; $this->info('🚀 Starting installation process...'); // Process non-interactive steps with spinner foreach ($installationSteps as $stepName => $stepFunction) { $success = spin( callback: fn (): mixed => $stepFunction(), message: "Installing {$stepName}..." ); if (! $success) { $this->newLine(); $this->error("❌ Installation failed during: {$stepName}"); $this->newLine(); $this->line('Check the error messages above for more details.'); $this->line('You can re-run the installer with --force to retry.'); return self::FAILURE; } $this->line(" ✅ {$stepName} completed"); } // Handle System Administrator creation separately (requires user interaction) if ($config['sysadmin_user']) { $this->newLine(); $this->info('Creating System Administrator account...'); if (! $this->createSystemAdministrator()) { $this->newLine(); $this->error('❌ Installation failed during: System Administrator creation'); $this->newLine(); $this->line('You can create a system administrator later using: php artisan sysadmin:create'); return self::FAILURE; } $this->line(' ✅ System Administrator created'); } $this->newLine(); $this->displaySuccessMessage($config); return self::SUCCESS; } private function checkSystemRequirements(): bool { $requirements = [ 'PHP 8.4+' => version_compare(PHP_VERSION, '8.3.0', '>='), 'Composer' => $this->commandExists('composer'), 'Node.js' => $this->commandExists('node'), 'NPM' => $this->commandExists('npm'), ]; $extensions = [ 'pdo_sqlite', 'gd', 'bcmath', 'ctype', 'fileinfo', 'json', 'mbstring', 'openssl', 'tokenizer', 'xml', ]; foreach ($extensions as $extension) { $requirements["PHP {$extension}"] = extension_loaded($extension); } $failed = array_filter($requirements, fn (bool $passed): bool => ! $passed); if ($failed !== []) { $this->newLine(); $this->error('✗ Missing system requirements:'); foreach (array_keys($failed) as $requirement) { $this->line(" • {$requirement}"); } $this->newLine(); $this->line('Please install the missing requirements and try again.'); return false; } return true; } private function commandExists(string $command): bool { return Process::run("which {$command} 2>/dev/null")->successful(); } /** @param array $config */ private function setupEnvironment(array $config): bool { // Create .env file if (! File::exists($this->envPath())) { if (! File::exists(base_path('.env.example'))) { return false; } File::copy(base_path('.env.example'), $this->envPath()); } // Generate app key if (! config('app.key')) { Artisan::call('key:generate', ['--force' => true]); } // Configure database return $this->configureDatabaseConnection($config['database']); } private function configureDatabaseConnection(string $type): bool { $envContent = File::get($this->envPath()); if ($type === 'sqlite') { if (! File::exists(database_path())) { File::makeDirectory(database_path(), 0755, true); } $dbPath = database_path('database.sqlite'); if (! File::exists($dbPath)) { File::put($dbPath, ''); } $config = [ 'DB_CONNECTION=sqlite', "DB_DATABASE={$dbPath}", 'DB_HOST=', 'DB_PORT=', 'DB_USERNAME=', 'DB_PASSWORD=', ]; } else { // For non-SQLite, we'll use the existing .env values or prompt if needed return true; } foreach ($config as $line) { [$key, $value] = explode('=', $line, 2); $envContent = preg_replace("/^{$key}=.*/m", $line, (string) $envContent); } File::put($this->envPath(), $envContent); return true; } private function installDependencies(): bool { $composerResult = Process::run('composer install --no-interaction --prefer-dist --optimize-autoloader'); if (! $composerResult->successful()) { $this->error('Composer install failed:'); $this->line($composerResult->errorOutput()); return false; } $npmResult = Process::run('npm ci --silent'); if (! $npmResult->successful()) { $this->error('NPM install failed:'); $this->line($npmResult->errorOutput()); return false; } return true; } private function setupDatabase(): bool { try { Artisan::call('migrate', ['--force' => true]); return true; } catch (Throwable $e) { $this->error('Database migration failed:'); $this->line($e->getMessage()); return false; } } private function buildAssets(): bool { $result = Process::run('npm run build'); if (! $result->successful()) { $this->error('Asset compilation failed:'); $this->line($result->errorOutput()); return false; } return true; } private function setupStorage(): bool { try { Artisan::call('storage:link', ['--force' => true]); return true; } catch (Throwable $e) { $this->error('Storage link failed:'); $this->line($e->getMessage()); return false; } } private function seedDemoData(): bool { try { // When using --force, we might be re-running installation // Use migrate:fresh to reset the database cleanly if ($this->option('force')) { Artisan::call('migrate:fresh', ['--force' => true]); } Artisan::call('db:seed', ['--force' => true]); return true; } catch (Throwable $e) { $this->error('Demo data seeding failed:'); $this->line($e->getMessage()); return false; } } private function createSystemAdministrator(): bool { try { // Check if system administrator already exists if (SystemAdministrator::query()->exists()) { $this->warn('A System Administrator already exists.'); $overwrite = confirm( label: 'Do you want to create another one?', default: false, hint: 'You can have multiple system administrators' ); if (! $overwrite) { return true; } } $name = text( label: 'System Administrator name', default: 'System Admin', required: true ); $email = text( label: 'System Administrator email address', default: 'sysadmin@relaticle.local', required: true, validate: fn (string $value): ?string => filter_var($value, FILTER_VALIDATE_EMAIL) ? null : 'Please enter a valid email address' ); // Check if email already exists if (SystemAdministrator::query()->where('email', $email)->exists()) { $this->error("A System Administrator with email '{$email}' already exists."); return false; } $password = text( label: 'System Administrator password (min. 8 characters)', default: 'password123', required: true, validate: fn (string $value): ?string => strlen($value) >= 8 ? null : 'Password must be at least 8 characters' ); // Create the system administrator SystemAdministrator::query()->create([ 'name' => $name, 'email' => $email, 'password' => bcrypt($password), 'email_verified_at' => now(), 'role' => SystemAdministratorRole::SuperAdministrator, ]); $this->info(' System Administrator created successfully!'); $this->line(" Email: {$email}"); $this->line(' Access panel at: /sysadmin'); return true; } catch (Throwable $e) { $this->error('System Administrator creation failed:'); $this->line($e->getMessage()); return false; } } /** @param array $config */ private function displaySuccessMessage(array $config): void { $this->newLine(); $this->info('🎉 Relaticle installed successfully!'); $this->newLine(); $this->line(' Start all development services:'); $this->line(' composer run dev'); $this->newLine(); $this->line(' Your application:'); $this->line(' http://localhost:8000'); if ($config['sysadmin_user'] ?? false) { $this->newLine(); $this->line(' System Admin panel:'); $this->line(' http://localhost:8000/sysadmin'); } if ($config['demo_data']) { $this->newLine(); $this->line(' Demo data included:'); $this->line(' • Sample companies and contacts'); $this->line(' • Example opportunities and tasks'); $this->line(' • Pre-configured custom fields'); } $this->newLine(); $this->line(' Development services:'); $this->line(' • Laravel development server'); $this->line(' • Vite asset watcher with HMR'); $this->line(' • Queue worker (Horizon)'); $this->line(' • Real-time logs (Pail)'); $this->newLine(); $this->line(' Documentation: https://relaticle.com/documentation'); $this->newLine(); $this->info('Happy CRM-ing! 🚀'); } private function envPath(): string { return $this->option('env-file') ?: base_path('.env'); } } ================================================ FILE: app/Contracts/User/CreatesNewSocialUsers.php ================================================ $input */ public function create(array $input): User; } ================================================ FILE: app/Data/SubscriberData.php ================================================ */ public ?array $tags = [], public bool $skip_confirmation = true, ) {} } ================================================ FILE: app/Enums/CreationSource.php ================================================ 'info', self::SYSTEM => 'warning', self::IMPORT => 'success', self::API => 'purple', self::MCP => 'gray', }; } public function getLabel(): string { return match ($this) { self::WEB => 'Web Interface', self::SYSTEM => 'System Process', self::IMPORT => 'Data Import', self::API => 'API', self::MCP => 'MCP Agent', }; } } ================================================ FILE: app/Enums/CustomFieldType.php ================================================ 'ICP', self::DOMAINS => 'Domains', self::LINKEDIN => 'LinkedIn', }; } public function getFieldType(): string { return match ($this) { self::ICP => CustomFieldType::TOGGLE->value, self::DOMAINS, self::LINKEDIN => CustomFieldType::LINK->value, }; } public function isSystemDefined(): bool { return match ($this) { self::DOMAINS => true, default => false, }; } public function isListToggleableHidden(): bool { return match ($this) { self::ICP, self::DOMAINS => false, default => true, }; } public function getDescription(): string { return match ($this) { self::ICP => 'Indicates whether this company is an Ideal Customer Profile', self::DOMAINS => 'Website domains of the company (e.g., example.com)', self::LINKEDIN => 'URL to the company\'s LinkedIn profile', }; } public function allowsMultipleValues(): bool { return match ($this) { self::DOMAINS => true, default => false, }; } public function isUniquePerEntityType(): bool { return match ($this) { self::DOMAINS => true, default => false, }; } } ================================================ FILE: app/Enums/CustomFields/CustomFieldTrait.php ================================================ name); } /** * Get the field type * * @return string The type of form field to use */ abstract public function getFieldType(): string; /** * Get whether this field is system defined * * System-defined fields cannot be deleted by users, only deactivated. * * @return bool True if the field is system defined */ public function isSystemDefined(): bool { return true; } /** * Get whether the field is hidden in list toggle * * Fields that aren't toggleable hidden are always shown in lists. * * @return bool True if the field can be hidden in list view */ public function isListToggleableHidden(): bool { return true; } /** * Get the field width * * @return CustomFieldWidth The width of the field or null for default width */ public function getWidth(): CustomFieldWidth { return CustomFieldWidth::_100; } /** * Get options for select fields * * @return array|null Array of options for select/multi-select fields or null if not applicable */ public function getOptions(): ?array { return null; } /** * Get field description (tooltip) * * @return string|null The field description or null if not provided */ public function getDescription(): ?string { return null; } /** * Get color mapping for select field options * * @return array|null Array of option => color mappings or null if not applicable */ public function getOptionColors(): ?array { return null; } /** * Get whether this field should have color options enabled * * @return bool True if color options should be enabled */ public function hasColorOptions(): bool { return $this->getOptionColors() !== null; } /** * Get whether this field allows multiple values * * @return bool True if multiple values are allowed */ public function allowsMultipleValues(): bool { return false; } /** * Get the maximum number of values allowed for this field * * @return int Maximum values (1 for single value fields) */ public function getMaxValues(): int { return $this->allowsMultipleValues() ? 5 : 1; } /** * Get whether this field value must be unique per entity type * * @return bool True if values must be unique across all records of this entity type */ public function isUniquePerEntityType(): bool { return false; } /** * Get complete field configuration * * @return array{ * name: string, * type: string, * systemDefined: bool, * listToggleableHidden: bool, * width: CustomFieldWidth|null, * options: array|null, * description: string|null, * optionColors: array|null, * hasColorOptions: bool, * allowsMultipleValues: bool * } The complete field configuration */ public function getConfiguration(): array { return [ 'name' => $this->getDisplayName(), 'type' => $this->getFieldType(), 'systemDefined' => $this->isSystemDefined(), 'listToggleableHidden' => $this->isListToggleableHidden(), 'width' => $this->getWidth(), 'options' => $this->getOptions(), 'description' => $this->getDescription(), 'optionColors' => $this->getOptionColors(), 'hasColorOptions' => $this->hasColorOptions(), 'allowsMultipleValues' => $this->allowsMultipleValues(), ]; } } ================================================ FILE: app/Enums/CustomFields/NoteField.php ================================================ CustomFieldType::RICH_EDITOR->value, }; } public function getDisplayName(): string { return match ($this) { self::BODY => 'Body', }; } public function isListToggleableHidden(): bool { return match ($this) { self::BODY => true, }; } } ================================================ FILE: app/Enums/CustomFields/OpportunityField.php ================================================ [ 'Prospecting', 'Qualification', 'Needs Analysis', 'Value Proposition', 'Id. Decision Makers', 'Perception Analysis', 'Proposal/Price Quote', 'Negotiation/Review', 'Closed Won', 'Closed Lost', ], default => null, }; } public function getFieldType(): string { return match ($this) { self::AMOUNT => CustomFieldType::CURRENCY->value, self::CLOSE_DATE => CustomFieldType::DATE->value, self::STAGE => CustomFieldType::SELECT->value, }; } public function getDisplayName(): string { return match ($this) { self::AMOUNT => 'Amount', self::CLOSE_DATE => 'Close Date', self::STAGE => 'Stage', }; } public function isListToggleableHidden(): bool { return false; } /** * Get color mapping for select field options * * 2024 Sophisticated Sales Journey - A unique emotional progression through the * pipeline using earth-inspired, professional colors that tell the story of * building energy, trust, and momentum from first contact to final outcome. * Based on latest color psychology and 2024 design sophistication trends. * * @return array|null Array of option => color mappings or null if not applicable */ public function getOptionColors(): ?array { return match ($this) { self::STAGE => [ 'Prospecting' => '#a5b4fc', // Misty Dawn - Soft exploration of possibilities 'Qualification' => '#1e40af', // Ocean Depth - Deep analytical thinking 'Needs Analysis' => '#0d9488', // Teal Understanding - Empathy & insight 'Value Proposition' => '#eab308', // Golden Clarity - Bright ideas & value 'Id. Decision Makers' => '#7c3aed', // Royal Authority - Power & influence 'Perception Analysis' => '#f59e0b', // Warm Amber - Comfortable evaluation 'Proposal/Price Quote' => '#1e293b', // Professional Navy - Serious business 'Negotiation/Review' => '#f97316', // Electric Coral - Dynamic energy 'Closed Won' => '#059669', // Victory Emerald - Success celebration 'Closed Lost' => '#6b7280', // Silver Acceptance - Respectful closure ], default => null, }; } } ================================================ FILE: app/Enums/CustomFields/PeopleField.php ================================================ CustomFieldType::EMAIL->value, self::PHONE_NUMBER => CustomFieldType::PHONE->value, self::JOB_TITLE => CustomFieldType::TEXT->value, self::LINKEDIN => CustomFieldType::LINK->value, }; } public function getDisplayName(): string { return match ($this) { self::EMAILS => 'Emails', self::PHONE_NUMBER => 'Phone Number', self::JOB_TITLE => 'Job Title', self::LINKEDIN => 'LinkedIn', }; } public function isListToggleableHidden(): bool { return match ($this) { self::JOB_TITLE, self::EMAILS => false, default => true, }; } public function isSystemDefined(): bool { return match ($this) { self::EMAILS => true, default => false, }; } public function allowsMultipleValues(): bool { return match ($this) { self::EMAILS => true, default => false, }; } public function isUniquePerEntityType(): bool { return match ($this) { self::EMAILS => true, default => false, }; } } ================================================ FILE: app/Enums/CustomFields/TaskField.php ================================================ 'Status', self::PRIORITY => 'Priority', self::DESCRIPTION => 'Description', self::DUE_DATE => 'Due Date', }; } /** * Get the field type * * @return string The type of form control to use */ public function getFieldType(): string { return match ($this) { self::STATUS, self::PRIORITY => CustomFieldType::SELECT->value, self::DESCRIPTION => CustomFieldType::RICH_EDITOR->value, self::DUE_DATE => CustomFieldType::DATE_TIME->value, }; } /** * Get whether this field is system defined * * @return bool True if the field is system defined */ public function isSystemDefined(): bool { return match ($this) { self::STATUS, self::PRIORITY => true, default => false, }; } /** * Get whether the field is hidden in list toggle * * @return bool True if the field can be hidden in list view */ public function isListToggleableHidden(): bool { return match ($this) { self::STATUS, self::PRIORITY, self::DUE_DATE => false, default => true, }; } /** * Get the field width * * @return CustomFieldWidth The width of the field or null for default width */ public function getWidth(): CustomFieldWidth { return match ($this) { self::STATUS, self::PRIORITY => CustomFieldWidth::_50, default => CustomFieldWidth::_100, }; } /** * Get available options for this field * * @return array|null Array of options for select/multi-select fields or null if not applicable */ public function getOptions(): ?array { return match ($this) { self::STATUS => [ 'To do', 'In progress', 'Done', ], self::PRIORITY => [ 'Low', 'Medium', 'High', ], default => null, }; } /** * Get color mapping for select field options * * 2024 sophisticated color psychology system - completely unique colors designed for * emotional resonance and semantic meaning. Based on latest color trends including * Digital Lavender, Mocha Mousse sophistication, and retro-futuristic aesthetics. * * @return array|null Array of option => color mappings or null if not applicable */ public function getOptionColors(): ?array { return match ($this) { self::STATUS => [ 'To do' => '#c4b5fd', // Soft Periwinkle - Digital Lavender inspired calm potential 'In progress' => '#0A80EA', // Professional Blue - Clear active progress state 'Done' => '#2A9764', // Success Green - Confident completion achievement ], self::PRIORITY => [ 'Low' => '#94a3b8', // Sage Whisper - Natural earth tone, subtle presence 'Medium' => '#d4a574', // Burnished Gold - Mocha Mousse warmth & confidence 'High' => '#dc2626', // Crimson Velvet - Sophisticated urgent command ], default => null, }; } /** * Get field description (tooltip) * * @return string The field description */ public function getDescription(): string { return match ($this) { self::STATUS => 'Current status of the task', self::PRIORITY => 'Priority level for this task', self::DESCRIPTION => 'Detailed description of what needs to be done', self::DUE_DATE => 'When this task needs to be completed by', }; } } ================================================ FILE: app/Enums/SocialiteProvider.php ================================================ label('AI Summary') ->icon(Heroicon::Sparkles) ->color('gray') ->modalHeading('AI Summary') ->modalDescription(fn (Model $record): string => 'AI-generated summary for this '.class_basename($record)) ->modalSubmitAction(false) ->modalCancelActionLabel('Close') ->modalContent(fn (Model $record): View => $this->getSummaryView($record)) ->registerModalActions([ $this->makeRegenerateAction(), $this->makeCopyAction(), ]); } private function makeRegenerateAction(): Action { return Action::make('regenerate') ->label('Regenerate') ->icon(Heroicon::ArrowPath) ->color('gray') ->action(fn (Model $record) => $this->regenerateSummary($record)); } private function makeCopyAction(): Action { return Action::make('copy') ->label('Copy') ->icon(Heroicon::Clipboard) ->color('gray') ->extraAttributes(function (Model $record): array { // @phpstan-ignore nullsafe.neverNull (defensive code for models without HasAiSummary trait) $summaryText = $this->getCachedSummary($record)?->summary ?? ''; return [ 'x-on:click' => 'window.navigator.clipboard.writeText('.json_encode($summaryText).'); $tooltip(\'Copied!\')', ]; }); } private function getSummaryView(Model $record): View { return view('filament.actions.ai-summary', [ 'summary' => $this->summaryService()->getSummary($record), ]); } private function getCachedSummary(Model $record): ?AiSummary { if (! method_exists($record, 'aiSummary')) { return null; } return $record->aiSummary; // @phpstan-ignore property.notFound } private function regenerateSummary(Model $record): void { try { $this->summaryService()->getSummary($record, regenerate: true); Notification::make() ->title('Summary regenerated') ->success() ->send(); } catch (Throwable $e) { Notification::make() ->title('Failed to regenerate summary') ->body($e->getMessage()) ->danger() ->send(); } } private function summaryService(): RecordSummaryService { return resolve(RecordSummaryService::class); } } ================================================ FILE: app/Filament/Components/Infolists/AvatarName.php ================================================ avatarPath = $path; return $this; } public function name(string $path): static { $this->namePath = $path; return $this; } public function avatarSize(string $size): static { $this->avatarSize = $size; return $this; } public function textSize(string $size): static { $this->textSize = $size; return $this; } public function square(): static { $this->circular = false; return $this; } public function circular(): static { $this->circular = true; return $this; } /** * @return array */ public function getState(): array { $record = $this->getRecord(); if (! $record instanceof Model) { return [ 'avatar' => null, 'name' => null, 'avatarSize' => $this->avatarSize, 'textSize' => $this->textSize, 'circular' => $this->circular, ]; } $avatarValue = in_array($this->avatarPath, [null, '', '0'], true) ? null : $this->resolvePath($record, $this->avatarPath); $nameValue = in_array($this->namePath, [null, '', '0'], true) ? null : $this->resolvePath($record, $this->namePath); return [ 'avatar' => $avatarValue, 'name' => $nameValue, 'avatarSize' => $this->avatarSize, 'textSize' => $this->textSize, 'circular' => $this->circular, ]; } private function resolvePath(mixed $record, string $path): mixed { return $this->evaluate(function () use ($record, $path) { $segments = explode('.', $path); $value = $record; foreach ($segments as $segment) { if ($value === null) { break; } $value = $value->{$segment} ?? null; } return $value; }); } } ================================================ FILE: app/Filament/Exports/BaseExporter.php ================================================ $columnMap * @param array $options */ public function __construct( Export $export, array $columnMap, array $options, ) { parent::__construct($export, $columnMap, $options); // Set the team_id on the export record if (Auth::guard('web')->check() && Auth::guard('web')->user()->currentTeam) { /** @var Team $currentTeam */ $currentTeam = Auth::guard('web')->user()->currentTeam; $export->team_id = $currentTeam->getKey(); } } /** * Make exports tenant-aware by scoping to the current team * * @param Builder $query * @return Builder */ public static function modifyQuery(Builder $query): Builder { if (Auth::guard('web')->check() && Auth::guard('web')->user()->currentTeam) { /** @var Team $currentTeam */ $currentTeam = Auth::guard('web')->user()->currentTeam; return $query->where('team_id', $currentTeam->getKey()); } return $query; } } ================================================ FILE: app/Filament/Exports/CompanyExporter.php ================================================ label('ID'), ExportColumn::make('name') ->label('Company Name'), ExportColumn::make('team.name') ->label('Team'), ExportColumn::make('accountOwner.name') ->label('Account Owner'), ExportColumn::make('creator.name') ->label('Created By'), ExportColumn::make('people_count') ->label('Number of People') ->state(fn (Company $company): int => $company->people()->count()), ExportColumn::make('opportunities_count') ->label('Number of Opportunities') ->state(fn (Company $company): int => $company->opportunities()->count()), ExportColumn::make('created_at') ->label('Created At') ->formatStateUsing(fn (Carbon $state): string => $state->format('Y-m-d H:i:s')), ExportColumn::make('updated_at') ->label('Updated At') ->formatStateUsing(fn (Carbon $state): string => $state->format('Y-m-d H:i:s')), ExportColumn::make('creation_source') ->label('Creation Source') ->formatStateUsing(fn (mixed $state): string => $state->value ?? (string) $state), // Add all custom fields automatically ...CustomFields::exporter()->forModel(self::getModel())->columns(), ]; } public static function getCompletedNotificationBody(Export $export): string { $successfulRows = $export->successful_rows ?? 0; $body = 'Your company export has completed and '.number_format($successfulRows).' '.str('row')->plural($successfulRows).' exported.'; if (($failedRowsCount = $export->getFailedRowsCount()) !== 0) { $body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.'; } return $body; } } ================================================ FILE: app/Filament/Exports/NoteExporter.php ================================================ label('ID'), ExportColumn::make('team.name'), ExportColumn::make('creator.name'), ExportColumn::make('creation_source') ->formatStateUsing(fn (mixed $state): string => $state->value ?? (string) $state), ExportColumn::make('title'), ExportColumn::make('created_at'), ExportColumn::make('updated_at'), ExportColumn::make('deleted_at'), ...CustomFields::exporter()->forModel(self::getModel())->columns(), ]; } public static function getCompletedNotificationBody(Export $export): string { $body = 'Your note export has completed and '.Number::format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.'; if (($failedRowsCount = $export->getFailedRowsCount()) !== 0) { $body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.'; } return $body; } } ================================================ FILE: app/Filament/Exports/OpportunityExporter.php ================================================ label('ID'), ExportColumn::make('name') ->label('Opportunity Name'), ExportColumn::make('company.name') ->label('Company'), ExportColumn::make('contact.name') ->label('Contact Person'), ExportColumn::make('team.name') ->label('Team'), ExportColumn::make('creator.name') ->label('Created By'), ExportColumn::make('notes_count') ->label('Number of Notes') ->state(fn (Opportunity $opportunity): int => $opportunity->notes()->count()), ExportColumn::make('tasks_count') ->label('Number of Tasks') ->state(fn (Opportunity $opportunity): int => $opportunity->tasks()->count()), ExportColumn::make('created_at') ->label('Created At') ->formatStateUsing(fn (Carbon $state): string => $state->format('Y-m-d H:i:s')), ExportColumn::make('updated_at') ->label('Updated At') ->formatStateUsing(fn (Carbon $state): string => $state->format('Y-m-d H:i:s')), ExportColumn::make('creation_source') ->label('Creation Source') ->formatStateUsing(fn (mixed $state): string => $state->value ?? (string) $state), // Add all custom fields automatically ...CustomFields::exporter()->forModel(self::getModel())->columns(), ]; } public static function getCompletedNotificationBody(Export $export): string { $successfulRows = $export->successful_rows ?? 0; $body = 'Your opportunity export has completed and '.number_format($successfulRows).' '.str('row')->plural($successfulRows).' exported.'; if (($failedRowsCount = $export->getFailedRowsCount()) !== 0) { $body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.'; } return $body; } } ================================================ FILE: app/Filament/Exports/PeopleExporter.php ================================================ label('ID'), ExportColumn::make('team.name'), ExportColumn::make('creator.name'), ExportColumn::make('creation_source') ->label('Creation Source') ->formatStateUsing(fn (mixed $state): string => $state->value ?? (string) $state), ExportColumn::make('company.name'), ExportColumn::make('name'), ExportColumn::make('created_at'), ExportColumn::make('updated_at'), ExportColumn::make('deleted_at'), ...CustomFields::exporter()->forModel(self::getModel())->columns(), ]; } public static function getCompletedNotificationBody(Export $export): string { $successfulRows = $export->successful_rows ?? 0; $body = 'Your people export has completed and '.Number::format($successfulRows).' '.str('row')->plural($successfulRows).' exported.'; if (($failedRowsCount = $export->getFailedRowsCount()) !== 0) { $body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.'; } return $body; } } ================================================ FILE: app/Filament/Exports/TaskExporter.php ================================================ label('ID'), ExportColumn::make('team.name'), ExportColumn::make('creator.name'), ExportColumn::make('creation_source') ->formatStateUsing(fn (mixed $state): string => $state->value ?? (string) $state), ExportColumn::make('title'), ExportColumn::make('created_at'), ExportColumn::make('updated_at'), ...CustomFields::exporter()->forModel(self::getModel())->columns(), ]; } public static function getCompletedNotificationBody(Export $export): string { $successfulRows = $export->successful_rows ?? 0; $body = 'Your task export has completed and '.Number::format($successfulRows).' '.str('row')->plural($successfulRows).' exported.'; if (($failedRowsCount = $export->getFailedRowsCount()) !== 0) { $body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.'; } return $body; } } ================================================ FILE: app/Filament/Pages/AccessTokens.php ================================================ components([ Livewire::make(CreateAccessToken::class), Livewire::make(ManageAccessTokens::class), ]); } public static function getLabel(): string { return __('access-tokens.title'); } } ================================================ FILE: app/Filament/Pages/Auth/Login.php ================================================ components([ Html::make(fn (): string => $this->getInvitationContentHtml()), RenderHook::make(PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE), $this->getFormContentComponent(), $this->getMultiFactorChallengeFormContentComponent(), RenderHook::make(PanelsRenderHook::AUTH_LOGIN_FORM_AFTER), ]); } protected function getAuthenticateFormAction(): Action { return Action::make('authenticate') ->size(Size::Medium) ->label(__('filament-panels::auth/pages/login.form.actions.authenticate.label')) ->submit('authenticate'); } } ================================================ FILE: app/Filament/Pages/Auth/Register.php ================================================ components([ Html::make(fn (): string => $this->getInvitationContentHtml()), RenderHook::make(PanelsRenderHook::AUTH_REGISTER_FORM_BEFORE), $this->getFormContentComponent(), RenderHook::make(PanelsRenderHook::AUTH_REGISTER_FORM_AFTER), ]); } protected function getEmailFormComponent(): TextInput { return TextInput::make('email') ->label(__('filament-panels::auth/pages/register.form.email.label')) ->email() ->rules(['email:rfc,dns']) ->required() ->maxLength(255) ->unique($this->getUserModel()); } public function getRegisterFormAction(): Action { return Action::make('register') ->size(Size::Medium) ->label(__('filament-panels::auth/pages/register.form.actions.register.label')) ->submit('register'); } /** * @param array $data */ protected function handleRegistration(array $data): Model { $user = $this->getUserModel()::query()->create($data); $invitation = $this->getTeamInvitationFromSession(); if ($invitation && $invitation->email === $data['email']) { $user->forceFill(['email_verified_at' => now()])->save(); } return $user; } } ================================================ FILE: app/Filament/Pages/CreateTeam.php ================================================ getAppUrl(), PHP_URL_HOST); return $schema ->components([ TextInput::make('name') ->required() ->maxLength(255) ->placeholder('Acme Corp') ->autofocus() ->live(onBlur: true) ->afterStateUpdated(function (Get $get, Set $set, ?string $state): void { if ($get('slug_auto_generated') === true || blank($get('slug'))) { $set('slug', Str::slug($state ?? '')); $set('slug_auto_generated', true); } }), TextInput::make('slug') ->required() ->maxLength(255) ->rules([new ValidTeamSlug]) ->unique(Team::class, 'slug') ->prefix("{$appHost}/") ->helperText('Only lowercase letters, numbers, and hyphens are allowed.') ->live(onBlur: true) ->afterStateUpdated(function (Set $set): void { $set('slug_auto_generated', false); }), Hidden::make('slug_auto_generated') ->default(true) ->dehydrated(false), ]); } #[Override] protected function getRedirectUrl(): string { return CompanyResource::getUrl('index', ['tenant' => $this->tenant]); } #[Override] protected function handleRegistration(array $data): Model { /** @var User $user */ $user = auth('web')->user(); return resolve(CreateTeamAction::class)->create($user, $data); } } ================================================ FILE: app/Filament/Pages/EditProfile.php ================================================ components([ Livewire::make(UpdateProfileInformation::class), Livewire::make(UpdatePassword::class), Livewire::make(LogoutOtherBrowserSessions::class), Livewire::make(DeleteAccount::class), ]); } public static function getLabel(): string { return __('profile.edit_profile'); } } ================================================ FILE: app/Filament/Pages/EditTeam.php ================================================ tenant; return $schema->components([ Livewire::make(UpdateTeamName::class) ->data(['team' => $tenant]), Livewire::make(AddTeamMember::class) ->data(['team' => $tenant]), Livewire::make(PendingTeamInvitations::class) ->data(['team' => $tenant]), Livewire::make(TeamMembers::class) ->data(['team' => $tenant]), Livewire::make(DeleteTeam::class) ->visible(fn (): bool => $tenant->isPersonalTeam() === false) ->data(['team' => $tenant]), ]); } public static function getLabel(): string { return __('teams.edit_team'); } } ================================================ FILE: app/Filament/Pages/OpportunitiesBoard.php ================================================ stageCustomField(); $valueColumn = $stageField->getValueColumn(); $customFields = CustomFields::infolist() ->forModel(Opportunity::class) ->only([OpportunityCustomField::AMOUNT, OpportunityCustomField::CLOSE_DATE]) ->hiddenLabels() ->visibleWhenFilled() ->withoutSections() ->values() ->keyBy(fn (mixed $field): string => $field->getName()); return $board ->query( Opportunity::query() ->leftJoin('custom_field_values as cfv', function (JoinClause $join) use ($stageField): void { $join->on('opportunities.id', '=', 'cfv.entity_id') ->where('cfv.custom_field_id', '=', $stageField->getKey()); }) ->select('opportunities.*', 'cfv.'.$valueColumn) ->with(['company', 'contact']) ) ->recordTitleAttribute('name') ->columnIdentifier($valueColumn) ->positionIdentifier('order_column') ->searchable(['name']) ->columns($this->getColumns()) ->cardSchema(function (Schema $schema) use ($customFields): Schema { $amountField = $customFields->get('custom_fields.'.OpportunityCustomField::AMOUNT->value) ?->visible(fn (?string $state): bool => filled($state)) ->badge() ->color('success') ->icon(Heroicon::OutlinedCurrencyDollar) ->grow(false) ->hiddenLabel(); $closeDateField = $customFields->get('custom_fields.'.OpportunityCustomField::CLOSE_DATE->value) ?->visible(fn (?string $state): bool => filled($state)) ->badge() ->color('gray') ->icon(Heroicon::OutlinedCalendar) ->grow(false) ->hiddenLabel() ->formatStateUsing(fn (?string $state): string => $this->formatCloseDateBadge($state)); return $schema ->components([ CardFlex::make([ TextEntry::make('company.name') ->hiddenLabel() ->visible(fn (?string $state): bool => filled($state)) ->icon(Heroicon::OutlinedBuildingOffice) ->color('gray') ->size(TextSize::ExtraSmall) ->grow(), ]), CardFlex::make([ $amountField, $closeDateField, ])->align('center'), ]); }) ->columnActions([ CreateAction::make() ->label('Add Opportunity') ->icon('heroicon-o-plus') ->iconButton() ->modalWidth(Width::Large) ->slideOver(false) ->model(Opportunity::class) ->schema(fn (Schema $schema): Schema => $schema ->components([ TextInput::make('name') ->required() ->placeholder('Enter opportunity title') ->columnSpanFull(), Select::make('company_id') ->relationship('company', 'name') ->searchable() ->preload(), Select::make('contact_id') ->relationship('contact', 'name') ->searchable() ->preload(), CustomFields::form() ->except([OpportunityCustomField::STAGE]) ->build() ->columnSpanFull() ->columns(1), ]) ->columns(2)) ->using(function (array $data, CreateAction $action): Opportunity { /** @var Team $currentTeam */ $currentTeam = Auth::guard('web')->user()->currentTeam; /** @var Opportunity $opportunity */ $opportunity = $currentTeam->opportunities()->create($data); $columnId = $action->getArguments()['column'] ?? null; if (filled($columnId)) { $opportunity->saveCustomFieldValue($this->stageCustomField(), $columnId); $opportunity->order_column = (float) $this->getBoardPositionInColumn($columnId); $opportunity->saveQuietly(); } return $opportunity; }), ]) ->cardActions([ Action::make('edit') ->label('Edit') ->slideOver() ->modalWidth(Width::ExtraLarge) ->icon('heroicon-o-pencil-square') ->schema(OpportunityForm::get(...)) ->fillForm(fn (Opportunity $record): array => [ 'name' => $record->name, 'company_id' => $record->company_id, 'contact_id' => $record->contact_id, ]) ->action(function (Opportunity $record, array $data): void { $record->update($data); }), Action::make('delete') ->label('Delete') ->icon('heroicon-o-trash') ->color('danger') ->requiresConfirmation() ->action(function (Opportunity $record): void { $record->delete(); }), ]) ->filters([ SelectFilter::make('companies') ->label('Company') ->relationship('company', 'name') ->multiple(), SelectFilter::make('contacts') ->label('Contact') ->relationship('contact', 'name') ->multiple(), ]) ->filtersFormWidth(Width::Medium) ->headerToolbar(); } /** * Move card to new position using DecimalPosition service. * * Overrides the default Flowforge implementation to properly handle * custom field columns which are stored in a polymorphic table. * * @throws Throwable */ public function moveCard( string $cardId, string $targetColumnId, ?string $afterCardId = null, ?string $beforeCardId = null ): void { $board = $this->getBoard(); $query = $board->getQuery(); throw_unless($query instanceof Builder, InvalidArgumentException::class, 'Board query not available'); $card = (clone $query)->find($cardId); throw_unless($card, InvalidArgumentException::class, "Card not found: {$cardId}"); $newPosition = $this->calculatePositionBetweenCards($afterCardId, $beforeCardId, $targetColumnId); DB::transaction(function () use ($card, $board, $targetColumnId, $newPosition): void { $columnIdentifier = $board->getColumnIdentifierAttribute(); $columnValue = $this->resolveStatusValue($card, $columnIdentifier, $targetColumnId); $positionIdentifier = $board->getPositionIdentifierAttribute(); $card->update([$positionIdentifier => $newPosition]); /** @var Opportunity $card */ $card->saveCustomFieldValue($this->stageCustomField(), $columnValue); }); $this->dispatch('kanban-card-moved', [ 'cardId' => $cardId, 'columnId' => $targetColumnId, 'position' => $newPosition, ]); } /** * Get columns for the board. * * @return array * * @throws Exception */ private function getColumns(): array { return $this->stages()->map(fn (array $stage): Column => Column::make((string) $stage['id']) ->color($stage['color']) ->label($stage['name']) )->toArray(); } private function formatCloseDateBadge(?string $state): string { if (blank($state)) { return ''; } $date = Date::parse($state); return match (true) { $date->isPast() => $date->format('M j').' (Overdue)', $date->isToday() => 'Closes Today', $date->isTomorrow() => 'Closes Tomorrow', default => $date->format('M j'), }; } private function stageCustomField(): ?CustomField { /** @var CustomField|null */ return once(fn () => CustomField::query() ->forEntity(Opportunity::class) ->where('code', OpportunityCustomField::STAGE) ->first()); } /** * @return Collection */ private function stages(): Collection { $field = $this->stageCustomField(); if (! $field instanceof CustomField) { return collect(); } $colorsEnabled = $field->settings->enable_option_colors ?? false; return $field->options->map(fn (CustomFieldOption $option): array => [ 'id' => $option->getKey(), 'custom_field_id' => $option->getAttribute('custom_field_id'), 'name' => $option->getAttribute('name'), 'color' => $colorsEnabled ? ($option->settings->color ?? 'gray') : 'gray', ]); } public static function canAccess(): bool { return (new self)->stageCustomField() instanceof CustomField; } } ================================================ FILE: app/Filament/Pages/TasksBoard.php ================================================ statusCustomField(); $valueColumn = $statusField->getValueColumn(); $customFields = CustomFields::infolist() ->forModel(Task::class) ->only(['description', 'priority', 'due_date']) ->hiddenLabels() ->visibleWhenFilled() ->withoutSections() ->values() ->keyBy(fn (mixed $field): string => $field->getName()); return $board ->query( Task::query() ->leftJoin('custom_field_values as cfv', function (JoinClause $join) use ($statusField): void { $join->on('tasks.id', '=', 'cfv.entity_id') ->where('cfv.custom_field_id', '=', $statusField->getKey()); }) ->with(['assignees']) ->select('tasks.*', 'cfv.'.$valueColumn) ) ->recordTitleAttribute('title') ->columnIdentifier($valueColumn) ->positionIdentifier('order_column') ->searchable(['title']) ->columns($this->getColumns()) ->cardSchema(function (Schema $schema) use ($customFields): Schema { $descriptionCustomField = $customFields->get('custom_fields.description') ?->columnSpanFull() ->visible(fn (?string $state): bool => filled($state)) ->formatStateUsing(fn (string $state): string => str($state)->stripTags()->limit()->toString()) ->extraAttributes(['class' => 'mb-4']); $priorityField = $customFields->get('custom_fields.priority') ?->visible(fn (?string $state): bool => filled($state)) ->grow(false) ->badge() ->hiddenLabel() ->icon('heroicon-o-flag'); $dueDateField = $customFields->get('custom_fields.due_date') ?->visible(fn (?string $state): bool => filled($state)) ->badge() ->color('gray') ->icon('heroicon-o-calendar') ->grow(false) ->hiddenLabel() ->formatStateUsing(fn (?string $state): string => $this->formatDueDateBadge($state)); return $schema ->inline() ->gap(false) ->components([ $descriptionCustomField, CardFlex::make([ $priorityField, $dueDateField, ImageEntry::make('assignees.profile_photo_url') ->hiddenLabel() ->alignLeft() ->imageHeight(20) ->circular() ->visible(fn (?string $state): bool => filled($state)) ->stacked(), ])->align('center'), ]); }) ->columnActions([ CreateAction::make() ->label('Add Task') ->icon('heroicon-o-plus') ->iconButton() ->modalWidth(Width::TwoExtraLarge) ->slideOver(false) ->model(Task::class) ->schema(fn (Schema $schema): Schema => TaskForm::get($schema, ['status'])) ->using(function (array $data, CreateAction $action): Task { /** @var Team $currentTeam */ $currentTeam = Auth::guard('web')->user()->currentTeam; /** @var Task $task */ $task = $currentTeam->tasks()->create($data); $columnId = $action->getArguments()['column'] ?? null; if (filled($columnId)) { $task->saveCustomFieldValue($this->statusCustomField(), $columnId); $task->order_column = (float) $this->getBoardPositionInColumn($columnId); $task->saveQuietly(); } return $task; }), ]) ->cardActions([ Action::make('edit') ->label('Edit') ->slideOver() ->modalWidth(Width::ThreeExtraLarge) ->icon('heroicon-o-pencil-square') ->schema(fn (Schema $schema): Schema => TaskForm::get($schema)) ->fillForm(fn (Task $record): array => [ 'title' => $record->title, ]) ->action(function (Task $record, array $data): void { $record->update($data); }), Action::make('delete') ->label('Delete') ->icon('heroicon-o-trash') ->color('danger') ->requiresConfirmation() ->action(function (Task $record): void { $record->delete(); }), ]) ->filters([ SelectFilter::make('assignees') ->label('Assignee') ->relationship('assignees', 'name') ->multiple(), ]) ->filtersFormWidth(Width::Medium) ->headerToolbar(); } /** * Move card to new position using DecimalPosition service. * * Overrides the default Flowforge implementation to properly handle * custom field columns which are stored in a polymorphic table. * * @throws Throwable */ public function moveCard( string $cardId, string $targetColumnId, ?string $afterCardId = null, ?string $beforeCardId = null ): void { $board = $this->getBoard(); $query = $board->getQuery(); throw_unless($query instanceof Builder, InvalidArgumentException::class, 'Board query not available'); /** @var Task|null $card */ $card = (clone $query)->with(['assignees'])->find($cardId); throw_unless($card, InvalidArgumentException::class, "Card not found: {$cardId}"); // Calculate new position using DecimalPosition (via v3 trait helper) $newPosition = $this->calculatePositionBetweenCards($afterCardId, $beforeCardId, $targetColumnId); // Use transaction for data consistency DB::transaction(function () use ($card, $board, $targetColumnId, $newPosition): void { $columnIdentifier = $board->getColumnIdentifierAttribute(); $columnValue = $this->resolveStatusValue($card, $columnIdentifier, $targetColumnId); $positionIdentifier = $board->getPositionIdentifierAttribute(); $card->update([$positionIdentifier => $newPosition]); $card->saveCustomFieldValue($this->statusCustomField(), $columnValue); }); // Emit success event after successful transaction $this->dispatch('kanban-card-moved', [ 'cardId' => $cardId, 'columnId' => $targetColumnId, 'position' => $newPosition, ]); } /** * Get columns for the board. * * @return array * * @throws Exception */ private function getColumns(): array { return $this->statuses()->map(fn (array $status): Column => Column::make((string) $status['id']) ->color($status['color']) ->label($status['name']) )->toArray(); } /** * Format a due date value for badge display. * * Shows relative dates (Today/Tomorrow) for immediate items, * and full dates with year for all other cases. */ private function formatDueDateBadge(?string $state): string { if (blank($state)) { return ''; } $date = Date::parse($state); return match (true) { $date->isPast() => $date->format('M j, Y').' (Overdue)', $date->isToday() => 'Due Today', $date->isTomorrow() => 'Due Tomorrow', default => $date->format('M j, Y'), }; } private function statusCustomField(): ?CustomField { /** @var CustomField|null */ return once(fn () => CustomField::query() ->forEntity(Task::class) ->where('code', TaskCustomField::STATUS) ->first()); } /** * @return Collection */ private function statuses(): Collection { $field = $this->statusCustomField(); if (! $field instanceof CustomField) { return collect(); } // Check if color options are enabled for this field $colorsEnabled = $field->settings->enable_option_colors ?? false; return $field->options->map(fn (CustomFieldOption $option): array => [ 'id' => $option->getKey(), 'custom_field_id' => $option->getAttribute('custom_field_id'), 'name' => $option->getAttribute('name'), 'color' => $colorsEnabled ? ($option->settings->color ?? 'gray') : 'gray', ]); } public static function canAccess(): bool { return (new self)->statusCustomField() instanceof CustomField; } } ================================================ FILE: app/Filament/Resources/CompanyResource/Pages/ListCompanies.php ================================================ */ protected static string $resource = CompanyResource::class; /** * Get the actions available on the resource index header. */ #[Override] protected function getHeaderActions(): array { return [ ActionGroup::make([ Action::make('import') ->label('Import companies') ->icon('heroicon-o-arrow-up-tray') ->url(ImportCompanies::getUrl()), ExportAction::make()->exporter(CompanyExporter::class), ]) ->icon('heroicon-o-arrows-up-down') ->color('gray') ->button() ->label('Import / Export') ->size(Size::Small), CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]; } } ================================================ FILE: app/Filament/Resources/CompanyResource/Pages/ViewCompany.php ================================================ icon('heroicon-o-pencil-square')->label('Edit'), ActionGroup::make([ ActionGroup::make([ Action::make('copyPageUrl') ->label('Copy page URL') ->icon('heroicon-o-clipboard-document') ->action(function (Company $record): void { $jsUrl = Js::from(CompanyResource::getUrl('view', [$record])); $this->js(" navigator.clipboard.writeText({$jsUrl}).then(() => { new FilamentNotification() .title('URL copied to clipboard') .success() .send() }) "); }), Action::make('copyRecordId') ->label('Copy record ID') ->icon('heroicon-o-clipboard-document') ->action(function (Company $record): void { $jsId = Js::from((string) $record->getKey()); $this->js(" navigator.clipboard.writeText({$jsId}).then(() => { new FilamentNotification() .title('Record ID copied to clipboard') .success() .send() }) "); }), ])->dropdown(false), DeleteAction::make(), ]), ]; } public function infolist(Schema $schema): Schema { return $schema ->schema([ Flex::make([ Section::make([ Flex::make([ AvatarName::make('logo') ->avatar('logo') ->name('name') ->avatarSize('lg') ->textSize('xl') ->square() ->label(''), AvatarName::make('creator') ->avatar('creator.avatar') ->name('creator.name') ->avatarSize('sm') ->textSize('sm') // Default text size for creator ->circular() ->label('Created By'), AvatarName::make('accountOwner') ->avatar('accountOwner.avatar') ->name('accountOwner.name') ->avatarSize('sm') ->textSize('sm') // Default text size for account owner ->circular() ->label('Account Owner'), ]), CustomFields::infolist()->forSchema($schema)->build(), ]), Section::make([ TextEntry::make('created_at') ->label('Created Date') ->icon('heroicon-o-clock') ->dateTime(), TextEntry::make('updated_at') ->label('Last Updated') ->icon('heroicon-o-clock') ->dateTime(), ])->grow(false), ])->columnSpan('full'), ]); } public function getRelationManagers(): array { return [ PeopleRelationManager::class, TasksRelationManager::class, NotesRelationManager::class, ]; } } ================================================ FILE: app/Filament/Resources/CompanyResource/RelationManagers/NotesRelationManager.php ================================================ recordTitleAttribute('title') ->columns([ TextColumn::make('title'), TextColumn::make('people.name') ->label('People') ->badge() ->color('primary') ->searchable(), TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), AttachAction::make(), ]) ->recordActions([ ActionGroup::make([ EditAction::make(), DetachAction::make(), DeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ DetachBulkAction::make(), DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/CompanyResource/RelationManagers/PeopleRelationManager.php ================================================ components([ TextInput::make('name') ->required() ->maxLength(255) ->columnSpanFull(), CustomFields::form()->build() ->columnSpanFull() ->columns(), ]); } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name'), ...CustomFields::table()->forModel($table->getModel())->columns(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]) ->recordActions([ ActionGroup::make([ EditAction::make(), DeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/CompanyResource/RelationManagers/TasksRelationManager.php ================================================ recordTitleAttribute('title') ->columns([ TextColumn::make('title'), TextColumn::make('assignees.name') ->label('Assignee') ->badge() ->color('primary') ->searchable(), TextColumn::make('people.name') ->label('People') ->badge() ->color('primary') ->searchable(), TextColumn::make('created_at') ->label('Created At') ->dateTime() ->sortable() ->toggleable(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), AttachAction::make(), ]) ->recordActions([ ActionGroup::make([ EditAction::make(), DetachAction::make(), DeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/CompanyResource.php ================================================ components([ TextInput::make('name') ->required(), Select::make('account_owner_id') ->relationship('accountOwner', 'name') ->label('Account Owner') ->nullable() ->preload() ->searchable(), CustomFields::form()->build()->columnSpanFull()->columns(1), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Company') ->searchable() ->sortable() ->view('filament.tables.columns.logo-name-column'), TextColumn::make('accountOwner.name') ->label('Account Owner') ->searchable() ->sortable() ->toggleable(), TextColumn::make('creator.name') ->label('Created By') ->searchable() ->sortable() ->toggleable() ->getStateUsing(fn (Company $record): string => $record->created_by), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable() ->toggledHiddenByDefault(), TextColumn::make('created_at') ->label('Creation Date') ->dateTime() ->searchable() ->sortable() ->toggleable(), TextColumn::make('updated_at') ->label('Last Update') ->since() ->searchable() ->sortable() ->toggleable(), ]) ->defaultSort('created_at', 'desc') ->filters([ SelectFilter::make('creation_source') ->label('Creation Source') ->options(CreationSource::class) ->multiple(), TrashedFilter::make(), ]) ->recordActions([ ActionGroup::make([ ViewAction::make(), EditAction::make(), RestoreAction::make(), DeleteAction::make(), ForceDeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ ExportBulkAction::make() ->exporter(CompanyExporter::class), DeleteBulkAction::make(), ForceDeleteBulkAction::make(), RestoreBulkAction::make(), ]), ]); } public static function getPages(): array { return [ 'index' => ListCompanies::route('/'), 'view' => ViewCompany::route('/{record}'), ]; } public static function getGloballySearchableAttributes(): array { return ['name']; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with(['team', 'customFieldValues.customField.options']) ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } } ================================================ FILE: app/Filament/Resources/NoteResource/Forms/NoteForm.php ================================================ $excludeFields Fields to exclude from the form. * @return Schema The modified form instance with the schema applied. * * @throws \Exception */ public static function get(Schema $schema, array $excludeFields = []): Schema { $components = [ TextInput::make('title') ->label('Title') ->rules(['max:255']) ->columnSpanFull() ->required(), ]; if (! in_array('companies', $excludeFields)) { $components[] = Select::make('companies') ->label('Companies') ->multiple() ->relationship('companies', 'name'); } if (! in_array('people', $excludeFields)) { $components[] = Select::make('people') ->label('People') ->multiple() ->relationship('people', 'name') ->nullable(); } $components[] = CustomFields::form()->build() ->columnSpanFull() ->columns(1); return $schema ->components($components) ->columns(2); } } ================================================ FILE: app/Filament/Resources/NoteResource/Pages/ManageNotes.php ================================================ label('Import notes') ->icon('heroicon-o-arrow-up-tray') ->url(ImportNotes::getUrl()), ExportAction::make()->exporter(NoteExporter::class), ]) ->icon('heroicon-o-arrows-up-down') ->color('gray') ->button() ->label('Import / Export') ->size(Size::Small), CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]; } } ================================================ FILE: app/Filament/Resources/NoteResource.php ================================================ columns([ TextColumn::make('title') ->searchable(), TextColumn::make('companies.name') ->label('Companies') ->toggleable(), TextColumn::make('people.name') ->label('People') ->toggleable(), TextColumn::make('creator.name') ->label('Created By') ->searchable() ->sortable() ->toggleable() ->getStateUsing(fn (Note $record): string => $record->created_by), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable() ->toggledHiddenByDefault(), TextColumn::make('created_at') ->label('Created At') ->dateTime('Y-m-d H:i:s') ->sortable() ->toggleable(), TextColumn::make('updated_at') ->label('Updated At') ->dateTime('Y-m-d H:i:s') ->sortable() ->toggleable() ->toggledHiddenByDefault(), ]) ->defaultSort('created_at', 'desc') ->filters([ SelectFilter::make('creation_source') ->label('Creation Source') ->options(CreationSource::class) ->multiple(), TrashedFilter::make(), ]) ->recordActions([ ActionGroup::make([ EditAction::make(), DeleteAction::make(), ForceDeleteAction::make(), RestoreAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ ExportBulkAction::make() ->exporter(NoteExporter::class), DeleteBulkAction::make(), ForceDeleteBulkAction::make(), RestoreBulkAction::make(), ]), ]); } #[Override] public static function getPages(): array { return [ 'index' => ManageNotes::route('/'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with(['team', 'customFieldValues.customField.options']) ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } } ================================================ FILE: app/Filament/Resources/OpportunityResource/Forms/OpportunityForm.php ================================================ components([ TextInput::make('name') ->required() ->placeholder('Enter opportunity title') ->columnSpanFull(), Select::make('company_id') ->relationship('company', 'name') ->searchable() ->preload() ->columnSpan(2), Select::make('contact_id') ->relationship('contact', 'name') ->searchable() ->preload() ->columnSpan(2), CustomFields::form()->build()->columnSpanFull()->columns(1), ]) ->columns(4); } } ================================================ FILE: app/Filament/Resources/OpportunityResource/Pages/ListOpportunities.php ================================================ label('Import opportunities') ->icon('heroicon-o-arrow-up-tray') ->url(ImportOpportunities::getUrl()), ExportAction::make()->exporter(OpportunityExporter::class), ]) ->icon('heroicon-o-arrows-up-down') ->color('gray') ->button() ->label('Import / Export') ->size(Size::Small), CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]; } } ================================================ FILE: app/Filament/Resources/OpportunityResource/Pages/ViewOpportunity.php ================================================ icon('heroicon-o-pencil-square')->label('Edit'), ActionGroup::make([ ActionGroup::make([ Action::make('copyPageUrl') ->label('Copy page URL') ->icon('heroicon-o-clipboard-document') ->action(function (Opportunity $record): void { $jsUrl = Js::from(OpportunityResource::getUrl('view', [$record])); $this->js(" navigator.clipboard.writeText({$jsUrl}).then(() => { new FilamentNotification() .title('URL copied to clipboard') .success() .send() }) "); }), Action::make('copyRecordId') ->label('Copy record ID') ->icon('heroicon-o-clipboard-document') ->action(function (Opportunity $record): void { $jsId = Js::from((string) $record->getKey()); $this->js(" navigator.clipboard.writeText({$jsId}).then(() => { new FilamentNotification() .title('Record ID copied to clipboard') .success() .send() }) "); }), ])->dropdown(false), DeleteAction::make(), ]), ]; } public function infolist(Schema $schema): Schema { return $schema->schema([ Section::make()->schema([ Flex::make([ TextEntry::make('name')->grow(true), TextEntry::make('company.name') ->label('Company') ->color('primary') ->url(fn (Opportunity $record): ?string => $record->company ? CompanyResource::getUrl('view', [$record->company]) : null) ->grow(false), TextEntry::make('contact.name') ->label('Point of Contact') ->color('primary') ->url(fn (Opportunity $record): ?string => $record->contact ? PeopleResource::getUrl('view', [$record->contact]) : null) ->grow(false), ]), CustomFields::infolist()->forSchema($schema)->build()->columnSpanFull(), ]) ->columnSpanFull(), ]); } } ================================================ FILE: app/Filament/Resources/OpportunityResource/RelationManagers/NotesRelationManager.php ================================================ recordTitleAttribute('title') ->columns([ TextColumn::make('title'), ...CustomFields::table()->forModel($table->getModel())->columns(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), AttachAction::make(), ]) ->recordActions([ ActionGroup::make([ EditAction::make(), DetachAction::make(), DeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ DetachBulkAction::make(), DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/OpportunityResource/RelationManagers/TasksRelationManager.php ================================================ recordTitleAttribute('title') ->columns([ TextColumn::make('title'), ...CustomFields::table()->forModel($table->getModel())->columns(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), AttachAction::make(), ]) ->recordActions([ ActionGroup::make([ EditAction::make(), DetachAction::make(), DeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ DetachBulkAction::make(), DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/OpportunityResource.php ================================================ columns([ TextColumn::make('name') ->searchable(), TextColumn::make('creator.name') ->label('Created By') ->searchable() ->sortable() ->toggleable() ->getStateUsing(fn (Opportunity $record): string => $record->created_by), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('updated_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->defaultSort('created_at', 'desc') ->filters([ SelectFilter::make('creation_source') ->label('Creation Source') ->options(CreationSource::class) ->multiple(), TrashedFilter::make(), ]) ->recordActions([ ActionGroup::make([ ViewAction::make(), EditAction::make(), RestoreAction::make(), DeleteAction::make(), ForceDeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ ExportBulkAction::make() ->exporter(OpportunityExporter::class), RestoreBulkAction::make(), DeleteBulkAction::make(), ForceDeleteBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ TasksRelationManager::class, NotesRelationManager::class, ]; } #[Override] public static function getPages(): array { return [ 'index' => ListOpportunities::route('/'), 'view' => ViewOpportunity::route('/{record}'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with(['team', 'customFieldValues.customField.options']) ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } } ================================================ FILE: app/Filament/Resources/PeopleResource/Pages/ListPeople.php ================================================ label('Import people') ->icon('heroicon-o-arrow-up-tray') ->url(ImportPeople::getUrl()), ExportAction::make()->exporter(PeopleExporter::class), ]) ->icon('heroicon-o-arrows-up-down') ->color('gray') ->button() ->label('Import / Export') ->size(Size::Small), CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]; } } ================================================ FILE: app/Filament/Resources/PeopleResource/Pages/ViewPeople.php ================================================ icon('heroicon-o-pencil-square')->label('Edit'), ActionGroup::make([ ActionGroup::make([ Action::make('copyPageUrl') ->label('Copy page URL') ->icon('heroicon-o-clipboard-document') ->action(function (People $record): void { $jsUrl = Js::from(PeopleResource::getUrl('view', [$record])); $this->js(" navigator.clipboard.writeText({$jsUrl}).then(() => { new FilamentNotification() .title('URL copied to clipboard') .success() .send() }) "); }), Action::make('copyRecordId') ->label('Copy record ID') ->icon('heroicon-o-clipboard-document') ->action(function (People $record): void { $jsId = Js::from((string) $record->getKey()); $this->js(" navigator.clipboard.writeText({$jsId}).then(() => { new FilamentNotification() .title('Record ID copied to clipboard') .success() .send() }) "); }), ])->dropdown(false), DeleteAction::make(), ]), ]; } public function infolist(Schema $schema): Schema { return $schema->schema([ Section::make()->schema([ Flex::make([ ImageEntry::make('avatar') ->label('') ->height(30) ->circular() ->grow(false), TextEntry::make('name') ->label('') ->size(TextSize::Large), TextEntry::make('company.name') ->label('Company') ->color('primary') ->url(fn (People $record): ?string => $record->company ? CompanyResource::getUrl('view', [$record->company]) : null), ]), CustomFields::infolist()->forSchema($schema)->build()->columnSpanFull(), ])->columnSpanFull(), ]); } } ================================================ FILE: app/Filament/Resources/PeopleResource/RelationManagers/NotesRelationManager.php ================================================ recordTitleAttribute('title') ->columns([ TextColumn::make('title'), ...CustomFields::table()->forModel($table->getModel())->columns(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]) ->recordActions([ EditAction::make(), DeleteAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/PeopleResource/RelationManagers/TasksRelationManager.php ================================================ recordTitleAttribute('title') ->columns([ TextColumn::make('title'), ...CustomFields::table()->forModel($table->getModel())->columns(), ]) ->filters([ // ]) ->headerActions([ CreateAction::make()->icon('heroicon-o-plus')->size(Size::Small), ]) ->recordActions([ EditAction::make(), DeleteAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: app/Filament/Resources/PeopleResource.php ================================================ components([ Grid::make() ->columnSpanFull() ->schema([ TextInput::make('name') ->required() ->maxLength(255) ->columnSpan(7), Select::make('company_id') ->relationship('company', 'name') ->suffixAction( Action::make('Create Company') ->model(Company::class) ->schema(fn (Schema $schema): Schema => $schema->components([ TextInput::make('name') ->required(), Select::make('account_owner_id') ->model(Company::class) ->relationship('accountOwner', 'name') ->label('Account Owner') ->preload() ->searchable(), CustomFields::form()->forModel(Company::class)->build()->columns(1), ])) ->modalWidth(Width::Large) ->slideOver() ->icon('heroicon-o-plus') ->action(function (array $data, Set $set): void { $company = Company::query()->create($data); $set('company_id', $company->id); }) ) ->searchable() ->preload() ->columnSpan(5), ]) ->columns(12), CustomFields::form()->build()->columnSpanFull(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Person') ->searchable() ->sortable() ->view('filament.tables.columns.avatar-name-column'), TextColumn::make('company.name') ->label('Company') ->url(fn (People $record): ?string => $record->company_id ? CompanyResource::getUrl('view', [$record->company_id]) : null) ->searchable() ->sortable(), TextColumn::make('creator.name') ->label('Created By') ->searchable() ->sortable() ->toggleable() ->getStateUsing(fn (People $record): string => $record->created_by), TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('updated_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable() ->toggledHiddenByDefault(), ]) ->defaultSort('created_at', 'desc') ->filters([ SelectFilter::make('creation_source') ->label('Creation Source') ->options(CreationSource::class) ->multiple(), TrashedFilter::make(), ]) ->recordActions([ ActionGroup::make([ ViewAction::make(), EditAction::make(), RestoreAction::make(), DeleteAction::make(), ForceDeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ ExportBulkAction::make() ->exporter(PeopleExporter::class), DeleteBulkAction::make(), ForceDeleteBulkAction::make(), RestoreBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ TasksRelationManager::class, NotesRelationManager::class, ]; } public static function getPages(): array { return [ 'index' => ListPeople::route('/'), 'view' => ViewPeople::route('/{record}'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with(['team', 'customFieldValues.customField.options']) ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } } ================================================ FILE: app/Filament/Resources/TaskResource/Forms/TaskForm.php ================================================ $excludeFields * * @throws \Exception */ public static function get(Schema $schema, array $excludeFields = []): Schema { $components = [ TextInput::make('title') ->required() ->columnSpanFull(), ]; if (! in_array('companies', $excludeFields)) { $components[] = Select::make('companies') ->label('Companies') ->multiple() ->relationship('companies', 'name') ->columnSpanFull(); } if (! in_array('people', $excludeFields)) { $components[] = Select::make('people') ->label('People') ->multiple() ->relationship('people', 'name') ->nullable(); } $components[] = Select::make('assignees') ->label('Assignees') ->multiple() ->relationship('assignees', 'name') ->nullable(); $components[] = CustomFields::form()->except($excludeFields)->build()->columnSpanFull()->columns(1); return $schema ->components($components) ->columns(2); } } ================================================ FILE: app/Filament/Resources/TaskResource/Pages/ManageTasks.php ================================================ label('Import tasks') ->icon('heroicon-o-arrow-up-tray') ->url(ImportTasks::getUrl()), ExportAction::make()->exporter(TaskExporter::class), ]) ->icon('heroicon-o-arrows-up-down') ->color('gray') ->button() ->label('Import / Export') ->size(Size::Small), CreateAction::make() ->icon('heroicon-o-plus') ->size(Size::Small) ->slideOver() ->after(function (Task $record): void { resolve(NotifyTaskAssignees::class)->execute($record); }), ]; } } ================================================ FILE: app/Filament/Resources/TaskResource.php ================================================ $customFields */ $customFields = CustomField::query()->whereIn('code', ['status', 'priority'])->get()->keyBy('code'); /** @var ValueResolvers $valueResolver */ $valueResolver = resolve(ValueResolvers::class); return $table ->columns([ TextColumn::make('title') ->searchable() ->limit(50) ->weight('medium'), TextColumn::make('assignees.name') ->label('Assignee') ->badge() ->color('primary') ->searchable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('creator.name') ->label('Created By') ->searchable() ->sortable() ->toggleable() ->getStateUsing(fn (Task $record): string => $record->createdBy), TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('updated_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable() ->toggledHiddenByDefault(), ]) ->defaultSort('created_at', 'desc') ->searchable() ->paginated([10, 25, 50]) ->filters([ Filter::make('assigned_to_me') ->label('Assigned to me') ->query(fn (Builder $query): Builder => $query->whereHas('assignees', function (Builder $query): void { $query->where('users.id', auth()->id()); })) ->toggle(), SelectFilter::make('assignees') ->multiple() ->relationship('assignees', 'name') ->searchable() ->preload(), SelectFilter::make('creation_source') ->label('Creation Source') ->options(CreationSource::class) ->multiple(), TrashedFilter::make(), ]) ->groups(array_filter([ ...collect(['status', 'priority'])->map(fn (string $fieldCode): ?\Filament\Tables\Grouping\Group => $customFields->has($fieldCode) ? self::makeCustomFieldGroup($fieldCode, $customFields, $valueResolver) : null )->filter()->toArray(), ])) ->recordActions([ ActionGroup::make([ EditAction::make() ->using(function (Task $record, array $data): Task { /** @var User $user */ $user = auth()->user(); return resolve(UpdateTask::class)->execute($user, $record, $data); }), RestoreAction::make(), DeleteAction::make(), ForceDeleteAction::make(), ]), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ForceDeleteBulkAction::make(), RestoreBulkAction::make(), ]), ]); } public static function getPages(): array { return [ 'index' => ManageTasks::route('/'), ]; } /** * @param Collection $customFields */ private static function makeCustomFieldGroup(string $fieldCode, Collection $customFields, ValueResolvers $valueResolver): Group { $field = $customFields[$fieldCode]; $label = ucfirst($fieldCode); return Group::make("{$fieldCode}_group") ->label($label) ->orderQueryUsing(fn (Builder $query, string $direction): Builder => $query->orderBy( $field->values() ->select($field->getValueColumn()) ->whereColumn('custom_field_values.entity_id', 'tasks.id') ->limit(1) ->getQuery(), $direction )) ->getTitleFromRecordUsing(function (Task $record) use ($valueResolver, $field, $label): string { $value = $valueResolver->resolve($record, $field); return blank($value) ? "No {$label}" : $value; }) ->getKeyFromRecordUsing(function (Task $record) use ($field): string { $fieldValue = $record->customFieldValues->firstWhere('custom_field_id', $field->id); $rawValue = $fieldValue?->getValue(); return $rawValue ? (string) $rawValue : '0'; }) ->scopeQueryByKeyUsing(function (Builder $query, string $key) use ($field): Builder { if ($key === '0') { return $query->whereDoesntHave('customFieldValues', function (Builder $query) use ($field): void { $query->where('custom_field_id', $field->id); }); } return $query->whereHas('customFieldValues', function (Builder $query) use ($field, $key): void { $query->where('custom_field_id', $field->id) ->where($field->getValueColumn(), $key); }); }); } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with(['team', 'customFieldValues.customField.options']) ->withoutGlobalScopes([ SoftDeletingScope::class, ]); } } ================================================ FILE: app/Health/AnthropicModelCheck.php ================================================ meta(['model' => $model]) ->shortSummary($model); try { Prism::text() ->using(Provider::Anthropic, $model) ->withMaxTokens(1) ->withPrompt('Hi') ->generate(); return $result->ok(); } catch (Throwable $e) { return $result->failed("Anthropic model '{$model}' is unavailable: {$e->getMessage()}"); } } } ================================================ FILE: app/Http/Controllers/AcceptTeamInvitationController.php ================================================ whereKey($invitationId)->firstOrFail(); if ($invitation->isExpired()) { Log::warning('Expired invitation accessed', [ 'invitation_id' => $invitation->id, 'team_id' => $invitation->team_id, ]); return view('teams.invitation-expired'); } if ($request->user()->email !== $invitation->email) { Log::warning('Invitation email mismatch', [ 'invitation_id' => $invitation->id, 'user_id' => $request->user()->id, ]); abort(403, __('This invitation was sent to a different email address.')); } /** @var User $owner */ $owner = $invitation->team->owner; resolve(AddsTeamMembers::class)->add( $owner, $invitation->team, $invitation->email, $invitation->role, ); $invitation->delete(); /** @var User $user */ $user = $request->user(); $user->switchTeam($invitation->team); return redirect(config('fortify.home')) ->banner(__('Great! You have accepted the invitation to join the :team team.', [ // @phpstan-ignore method.notFound 'team' => $invitation->team->name, ])); } } ================================================ FILE: app/Http/Controllers/Api/V1/CompaniesController.php ================================================ execute( user: $user, perPage: $request->safe()->integer('per_page', 15), useCursor: $request->safe()->has('cursor'), request: $request, )); } #[ResponseFromApiResource(CompanyResource::class, Company::class, status: 201)] public function store(StoreCompanyRequest $request, CreateCompany $action, #[CurrentUser] User $user): JsonResponse { $company = $action->execute($user, $request->validated(), CreationSource::API); return new CompanyResource($company) ->response() ->setStatusCode(201); } #[ResponseFromApiResource(CompanyResource::class, Company::class)] public function show(Company $company): CompanyResource { Gate::authorize('view', $company); $company->loadMissing('customFieldValues.customField.options'); return new CompanyResource($company); } #[ResponseFromApiResource(CompanyResource::class, Company::class)] public function update(UpdateCompanyRequest $request, Company $company, UpdateCompany $action, #[CurrentUser] User $user): CompanyResource { $company = $action->execute($user, $company, $request->validated()); return new CompanyResource($company); } #[Response(status: 204)] public function destroy(Company $company, DeleteCompany $action, #[CurrentUser] User $user): HttpResponse { $action->execute($user, $company); return response()->noContent(); } } ================================================ FILE: app/Http/Controllers/Api/V1/CustomFieldsController.php ================================================ user(); $teamId = $user->currentTeam->getKey(); $query = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $teamId) ->active() ->with(['options' => fn (HasMany $q) => $q->withoutGlobalScopes()]); $query->when($request->validated('entity_type'), fn (mixed $q, string $type) => $q->where('entity_type', $type)); return CustomFieldResource::collection($query->paginate($request->safe()->integer('per_page', 15))); } } ================================================ FILE: app/Http/Controllers/Api/V1/NotesController.php ================================================ execute( user: $user, perPage: $request->safe()->integer('per_page', 15), useCursor: $request->safe()->has('cursor'), request: $request, )); } #[ResponseFromApiResource(NoteResource::class, Note::class, status: 201)] public function store(StoreNoteRequest $request, CreateNote $action, #[CurrentUser] User $user): JsonResponse { $note = $action->execute($user, $request->validated(), CreationSource::API); return new NoteResource($note) ->response() ->setStatusCode(201); } #[ResponseFromApiResource(NoteResource::class, Note::class)] public function show(Note $note): NoteResource { Gate::authorize('view', $note); $note->loadMissing('customFieldValues.customField.options'); return new NoteResource($note); } #[ResponseFromApiResource(NoteResource::class, Note::class)] public function update(UpdateNoteRequest $request, Note $note, UpdateNote $action, #[CurrentUser] User $user): NoteResource { $note = $action->execute($user, $note, $request->validated()); return new NoteResource($note); } #[Response(status: 204)] public function destroy(Note $note, DeleteNote $action, #[CurrentUser] User $user): HttpResponse { $action->execute($user, $note); return response()->noContent(); } } ================================================ FILE: app/Http/Controllers/Api/V1/OpportunitiesController.php ================================================ execute( user: $user, perPage: $request->safe()->integer('per_page', 15), useCursor: $request->safe()->has('cursor'), request: $request, )); } #[ResponseFromApiResource(OpportunityResource::class, Opportunity::class, status: 201)] #[BodyParam('name', 'string', required: true, example: 'Enterprise Deal')] #[BodyParam('company_id', 'string', required: false, example: null)] #[BodyParam('contact_id', 'string', required: false, example: null)] public function store(StoreOpportunityRequest $request, CreateOpportunity $action, #[CurrentUser] User $user): JsonResponse { $opportunity = $action->execute($user, $request->validated(), CreationSource::API); return new OpportunityResource($opportunity) ->response() ->setStatusCode(201); } #[ResponseFromApiResource(OpportunityResource::class, Opportunity::class)] public function show(Opportunity $opportunity): OpportunityResource { Gate::authorize('view', $opportunity); $opportunity->loadMissing('customFieldValues.customField.options'); return new OpportunityResource($opportunity); } #[ResponseFromApiResource(OpportunityResource::class, Opportunity::class)] #[BodyParam('name', 'string', required: false, example: 'Enterprise Deal')] #[BodyParam('company_id', 'string', required: false, example: null)] #[BodyParam('contact_id', 'string', required: false, example: null)] public function update(UpdateOpportunityRequest $request, Opportunity $opportunity, UpdateOpportunity $action, #[CurrentUser] User $user): OpportunityResource { $opportunity = $action->execute($user, $opportunity, $request->validated()); return new OpportunityResource($opportunity); } #[Response(status: 204)] public function destroy(Opportunity $opportunity, DeleteOpportunity $action, #[CurrentUser] User $user): HttpResponse { $action->execute($user, $opportunity); return response()->noContent(); } } ================================================ FILE: app/Http/Controllers/Api/V1/PeopleController.php ================================================ execute( user: $user, perPage: $request->safe()->integer('per_page', 15), useCursor: $request->safe()->has('cursor'), request: $request, )); } #[ResponseFromApiResource(PeopleResource::class, People::class, status: 201)] #[BodyParam('name', 'string', required: true, example: 'Jane Smith')] #[BodyParam('company_id', 'string', required: false, example: null)] public function store(StorePeopleRequest $request, CreatePeople $action, #[CurrentUser] User $user): JsonResponse { $person = $action->execute($user, $request->validated(), CreationSource::API); return new PeopleResource($person) ->response() ->setStatusCode(201); } #[ResponseFromApiResource(PeopleResource::class, People::class)] public function show(People $person): PeopleResource { Gate::authorize('view', $person); $person->loadMissing('customFieldValues.customField.options'); return new PeopleResource($person); } #[ResponseFromApiResource(PeopleResource::class, People::class)] #[BodyParam('name', 'string', required: false, example: 'Jane Smith')] #[BodyParam('company_id', 'string', required: false, example: null)] public function update(UpdatePeopleRequest $request, People $person, UpdatePeople $action, #[CurrentUser] User $user): PeopleResource { $person = $action->execute($user, $person, $request->validated()); return new PeopleResource($person); } #[Response(status: 204)] public function destroy(People $person, DeletePeople $action, #[CurrentUser] User $user): HttpResponse { $action->execute($user, $person); return response()->noContent(); } } ================================================ FILE: app/Http/Controllers/Api/V1/TasksController.php ================================================ execute( user: $user, perPage: $request->safe()->integer('per_page', 15), useCursor: $request->safe()->has('cursor'), request: $request, )); } #[ResponseFromApiResource(TaskResource::class, Task::class, status: 201)] public function store(StoreTaskRequest $request, CreateTask $action, #[CurrentUser] User $user): JsonResponse { $task = $action->execute($user, $request->validated(), CreationSource::API); return new TaskResource($task) ->response() ->setStatusCode(201); } #[ResponseFromApiResource(TaskResource::class, Task::class)] public function show(Task $task): TaskResource { Gate::authorize('view', $task); $task->loadMissing('customFieldValues.customField.options'); return new TaskResource($task); } #[ResponseFromApiResource(TaskResource::class, Task::class)] public function update(UpdateTaskRequest $request, Task $task, UpdateTask $action, #[CurrentUser] User $user): TaskResource { $task = $action->execute($user, $task, $request->validated()); return new TaskResource($task); } #[Response(status: 204)] public function destroy(Task $task, DeleteTask $action, #[CurrentUser] User $user): HttpResponse { $action->execute($user, $task); return response()->noContent(); } } ================================================ FILE: app/Http/Controllers/Auth/CallbackController.php ================================================ has('code')) { return $this->handleError('Authorization was cancelled or failed. Please try again.'); } try { $socialUser = $this->retrieveSocialUser($provider); $user = $this->resolveUser($provider, $socialUser, $creator); return $this->loginAndRedirect($user); } catch (InvalidStateException) { return $this->handleError('Authentication state mismatch. Please try again.'); } catch (Throwable $e) { report($e); return $this->handleError($this->parseProviderError($e->getMessage(), $provider)); } } /** * @throws InvalidStateException * @throws Throwable */ private function retrieveSocialUser(string $provider): SocialiteUser { return Socialite::driver($provider)->user(); } private function resolveUser( string $provider, SocialiteUser $socialUser, CreatesNewSocialUsers $creator ): User { return DB::transaction(function () use ($provider, $socialUser, $creator): User { $existingAccount = UserSocialAccount::query() ->with('user') ->where('provider_name', $provider) ->where('provider_id', $socialUser->getId()) ->first(); if ($existingAccount?->user) { return $existingAccount->user; } $email = $socialUser->getEmail(); $user = $email ? User::query()->where('email', $email)->first() : null; if (! $user) { $user = $this->createUser($socialUser, $creator, $provider); } $this->linkSocialAccount($user, $provider, $socialUser->getId()); return $user; }); } private function createUser( SocialiteUser $socialUser, CreatesNewSocialUsers $creator, string $provider ): User { return $creator->create([ 'name' => $this->extractName($socialUser), 'email' => $this->extractEmail($socialUser, $provider), 'terms' => 'on', ]); } private function linkSocialAccount(User $user, string $provider, string|int $providerId): void { $user->socialAccounts()->updateOrCreate( [ 'provider_name' => $provider, 'provider_id' => (string) $providerId, ] ); } private function extractName(SocialiteUser $socialUser): string { return $socialUser->getName() ?? $socialUser->getNickname() ?? 'Unknown User'; } private function extractEmail(SocialiteUser $socialUser, string $provider): string { return $socialUser->getEmail() ?? sprintf('%s_%s@noemail.app', $provider, $socialUser->getId()); } private function parseProviderError(string $exceptionMessage, string $provider): string { $errorPatterns = [ 'invalid_request' => 'Invalid authentication request. Please try again.', 'access_denied' => 'Access was denied. Please authorize the application to continue.', ]; foreach ($errorPatterns as $pattern => $message) { if (str_contains($exceptionMessage, $pattern)) { return $message; } } return sprintf('Failed to authenticate with %s.', ucfirst($provider)); } private function handleError(string $message): RedirectResponse { Notification::make() ->title('Authentication Failed') ->body($message) ->danger() ->persistent() ->send(); return to_route('login') ->withErrors(['login' => $message]) ->with('error', $message); } private function loginAndRedirect(User $user): RedirectResponse { Auth::login($user, remember: true); return redirect()->intended(url()->getAppUrl()); } } ================================================ FILE: app/Http/Controllers/Auth/RedirectController.php ================================================ value); return $driver->redirect(); } } ================================================ FILE: app/Http/Controllers/ContactController.php ================================================ validated(); Mail::to(config('relaticle.contact.email'))->send(new NewContactSubmissionMail($data)); return to_route('contact')->with('success', 'Thanks for reaching out! We\'ll get back to you soon.'); } } ================================================ FILE: app/Http/Controllers/HomeController.php ================================================ Str::markdown(file_get_contents($policyFile) ?: ''), ]); } } ================================================ FILE: app/Http/Controllers/TermsOfServiceController.php ================================================ Str::markdown(file_get_contents($termsFile) ?: ''), ]); } } ================================================ FILE: app/Http/Middleware/ApplyTenantScopes.php ================================================ getKey(); User::addGlobalScope( filament()->getTenancyScopeName(), fn (Builder $query) => $query ->whereHas('teams', fn (Builder $query) => $query->where('teams.id', $tenantId)) ->orWhereHas('ownedTeams', fn (Builder $query) => $query->where('teams.id', $tenantId)) ); Company::addGlobalScope(new TeamScope); People::addGlobalScope(new TeamScope); Opportunity::addGlobalScope(new TeamScope); Task::addGlobalScope(new TeamScope); Note::addGlobalScope(new TeamScope); return $next($request); } } ================================================ FILE: app/Http/Middleware/EnsureTokenHasAbility.php ================================================ user(); $token = $user?->currentAccessToken(); // First-party SPA/web requests (via Sanctum session auth) don't use PersonalAccessToken. // These requests bypass ability checks intentionally -- authorization is handled by policies. if (! $token instanceof PersonalAccessToken || ! $token->getKey()) { return $next($request); } $ability = $this->resolveAbility($request->method()); throw_unless($token->can($ability), MissingAbilityException::class, [$ability]); return $next($request); } private function resolveAbility(string $method): string { return match ($method) { 'POST' => 'create', 'PUT', 'PATCH' => 'update', 'DELETE' => 'delete', default => 'read', }; } } ================================================ FILE: app/Http/Middleware/ForceJsonResponse.php ================================================ headers->set('Accept', 'application/json'); return $next($request); } } ================================================ FILE: app/Http/Middleware/SetApiTeamContext.php ================================================ > */ private const array SCOPED_MODELS = [ User::class, Company::class, People::class, Opportunity::class, Task::class, Note::class, ]; public function handle(Request $request, Closure $next): Response { /** @var User $user */ $user = $request->user(); $team = $this->resolveTeam($request, $user); if (! $team instanceof Team) { return response()->json(['message' => 'No team found.'], 403); } if (! $user->belongsToTeam($team)) { return response()->json(['message' => 'You do not belong to this team.'], 403); } // Set team in memory only — do NOT call switchTeam() which persists // current_team_id to the database, corrupting the web panel's team state // when API calls target a different team than the active web session. $user->forceFill(['current_team_id' => $team->getKey()]); $user->setRelation('currentTeam', $team); TenantContextService::setTenantId($team->getKey()); // Override to web guard because Filament policies, observers, and the TeamScope // global scope all check auth('web')->user(). Without this, API requests through // Sanctum would not be recognized by the existing authorization layer. auth()->guard('web')->setUser($user); auth()->shouldUse('web'); $this->applyTenantScopes($team); return $next($request); } public function terminate(): void { auth()->guard('web')->forgetUser(); TenantContextService::setTenantId(null); foreach (self::SCOPED_MODELS as $model) { $model::clearBootedModels(); } } private function resolveTeam(Request $request, User $user): ?Team { $token = $user->currentAccessToken(); if ($token instanceof PersonalAccessToken && is_string($token->team_id)) { return Team::query()->find($token->team_id); } $teamId = $request->header('X-Team-Id'); if (is_string($teamId) && Str::isUlid($teamId)) { return Team::query()->find($teamId); } return $user->currentTeam; } private function applyTenantScopes(Team $team): void { $tenantId = $team->getKey(); User::addGlobalScope( 'tenant', fn (Builder $query) => $query->where(function (Builder $q) use ($tenantId): void { $q->whereIn('users.id', DB::table('team_user')->where('team_id', $tenantId)->select('user_id')) ->orWhere('users.id', DB::table('teams')->where('id', $tenantId)->select('user_id')); }) ); Company::addGlobalScope(new TeamScope); People::addGlobalScope(new TeamScope); Opportunity::addGlobalScope(new TeamScope); Task::addGlobalScope(new TeamScope); Note::addGlobalScope(new TeamScope); } } ================================================ FILE: app/Http/Middleware/SubdomainRootResponse.php ================================================ path() !== '/') { return $next($request); } $host = $request->getHost(); if ($host === config('app.api_domain')) { return new JsonResponse([ 'name' => 'Relaticle API', 'version' => 'v1', 'docs' => url('/docs/api'), ]); } if ($host === config('app.mcp_domain')) { return new JsonResponse([ 'name' => 'Relaticle MCP Server', 'version' => '1.0.0', 'docs' => url('/docs/mcp'), ]); } return $next($request); } } ================================================ FILE: app/Http/Middleware/ValidateSignature.php ================================================ base->handle($request, $next, ...$args); } catch (InvalidSignatureException) { if ($this->hasValidNormalizedSignature($request, array_values($args))) { return $next($request); } throw new InvalidSignatureException; } } /** * Re-encode query values to match the percent-encoding used during signing, * then verify the signature against the normalized URL. * * @param array $args */ private function hasValidNormalizedSignature(Request $request, array $args): bool { $relative = isset($args[0]) && $args[0] === 'relative'; $absolute = ! $relative; $url = $absolute ? $request->url() : '/'.$request->path(); $rawQuery = (string) $request->server->get('QUERY_STRING'); if ($rawQuery === '') { return false; } $normalized = []; foreach (explode('&', $rawQuery) as $part) { $equalsPos = strpos($part, '='); [$key, $value] = $equalsPos !== false ? [substr($part, 0, $equalsPos), substr($part, $equalsPos + 1)] : [$part, '']; if ($key === 'signature') { continue; } $normalized[] = $key.'='.rawurlencode(rawurldecode($value)); } $original = rtrim("{$url}?".implode('&', $normalized), '?'); $keys = [config('app.key'), ...config('app.previous_keys', [])]; $signature = (string) $request->query('signature', ''); $hasCorrectSignature = array_any( $keys, fn (string $key): bool => hash_equals(hash_hmac('sha256', $original, $key), $signature), ); return $hasCorrectSignature && URL::signatureHasNotExpired($request); } } ================================================ FILE: app/Http/Requests/Api/V1/IndexCustomFieldsRequest.php ================================================ > */ public function rules(): array { return [ 'entity_type' => ['sometimes', 'string', Rule::in(self::ENTITY_TYPES)], 'per_page' => ['sometimes', 'integer', 'min:1', 'max:'.self::MAX_PER_PAGE], ]; } } ================================================ FILE: app/Http/Requests/Api/V1/IndexRequest.php ================================================ > */ public function rules(): array { return [ 'per_page' => ['sometimes', 'integer', 'min:1', 'max:100'], 'cursor' => ['sometimes', 'string'], 'page' => ['sometimes', 'integer', 'min:1'], ]; } } ================================================ FILE: app/Http/Requests/Api/V1/StoreCompanyRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'name' => ['required', 'string', 'max:255'], ], new ValidCustomFields($teamId, 'company')->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/StoreNoteRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'title' => ['required', 'string', 'max:255'], 'company_ids' => ['nullable', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['nullable', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['nullable', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], ], new ValidCustomFields($teamId, 'note')->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/StoreOpportunityRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'name' => ['required', 'string', 'max:255'], 'company_id' => ['nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'contact_id' => ['nullable', 'string', Rule::exists('people', 'id')->where('team_id', $teamId)], ], new ValidCustomFields($teamId, 'opportunity')->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/StorePeopleRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'name' => ['required', 'string', 'max:255'], 'company_id' => ['nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], ], new ValidCustomFields($teamId, 'people')->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/StoreTaskRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $team = $user->currentTeam; $teamId = $team->getKey(); $teamMemberIds = $team->users()->pluck('users.id')->push($team->user_id)->unique()->all(); return array_merge([ 'title' => ['required', 'string', 'max:255'], 'company_ids' => ['nullable', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['nullable', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['nullable', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], 'assignee_ids' => ['nullable', 'array'], 'assignee_ids.*' => ['string', Rule::in($teamMemberIds)], ], new ValidCustomFields($teamId, 'task')->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/UpdateCompanyRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'name' => ['sometimes', 'required', 'string', 'max:255'], ], new ValidCustomFields($teamId, 'company', isUpdate: true)->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/UpdateNoteRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'title' => ['sometimes', 'required', 'string', 'max:255'], 'company_ids' => ['nullable', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['nullable', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['nullable', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], ], new ValidCustomFields($teamId, 'note', isUpdate: true)->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/UpdateOpportunityRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'name' => ['sometimes', 'required', 'string', 'max:255'], 'company_id' => ['nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'contact_id' => ['nullable', 'string', Rule::exists('people', 'id')->where('team_id', $teamId)], ], new ValidCustomFields($teamId, 'opportunity', isUpdate: true)->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/UpdatePeopleRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $teamId = $user->currentTeam->getKey(); return array_merge([ 'name' => ['sometimes', 'required', 'string', 'max:255'], 'company_id' => ['nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], ], new ValidCustomFields($teamId, 'people', isUpdate: true)->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/Api/V1/UpdateTaskRequest.php ================================================ > */ public function rules(): array { /** @var User $user */ $user = $this->user(); $team = $user->currentTeam; $teamId = $team->getKey(); $teamMemberIds = $team->users()->pluck('users.id')->push($team->user_id)->unique()->all(); return array_merge([ 'title' => ['sometimes', 'required', 'string', 'max:255'], 'company_ids' => ['nullable', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['nullable', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['nullable', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], 'assignee_ids' => ['nullable', 'array'], 'assignee_ids.*' => ['string', Rule::in($teamMemberIds)], ], new ValidCustomFields($teamId, 'task', isUpdate: true)->toRules($this->input('custom_fields'))); } } ================================================ FILE: app/Http/Requests/ContactRequest.php ================================================ > */ public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email:rfc,dns', 'max:255'], 'company' => ['nullable', 'string', 'max:255'], 'message' => ['required', 'string', 'min:20', 'max:5000'], 'cf-turnstile-response' => ['required', new Turnstile], ]; } } ================================================ FILE: app/Http/Resources/V1/CompanyResource.php ================================================ */ public function toAttributes(Request $request): array { return [ 'name' => $this->name, 'creation_source' => $this->creation_source, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, 'custom_fields' => $this->formatCustomFields($this->resource), 'people_count' => $this->whenHas('people_count'), 'opportunities_count' => $this->whenHas('opportunities_count'), 'tasks_count' => $this->whenHas('tasks_count'), 'notes_count' => $this->whenHas('notes_count'), ]; } /** * @return array> */ public function toRelationships(Request $request): array { return [ 'creator' => UserResource::class, 'accountOwner' => UserResource::class, 'people' => PeopleResource::class, 'opportunities' => OpportunityResource::class, ]; } } ================================================ FILE: app/Http/Resources/V1/Concerns/FormatsCustomFields.php ================================================ relationLoaded('customFieldValues')) { return new \stdClass; } $result = $record->getRelation('customFieldValues') /** @phpstan-ignore notIdentical.alwaysTrue (orphaned values can exist when a custom field is deleted) */ ->filter(fn (CustomFieldValue $fieldValue): bool => $fieldValue->customField !== null) ->mapWithKeys(fn (CustomFieldValue $fieldValue): array => [ $fieldValue->customField->code => $this->resolveFieldValue($fieldValue), ]) ->all(); return (object) $result; } private function resolveFieldValue(CustomFieldValue $fieldValue): mixed { $customField = $fieldValue->customField; $rawValue = $fieldValue->getValue(); if (! $customField->typeData->dataType->isChoiceField()) { return $rawValue; } if ($customField->typeData->dataType->isMultiChoiceField()) { return $this->resolveMultiChoiceValue($customField, $rawValue); } return $this->resolveSingleChoiceValue($customField, $rawValue); } /** * @return array{id: string, label: string}|null */ private function resolveSingleChoiceValue(CustomField $customField, mixed $rawValue): ?array { if ($rawValue === null) { return null; } $option = $customField->options->firstWhere('id', $rawValue); return [ 'id' => (string) $rawValue, 'label' => $option !== null ? $option->name : (string) $rawValue, ]; } /** * @return array */ private function resolveMultiChoiceValue(CustomField $customField, mixed $rawValue): array { $values = $rawValue instanceof Collection ? $rawValue->all() : (array) ($rawValue ?? []); return collect($values) ->filter(fn (mixed $value): bool => is_string($value) || is_numeric($value)) ->map(function (mixed $optionId) use ($customField): array { $stringId = (string) $optionId; $option = $customField->options->firstWhere('id', $optionId); return [ 'id' => $stringId, 'label' => $option !== null ? $option->name : $stringId, ]; }) ->values() ->all(); } } ================================================ FILE: app/Http/Resources/V1/CustomFieldResource.php ================================================ */ public function toAttributes(Request $request): array { $validationService = resolve(ValidationService::class); return [ 'code' => $this->code, 'name' => $this->name, 'type' => $this->type, 'entity_type' => $this->entity_type, 'required' => $validationService->isRequired($this->resource), 'options' => $this->whenLoaded('options', fn () => $this->options->map(fn (CustomFieldOption $option): array => [ 'label' => $option->name, 'value' => $option->id, ])->all()), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } } ================================================ FILE: app/Http/Resources/V1/NoteResource.php ================================================ */ public function toAttributes(Request $request): array { return [ 'title' => $this->title, 'creation_source' => $this->creation_source, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, 'custom_fields' => $this->formatCustomFields($this->resource), 'companies_count' => $this->whenHas('companies_count'), 'people_count' => $this->whenHas('people_count'), 'opportunities_count' => $this->whenHas('opportunities_count'), ]; } /** * @return array> */ public function toRelationships(Request $request): array { return [ 'creator' => UserResource::class, 'companies' => CompanyResource::class, 'people' => PeopleResource::class, 'opportunities' => OpportunityResource::class, ]; } } ================================================ FILE: app/Http/Resources/V1/OpportunityResource.php ================================================ */ public function toAttributes(Request $request): array { return [ 'name' => $this->name, 'company_id' => $this->company_id, 'contact_id' => $this->contact_id, 'creation_source' => $this->creation_source, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, 'custom_fields' => $this->formatCustomFields($this->resource), 'tasks_count' => $this->whenHas('tasks_count'), 'notes_count' => $this->whenHas('notes_count'), ]; } /** * @return array> */ public function toRelationships(Request $request): array { return [ 'creator' => UserResource::class, 'company' => CompanyResource::class, 'contact' => PeopleResource::class, ]; } } ================================================ FILE: app/Http/Resources/V1/PeopleResource.php ================================================ */ public function toAttributes(Request $request): array { return [ 'name' => $this->name, 'company_id' => $this->company_id, 'creation_source' => $this->creation_source, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, 'custom_fields' => $this->formatCustomFields($this->resource), 'tasks_count' => $this->whenHas('tasks_count'), 'notes_count' => $this->whenHas('notes_count'), ]; } /** * @return array> */ public function toRelationships(Request $request): array { return [ 'creator' => UserResource::class, 'company' => CompanyResource::class, ]; } } ================================================ FILE: app/Http/Resources/V1/TaskResource.php ================================================ */ public function toAttributes(Request $request): array { return [ 'title' => $this->title, 'creation_source' => $this->creation_source, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, 'custom_fields' => $this->formatCustomFields($this->resource), 'assignees_count' => $this->whenHas('assignees_count'), 'companies_count' => $this->whenHas('companies_count'), 'people_count' => $this->whenHas('people_count'), 'opportunities_count' => $this->whenHas('opportunities_count'), ]; } /** * @return array> */ public function toRelationships(Request $request): array { return [ 'creator' => UserResource::class, 'assignees' => UserResource::class, 'companies' => CompanyResource::class, 'people' => PeopleResource::class, 'opportunities' => OpportunityResource::class, ]; } } ================================================ FILE: app/Http/Resources/V1/UserResource.php ================================================ */ public function toAttributes(Request $request): array { return [ 'name' => $this->name, 'email' => $this->email, ]; } } ================================================ FILE: app/Http/Responses/LoginResponse.php ================================================ getId() === 'sysadmin') { return redirect()->intended($panel->getUrl()); } // For app panel, redirect to companies with tenant $user = $request->user('web'); if ($user && $user->currentTeam) { return redirect()->intended(CompanyResource::getUrl('index', ['tenant' => $user->currentTeam])); } return redirect()->intended(Filament::getUrl()); } } ================================================ FILE: app/Jobs/Email/CreateSubscriberJob.php ================================================ data->toArray()); }, fn (int $attempt): int => $attempt * 100 * random_int(1, 15)); } } ================================================ FILE: app/Jobs/Email/UpdateSubscriberJob.php ================================================ data->email; $subscriber = Mailcoach::findByEmail(config('mailcoach-sdk.subscribers_list_id'), $this->data->email); if ($subscriber instanceof Subscriber) { $data = $this->data->toArray(); $data['tags'] = collect($subscriber->tags)->merge($this->data->tags)->unique()->toArray(); Mailcoach::updateSubscriber($subscriber->uuid, array_filter($data)); } else { Log::channel('email_subscriptions_channel')->info("Subscriber with email '$email' was not found!"); } } /** * The unique ID of the job. */ public function uniqueId(): string { return $this->data->email; } /** * Get the middleware the job should pass through. * * @return array */ public function middleware(): array { return [new ThrottlesExceptionsWithRedis(1, 1)->backoff(1)->report()]; } /** * Determine the time at which the job should timeout. */ public function retryUntil(): \DateTime { return now()->addHour(); } } ================================================ FILE: app/Jobs/FetchFaviconForCompany.php ================================================ company->customFields() ->whereBelongsTo($this->company->team) ->where('code', CompanyField::DOMAINS->value) ->first(); $domains = $this->company->getCustomFieldValue($customFieldDomain); $domainName = is_array($domains) ? ($domains[0] ?? null) : $domains; if ($domainName === null || $domainName === '') { return; } $domainName = Str::start($domainName, 'https://'); $favicon = Favicon::driver('high-quality')->fetch($domainName); $url = $favicon?->getFaviconUrl(); if ($url === null) { return; } $path = parse_url($url, PHP_URL_PATH); $extension = $path ? pathinfo($path, PATHINFO_EXTENSION) : ''; $filename = match ($extension) { 'svg' => 'logo.svg', 'webp' => 'logo.webp', 'jpg', 'jpeg' => 'logo.jpg', default => 'logo.png', }; $logo = $this->company ->addMediaFromUrl($url) ->usingFileName($filename) ->usingName('company_logo') ->withCustomProperties([ 'domain' => $domainName, 'original_size' => $favicon->getIconSize(), 'icon_type' => $favicon->getIconType(), 'fetched_at' => now()->toIso8601String(), ]) ->toMediaCollection('logo'); $this->company->clearMediaCollectionExcept('logo', $logo); } catch (Exception $exception) { report($exception); } } public function uniqueId(): string { return (string) $this->company->getKey(); } } ================================================ FILE: app/Listeners/CreateTeamCustomFields.php ================================================ */ private const array MODEL_ENUM_MAP = [ Company::class => CompanyCustomField::class, Opportunity::class => OpportunityCustomField::class, Note::class => NoteCustomField::class, People::class => PeopleCustomField::class, Task::class => TaskCustomField::class, ]; public function __construct( private CustomsFieldsMigrators $migrator, private OnboardSeeder $onboardSeeder, ) {} public function handle(TeamCreated $event): void { $team = $event->team; $this->migrator->setTenantId($team->id); DB::transaction(function (): void { foreach (self::MODEL_ENUM_MAP as $modelClass => $enumClass) { foreach ($enumClass::cases() as $enum) { $this->createCustomField($modelClass, $enum); } } }); if ($team->isPersonalTeam()) { $team->loadMissing('owner'); /** @var Authenticatable $owner */ $owner = $team->owner; $this->onboardSeeder->run($owner, $team); } } /** @param class-string $model */ private function createCustomField(string $model, CompanyCustomField|OpportunityCustomField|PeopleCustomField|TaskCustomField|NoteCustomField $enum): void { $fieldData = new CustomFieldData( name: $enum->getDisplayName(), code: $enum->value, type: $enum->getFieldType(), section: new CustomFieldSectionData( name: 'General', code: 'general', type: CustomFieldSectionType::HEADLESS ), systemDefined: $enum->isSystemDefined(), width: $enum->getWidth(), settings: new CustomFieldSettingsData( list_toggleable_hidden: $enum->isListToggleableHidden(), enable_option_colors: $enum->hasColorOptions(), allow_multiple: $enum->allowsMultipleValues(), max_values: $enum->getMaxValues(), unique_per_entity_type: $enum->isUniquePerEntityType(), ) ); $migrator = $this->migrator->new( model: $model, fieldData: $fieldData ); $options = $enum->getOptions(); if ($options !== null) { $migrator->options($options); } $customField = $migrator->create(); $this->applyColorsToOptions($customField, $enum); } private function applyColorsToOptions(CustomField $customField, CompanyCustomField|OpportunityCustomField|PeopleCustomField|TaskCustomField|NoteCustomField $enum): void { $colorMapping = $enum->getOptionColors(); if ($colorMapping === null) { return; } $options = $customField->options()->withoutGlobalScopes()->get(); $updates = $options ->filter(fn (CustomFieldOption $option): bool => isset($colorMapping[$option->name])) ->map(fn (CustomFieldOption $option): array => [ 'id' => $option->getKey(), 'settings' => json_encode(new CustomFieldOptionSettingsData(color: $colorMapping[$option->name])), ]) ->values() ->all(); if ($updates === []) { return; } $table = $customField->options()->getModel()->getTable(); $ids = array_column($updates, 'id'); $cases = []; $caseBindings = []; foreach ($updates as $item) { $cases[] = 'WHEN id = ? THEN ?'; $caseBindings[] = $item['id']; $caseBindings[] = $item['settings']; } $casesSql = implode(' ', $cases); $placeholders = implode(',', array_fill(0, count($ids), '?')); $caseExpr = "(CASE {$casesSql} END)"; if (DB::getDriverName() === 'pgsql') { $caseExpr .= '::json'; } DB::update( "UPDATE \"{$table}\" SET \"settings\" = {$caseExpr}, \"updated_at\" = ? WHERE \"id\" IN ({$placeholders})", [...$caseBindings, now(), ...$ids], ); } } ================================================ FILE: app/Listeners/Email/NewSubscriberListener.php ================================================ user; if ($user->hasVerifiedEmail() && config('mailcoach-sdk.enabled_subscribers_sync', false)) { $subscriber = retry(10, fn (): mixed => Mailcoach::findByEmail(config('mailcoach-sdk.subscribers_list_id'), $user->email), fn (int $attempt): int => $attempt * 100 * random_int(1, 15)); if ($subscriber) { dispatch(new UpdateSubscriberJob(SubscriberData::from([ 'email' => $user->email, 'tags' => [SubscriberTagEnum::VERIFIED->value], ]))); } dispatch(new CreateSubscriberJob(SubscriberData::from([ 'email' => $user->email, 'first_name' => $user->name, 'last_name' => $user->name, 'tags' => [SubscriberTagEnum::VERIFIED->value], 'skip_confirmation' => true, ]))); } } } ================================================ FILE: app/Listeners/SwitchTeam.php ================================================ getUser(); $team = $event->getTenant(); if ($user instanceof User) { $user->switchTeam($team); } } } ================================================ FILE: app/Livewire/App/AccessTokens/CreateAccessToken.php ================================================ |null */ public ?array $data = []; public ?string $plainTextToken = null; public function mount(): void { $this->form->fill([ 'team_id' => $this->authUser()->currentTeam?->getKey(), 'permissions' => Jetstream::$defaultPermissions, ]); } public function form(Schema $schema): Schema { return $schema ->schema([ Section::make(__('access-tokens.sections.create.title')) ->aside() ->description( __('access-tokens.sections.create.description'), ) ->schema([ TextInput::make('name') ->label('Token Name') ->required() ->maxLength(255) ->rules([ Rule::unique('personal_access_tokens', 'name') ->where( 'tokenable_type', $this->authUser()->getMorphClass(), ) ->where( 'tokenable_id', $this->authUser()->getKey(), ), ]), Select::make('team_id') ->label('Team') ->required() ->options( $this->authUser()->allTeams()->pluck('name', 'id'), ), Select::make('expiration') ->label('Expiration') ->required() ->placeholder('Select expiration...') ->options([ '1' => '1 Day', '7' => '7 Days', '30' => '30 Days', '60' => '60 Days', '90' => '90 Days', '180' => '180 Days', '365' => '1 Year', '0' => 'No Expiration', ]), self::permissionsCheckboxList(), Actions::make([ Action::make('create') ->label('Create') ->submit('createToken'), ]), ]), ]) ->statePath('data'); } public function showTokenAction(): Action { return Action::make('showToken') ->modalHeading(__('access-tokens.modals.show_token.title')) ->modalDescription( __('access-tokens.modals.show_token.description'), ) ->modalWidth(Width::Large) ->modalSubmitAction(false) ->modalCancelActionLabel('Close') ->schema([ TextInput::make('plainTextToken') ->label('Token') ->default($this->plainTextToken ?? '') ->readOnly() ->suffixAction( Action::make('copyToken') ->icon('heroicon-o-clipboard') ->tooltip('Copy to clipboard')->alpineClickHandler(" window.navigator.clipboard.writeText(\$wire.plainTextToken); \$tooltip('Copied!'); "), ), ]) ->after(fn (): null => ($this->plainTextToken = null)); } public function createToken(): void { try { $this->rateLimit(5); } catch (TooManyRequestsException $exception) { $this->sendRateLimitedNotification($exception); return; } $state = $this->form->getState(); $user = $this->authUser(); $teamId = $state['team_id']; if ($user->allTeams()->doesntContain('id', $teamId)) { $this->sendNotification(title: 'You do not belong to this team.', type: 'danger'); return; } $expiration = (int) $state['expiration']; $expiresAt = $expiration > 0 ? now()->addDays($expiration) : null; /** @var NewAccessToken $token */ $token = DB::transaction(function () use ($user, $state, $teamId, $expiresAt): NewAccessToken { $token = $user->createToken( $state['name'], Jetstream::validPermissions($state['permissions'] ?? []), ); // Sanctum's createToken() does not accept extra attributes, so we update after creation $token->accessToken->fill([ 'team_id' => $teamId, 'expires_at' => $expiresAt, ])->save(); return $token; }); $this->plainTextToken = explode('|', $token->plainTextToken, 2)[1]; $this->form->fill([ 'team_id' => $user->currentTeam?->getKey(), 'permissions' => Jetstream::$defaultPermissions, ]); $this->dispatch('tokenCreated'); $this->mountAction('showToken'); } public static function permissionsCheckboxList(): CheckboxList { return CheckboxList::make('permissions') ->label('Permissions') ->required() ->options( collect(Jetstream::$permissions) ->mapWithKeys( fn (string $permission): array => [ $permission => ucfirst($permission), ], ) ->all(), ) ->columns(2); } public function render(): View { return view('livewire.app.access-tokens.create-access-token'); } } ================================================ FILE: app/Livewire/App/AccessTokens/ManageAccessTokens.php ================================================ authUser(); return $table ->query( fn (): Builder => PersonalAccessToken::query() ->with('team') ->where('tokenable_type', $user->getMorphClass()) ->where('tokenable_id', $user->getKey()), ) ->columns([ TextColumn::make('name')->label('Name')->searchable(), TextColumn::make('team.name') ->label('Team') ->placeholder('—'), TextColumn::make('abilities') ->label('Permissions') ->badge() ->formatStateUsing( fn (string $state): string => $state === '*' ? 'All' : ucfirst($state), ), TextColumn::make('expires_at') ->label('Expires') ->date() ->placeholder('Never'), TextColumn::make('last_used_at') ->label('Last Used') ->since() ->placeholder('Never'), TextColumn::make('created_at')->label('Created')->since(), ]) ->actions([ Action::make('permissions') ->label('Permissions') ->icon('heroicon-o-lock-closed') ->iconButton() ->tooltip('Edit Permissions') ->modalHeading(fn (PersonalAccessToken $record): string => "Permissions: {$record->name}") ->modalWidth(Width::Large) ->fillForm( fn (PersonalAccessToken $record): array => [ 'permissions' => $record->abilities, ], ) ->schema([ CreateAccessToken::permissionsCheckboxList(), ]) ->action(function ( PersonalAccessToken $record, array $data, ): void { $record ->forceFill([ 'abilities' => Jetstream::validPermissions( $data['permissions'] ?? [], ), ]) ->save(); $this->sendNotification( title: __('access-tokens.notifications.permissions_updated'), ); }), DeleteAction::make() ->iconButton() ->after( fn () => $this->sendNotification( title: __('access-tokens.notifications.deleted'), ), ), ]) ->emptyStateHeading(__('access-tokens.empty_state.heading')) ->emptyStateDescription(__('access-tokens.empty_state.description')) ->paginated(false); } public function render(): View { return view('livewire.app.access-tokens.manage-access-tokens'); } } ================================================ FILE: app/Livewire/App/Profile/DeleteAccount.php ================================================ authUser()->hasPassword(); return $schema ->schema([ Section::make(__('profile.sections.delete_account.title')) ->description(__('profile.sections.delete_account.description')) ->aside() ->schema([ TextEntry::make('deleteAccountNotice') ->hiddenLabel() ->state(fn (): string|array => __('profile.sections.delete_account.notice')), Actions::make([ Action::make('deleteAccount') ->label(__('profile.actions.delete_account')) ->color('danger') ->requiresConfirmation() ->modalHeading(__('profile.sections.delete_account.title')) ->modalDescription($hasPassword ? __('profile.modals.delete_account.notice') : __('profile.modals.delete_account.notice_no_password')) ->modalSubmitActionLabel(__('profile.actions.delete_account')) ->modalCancelAction(false) ->schema($hasPassword ? [ Forms\Components\TextInput::make('password') ->password() ->revealable() ->label(__('profile.form.password.label')) ->required() ->currentPassword(), ] : []) ->action(fn (array $data): Redirector|RedirectResponse => $this->deleteAccount($data['password'] ?? null)), ]), ]), ]); } /** * Delete the current user. * * @throws ValidationException */ public function deleteAccount(?string $password = null): Redirector|RedirectResponse { $user = $this->authUser(); if ($user->hasPassword() && ! Hash::check((string) $password, $user->password ?? '')) { throw ValidationException::withMessages([ 'password' => __('auth.password'), ]); } // Logout before deleting to prevent SessionGuard::logout() from // re-inserting the user when it updates the remember token. filament()->auth()->logout(); DB::transaction(function () use ($user): void { if (config('jetstream.features.teams', false)) { $user->teams()->detach(); /** @var Collection $ownedTeams */ $ownedTeams = $user->ownedTeams; $ownedTeams->each(function (Team $team): void { resolve(DeleteTeam::class)->delete($team); }); } $user->deleteProfilePhoto(); $user->tokens->each->delete(); $user->delete(); }); return redirect(filament()->getLoginUrl()); } public function render(): View { return view('livewire.app.profile.delete-account'); } } ================================================ FILE: app/Livewire/App/Profile/LogoutOtherBrowserSessions.php ================================================ authUser()->hasPassword(); return $schema ->schema([ Section::make(__('profile.sections.browser_sessions.title')) ->description(__('profile.sections.browser_sessions.description')) ->aside() ->schema([ Forms\Components\ViewField::make('browserSessions') ->hiddenLabel() ->view('components.browser-sessions') ->viewData(['sessions' => $this->browserSessions()]), Actions::make([ Action::make('deleteBrowserSessions') ->label(__('profile.actions.log_out_other_browsers')) ->requiresConfirmation() ->modalHeading(__('profile.modals.log_out_other_browsers.title')) ->modalDescription($hasPassword ? __('profile.modals.log_out_other_browsers.description') : __('profile.modals.log_out_other_browsers.description_no_password')) ->modalSubmitActionLabel(__('profile.actions.log_out_other_browsers')) ->modalCancelAction(false) ->schema($hasPassword ? [ Forms\Components\TextInput::make('password') ->password() ->revealable() ->label(__('profile.form.password.label')) ->required() ->currentPassword(), ] : []) ->action( fn (array $data) => $this->logoutOtherBrowserSessions($data['password'] ?? null) ), ]), ]), ]); } /** * @throws ValidationException */ public function logoutOtherBrowserSessions(?string $password): void { $user = $this->authUser(); if ($user->hasPassword() && ! Hash::check((string) $password, $user->password ?? '')) { throw ValidationException::withMessages([ 'password' => __('auth.password'), ]); } if (config('session.driver') !== 'database') { return; } if ($password !== null) { auth(filament()->getAuthGuard())->logoutOtherDevices($password); } DB::connection(config('session.connection')) ->table(config('session.table', 'sessions')) ->where('user_id', filament()->auth()->user()->getAuthIdentifier()) ->where('id', '!=', request()->session()->getId()) ->delete(); request() ->session() ->put([ 'password_hash_'.Auth::getDefaultDriver() => filament()->auth()->user()->getAuthPassword(), ]); $this->sendNotification(__('profile.notifications.logged_out_other_sessions.success')); } /** * Get the current sessions. * * @return Collection */ public function browserSessions(): Collection { if (config('session.driver') !== 'database') { return collect(); } // @phpstan-ignore-next-line Collection type covariance issue return DB::connection(config('session.connection'))->table(config('session.table', 'sessions')) ->where('user_id', filament()->auth()->user()->getAuthIdentifier()) ->orderBy('last_activity', 'desc') ->get()->map(function (\stdClass $session): object { $agent = tap(new Agent, function (Agent $agent) use ($session): void { $agent->setUserAgent($session->user_agent ?? ''); }); return (object) [ 'agent' => $agent, 'ip_address' => $session->ip_address, 'is_current_device' => $session->id === request()->session()->getId(), 'last_active' => Date::createFromTimestamp($session->last_activity)->diffForHumans(), ]; }); } public function render(): View { return view('livewire.app.profile.logout-other-browser-sessions'); } } ================================================ FILE: app/Livewire/App/Profile/UpdatePassword.php ================================================ |null */ public ?array $data = []; public function mount(): void { // Initialize empty form } public function form(Schema $schema): Schema { $hasPassword = $this->authUser()->hasPassword(); return $schema ->schema([ Section::make($hasPassword ? __('profile.sections.update_password.title') : __('profile.sections.set_password.title')) ->aside() ->description($hasPassword ? __('profile.sections.update_password.description') : __('profile.sections.set_password.description')) ->schema([ TextInput::make('currentPassword') ->label(__('profile.form.current_password.label')) ->password() ->revealable(filament()->arePasswordsRevealable()) ->required($hasPassword) ->autocomplete('current-password') ->currentPassword($hasPassword) ->visible($hasPassword), TextInput::make('password') ->label(__('profile.form.new_password.label')) ->password() ->required() ->revealable(filament()->arePasswordsRevealable()) ->rules([Password::default(), 'confirmed']) ->autocomplete('new-password') ->dehydrated() ->live(debounce: 500), TextInput::make('password_confirmation') ->label(__('profile.form.confirm_password.label')) ->password() ->revealable(filament()->arePasswordsRevealable()) ->required() ->dehydrated() ->visible( fn (Get $get): bool => filled($get('password')) ), Actions::make([ Action::make('save') ->label(__('profile.actions.save')) ->submit('updatePassword'), ]), ]), ]) ->statePath('data') ->model($this->authUser()); } public function updatePassword(): void { try { $this->rateLimit(5); } catch (TooManyRequestsException $exception) { $this->sendRateLimitedNotification($exception); return; } $this->form->validate(); $data = $this->form->getState(); // Update the password directly without Fortify validation $this->authUser()->forceFill([ 'password' => Hash::make($data['password'] ?? ''), ])->save(); if (request()->hasSession() && filled($data['password'])) { request()->session()->put(['password_hash_'.Filament::getAuthGuard() => $this->authUser()->getAuthPassword()]); } $this->reset('data'); $this->sendNotification(); } public function render(): View { return view('livewire.app.profile.update-password'); } } ================================================ FILE: app/Livewire/App/Profile/UpdateProfileInformation.php ================================================ |null */ public ?array $data = []; public function mount(): void { $data = $this->authUser()->only(['name', 'email']); $this->form->fill($data); } public function form(Schema $schema): Schema { return $schema ->schema([ Section::make(__('profile.sections.update_profile_information.title')) ->aside() ->description(__('profile.sections.update_profile_information.description')) ->schema([ FileUpload::make('profile_photo_path') ->label(__('profile.form.profile_photo.label')) ->avatar() ->image() ->imageEditor() ->disk(config('jetstream.profile_photo_disk')) ->directory('profile-photos') ->visibility('public') ->formatStateUsing(fn () => auth('web')->user()?->profile_photo_path), TextInput::make('name') ->label(__('profile.form.name.label')) ->string() ->maxLength(255) ->required(), TextInput::make('email') ->label(__('profile.form.email.label')) ->email() ->required() ->unique(Filament::auth()->user() !== null ? Filament::auth()->user()::class : self::class, ignorable: $this->authUser()), Actions::make([ Action::make('save') ->label(__('profile.actions.save')) ->submit('updateProfile'), ]), ]), ]) ->statePath('data'); } public function updateProfile(): void { try { $this->rateLimit(5); } catch (TooManyRequestsException $exception) { $this->sendRateLimitedNotification($exception); return; } $data = $this->form->getState(); if (Filament::hasEmailChangeVerification() && array_key_exists('email', $data)) { $this->sendEmailChangeVerification($data); $data['email'] = $this->authUser()->email; } resolve(UpdateUserProfileInformationAction::class)->update($this->authUser(), $data); $this->sendNotification(); } /** * @param array $data */ private function sendEmailChangeVerification(array $data): void { $user = $this->authUser(); $newEmail = $data['email']; if ($user->email === $newEmail) { return; } $notification = resolve(VerifyEmailChange::class); $notification->url = Filament::getVerifyEmailChangeUrl($user, $newEmail); $verificationSignature = Query::new($notification->url)->get('signature'); cache()->put($verificationSignature, true, ttl: now()->addHour()); $user->notify(resolve(NoticeOfEmailChangeRequest::class, [ 'blockVerificationUrl' => Filament::getBlockEmailChangeVerificationUrl($user, $newEmail, $verificationSignature), 'newEmail' => $newEmail, ])); NotificationFacade::route('mail', $newEmail) ->notify($notification); Notification::make() ->success() ->title(__('filament-panels::auth/pages/edit-profile.notifications.email_change_verification_sent.title', ['email' => $newEmail])) ->body(__('filament-panels::auth/pages/edit-profile.notifications.email_change_verification_sent.body', ['email' => $newEmail])) ->send(); $this->data['email'] = $user->email; } public function render(): View { return view('livewire.app.profile.update-profile-information'); } } ================================================ FILE: app/Livewire/App/Teams/AddTeamMember.php ================================================ |null */ public ?array $data = []; public Team $team; public function mount(Team $team): void { $this->team = $team; $this->form->fill($this->team->only(['name'])); } public function form(Schema $schema): Schema { return $schema ->statePath('data') ->schema([ Section::make(__('teams.sections.add_team_member.title')) ->aside() ->visible(fn () => Gate::check('addTeamMember', $this->team)) ->description(__('teams.sections.add_team_member.description')) ->schema([ TextEntry::make('addTeamMemberNotice') ->hiddenLabel() ->state(fn (): string => __('teams.sections.add_team_member.notice')), TextInput::make('email') ->label(__('teams.form.email.label')) ->email() ->required(), Grid::make() ->columns(1) ->schema(function (): array { $roles = collect(Jetstream::$roles); return [ Radio::make('role') ->hiddenLabel() ->required() ->in($roles->pluck('key')) ->options($roles->pluck('name', 'key')) ->descriptions($roles->pluck('description', 'key')), ]; }), Actions::make([ Action::make('addTeamMember') ->label(__('teams.actions.add_team_member')) ->action(function (): void { $this->addTeamMember($this->team); }), ])->alignEnd(), ]), ]); } public function addTeamMember(Team $team): void { try { $this->rateLimit(5); } catch (TooManyRequestsException $exception) { $this->sendRateLimitedNotification($exception); return; } $data = $this->form->getState(); try { resolve(InviteTeamMember::class)->invite( $this->authUser(), $team, $data['email'], $data['role'] ?? null ); } catch (ValidationException $e) { Notification::make() ->title($e->validator->errors()->first()) ->danger() ->send(); return; } $this->sendNotification(__('teams.notifications.team_invitation_sent.success')); $this->redirect(Filament::getTenantProfileUrl()); } public function render(): View { return view('livewire.app.teams.add-team-member'); } } ================================================ FILE: app/Livewire/App/Teams/DeleteTeam.php ================================================ team = $team; } public function form(Schema $schema): Schema { return $schema ->schema([ Section::make(__('teams.sections.delete_team.title')) ->description(__('teams.sections.delete_team.description')) ->aside() ->visible(fn () => Gate::check('delete', $this->team)) ->schema([ TextEntry::make('notice') ->hiddenLabel() ->state(__('teams.sections.delete_team.notice')), Actions::make([ Action::make('deleteAccountAction') ->label(__('teams.actions.delete_team')) ->color('danger') ->requiresConfirmation() ->modalHeading(__('teams.sections.delete_team.title')) ->modalDescription(__('teams.modals.delete_team.notice')) ->modalSubmitActionLabel(__('teams.actions.delete_team')) ->modalCancelAction(false) ->action(fn () => $this->deleteTeam($this->team)), ]), ]), ]); } public function render(): View { return view('livewire.app.teams.delete-team'); } public function deleteTeam(Team $team): void { resolve(DeleteTeamAction::class)->delete($team); Filament::setTenant(Auth::guard('web')->user()->personalTeam()); $this->sendNotification(__('teams.notifications.team_deleted.success')); redirect()->to(Filament::getCurrentPanel()?->getHomeUrl()); } } ================================================ FILE: app/Livewire/App/Teams/PendingTeamInvitations.php ================================================ team = $team; } public function table(Table $table): Table { return $table ->query(fn () => $this->team->teamInvitations()->latest()) ->columns([ Tables\Columns\Layout\Split::make([ Tables\Columns\TextColumn::make('email'), Tables\Columns\TextColumn::make('expires_at') ->label(__('Expires')) ->state(function (TeamInvitation $record): string { if ($record->isExpired()) { return __('Expired'); } /** @var Carbon $expiresAt */ $expiresAt = $record->expires_at; return $expiresAt->diffForHumans(); }), ]), ]) ->paginated(false) ->recordActions([ Action::make('extendTeamInvitation') ->label(__('teams.actions.extend_team_invitation')) ->color('warning') ->requiresConfirmation() ->visible(fn () => Gate::check('updateTeamMember', $this->team)) ->action(fn (Model $record) => $this->extendTeamInvitation($record)), Action::make('copyInviteLink') ->label(__('teams.actions.copy_invite_link')) ->color('gray') ->visible(fn () => Gate::check('updateTeamMember', $this->team)) ->action(fn (Model $record) => $this->copyInviteLink($record)), Action::make('resendTeamInvitation') ->label(__('teams.actions.resend_team_invitation')) ->color('primary') ->requiresConfirmation() ->visible(fn () => Gate::check('updateTeamMember', $this->team)) ->action($this->resendTeamInvitation(...)), Action::make('cancelTeamInvitation') ->label(__('teams.actions.cancel_team_invitation')) ->color('danger') ->visible(fn () => Gate::check('removeTeamMember', $this->team)) ->requiresConfirmation() ->action(fn (Model $record) => $this->cancelTeamInvitation($this->team, $record)), ]); } public function extendTeamInvitation(Model $invitation): void { Gate::authorize('updateTeamMember', $this->team); $expiryDays = (int) config('jetstream.invitation_expiry_days', 7); $invitation->update([ 'expires_at' => now()->addDays($expiryDays), ]); $this->sendNotification(__('teams.notifications.team_invitation_extended.success')); } public function copyInviteLink(Model $invitation): void { Gate::authorize('updateTeamMember', $this->team); $url = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->js('navigator.clipboard.writeText('.json_encode($url, JSON_THROW_ON_ERROR).')'); $this->sendNotification(__('teams.notifications.invite_link_copied.success')); } public function resendTeamInvitation(Model $invitation): void { Gate::authorize('updateTeamMember', $this->team); $key = "resend-invitation:{$invitation->getKey()}"; if (RateLimiter::tooManyAttempts($key, 1)) { $seconds = RateLimiter::availableIn($key); $this->sendNotification(__('Please wait :seconds seconds before resending.', ['seconds' => $seconds])); return; } RateLimiter::hit($key, 60); /** @var \Laravel\Jetstream\TeamInvitation $invitation */ Mail::to($invitation->email)->send(new TeamInvitationMail($invitation)); $this->sendNotification(__('teams.notifications.team_invitation_sent.success')); } public function cancelTeamInvitation(Team $team, Model $invitation): void { $invitation->delete(); $team->fresh(); $this->sendNotification(__('teams.notifications.team_invitation_cancelled.success')); } public function render(): View { return view('livewire.app.teams.pending-team-invitations'); } } ================================================ FILE: app/Livewire/App/Teams/TeamMembers.php ================================================ team = $team; } public function table(Table $table): Table { $model = Membership::class; $teamForeignKeyColumn = 'team_id'; return $table ->query(fn (): Builder => $model::with('user')->where($teamForeignKeyColumn, $this->team->id)) ->columns([ Tables\Columns\Layout\Split::make([ Tables\Columns\ImageColumn::make('profile_photo_url') ->disk(config('jetstream.profile_photo_disk')) ->defaultImageUrl(fn (Membership $record): string => Filament::getUserAvatarUrl($record->user)) ->circular() ->imageSize(25) ->grow(false), Tables\Columns\TextColumn::make('user.email'), ]), ]) ->paginated(false) ->recordActions([ Action::make('updateTeamRole') ->visible(fn (Membership $record): bool => Gate::check('updateTeamMember', $this->team)) ->label(fn (Membership $record): string => $record->roleName) ->modalWidth('lg') ->modalHeading(__('teams.actions.update_team_role')) ->modalSubmitActionLabel(__('teams.actions.save')) ->modalCancelAction(false) ->modalFooterActionsAlignment(Alignment::End) ->schema([ Grid::make() ->columns(1) ->schema(function (): array { $roles = collect(Jetstream::$roles); return [ Radio::make('role') ->hiddenLabel() ->required() ->in($roles->pluck('key')) ->options($roles->pluck('name', 'key')) ->descriptions($roles->pluck('description', 'key')) ->default(fn (Membership $record): string => $record->role), ]; }), ]) ->action(function (Membership $record, array $data): void { $this->updateTeamRole($this->team, $record, $data); }), Action::make('removeTeamMember') ->visible( fn (Membership $record): bool => (string) $this->authUser()->id !== (string) $record->user_id && Gate::check( 'removeTeamMember', $this->team ) ) ->label(__('teams.actions.remove_team_member')) ->color('danger') ->requiresConfirmation() ->action(function (Membership $record): void { $this->removeTeamMember($this->team, $record); }), Action::make('leaveTeam') ->visible(fn (Membership $record): bool => (string) $this->authUser()->id === (string) $record->user_id) ->icon('heroicon-o-arrow-right-start-on-rectangle') ->color('danger') ->label(__('teams.actions.leave_team')) ->modalDescription(__('teams.modals.leave_team.notice')) ->requiresConfirmation() ->action(function (Membership $record): void { $this->leaveTeam($this->team); }), ]); } /** * @param array $data */ public function updateTeamRole(Team $team, Membership $teamMember, array $data): void { if (! Gate::check('updateTeamMember', $team)) { $this->sendNotification( __('teams.notifications.permission_denied.cannot_update_team_member'), type: 'danger' ); return; } $team->users()->updateExistingPivot($teamMember->user_id, ['role' => $data['role']]); event(new TeamMemberUpdated($team->fresh(), $teamMember)); $this->sendNotification(); $team->fresh(); } public function removeTeamMember(Team $team, Membership $teamMember): void { try { resolve(RemoveTeamMemberAction::class)->remove($this->authUser(), $team, $teamMember->user); $this->sendNotification(__('teams.notifications.team_member_removed.success')); $team->fresh(); } catch (AuthorizationException) { $this->sendNotification( __('teams.notifications.permission_denied.cannot_remove_team_member'), type: 'danger' ); } catch (ValidationException $e) { $this->sendNotification( $e->validator->errors()->first(), type: 'danger' ); } } public function leaveTeam(Team $team): void { $teamMember = $this->authUser(); try { resolve(RemoveTeamMemberAction::class)->remove($teamMember, $team, $teamMember); $this->sendNotification(__('teams.notifications.leave_team.success')); $this->redirect(Filament::getHomeUrl()); } catch (AuthorizationException) { $this->sendNotification( title: __('teams.notifications.permission_denied.cannot_leave_team'), type: 'danger' ); } catch (ValidationException $e) { $this->sendNotification( $e->validator->errors()->first(), type: 'danger' ); } } public function render(): View { return view('livewire.app.teams.team-members'); } } ================================================ FILE: app/Livewire/App/Teams/UpdateTeamName.php ================================================ |null */ public ?array $data = []; public Team $team; public bool $slugManuallyEdited = false; public function mount(Team $team): void { $this->team = $team; $this->form->fill($team->only(['name', 'slug'])); } public function form(Schema $schema): Schema { return $schema ->schema([ Section::make(__('teams.sections.update_team_name.title')) ->aside() ->description(__('teams.sections.update_team_name.description')) ->schema([ TextInput::make('name') ->label(__('teams.form.team_name.label')) ->string() ->maxLength(255) ->required() ->live(onBlur: true) ->afterStateUpdated(function (Set $set, ?string $state): void { if ($this->slugManuallyEdited) { return; } $set('slug', Str::slug((string) $state)); }), TextInput::make('slug') ->label(__('teams.form.team_slug.label')) ->helperText(__('teams.form.team_slug.helper_text')) ->string() ->maxLength(255) ->required() ->rules([new ValidTeamSlug(ignoreValue: $this->team->slug)]) ->live(onBlur: true) ->afterStateUpdated(function (): void { $this->slugManuallyEdited = true; }) ->dehydrateStateUsing(fn (?string $state): string => Str::slug((string) $state)) ->unique('teams', 'slug', ignorable: $this->team), Actions::make([ Action::make('save') ->label(__('teams.actions.save')) ->action(fn () => $this->updateTeamName($this->team)), ])->alignEnd(), ]), ]) ->statePath('data'); } public function updateTeamName(Team $team): void { try { $this->rateLimit(5); } catch (TooManyRequestsException $exception) { $this->sendRateLimitedNotification($exception); return; } $data = $this->form->getState(); $oldSlug = $team->slug; resolve(UpdateTeamNameAction::class)->update($this->authUser(), $team, $data); if ($team->slug !== $oldSlug) { $this->redirect(EditTeam::getUrl(tenant: $team)); return; } $this->sendNotification(); } public function render(): View { return view('livewire.app.teams.update-team-name'); } } ================================================ FILE: app/Livewire/BaseLivewireComponent.php ================================================ user(); return $user; } protected function sendRateLimitedNotification(TooManyRequestsException $exception): void { Notification::make() ->title('Too Many Requests') ->body("Please wait {$exception->secondsUntilAvailable} seconds before trying again.") ->danger() ->send(); } protected function sendNotification(string $title = 'Saved', ?string $message = null, string $type = 'success'): void { Notification::make() ->title(__($title)) ->body(__($message)) ->{$type}() ->send(); } } ================================================ FILE: app/Livewire/UpdateProfileInformationForm.php ================================================ */ public array $state = []; /** * The new avatar for the user. */ public mixed $photo = null; /** * Determine if the verification email was sent. */ public bool $verificationLinkSent = false; /** * Prepare the component. */ public function mount(): void { $user = Auth::guard('web')->user(); $this->state = array_merge([ 'email' => $user->email, ], $user->withoutRelations()->toArray()); } /** * Update the user's profile information. */ public function updateProfileInformation(UpdatesUserProfileInformation $updater): void { $this->resetErrorBag(); $updater->update( Auth::guard('web')->user(), $this->photo ? array_merge($this->state, ['photo' => $this->photo]) : $this->state ); $this->dispatch('saved'); $this->dispatch('refresh-navigation-menu'); } /** * Delete user's profile photo. */ public function deleteProfilePhoto(): void { Auth::guard('web')->user()->deleteProfilePhoto(); $this->dispatch('refresh-navigation-menu'); } /** * Sent the email verification. */ public function sendEmailVerification(): void { Auth::guard('web')->user()->sendEmailVerificationNotification(); $this->verificationLinkSent = true; } /** * Get the current user of the application. */ #[Computed] public function user(): Authenticatable { return Auth::guard('web')->user(); } /** * Render the component. */ public function render(): View { return view('profile.update-profile-information-form'); } } ================================================ FILE: app/Mail/NewContactSubmissionMail.php ================================================ data['email']], subject: "New contact: {$this->data['name']}", ); } public function content(): Content { return new Content( markdown: 'mail.new-contact-submission', ); } } ================================================ FILE: app/Mcp/Filters/CustomFieldFilter.php ================================================ */ final readonly class CustomFieldFilter implements Filter { private const int MAX_CONDITIONS = 10; private const array OPERATOR_MAP = [ 'eq' => '=', 'gt' => '>', 'gte' => '>=', 'lt' => '<', 'lte' => '<=', ]; public function __construct( private string $entityType, ) {} public function __invoke(Builder $query, mixed $value, string $property): void { if (! is_array($value) || $value === []) { return; } $fieldCodes = array_keys($value); abort_if(count($fieldCodes) > self::MAX_CONDITIONS, 422, 'Maximum 10 filter conditions allowed.'); $fields = $this->resolveFields($fieldCodes); foreach ($value as $fieldCode => $operators) { if (! is_array($operators)) { continue; } if (! isset($fields[$fieldCode])) { continue; } $field = $fields[$fieldCode]; $valueColumn = CustomFieldValue::getValueColumn($field->type); foreach ($operators as $operator => $operand) { $this->applyCondition($query, $field, $valueColumn, (string) $operator, $operand); } } } /** * @param Builder $query */ private function applyCondition( Builder $query, CustomField $field, string $valueColumn, string $operator, mixed $operand, ): void { $query->whereHas('customFieldValues', function (Builder $q) use ($field, $valueColumn, $operator, $operand): void { $q->where('custom_field_id', $field->getKey()); match ($operator) { 'eq', 'gt', 'gte', 'lt', 'lte' => $q->where($valueColumn, self::OPERATOR_MAP[$operator], $operand), 'contains' => $q->where($valueColumn, 'ILIKE', '%'.str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], (string) $operand).'%'), 'in' => $q->whereIn($valueColumn, (array) $operand), 'has_any' => $q->whereJsonContains($valueColumn, $operand), default => null, }; }); } /** * @param array $fieldCodes * @return Collection */ private function resolveFields(array $fieldCodes): Collection { /** @var User $user */ $user = auth()->user(); /** @var Collection */ return CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $user->currentTeam->getKey()) ->where('entity_type', $this->entityType) ->whereIn('code', $fieldCodes) ->active() ->get() ->keyBy('code'); } } ================================================ FILE: app/Mcp/Filters/CustomFieldSort.php ================================================ $query */ public function __invoke(Builder $query, bool $descending, string $property): void { $field = $this->resolveField($property); if (! $field instanceof CustomField) { return; } $valueColumn = CustomFieldValue::getValueColumn($field->type); $model = $query->getModel(); $query->orderBy( CustomFieldValue::query() ->select($valueColumn) ->whereColumn('entity_id', $model->getTable().'.id') ->where('entity_type', $model->getMorphClass()) ->where('custom_field_id', $field->getKey()) ->limit(1), $descending ? 'desc' : 'asc', ); } private function resolveField(string $code): ?CustomField { return $this->resolveAllFields()->get($code); } /** * @return Collection */ private function resolveAllFields(): Collection { /** @var User $user */ $user = auth()->user(); $teamId = $user->currentTeam->getKey(); /** @var Collection */ return Cache::remember( "custom_fields_sort_{$teamId}_{$this->entityType}", 60, fn () => CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $teamId) ->where('entity_type', $this->entityType) ->active() ->get() ->keyBy('code') ); } } ================================================ FILE: app/Mcp/Prompts/CrmOverviewPrompt.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $teamId = $user->currentTeam->getKey(); $cacheKey = "crm_overview_{$teamId}"; $overview = Cache::remember($cacheKey, self::CACHE_TTL, function (): string { $counts = [ 'companies' => Company::query()->count(), 'people' => People::query()->count(), 'opportunities' => Opportunity::query()->count(), 'tasks' => Task::query()->count(), 'notes' => Note::query()->count(), ]; $recentCompanies = Company::query() ->latest() ->take(5) ->pluck('name') ->implode(', '); $recentPeople = People::query() ->latest() ->take(5) ->pluck('name') ->implode(', '); $text = "CRM Overview for current team:\n\n"; $text .= "Record Counts:\n"; foreach ($counts as $entity => $count) { $text .= " - {$entity}: {$count}\n"; } $text .= "\nRecent Companies: {$recentCompanies}\n"; $text .= "Recent People: {$recentPeople}\n"; return $text."\nUse the available tools to search, create, update, or delete CRM records."; }); return Response::text($overview); } } ================================================ FILE: app/Mcp/Resources/CompanySchemaResource.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $schema = [ 'entity' => 'company', 'description' => 'Organizations and businesses tracked in the CRM.', 'fields' => [ 'name' => ['type' => 'string', 'required' => true], ], 'custom_fields' => $this->resolveCustomFields($user, 'company'), 'filterable_fields' => $this->resolveFilterableFields($user, 'company'), 'relationships' => ['creator', 'accountOwner', 'people', 'opportunities'], 'aggregate_includes' => [ 'peopleCount' => 'Count of related people', 'opportunitiesCount' => 'Count of related opportunities', 'tasksCount' => 'Count of related tasks', 'notesCount' => 'Count of related notes', ], 'usage' => 'Pass custom field values in the "custom_fields" object using field codes as keys. Use "filter" param in list tools to filter by custom field values with operators (eq, gt, gte, lt, lte, contains, in, has_any). Example: {"name": "Acme", "custom_fields": {"icp": true}}', ]; return Response::text(json_encode($schema, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } } ================================================ FILE: app/Mcp/Resources/Concerns/ResolvesEntitySchema.php ================================================ > */ protected function resolveCustomFields(User $user, string $entityType): array { $teamId = $user->currentTeam->getKey(); $cacheKey = "custom_fields_schema_{$teamId}_{$entityType}"; return Cache::remember($cacheKey, 60, function () use ($teamId, $entityType): array { $fields = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $teamId) ->where('entity_type', $entityType) ->active() ->select('id', 'code', 'name', 'type', 'validation_rules') ->with(['options:id,custom_field_id,name']) ->get(); return $this->formatCustomFields($fields); }); } /** * @return array> */ protected function resolveFilterableFields(User $user, string $entityType): array { return (new CustomFieldFilterSchema)->build($user, $entityType); } private const CHOICE_TYPES = ['select', 'radio', 'multi_select', 'checkbox_list', 'tags']; /** * @param Collection $fields * @return array> */ private function formatCustomFields(Collection $fields): array { $result = []; foreach ($fields as $field) { $required = ($field->validation_rules ?? collect()) ->contains('name', 'required'); $entry = [ 'name' => $field->name, 'type' => $field->type, 'required' => $required, ]; $formatHint = $this->fieldFormatHint($field->type); if ($formatHint !== null) { $entry['input_format'] = $formatHint['format']; $entry['example'] = $formatHint['example']; } if (in_array($field->type, self::CHOICE_TYPES, true) && $field->options->isNotEmpty()) { $entry['options'] = $field->options->map(fn (CustomFieldOption $option): array => [ 'id' => $option->id, 'label' => $option->name, ])->all(); } $result[$field->code] = $entry; } return $result; } /** * @return array{format: string, example: mixed}|null */ private function fieldFormatHint(string $type): ?array { return match ($type) { 'link' => ['format' => 'array of URL strings', 'example' => ['https://example.com']], 'email' => ['format' => 'array of email strings', 'example' => ['user@example.com']], 'phone' => ['format' => 'array of phone strings', 'example' => ['+1234567890']], 'select', 'radio' => ['format' => 'option ID string (see options)', 'example' => 'option-id-here'], 'multi_select', 'checkbox_list', 'tags' => ['format' => 'array of option ID strings', 'example' => ['option-id-1', 'option-id-2']], 'toggle' => ['format' => 'boolean', 'example' => true], 'date_time' => ['format' => 'ISO 8601 datetime string', 'example' => '2025-01-15T10:30:00Z'], 'number' => ['format' => 'numeric value', 'example' => 42], 'currency' => ['format' => 'numeric value (amount)', 'example' => 15000.00], default => null, }; } } ================================================ FILE: app/Mcp/Resources/CrmSummaryResource.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $teamId = $user->currentTeam->getKey(); $cacheKey = "crm_summary_{$teamId}"; $summary = Cache::remember($cacheKey, 60, fn (): array => [ 'companies' => ['total' => Company::query()->where('team_id', $teamId)->count()], 'people' => ['total' => People::query()->where('team_id', $teamId)->count()], 'opportunities' => $this->opportunitySummary($teamId), 'tasks' => $this->taskSummary($teamId), 'notes' => ['total' => Note::query()->where('team_id', $teamId)->count()], ]); return Response::text(json_encode($summary, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } /** * @return array */ private function opportunitySummary(mixed $teamId): array { $total = Opportunity::query()->where('team_id', $teamId)->count(); $stageFieldId = $this->resolveFieldId($teamId, 'opportunity', OpportunityField::STAGE->value); $amountFieldId = $this->resolveFieldId($teamId, 'opportunity', OpportunityField::AMOUNT->value); if ($stageFieldId === null) { return ['total' => $total]; } $amountJoin = $amountFieldId !== null ? "LEFT JOIN custom_field_values amount_cfv ON amount_cfv.entity_id = o.id AND amount_cfv.entity_type = 'opportunity' AND amount_cfv.custom_field_id = ?" : ''; $amountSelect = $amountFieldId !== null ? 'COALESCE(SUM(amount_cfv.float_value), 0) as total_amount' : '0 as total_amount'; $amountBindings = $amountFieldId !== null ? [$amountFieldId] : []; $rows = DB::select( "SELECT stage_cfv.string_value as stage, COUNT(*) as count, {$amountSelect} FROM opportunities o LEFT JOIN custom_field_values stage_cfv ON stage_cfv.entity_id = o.id AND stage_cfv.entity_type = 'opportunity' AND stage_cfv.custom_field_id = ? {$amountJoin} WHERE o.team_id = ? AND o.deleted_at IS NULL GROUP BY stage_cfv.string_value", [$stageFieldId, ...$amountBindings, $teamId], ); $stageOptions = DB::table('custom_field_options') ->where('custom_field_id', $stageFieldId) ->pluck('name', 'id'); $byStage = []; $totalPipeline = 0; $totalWon = 0; foreach ($rows as $row) { $stageId = $row->stage ?? 'Unknown'; $stageLabel = $stageOptions[$stageId] ?? $stageId; $amount = (float) $row->total_amount; $byStage[$stageLabel] = ['count' => (int) $row->count, 'total_amount' => $amount]; $totalPipeline += $amount; if (str_contains(strtolower($stageLabel), 'won')) { $totalWon += $amount; } } return [ 'total' => $total, 'by_stage' => $byStage, 'total_pipeline_value' => $totalPipeline, 'total_won_value' => $totalWon, ]; } /** * @return array */ private function taskSummary(mixed $teamId): array { $total = Task::query()->where('team_id', $teamId)->count(); $dueDateFieldId = $this->resolveFieldId($teamId, 'task', TaskField::DUE_DATE->value); if ($dueDateFieldId === null) { return ['total' => $total, 'overdue' => 0, 'due_this_week' => 0]; } $row = DB::selectOne( "SELECT COUNT(*) FILTER (WHERE due_cfv.datetime_value::date < CURRENT_DATE) as overdue, COUNT(*) FILTER (WHERE due_cfv.datetime_value::date BETWEEN CURRENT_DATE AND (CURRENT_DATE + INTERVAL '7 days')) as due_this_week FROM tasks t LEFT JOIN custom_field_values due_cfv ON due_cfv.entity_id = t.id AND due_cfv.entity_type = 'task' AND due_cfv.custom_field_id = ? WHERE t.team_id = ? AND t.deleted_at IS NULL", [$dueDateFieldId, $teamId], ); return [ 'total' => $total, 'overdue' => (int) ($row->overdue ?? 0), 'due_this_week' => (int) ($row->due_this_week ?? 0), ]; } private function resolveFieldId(mixed $teamId, string $entityType, string $code): mixed { return CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $teamId) ->where('entity_type', $entityType) ->where('code', $code) ->active() ->value('id'); } } ================================================ FILE: app/Mcp/Resources/NoteSchemaResource.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $schema = [ 'entity' => 'note', 'description' => 'Free-form notes attached to CRM records.', 'fields' => [ 'title' => ['type' => 'string', 'required' => true], ], 'custom_fields' => $this->resolveCustomFields($user, 'note'), 'filterable_fields' => $this->resolveFilterableFields($user, 'note'), 'relationships' => ['creator', 'companies', 'people', 'opportunities'], 'writable_relationships' => [ 'company_ids' => [ 'type' => 'array of string IDs', 'description' => 'Link note to companies on create/update. Omit to leave unchanged, pass [] to remove all.', ], 'people_ids' => [ 'type' => 'array of string IDs', 'description' => 'Link note to people on create/update. Omit to leave unchanged, pass [] to remove all.', ], 'opportunity_ids' => [ 'type' => 'array of string IDs', 'description' => 'Link note to opportunities on create/update. Omit to leave unchanged, pass [] to remove all.', ], ], 'tools_hint' => 'Use attach-note-to-entities and detach-note-from-entities tools for post-creation relationship management.', 'aggregate_includes' => [ 'companiesCount' => 'Count of related companies', 'peopleCount' => 'Count of related people', 'opportunitiesCount' => 'Count of related opportunities', ], 'usage' => 'Pass custom field values in the "custom_fields" object using field codes as keys.', ]; return Response::text(json_encode($schema, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } } ================================================ FILE: app/Mcp/Resources/OpportunitySchemaResource.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $schema = [ 'entity' => 'opportunity', 'description' => 'Sales deals or business opportunities.', 'fields' => [ 'name' => ['type' => 'string', 'required' => true], 'company_id' => ['type' => 'string', 'required' => false], 'contact_id' => ['type' => 'string', 'required' => false, 'description' => 'Links to a person'], ], 'custom_fields' => $this->resolveCustomFields($user, 'opportunity'), 'filterable_fields' => $this->resolveFilterableFields($user, 'opportunity'), 'relationships' => ['creator', 'company', 'contact'], 'aggregate_includes' => [ 'tasksCount' => 'Count of related tasks', 'notesCount' => 'Count of related notes', ], 'usage' => 'Pass custom field values in the "custom_fields" object using field codes as keys. Use "filter" param in list tools to filter by custom field values with operators (eq, gt, gte, lt, lte, contains, in, has_any).', ]; return Response::text(json_encode($schema, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } } ================================================ FILE: app/Mcp/Resources/PeopleSchemaResource.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $schema = [ 'entity' => 'people', 'description' => 'Individual contacts associated with companies.', 'fields' => [ 'name' => ['type' => 'string', 'required' => true], 'company_id' => ['type' => 'string', 'required' => false, 'description' => 'Links to a company'], ], 'custom_fields' => $this->resolveCustomFields($user, 'people'), 'filterable_fields' => $this->resolveFilterableFields($user, 'people'), 'relationships' => ['creator', 'company'], 'aggregate_includes' => [ 'tasksCount' => 'Count of related tasks', 'notesCount' => 'Count of related notes', ], 'usage' => 'Pass custom field values in the "custom_fields" object using field codes as keys. Use "filter" param in list tools to filter by custom field values with operators.', ]; return Response::text(json_encode($schema, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } } ================================================ FILE: app/Mcp/Resources/TaskSchemaResource.php ================================================ user()?->currentAccessToken(); if (! $token instanceof PersonalAccessToken) { return true; } if (! $token->getKey()) { return true; } return $token->can('read'); } public function handle(Request $request): Response { /** @var User $user */ $user = $request->user(); $schema = [ 'entity' => 'task', 'description' => 'Action items and to-dos.', 'fields' => [ 'title' => ['type' => 'string', 'required' => true], ], 'custom_fields' => $this->resolveCustomFields($user, 'task'), 'filterable_fields' => $this->resolveFilterableFields($user, 'task'), 'relationships' => ['creator', 'assignees', 'companies', 'people', 'opportunities'], 'writable_relationships' => [ 'company_ids' => [ 'type' => 'array of string IDs', 'description' => 'Link task to companies on create/update. Omit to leave unchanged, pass [] to remove all.', ], 'people_ids' => [ 'type' => 'array of string IDs', 'description' => 'Link task to people on create/update. Omit to leave unchanged, pass [] to remove all.', ], 'opportunity_ids' => [ 'type' => 'array of string IDs', 'description' => 'Link task to opportunities on create/update. Omit to leave unchanged, pass [] to remove all.', ], 'assignee_ids' => [ 'type' => 'array of user IDs', 'description' => 'Assign team members to this task. Use whoami tool to discover valid user IDs.', ], ], 'tools_hint' => 'Use attach-task-to-entities and detach-task-from-entities tools for post-creation relationship management.', 'aggregate_includes' => [ 'assigneesCount' => 'Count of assigned users', 'companiesCount' => 'Count of related companies', 'peopleCount' => 'Count of related people', 'opportunitiesCount' => 'Count of related opportunities', ], 'usage' => 'Pass custom field values in the "custom_fields" object using field codes as keys. Use "filter" param in list tools to filter by custom field values with operators.', ]; return Response::text(json_encode($schema, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } } ================================================ FILE: app/Mcp/Schema/CustomFieldFilterSchema.php ================================================ */ private const array EXCLUDED_TYPES = [ CustomFieldType::FILE_UPLOAD->value, CustomFieldType::RECORD->value, CustomFieldType::TEXTAREA->value, CustomFieldType::RICH_EDITOR->value, CustomFieldType::MARKDOWN_EDITOR->value, ]; /** @var array */ private const array NUMERIC_OPERATORS = ['eq', 'gt', 'gte', 'lt', 'lte']; /** @var array */ private const array STRING_OPERATORS = ['eq', 'contains']; /** @var array */ private const array BOOLEAN_OPERATORS = ['eq']; /** @var array */ private const array MULTI_OPERATORS = ['has_any']; /** * @return array> */ public function build(User $user, string $entityType): array { $fields = $this->resolveFilterableFields($user, $entityType); $schema = []; foreach ($fields as $field) { $operators = $this->operatorsForType($field->type); if ($operators === []) { continue; } $schema[$field->code] = [ 'type' => 'object', 'description' => $field->name, 'properties' => $operators, ]; } return $schema; } /** * @return array */ public function allowedSorts(User $user, string $entityType): array { return collect(array_keys($this->build($user, $entityType))) ->map(fn (string $code): AllowedSort => AllowedSort::custom($code, new CustomFieldSort($entityType))) ->all(); } /** * @return array>> */ private function operatorsForType(string $type): array { $fieldType = CustomFieldType::tryFrom($type); if ($fieldType === null) { return []; } return match ($fieldType) { CustomFieldType::TEXT, CustomFieldType::EMAIL, CustomFieldType::PHONE, CustomFieldType::LINK => $this->buildOperators(self::STRING_OPERATORS, 'string'), CustomFieldType::CURRENCY => $this->buildOperators(self::NUMERIC_OPERATORS, 'number'), CustomFieldType::NUMBER => $this->buildOperators(self::NUMERIC_OPERATORS, 'integer'), CustomFieldType::DATE => $this->buildOperators(self::NUMERIC_OPERATORS, 'string'), CustomFieldType::DATE_TIME => $this->buildOperators(self::NUMERIC_OPERATORS, 'string'), CustomFieldType::CHECKBOX, CustomFieldType::TOGGLE => $this->buildOperators(self::BOOLEAN_OPERATORS, 'boolean'), CustomFieldType::SELECT, CustomFieldType::RADIO, CustomFieldType::TOGGLE_BUTTONS => array_merge( $this->buildOperators(['eq'], 'string'), ['in' => ['type' => 'array', 'items' => ['type' => 'string']]], ), CustomFieldType::MULTI_SELECT, CustomFieldType::CHECKBOX_LIST, CustomFieldType::TAGS_INPUT => $this->buildOperators(self::MULTI_OPERATORS, 'string'), default => [], }; } /** * @param array $operators * @return array> */ private function buildOperators(array $operators, string $jsonType): array { $result = []; foreach ($operators as $op) { $result[$op] = ['type' => $jsonType]; } return $result; } /** * @return Collection */ private function resolveFilterableFields(User $user, string $entityType): Collection { $teamId = $user->currentTeam->getKey(); $cacheKey = "custom_fields_filter_schema_{$teamId}_{$entityType}"; /** @var Collection */ return Cache::remember($cacheKey, 60, fn (): Collection => CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $teamId) ->where('entity_type', $entityType) ->whereNotIn('type', self::EXCLUDED_TYPES) ->where(fn (Builder $q) => $q->whereNull('settings->encrypted')->orWhere('settings->encrypted', false)) ->active() ->select('id', 'code', 'name', 'type') ->get()); } } ================================================ FILE: app/Mcp/Servers/RelaticleServer.php ================================================ > */ protected array $tools = [ WhoAmiTool::class, ListCompaniesTool::class, GetCompanyTool::class, CreateCompanyTool::class, UpdateCompanyTool::class, DeleteCompanyTool::class, ListPeopleTool::class, GetPeopleTool::class, CreatePeopleTool::class, UpdatePeopleTool::class, DeletePeopleTool::class, ListOpportunitiesTool::class, GetOpportunityTool::class, CreateOpportunityTool::class, UpdateOpportunityTool::class, DeleteOpportunityTool::class, ListTasksTool::class, GetTaskTool::class, CreateTaskTool::class, UpdateTaskTool::class, DeleteTaskTool::class, AttachTaskToEntitiesTool::class, DetachTaskFromEntitiesTool::class, ListNotesTool::class, GetNoteTool::class, CreateNoteTool::class, UpdateNoteTool::class, DeleteNoteTool::class, AttachNoteToEntitiesTool::class, DetachNoteFromEntitiesTool::class, ]; /** @var array> */ protected array $resources = [ CompanySchemaResource::class, PeopleSchemaResource::class, OpportunitySchemaResource::class, TaskSchemaResource::class, NoteSchemaResource::class, CrmSummaryResource::class, ]; /** @var array> */ protected array $prompts = [ CrmOverviewPrompt::class, ]; } ================================================ FILE: app/Mcp/Tools/BaseAttachTool.php ================================================ */ abstract protected function modelClass(): string; abstract protected function entityLabel(): string; /** @return class-string */ abstract protected function resourceClass(): string; /** @return array */ abstract protected function relationshipSchema(JsonSchema $schema): array; /** @return array> */ abstract protected function relationshipRules(User $user): array; /** @param array $data */ abstract protected function syncRelationships(Model $model, array $data): void; /** @return array */ protected function relationshipsToLoad(): array { return []; } public function schema(JsonSchema $schema): array { $label = strtolower($this->entityLabel()); return array_merge( ['id' => $schema->string()->description("The {$label} ID.")->required()], $this->relationshipSchema($schema), ); } public function handle(Request $request): Response { $this->ensureTokenCan('update'); /** @var User $user */ $user = auth()->user(); $rules = array_merge( ['id' => ['required', 'string']], $this->relationshipRules($user), ); $validated = $request->validate($rules); $relationshipData = collect($validated)->except('id')->filter(fn (mixed $v): bool => is_array($v)); if ($relationshipData->isEmpty()) { return Response::error('At least one relationship array must be provided.'); } $modelClass = $this->modelClass(); $model = $modelClass::query()->find($validated['id']); if (! $model instanceof Model) { return Response::error("{$this->entityLabel()} with ID [{$validated['id']}] not found."); } if ($user->cannot('update', $model)) { return Response::error("You do not have permission to update this {$this->entityLabel()}."); } $this->syncRelationships($model, $validated); return $this->buildRelationshipResponse($model); } } ================================================ FILE: app/Mcp/Tools/BaseCreateTool.php ================================================ */ abstract protected function resourceClass(): string; abstract protected function entityType(): string; /** * @return array */ abstract protected function entitySchema(JsonSchema $schema): array; /** * @return array> */ abstract protected function entityRules(User $user): array; public function schema(JsonSchema $schema): array { return array_merge( $this->entitySchema($schema), [ 'custom_fields' => $schema->object()->description('Custom field values as key-value pairs. IMPORTANT: You MUST first read the crm-schema resource to discover valid field codes for this entity type. Unknown field codes will be rejected. Use exact field codes from the schema (e.g. "job_title", not "jobTitle").'), ], ); } public function handle(Request $request): Response { $this->ensureTokenCan('create'); /** @var User $user */ $user = auth()->user(); $rules = array_merge( $this->entityRules($user), new ValidCustomFields($user->currentTeam->getKey(), $this->entityType())->toRules($request->get('custom_fields')), ); $validated = $request->validate($rules); $action = app()->make($this->actionClass()); $model = $action->execute($user, $validated, CreationSource::MCP); /** @var class-string $resourceClass */ $resourceClass = $this->resourceClass(); return Response::text( new $resourceClass($model->loadMissing('customFieldValues.customField.options'))->toJson(JSON_PRETTY_PRINT) ); } } ================================================ FILE: app/Mcp/Tools/BaseDeleteTool.php ================================================ */ abstract protected function modelClass(): string; /** @return class-string */ abstract protected function actionClass(): string; abstract protected function entityLabel(): string; protected function nameAttribute(): string { return 'name'; } public function schema(JsonSchema $schema): array { $label = strtolower($this->entityLabel()); return [ 'id' => $schema->string()->description("The {$label} ID to delete.")->required(), ]; } public function handle(Request $request): Response { $this->ensureTokenCan('delete'); /** @var User $user */ $user = auth()->user(); $validated = $request->validate([ 'id' => ['required', 'string'], ]); $modelClass = $this->modelClass(); $model = $modelClass::query()->find($validated['id']); if (! $model instanceof Model) { return Response::error("{$this->entityLabel()} with ID [{$validated['id']}] not found."); } if ($user->cannot('delete', $model)) { return Response::error("You do not have permission to delete this {$this->entityLabel()}."); } $action = app()->make($this->actionClass()); $action->execute($user, $model); $label = $this->entityLabel(); $entityName = $model->{$this->nameAttribute()}; return Response::text("{$label} '{$entityName}' has been deleted."); } } ================================================ FILE: app/Mcp/Tools/BaseDetachTool.php ================================================ */ abstract protected function modelClass(): string; abstract protected function entityLabel(): string; /** @return class-string */ abstract protected function resourceClass(): string; /** @return array */ abstract protected function relationshipSchema(JsonSchema $schema): array; /** @return array> */ abstract protected function relationshipRules(User $user): array; /** @param array $data */ abstract protected function detachRelationships(Model $model, array $data): void; /** @return array */ protected function relationshipsToLoad(): array { return []; } public function schema(JsonSchema $schema): array { $label = strtolower($this->entityLabel()); return array_merge( ['id' => $schema->string()->description("The {$label} ID.")->required()], $this->relationshipSchema($schema), ); } public function handle(Request $request): Response { $this->ensureTokenCan('update'); /** @var User $user */ $user = auth()->user(); $rules = array_merge( ['id' => ['required', 'string']], $this->relationshipRules($user), ); $validated = $request->validate($rules); $relationshipData = collect($validated)->except('id')->filter(fn (mixed $v): bool => is_array($v)); if ($relationshipData->isEmpty()) { return Response::error('At least one relationship array must be provided.'); } $modelClass = $this->modelClass(); $model = $modelClass::query()->find($validated['id']); if (! $model instanceof Model) { return Response::error("{$this->entityLabel()} with ID [{$validated['id']}] not found."); } if ($user->cannot('update', $model)) { return Response::error("You do not have permission to update this {$this->entityLabel()}."); } $this->detachRelationships($model, $validated); return $this->buildRelationshipResponse($model); } } ================================================ FILE: app/Mcp/Tools/BaseListTool.php ================================================ */ abstract protected function resourceClass(): string; abstract protected function searchFilterName(): string; /** * @return array */ protected function additionalSchema(JsonSchema $schema): array { return []; } /** * @return array */ protected function additionalFilters(Request $request): array { return []; } public function schema(JsonSchema $schema): array { return array_merge( ['search' => $schema->string()->description("Search by {$this->searchFilterName()}.")], $this->additionalSchema($schema), [ 'filter' => $schema->object()->description('Filter by custom field values. Keys are field codes, values are operator objects (eq, gt, gte, lt, lte, contains, in, has_any).'), 'sort' => $schema->object()->description('Sort by field. Properties: field (string), direction (asc|desc).'), 'include' => $schema->array()->description('Related records to expand in response.'), 'per_page' => $schema->integer()->description('Results per page (default 15, max 100).')->default(15), 'page' => $schema->integer()->description('Page number.')->default(1), ], ); } public function handle(Request $request): Response { $this->ensureTokenCan('read'); /** @var User $user */ $user = auth()->user(); $httpRequest = $this->buildHttpRequest($request); try { $action = app()->make($this->actionClass()); $results = $action->execute( user: $user, perPage: max(1, min((int) $request->get('per_page', 15), 100)), page: $request->get('page') ? (int) $request->get('page') : null, request: $httpRequest, ); } catch (InvalidQuery $e) { return Response::error($e->getMessage()); } /** @var class-string $resourceClass */ $resourceClass = $this->resourceClass(); $collection = $resourceClass::collection($results); $decoded = json_decode($collection->toJson(JSON_PRETTY_PRINT)); $items = isset($decoded->data) && is_array($decoded->data) ? $decoded->data : (is_array($decoded) ? $decoded : []); $relationshipMap = null; foreach (array_keys($items) as $index) { $resultItem = $results[$index] ?? null; if ($resultItem === null) { continue; } $model = $resultItem instanceof JsonResource ? $resultItem->resource : $resultItem; if (! $model instanceof Model) { continue; } foreach ($model->getRelations() as $relation => $relatedData) { if ($relation === 'customFieldValues') { continue; } $relationshipMap ??= $this->resolveRelationshipMap($resourceClass, $model); $items[$index]->{$relation} = $this->serializeRelation($model, $relation, $relationshipMap); } } $response = (object) ['data' => $items]; if ($results instanceof LengthAwarePaginator) { $response->meta = (object) [ 'current_page' => $results->currentPage(), 'per_page' => $results->perPage(), 'total' => $results->total(), 'last_page' => $results->lastPage(), ]; } return Response::text((string) json_encode($response, JSON_PRETTY_PRINT)); } private function buildHttpRequest(Request $mcpRequest): HttpRequest { $input = []; $nativeFilters = array_filter(array_merge( [$this->searchFilterName() => $mcpRequest->get('search')], $this->additionalFilters($mcpRequest), )); if ($nativeFilters !== []) { $input['filter'] = $nativeFilters; } $customFieldFilters = $mcpRequest->get('filter'); if (is_array($customFieldFilters) && $customFieldFilters !== []) { $input['filter']['custom_fields'] = $customFieldFilters; } $sort = $mcpRequest->get('sort'); if (is_array($sort) && isset($sort['field'])) { $direction = ($sort['direction'] ?? 'asc') === 'desc' ? '-' : ''; $input['sort'] = $direction.$sort['field']; } $include = $mcpRequest->get('include'); if (is_array($include) && $include !== []) { $input['include'] = implode(',', $include); } return new HttpRequest($input); } } ================================================ FILE: app/Mcp/Tools/BaseShowTool.php ================================================ */ abstract protected function modelClass(): string; /** @return class-string */ abstract protected function resourceClass(): string; abstract protected function entityLabel(): string; /** * @return array */ abstract protected function allowedIncludes(): array; public function schema(JsonSchema $schema): array { $label = strtolower($this->entityLabel()); return [ 'id' => $schema->string()->description("The {$label} ID to retrieve.")->required(), 'include' => $schema->array()->description('Related records to expand in response.'), ]; } public function handle(Request $request): Response { $this->ensureTokenCan('read'); /** @var User $user */ $user = auth()->user(); $validated = $request->validate([ 'id' => ['required', 'string'], 'include' => ['sometimes', 'array'], 'include.*' => ['string'], ]); $modelClass = $this->modelClass(); $model = $modelClass::query()->find($validated['id']); if (! $model instanceof Model) { return Response::error("{$this->entityLabel()} with ID [{$validated['id']}] not found."); } if ($user->cannot('view', $model)) { return Response::error("You do not have permission to view this {$this->entityLabel()}."); } $model->loadMissing('customFieldValues.customField.options'); $requestedIncludes = $validated['include'] ?? []; $validIncludes = array_intersect($requestedIncludes, $this->allowedIncludes()); $relationIncludes = []; $countIncludes = []; foreach ($validIncludes as $include) { if (str_ends_with((string) $include, 'Count')) { $countIncludes[] = lcfirst(substr((string) $include, 0, -5)); } else { $relationIncludes[] = $include; } } if ($relationIncludes !== []) { $model->loadMissing($relationIncludes); } if ($countIncludes !== []) { $model->loadCount($countIncludes); } /** @var class-string $resourceClass */ $resourceClass = $this->resourceClass(); $resource = new $resourceClass($model); $json = $resource->toJson(JSON_PRETTY_PRINT); if ($relationIncludes === []) { return Response::text($json); } $response = json_decode($json); $relationshipMap = $this->resolveRelationshipMap($resourceClass, $model); foreach ($relationIncludes as $relation) { if ($model->relationLoaded($relation)) { $response->data->{$relation} = $this->serializeRelation($model, $relation, $relationshipMap); } } return Response::text((string) json_encode($response, JSON_PRETTY_PRINT)); } } ================================================ FILE: app/Mcp/Tools/BaseUpdateTool.php ================================================ */ abstract protected function modelClass(): string; /** @return class-string */ abstract protected function actionClass(): string; /** @return class-string */ abstract protected function resourceClass(): string; abstract protected function entityType(): string; abstract protected function entityLabel(): string; /** * @return array */ abstract protected function entitySchema(JsonSchema $schema): array; /** * @return array> */ abstract protected function entityRules(User $user): array; public function schema(JsonSchema $schema): array { $label = strtolower($this->entityLabel()); return array_merge( ['id' => $schema->string()->description("The {$label} ID to update.")->required()], $this->entitySchema($schema), [ 'custom_fields' => $schema->object()->description('Custom field values as key-value pairs. IMPORTANT: You MUST first read the crm-schema resource to discover valid field codes for this entity type. Unknown field codes will be rejected. Use exact field codes from the schema (e.g. "job_title", not "jobTitle").'), ], ); } public function handle(Request $request): Response { $this->ensureTokenCan('update'); /** @var User $user */ $user = auth()->user(); $rules = array_merge( ['id' => ['required', 'string']], $this->entityRules($user), new ValidCustomFields($user->currentTeam->getKey(), $this->entityType(), isUpdate: true)->toRules($request->get('custom_fields')), ); $validated = $request->validate($rules); $modelClass = $this->modelClass(); $model = $modelClass::query()->find($validated['id']); if (! $model instanceof Model) { return Response::error("{$this->entityLabel()} with ID [{$validated['id']}] not found."); } if ($user->cannot('update', $model)) { return Response::error("You do not have permission to update this {$this->entityLabel()}."); } unset($validated['id']); $action = app()->make($this->actionClass()); $model = $action->execute($user, $model, $validated); /** @var class-string $resourceClass */ $resourceClass = $this->resourceClass(); return Response::text( new $resourceClass($model->loadMissing('customFieldValues.customField.options'))->toJson(JSON_PRETTY_PRINT) ); } } ================================================ FILE: app/Mcp/Tools/Company/CreateCompanyTool.php ================================================ $schema->string()->description('The company name.')->required(), ]; } protected function entityRules(User $user): array { return [ 'name' => ['required', 'string', 'max:255'], ]; } } ================================================ FILE: app/Mcp/Tools/Company/DeleteCompanyTool.php ================================================ */ protected function resourceClass(): string { return CompanyResource::class; } protected function entityLabel(): string { return 'Company'; } /** @return array */ protected function allowedIncludes(): array { return ['creator', 'accountOwner', 'people', 'opportunities', 'peopleCount', 'opportunitiesCount', 'tasksCount', 'notesCount']; } } ================================================ FILE: app/Mcp/Tools/Company/ListCompaniesTool.php ================================================ $schema->string()->description('The company name.'), ]; } protected function entityRules(User $user): array { return [ 'name' => ['sometimes', 'string', 'max:255'], ]; } } ================================================ FILE: app/Mcp/Tools/Concerns/BuildsRelationshipResponse.php ================================================ relationshipsToLoad()) ->filter(fn (string $relation): bool => $model->isRelation($relation)) ->all(); if ($countRelations !== []) { $model->loadCount($countRelations); } $model->loadMissing('customFieldValues.customField.options'); /** @var class-string $resourceClass */ $resourceClass = $this->resourceClass(); $resource = new $resourceClass($model); $response = json_decode($resource->toJson(JSON_PRETTY_PRINT)); $counts = new \stdClass; foreach ($countRelations as $relation) { $countKey = Str::snake($relation).'_count'; if (isset($model->{$countKey})) { $counts->{$relation} = $model->{$countKey}; } } if ((array) $counts !== []) { $response->relationship_counts = $counts; } return Response::text((string) json_encode($response, JSON_PRETTY_PRINT)); } } ================================================ FILE: app/Mcp/Tools/Concerns/ChecksTokenAbility.php ================================================ user(); $token = $user?->currentAccessToken(); if (! $token instanceof PersonalAccessToken || ! $token->getKey()) { return; } throw_unless($token->can($ability), MissingAbilityException::class, [$ability]); } } ================================================ FILE: app/Mcp/Tools/Concerns/SerializesRelatedModels.php ================================================ $resourceClass * @return array> */ private function resolveRelationshipMap(string $resourceClass, Model $model): array { /** @var JsonApiResource $resourceInstance */ $resourceInstance = new $resourceClass($model); /** @var array> $map */ $map = $resourceInstance->toRelationships(request()); return $map; } /** * Serialize a related model using its API resource, falling back to safe defaults. * * @param array> $relationshipMap * @return array */ private function serializeRelatedModel(Model $model, string $relation, array $relationshipMap): array { $relatedResourceClass = $relationshipMap[$relation] ?? null; if ($relatedResourceClass !== null) { /** @var JsonApiResource $resource */ $resource = new $relatedResourceClass($model); /** @var array $attributes */ $attributes = $resource->toAttributes(request()); // Strip unloaded aggregate counts (whenHas returns MissingValue -> {}) $attributes = array_filter( $attributes, fn (mixed $value, string $key): bool => ! str_ends_with($key, '_count') || $model->hasAttribute($key), ARRAY_FILTER_USE_BOTH, ); return [ 'id' => $model->getKey(), ...$attributes, ]; } return $model->only(['id', 'name', 'title', 'email']); } /** * Serialize related data (collection, single model, or null) for a given relation. * * @param array> $relationshipMap * @return array>|array|null */ private function serializeRelation( Model $parentModel, string $relation, array $relationshipMap, ): ?array { $relatedData = $parentModel->getRelation($relation); if ($relatedData instanceof EloquentCollection) { return $relatedData ->map(fn (Model $item): array => $this->serializeRelatedModel($item, $relation, $relationshipMap)) ->values() ->all(); } if ($relatedData instanceof Model) { return $this->serializeRelatedModel($relatedData, $relation, $relationshipMap); } return null; } } ================================================ FILE: app/Mcp/Tools/Note/AttachNoteToEntitiesTool.php ================================================ */ protected function relationshipsToLoad(): array { return ['companies', 'people', 'opportunities']; } public function relationshipSchema(JsonSchema $schema): array { return [ 'company_ids' => $schema->array()->description('Company IDs to attach this note to.'), 'people_ids' => $schema->array()->description('People IDs to attach this note to.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to attach this note to.'), ]; } public function relationshipRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], ]; } public function syncRelationships(Model $model, array $data): void { /** @var Note $model */ if (isset($data['company_ids'])) { $model->companies()->syncWithoutDetaching($data['company_ids']); } if (isset($data['people_ids'])) { $model->people()->syncWithoutDetaching($data['people_ids']); } if (isset($data['opportunity_ids'])) { $model->opportunities()->syncWithoutDetaching($data['opportunity_ids']); } } } ================================================ FILE: app/Mcp/Tools/Note/CreateNoteTool.php ================================================ $schema->string()->description('The note title.')->required(), 'company_ids' => $schema->array()->description('Company IDs to link this note to.'), 'people_ids' => $schema->array()->description('People IDs to link this note to.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to link this note to.'), ]; } protected function entityRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'title' => ['required', 'string', 'max:255'], 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], ]; } } ================================================ FILE: app/Mcp/Tools/Note/DeleteNoteTool.php ================================================ */ protected function relationshipsToLoad(): array { return ['companies', 'people', 'opportunities']; } public function relationshipSchema(JsonSchema $schema): array { return [ 'company_ids' => $schema->array()->description('Company IDs to detach from this note.'), 'people_ids' => $schema->array()->description('People IDs to detach from this note.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to detach from this note.'), ]; } public function relationshipRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], ]; } public function detachRelationships(Model $model, array $data): void { /** @var Note $model */ if (isset($data['company_ids'])) { $model->companies()->detach($data['company_ids']); } if (isset($data['people_ids'])) { $model->people()->detach($data['people_ids']); } if (isset($data['opportunity_ids'])) { $model->opportunities()->detach($data['opportunity_ids']); } } } ================================================ FILE: app/Mcp/Tools/Note/GetNoteTool.php ================================================ */ protected function resourceClass(): string { return NoteResource::class; } protected function entityLabel(): string { return 'Note'; } /** @return array */ protected function allowedIncludes(): array { return ['creator', 'companies', 'people', 'opportunities', 'companiesCount', 'peopleCount', 'opportunitiesCount']; } } ================================================ FILE: app/Mcp/Tools/Note/ListNotesTool.php ================================================ $schema->string()->description('Filter by related entity type: company, people, or opportunity.'), 'notable_id' => $schema->string()->description('Filter by related entity ID (use with notable_type for best results).'), ]; } protected function additionalFilters(Request $request): array { return [ 'notable_type' => $request->get('notable_type'), 'notable_id' => $request->get('notable_id'), ]; } } ================================================ FILE: app/Mcp/Tools/Note/UpdateNoteTool.php ================================================ $schema->string()->description('The note title.'), 'company_ids' => $schema->array()->description('Company IDs to link. Omit to leave unchanged, pass [] to remove all.'), 'people_ids' => $schema->array()->description('People IDs to link. Omit to leave unchanged, pass [] to remove all.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to link. Omit to leave unchanged, pass [] to remove all.'), ]; } protected function entityRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'title' => ['sometimes', 'string', 'max:255'], 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], ]; } } ================================================ FILE: app/Mcp/Tools/Opportunity/CreateOpportunityTool.php ================================================ $schema->string()->description('The opportunity name.')->required(), 'company_id' => $schema->string()->description('The associated company ID.'), 'contact_id' => $schema->string()->description('The associated contact (person) ID.'), ]; } protected function entityRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'name' => ['required', 'string', 'max:255'], 'company_id' => ['sometimes', 'nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'contact_id' => ['sometimes', 'nullable', 'string', Rule::exists('people', 'id')->where('team_id', $teamId)], ]; } } ================================================ FILE: app/Mcp/Tools/Opportunity/DeleteOpportunityTool.php ================================================ */ protected function resourceClass(): string { return OpportunityResource::class; } protected function entityLabel(): string { return 'Opportunity'; } /** @return array */ protected function allowedIncludes(): array { return ['creator', 'company', 'contact', 'tasksCount', 'notesCount']; } } ================================================ FILE: app/Mcp/Tools/Opportunity/ListOpportunitiesTool.php ================================================ $schema->string()->description('Filter by company ID.'), 'contact_id' => $schema->string()->description('Filter by contact (person) ID.'), ]; } protected function additionalFilters(Request $request): array { return [ 'company_id' => $request->get('company_id'), 'contact_id' => $request->get('contact_id'), ]; } } ================================================ FILE: app/Mcp/Tools/Opportunity/UpdateOpportunityTool.php ================================================ $schema->string()->description('The opportunity name.'), 'company_id' => $schema->string()->description('The associated company ID.'), 'contact_id' => $schema->string()->description('The associated contact (person) ID.'), ]; } protected function entityRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'name' => ['sometimes', 'string', 'max:255'], 'company_id' => ['sometimes', 'nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'contact_id' => ['sometimes', 'nullable', 'string', Rule::exists('people', 'id')->where('team_id', $teamId)], ]; } } ================================================ FILE: app/Mcp/Tools/People/CreatePeopleTool.php ================================================ $schema->string()->description('The person\'s full name.')->required(), 'company_id' => $schema->string()->description('The company this person belongs to.'), ]; } protected function entityRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'name' => ['required', 'string', 'max:255'], 'company_id' => ['sometimes', 'nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], ]; } } ================================================ FILE: app/Mcp/Tools/People/DeletePeopleTool.php ================================================ */ protected function resourceClass(): string { return PeopleResource::class; } protected function entityLabel(): string { return 'Person'; } /** @return array */ protected function allowedIncludes(): array { return ['creator', 'company', 'tasksCount', 'notesCount']; } } ================================================ FILE: app/Mcp/Tools/People/ListPeopleTool.php ================================================ $schema->string()->description('Filter by company ID.'), ]; } protected function additionalFilters(Request $request): array { return [ 'company_id' => $request->get('company_id'), ]; } } ================================================ FILE: app/Mcp/Tools/People/UpdatePeopleTool.php ================================================ $schema->string()->description('The person\'s full name.'), 'company_id' => $schema->string()->description('The company this person belongs to.'), ]; } protected function entityRules(User $user): array { $teamId = $user->currentTeam->getKey(); return [ 'name' => ['sometimes', 'string', 'max:255'], 'company_id' => ['sometimes', 'nullable', 'string', Rule::exists('companies', 'id')->where('team_id', $teamId)], ]; } } ================================================ FILE: app/Mcp/Tools/Task/AttachTaskToEntitiesTool.php ================================================ */ protected function relationshipsToLoad(): array { return ['companies', 'people', 'opportunities', 'assignees']; } public function relationshipSchema(JsonSchema $schema): array { return [ 'company_ids' => $schema->array()->description('Company IDs to attach this task to.'), 'people_ids' => $schema->array()->description('People IDs to attach this task to.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to attach this task to.'), 'assignee_ids' => $schema->array()->description('User IDs to assign this task to. Use whoami tool to discover valid user IDs.'), ]; } public function relationshipRules(User $user): array { /** @var Team $team */ $team = $user->currentTeam; $teamId = $team->getKey(); $teamMemberIds = $team->allUsers()->pluck('id')->all(); return [ 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], 'assignee_ids' => ['sometimes', 'array'], 'assignee_ids.*' => ['string', Rule::in($teamMemberIds)], ]; } public function syncRelationships(Model $model, array $data): void { /** @var Task $model */ if (isset($data['company_ids'])) { $model->companies()->syncWithoutDetaching($data['company_ids']); } if (isset($data['people_ids'])) { $model->people()->syncWithoutDetaching($data['people_ids']); } if (isset($data['opportunity_ids'])) { $model->opportunities()->syncWithoutDetaching($data['opportunity_ids']); } if (isset($data['assignee_ids'])) { $model->assignees()->syncWithoutDetaching($data['assignee_ids']); } } } ================================================ FILE: app/Mcp/Tools/Task/CreateTaskTool.php ================================================ $schema->string()->description('The task title.')->required(), 'company_ids' => $schema->array()->description('Company IDs to link this task to.'), 'people_ids' => $schema->array()->description('People IDs to link this task to.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to link this task to.'), 'assignee_ids' => $schema->array()->description('User IDs to assign this task to. Use whoami tool to discover valid user IDs.'), ]; } protected function entityRules(User $user): array { /** @var Team $team */ $team = $user->currentTeam; $teamId = $team->getKey(); $teamMemberIds = $team->allUsers()->pluck('id')->all(); return [ 'title' => ['required', 'string', 'max:255'], 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], 'assignee_ids' => ['sometimes', 'array'], 'assignee_ids.*' => ['string', Rule::in($teamMemberIds)], ]; } } ================================================ FILE: app/Mcp/Tools/Task/DeleteTaskTool.php ================================================ */ protected function relationshipsToLoad(): array { return ['companies', 'people', 'opportunities', 'assignees']; } public function relationshipSchema(JsonSchema $schema): array { return [ 'company_ids' => $schema->array()->description('Company IDs to detach from this task.'), 'people_ids' => $schema->array()->description('People IDs to detach from this task.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to detach from this task.'), 'assignee_ids' => $schema->array()->description('User IDs to unassign from this task.'), ]; } public function relationshipRules(User $user): array { /** @var Team $team */ $team = $user->currentTeam; $teamId = $team->getKey(); $teamMemberIds = $team->allUsers()->pluck('id')->all(); return [ 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], 'assignee_ids' => ['sometimes', 'array'], 'assignee_ids.*' => ['string', Rule::in($teamMemberIds)], ]; } public function detachRelationships(Model $model, array $data): void { /** @var Task $model */ if (isset($data['company_ids'])) { $model->companies()->detach($data['company_ids']); } if (isset($data['people_ids'])) { $model->people()->detach($data['people_ids']); } if (isset($data['opportunity_ids'])) { $model->opportunities()->detach($data['opportunity_ids']); } if (isset($data['assignee_ids'])) { $model->assignees()->detach($data['assignee_ids']); } } } ================================================ FILE: app/Mcp/Tools/Task/GetTaskTool.php ================================================ */ protected function resourceClass(): string { return TaskResource::class; } protected function entityLabel(): string { return 'Task'; } /** @return array */ protected function allowedIncludes(): array { return ['creator', 'assignees', 'companies', 'people', 'opportunities', 'assigneesCount', 'companiesCount', 'peopleCount', 'opportunitiesCount']; } } ================================================ FILE: app/Mcp/Tools/Task/ListTasksTool.php ================================================ $schema->boolean()->description('Filter tasks assigned to the current user.'), 'company_id' => $schema->string()->description('Filter tasks linked to a specific company.'), 'people_id' => $schema->string()->description('Filter tasks linked to a specific person.'), 'opportunity_id' => $schema->string()->description('Filter tasks linked to a specific opportunity.'), ]; } protected function additionalFilters(Request $request): array { return [ 'assigned_to_me' => $request->get('assigned_to_me') ? '1' : null, 'company_id' => $request->get('company_id'), 'people_id' => $request->get('people_id'), 'opportunity_id' => $request->get('opportunity_id'), ]; } } ================================================ FILE: app/Mcp/Tools/Task/UpdateTaskTool.php ================================================ $schema->string()->description('The task title.'), 'company_ids' => $schema->array()->description('Company IDs to link. Omit to leave unchanged, pass [] to remove all.'), 'people_ids' => $schema->array()->description('People IDs to link. Omit to leave unchanged, pass [] to remove all.'), 'opportunity_ids' => $schema->array()->description('Opportunity IDs to link. Omit to leave unchanged, pass [] to remove all.'), 'assignee_ids' => $schema->array()->description('User IDs to assign this task to. Use whoami tool to discover valid user IDs.'), ]; } protected function entityRules(User $user): array { /** @var Team $team */ $team = $user->currentTeam; $teamId = $team->getKey(); $teamMemberIds = $team->allUsers()->pluck('id')->all(); return [ 'title' => ['sometimes', 'string', 'max:255'], 'company_ids' => ['sometimes', 'array'], 'company_ids.*' => ['string', Rule::exists('companies', 'id')->where('team_id', $teamId)], 'people_ids' => ['sometimes', 'array'], 'people_ids.*' => ['string', Rule::exists('people', 'id')->where('team_id', $teamId)], 'opportunity_ids' => ['sometimes', 'array'], 'opportunity_ids.*' => ['string', Rule::exists('opportunities', 'id')->where('team_id', $teamId)], 'assignee_ids' => ['sometimes', 'array'], 'assignee_ids.*' => ['string', Rule::in($teamMemberIds)], ]; } } ================================================ FILE: app/Mcp/Tools/WhoAmiTool.php ================================================ ensureTokenCan('read'); /** @var User $user */ $user = auth()->user(); /** @var Team $team */ $team = $user->currentTeam; $tokenAbilities = ['*']; $token = $user->currentAccessToken(); if ($token instanceof PersonalAccessToken && $token->getKey()) { $tokenAbilities = $token->abilities; } $teamMembers = $team->allUsers()->map(fn (User $member): array => [ 'id' => $member->id, 'name' => $member->name, 'email' => $member->email, ])->values()->all(); $result = [ 'user' => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, ], 'team' => [ 'id' => $team->id, 'name' => $team->name, ], 'team_members' => $teamMembers, 'token_abilities' => $tokenAbilities, ]; return Response::text(json_encode($result, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); } } ================================================ FILE: app/Models/AiSummary.php ================================================ > */ use HasFactory; use HasTeam; use HasUlids; /** * @var list */ protected $fillable = [ 'team_id', 'summarizable_type', 'summarizable_id', 'summary', 'model_used', 'prompt_tokens', 'completion_tokens', ]; /** * @return array */ protected function casts(): array { return [ 'prompt_tokens' => 'integer', 'completion_tokens' => 'integer', ]; } /** * @return MorphTo */ public function summarizable(): MorphTo { return $this->morphTo(); } } ================================================ FILE: app/Models/Company.php ================================================ */ use HasFactory; use HasNotes; use HasTeam; use HasUlids; use InteractsWithMedia; use SoftDeletes; use UsesCustomFields; /** * @var list */ protected $fillable = [ 'name', 'creation_source', ]; /** * @var array */ protected $attributes = [ 'creation_source' => CreationSource::WEB, ]; /** * The attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'creation_source' => CreationSource::class, ]; } protected function getLogoAttribute(): string { $logo = $this->getFirstMediaUrl('logo'); return $logo === '' || $logo === '0' ? resolve(AvatarService::class)->generateAuto(name: $this->name) : $logo; } /** * Team member responsible for managing the company account * * @return BelongsTo */ public function accountOwner(): BelongsTo { return $this->belongsTo(User::class, 'account_owner_id'); } /** * @return HasMany */ public function people(): HasMany { return $this->hasMany(People::class); } /** * @return HasMany */ public function opportunities(): HasMany { return $this->hasMany(Opportunity::class); } /** * @return MorphToMany */ public function tasks(): MorphToMany { return $this->morphToMany(Task::class, 'taskable'); } } ================================================ FILE: app/Models/Concerns/BelongsToTeamCreator.php ================================================ check()) { /** @var User $user */ $user = auth()->user(); $model->creator_id ??= $user->getKey(); $model->team_id ??= $user->currentTeam->getKey(); } }); } } ================================================ FILE: app/Models/Concerns/HasAiSummary.php ================================================ */ public function aiSummary(): MorphOne { return $this->morphOne(AiSummary::class, 'summarizable'); } /** * Invalidate (delete) the cached AI summary for this record. */ public function invalidateAiSummary(): void { $this->aiSummary()->delete(); } } ================================================ FILE: app/Models/Concerns/HasCreator.php ================================================ */ public function creator(): BelongsTo { return $this->belongsTo(User::class, 'creator_id'); } /** * Determine if the system created the record. */ public function isSystemCreated(): bool { return $this->creation_source === CreationSource::SYSTEM; } /** * @return Attribute */ protected function createdBy(): Attribute { return Attribute::make( get: fn (): string => $this->creation_source === CreationSource::SYSTEM ? '⊙ System' : $this->creator->name ?? 'Unknown', ); } } ================================================ FILE: app/Models/Concerns/HasNotes.php ================================================ */ public function notes(): MorphToMany { return $this->morphToMany(Note::class, 'noteable'); } } ================================================ FILE: app/Models/Concerns/HasProfilePhoto.php ================================================ profile_photo_path, function ($previous) use ($photo): void { $this->forceFill(['profile_photo_path' => $photo])->save(); if ($previous) { Storage::disk($this->profilePhotoDisk())->delete($previous); } }); } /** * Delete the user's profile photo. */ public function deleteProfilePhoto(): void { if (is_null($this->profile_photo_path)) { return; } Storage::disk($this->profilePhotoDisk())->delete($this->profile_photo_path); $this->forceFill([ 'profile_photo_path' => null, ])->save(); } /** * Get the URL to the user's profile photo. * * @return Attribute */ protected function profilePhotoUrl(): Attribute { return Attribute::get(fn (): string => $this->profile_photo_path ? Storage::disk($this->profilePhotoDisk())->url($this->profile_photo_path) : $this->defaultProfilePhotoUrl()); } /** * Get the default profile photo URL if no profile photo has been uploaded. */ protected function defaultProfilePhotoUrl(): string { $name = trim( collect(explode(' ', $this->name))->map(fn ($segment): string => mb_substr($segment, 0, 1))->join(' ') ); return 'https://ui-avatars.com/api/?name='.urlencode($name).'&color=7F9CF5&background=EBF4FF'; } /** * Get the disk that profile photos should be stored on. */ protected function profilePhotoDisk(): string { return config('jetstream.profile_photo_disk', 'public'); } protected function getAvatarAttribute(): string { return $this->getFilamentAvatarUrl(); } public function getFilamentAvatarUrl(): string { return $this->profile_photo_path ? Storage::disk($this->profilePhotoDisk())->url($this->profile_photo_path) : resolve(AvatarService::class)->generate($this->name); } } ================================================ FILE: app/Models/Concerns/HasTeam.php ================================================ */ public function team(): BelongsTo { return $this->belongsTo(Team::class); } } ================================================ FILE: app/Models/Concerns/InvalidatesRelatedAiSummaries.php ================================================ {$relation}->each->invalidateAiSummary(); } } } } ================================================ FILE: app/Models/CustomField.php ================================================ > */ use HasFactory; use HasUlids; } ================================================ FILE: app/Models/Membership.php ================================================ > */ use HasFactory; /** * Indicates if the IDs are auto-incrementing. * * @var bool */ public $incrementing = true; /** * @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * @return BelongsTo */ public function team(): BelongsTo { return $this->belongsTo(Team::class); } protected function getRoleNameAttribute(): string { // @phpstan-ignore-next-line nullCoalesce.expr return Jetstream::findRole($this->role)?->name ?? 'Unknown'; } } ================================================ FILE: app/Models/Note.php ================================================ */ use HasFactory; use HasTeam; use HasUlids; use InvalidatesRelatedAiSummaries; use SoftDeletes; use UsesCustomFields; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'creation_source', ]; /** * @var array */ protected $attributes = [ 'creation_source' => CreationSource::WEB, ]; /** * The attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'creation_source' => CreationSource::class, ]; } /** * @return MorphToMany */ public function companies(): MorphToMany { return $this->morphedByMany(Company::class, 'noteable'); } /** * @return MorphToMany */ public function people(): MorphToMany { return $this->morphedByMany(People::class, 'noteable'); } /** * @return MorphToMany */ public function opportunities(): MorphToMany { return $this->morphedByMany(Opportunity::class, 'noteable'); } /** @param Builder $query */ #[Scope] protected function forNotableType(Builder $query, string $type): void { $relationMap = [ 'company' => 'companies', 'people' => 'people', 'opportunity' => 'opportunities', ]; $relation = $relationMap[$type] ?? null; if ($relation) { $query->whereHas($relation); } } /** @param Builder $query */ #[Scope] protected function forNotableId(Builder $query, string $id): void { $query->where(function (Builder $q) use ($id): void { $q->whereHas('companies', fn (Builder $sub) => $sub->where('noteables.noteable_id', $id)) ->orWhereHas('people', fn (Builder $sub) => $sub->where('noteables.noteable_id', $id)) ->orWhereHas('opportunities', fn (Builder $sub) => $sub->where('noteables.noteable_id', $id)); }); } } ================================================ FILE: app/Models/Opportunity.php ================================================ */ use HasFactory; use HasNotes; use HasTeam; use HasUlids; use SoftDeletes; use SortableTrait; use UsesCustomFields; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'creation_source', ]; /** * @var array */ protected $attributes = [ 'creation_source' => CreationSource::WEB, ]; /** * The attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'creation_source' => CreationSource::class, ]; } /** * @return BelongsTo */ public function company(): BelongsTo { return $this->belongsTo(Company::class); } /** * @return BelongsTo */ public function contact(): BelongsTo { return $this->belongsTo(People::class); } /** * @return MorphToMany */ public function tasks(): MorphToMany { return $this->morphToMany(Task::class, 'taskable'); } } ================================================ FILE: app/Models/People.php ================================================ */ use HasFactory; use HasNotes; use HasTeam; use HasUlids; use SoftDeletes; use UsesCustomFields; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'name', 'creation_source', ]; /** * @var array */ protected $attributes = [ 'creation_source' => CreationSource::WEB, ]; /** * The attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'creation_source' => CreationSource::class, ]; } protected function getAvatarAttribute(): string { return resolve(AvatarService::class)->generateAuto(name: $this->name, initialCount: 1); } /** * @return BelongsTo */ public function company(): BelongsTo { return $this->belongsTo(Company::class); } /** * @return MorphToMany */ public function tasks(): MorphToMany { return $this->morphToMany(Task::class, 'taskable'); } } ================================================ FILE: app/Models/PersonalAccessToken.php ================================================ */ protected $fillable = [ 'name', 'abilities', 'expires_at', 'team_id', ]; protected static function booted(): void { self::creating(function (PersonalAccessToken $token): void { if ($token->team_id && $token->tokenable instanceof User) { abort_unless( $token->tokenable->belongsToTeam(Team::query()->find($token->team_id)), 403, 'Token team_id must belong to the tokenable user.', ); } }); self::updating(function (PersonalAccessToken $token): void { if ($token->isDirty('team_id')) { throw_if($token->getOriginal('team_id') !== null, LogicException::class, 'The team_id attribute cannot be changed after it has been set.'); if ($token->team_id && $token->tokenable instanceof User) { abort_unless( $token->tokenable->belongsToTeam(Team::query()->find($token->team_id)), 403, 'Token team_id must belong to the tokenable user.', ); } } }); } /** @return BelongsTo */ public function team(): BelongsTo { return $this->belongsTo(Team::class); } } ================================================ FILE: app/Models/Scopes/TeamScope.php ================================================ $builder */ public function apply(Builder $builder, Model $model): void { $user = auth()->user(); if (! $user instanceof User) { $builder->whereRaw('1 = 0'); return; } $builder->whereBelongsTo($user->currentTeam); } } ================================================ FILE: app/Models/Task.php ================================================ */ use HasFactory; use HasTeam; use HasUlids; use InvalidatesRelatedAiSummaries; use SoftDeletes; use SortableTrait; use UsesCustomFields; protected $fillable = [ 'user_id', 'title', 'creation_source', ]; /** * @var array */ protected $attributes = [ 'creation_source' => CreationSource::WEB, ]; /** * The attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'creation_source' => CreationSource::class, ]; } /** * @var array{order_column_name: 'order_column', sort_when_creating: true} */ public array $sortable = [ 'order_column_name' => 'order_column', 'sort_when_creating' => true, ]; /** * @return BelongsToMany */ public function assignees(): BelongsToMany { return $this->belongsToMany(User::class); } /** * @return MorphToMany */ public function companies(): MorphToMany { return $this->morphedByMany(Company::class, 'taskable'); } /** * @return MorphToMany */ public function opportunities(): MorphToMany { return $this->morphedByMany(Opportunity::class, 'taskable'); } /** * @return MorphToMany */ public function people(): MorphToMany { return $this->morphedByMany(People::class, 'taskable'); } /** @param Builder $query */ #[Scope] protected function forCompany(Builder $query, string $companyId): void { $query->whereHas('companies', fn (Builder $q) => $q->where('companies.id', $companyId)); } /** @param Builder $query */ #[Scope] protected function forPerson(Builder $query, string $personId): void { $query->whereHas('people', fn (Builder $q) => $q->where('people.id', $personId)); } /** @param Builder $query */ #[Scope] protected function forOpportunity(Builder $query, string $opportunityId): void { $query->whereHas('opportunities', fn (Builder $q) => $q->where('opportunities.id', $opportunityId)); } } ================================================ FILE: app/Models/Team.php ================================================ */ use HasFactory; use HasSlug; use HasUlids; public const string SLUG_REGEX = '/^[a-z0-9]+(?:-[a-z0-9]+)*$/'; /** * Slugs reserved for application routes that must not be used as team slugs. * * @var list */ public const array RESERVED_SLUGS = [ // Authentication & authorization 'login', 'logout', 'register', 'signin', 'signout', 'signup', 'auth', 'oauth', 'sso', 'callback', 'forgot-password', 'reset-password', 'password-reset', 'verify-email', 'email-verification', 'confirm-password', 'two-factor-challenge', // Administration 'admin', 'administrator', 'dashboard', 'console', 'root', 'super', 'sysadmin', // Account & billing 'account', 'billing', 'checkout', 'invoices', 'plan', 'plans', 'pricing', 'settings', 'subscription', 'subscriptions', // Teams & orgs 'teams', 'team', 'org', 'organization', 'workspace', 'invitations', 'invite', 'team-invitations', // App routes 'companies', 'people', 'tasks', 'opportunities', 'notes', 'api-tokens', 'import-history', 'profile', 'opportunities-board', 'tasks-board', // Content & info pages 'about', 'blog', 'docs', 'documentation', 'faq', 'help', 'support', 'privacy-policy', 'terms-of-service', 'legal', 'security', 'changelog', 'discord', // API & developer 'api', 'graphql', 'mcp', 'webhooks', 'developer', 'developers', 'connect', 'user', 'users', // Marketing & public 'home', 'welcome', 'features', 'demo', 'enterprise', 'pro', 'careers', 'jobs', 'partners', 'affiliate', 'store', 'marketplace', // Communication 'mail', 'email', 'contact', 'feedback', 'abuse', 'report', // Infrastructure & framework 'filament', 'livewire', 'storage', 'imports', 'horizon', 'scalar', 'engagement', 'system-administrators', 'up', 'health', 'status', 'metrics', 'static', 'assets', 'cdn', 'public', 'uploads', 'www', 'ftp', 'ssh', 'dns', 'ns1', 'ns2', // Common actions 'new', 'create', 'edit', 'delete', 'search', 'explore', // Misc 'null', 'undefined', 'error', 'test', 'staging', 'preview', ]; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'name', 'slug', 'personal_team', ]; /** * The event map for the model. * * @var array */ protected $dispatchesEvents = [ 'created' => TeamCreated::class, 'updated' => TeamUpdated::class, 'deleted' => TeamDeleted::class, ]; /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'personal_team' => 'boolean', ]; } public function getSlugOptions(): SlugOptions { return SlugOptions::create() ->generateSlugsFrom(function (): string { $slug = Str::slug($this->name); if ($slug === '') { return Str::lower(Str::random(8)); } return $slug; }) ->saveSlugsTo('slug') ->preventOverwrite() ->doNotGenerateSlugsOnUpdate(); } protected function otherRecordExistsWithSlug(string $slug): bool { if (in_array($slug, self::RESERVED_SLUGS, true)) { return true; } $query = self::query()->where($this->slugOptions->slugField, $slug) ->withoutGlobalScopes(); if ($this->exists) { $query->where($this->getKeyName(), '!=', $this->getKey()); } return $query->exists(); } public function isPersonalTeam(): bool { return $this->personal_team; } public function getFilamentAvatarUrl(): string { return resolve(AvatarService::class)->generate(name: $this->name, bgColor: '#000000', textColor: '#ffffff'); } /** * @return HasMany */ public function people(): HasMany { return $this->hasMany(People::class); } /** * @return HasMany */ public function companies(): HasMany { return $this->hasMany(Company::class); } /** * @return HasMany */ public function tasks(): HasMany { return $this->hasMany(Task::class); } /** * @return HasMany */ public function opportunities(): HasMany { return $this->hasMany(Opportunity::class); } /** * @return HasMany */ public function notes(): HasMany { return $this->hasMany(Note::class); } } ================================================ FILE: app/Models/TeamInvitation.php ================================================ > */ use HasFactory; use HasUlids; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'email', 'role', 'expires_at', ]; /** * @return BelongsTo */ public function team(): BelongsTo { return $this->belongsTo(Team::class); } public function isExpired(): bool { if ($this->expires_at === null) { return true; } /** @var Carbon $expiresAt */ $expiresAt = $this->expires_at; return $expiresAt->isPast(); } /** * @return array */ protected function casts(): array { return [ 'expires_at' => 'datetime', ]; } } ================================================ FILE: app/Models/User.php ================================================ */ use HasFactory; use HasProfilePhoto; use HasTeams; use HasUlids; use Notifiable; use TwoFactorAuthenticatable; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var list */ protected $hidden = [ 'password', 'remember_token', 'two_factor_recovery_codes', 'two_factor_secret', ]; /** * The accessors to append to the model's array form. * * @var list */ protected $appends = [ 'profile_photo_url', ]; /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } /** * @return HasMany */ public function socialAccounts(): HasMany { return $this->hasMany(UserSocialAccount::class); } public function hasPassword(): bool { return $this->password !== null; } /** * @return BelongsToMany */ public function tasks(): BelongsToMany { return $this->belongsToMany(Task::class); } /** * @return HasMany */ public function opportunities(): HasMany { return $this->hasMany(Opportunity::class, 'creator_id'); } public function getDefaultTenant(Panel $panel): ?Model { return $this->currentTeam; } /** * @throws Exception */ public function canAccessPanel(Panel $panel): bool { return $panel->getId() === 'app'; } /** * @return Collection */ public function getTenants(Panel $panel): Collection { return $this->allTeams(); } public function canAccessTenant(Model $tenant): bool { return $this->belongsToTeam($tenant); } } ================================================ FILE: app/Models/UserSocialAccount.php ================================================ */ use HasFactory; use HasUlids; /** * @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class); } } ================================================ FILE: app/Observers/CompanyObserver.php ================================================ invalidateAiSummary(); $this->dispatchFaviconFetchIfNeeded($company); } private function dispatchFaviconFetchIfNeeded(Company $company): void { $domainField = $company->customFields() ->whereBelongsTo($company->team) ->where('code', CompanyField::DOMAINS->value) ->first(); if ($domainField === null) { return; } $company->load('customFieldValues.customField.options'); $domains = $company->getCustomFieldValue($domainField); $firstDomain = is_array($domains) ? ($domains[0] ?? null) : $domains; if (blank($firstDomain)) { return; } dispatch(new FetchFaviconForCompany($company))->afterCommit(); } } ================================================ FILE: app/Observers/NoteObserver.php ================================================ invalidateRelatedSummaries(); } public function deleted(Note $note): void { $note->invalidateRelatedSummaries(); } } ================================================ FILE: app/Observers/OpportunityObserver.php ================================================ invalidateAiSummary(); } } ================================================ FILE: app/Observers/PeopleObserver.php ================================================ invalidateAiSummary(); } } ================================================ FILE: app/Observers/TaskObserver.php ================================================ invalidateRelatedSummaries(); } public function deleted(Task $task): void { $task->invalidateRelatedSummaries(); } } ================================================ FILE: app/Policies/CompanyPolicy.php ================================================ hasVerifiedEmail() && $user->currentTeam !== null; } public function view(User $user, Company $company): bool { return $user->belongsToTeam($company->team); } public function create(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function update(User $user, Company $company): bool { return $user->belongsToTeam($company->team); } public function delete(User $user, Company $company): bool { return $user->belongsToTeam($company->team); } public function deleteAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function restore(User $user, Company $company): bool { return $user->belongsToTeam($company->team); } public function restoreAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function forceDelete(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } public function forceDeleteAny(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } } ================================================ FILE: app/Policies/NotePolicy.php ================================================ hasVerifiedEmail() && $user->currentTeam !== null; } public function view(User $user, Note $note): bool { return $user->belongsToTeam($note->team); } public function create(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function update(User $user, Note $note): bool { return $user->belongsToTeam($note->team); } public function delete(User $user, Note $note): bool { return $user->belongsToTeam($note->team); } public function deleteAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function restore(User $user, Note $note): bool { return $user->belongsToTeam($note->team); } public function restoreAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function forceDelete(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } public function forceDeleteAny(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } } ================================================ FILE: app/Policies/OpportunityPolicy.php ================================================ hasVerifiedEmail() && $user->currentTeam !== null; } public function view(User $user, Opportunity $opportunity): bool { return $user->belongsToTeam($opportunity->team); } public function create(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function update(User $user, Opportunity $opportunity): bool { return $user->belongsToTeam($opportunity->team); } public function delete(User $user, Opportunity $opportunity): bool { return $user->belongsToTeam($opportunity->team); } public function deleteAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function restore(User $user, Opportunity $opportunity): bool { return $user->belongsToTeam($opportunity->team); } public function restoreAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function forceDelete(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } public function forceDeleteAny(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } } ================================================ FILE: app/Policies/PeoplePolicy.php ================================================ hasVerifiedEmail() && $user->currentTeam !== null; } public function view(User $user, People $people): bool { return $user->belongsToTeam($people->team); } public function create(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function update(User $user, People $people): bool { return $user->belongsToTeam($people->team); } public function delete(User $user, People $people): bool { return $user->belongsToTeam($people->team); } public function deleteAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function restore(User $user, People $people): bool { return $user->belongsToTeam($people->team); } public function restoreAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function forceDelete(User $user, People $people): bool { return $user->hasTeamRole($people->team, 'admin'); } public function forceDeleteAny(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } } ================================================ FILE: app/Policies/TaskPolicy.php ================================================ hasVerifiedEmail() && $user->currentTeam !== null; } public function view(User $user, Task $task): bool { return $user->belongsToTeam($task->team); } public function create(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function update(User $user, Task $task): bool { return $user->belongsToTeam($task->team); } public function delete(User $user, Task $task): bool { return $user->belongsToTeam($task->team); } public function deleteAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function restore(User $user, Task $task): bool { return $user->belongsToTeam($task->team); } public function restoreAny(User $user): bool { return $user->hasVerifiedEmail() && $user->currentTeam !== null; } public function forceDelete(User $user, Task $task): bool { return $user->hasTeamRole($task->team, 'admin'); } public function forceDeleteAny(User $user): bool { return $user->hasTeamRole(Filament::getTenant(), 'admin'); } } ================================================ FILE: app/Policies/TeamPolicy.php ================================================ hasVerifiedEmail() && $user->currentTeam !== null; } /** * Determine whether the user can view the model. */ public function view(User $user, Team $team): bool { return $user->belongsToTeam($team); } /** * Determine whether the user can create models. */ public function create(User $user): bool { return $user->ownedTeams()->count() < 3; } /** * Determine whether the user can update the model. */ public function update(User $user, Team $team): bool { return $user->ownsTeam($team); } /** * Determine whether the user can add team members. */ public function addTeamMember(User $user, Team $team): bool { return $user->ownsTeam($team); } /** * Determine whether the user can update team member permissions. */ public function updateTeamMember(User $user, Team $team): bool { return $user->ownsTeam($team); } /** * Determine whether the user can remove team members. */ public function removeTeamMember(User $user, Team $team): bool { return $user->ownsTeam($team); } /** * Determine whether the user can delete the model. */ public function delete(User $user, Team $team): bool { return $user->ownsTeam($team); } public function deleteAny(): bool { return false; } public function restore(User $user, Team $team): bool { return $user->ownsTeam($team); } public function restoreAny(): bool { return false; } public function forceDelete(User $user, Team $team): bool { return $user->ownsTeam($team); } public function forceDeleteAny(): bool { return false; } } ================================================ FILE: app/Providers/AppServiceProvider.php ================================================ app->bind(\Filament\Auth\Http\Responses\Contracts\LoginResponse::class, LoginResponse::class); $this->app->bind(\Filament\Actions\Exports\Models\Export::class, Export::class); } /** * Bootstrap any application services. */ public function boot(): void { Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); $this->configurePolicies(); $this->configureModels(); $this->configureFilament(); $this->configureGitHubStars(); $this->configureLivewire(); $this->configureRateLimiting(); $this->configureScribe(); } private function configurePolicies(): void { Gate::guessPolicyNamesUsing(function (string $modelClass): ?string { try { $currentPanelId = Filament::getCurrentPanel()?->getId(); if ($currentPanelId === 'sysadmin') { $modelName = class_basename($modelClass); $systemAdminPolicy = "Relaticle\\SystemAdmin\\Policies\\{$modelName}Policy"; // Return SystemAdmin policy if it exists if (class_exists($systemAdminPolicy)) { return $systemAdminPolicy; } } } catch (\Exception) { // Fallback for non-Filament contexts } // Use Laravel's default policy discovery logic return $this->getDefaultLaravelPolicyName($modelClass); }); } private function getDefaultLaravelPolicyName(string $modelClass): ?string { // Replicate Laravel's default policy discovery logic from Gate.php:723-736 $classDirname = str_replace('/', '\\', dirname(str_replace('\\', '/', $modelClass))); $classDirnameSegments = explode('\\', $classDirname); $candidates = collect(); // Generate all possible policy paths $counter = count($classDirnameSegments); // Generate all possible policy paths for ($index = 0; $index < $counter; $index++) { $classDirname = implode('\\', array_slice($classDirnameSegments, 0, $index)); $candidates->push($classDirname.'\\Policies\\'.class_basename($modelClass).'Policy'); } // Add Models-specific paths if the model is in a Models directory if (str_contains($classDirname, '\\Models\\')) { $candidates = $candidates ->concat([str_replace('\\Models\\', '\\Policies\\', $classDirname).'\\'.class_basename($modelClass).'Policy']) ->concat([str_replace('\\Models\\', '\\Models\\Policies\\', $classDirname).'\\'.class_basename($modelClass).'Policy']); } // Return the first existing class, or fallback $existingPolicy = $candidates->reverse()->first(fn (string $class): bool => class_exists($class)); return $existingPolicy ?: $classDirname.'\\Policies\\'.class_basename($modelClass).'Policy'; } /** * Configure custom Livewire components. */ private function configureLivewire(): void { // Custom Livewire components can be registered here } private function configureRateLimiting(): void { RateLimiter::for('api', function (Request $request): array { /** @var User|null $user */ $user = $request->user(); $tokenId = $user?->currentAccessToken()?->getKey(); $teamId = $user?->currentTeam?->getKey(); $key = $tokenId ?: $request->ip(); $limits = [ Limit::perMinute(600)->by('team:'.($teamId ?? $request->ip())), ]; if ($request->isMethod('GET')) { $limits[] = Limit::perMinute(300)->by("token:{$key}:read"); } else { $limits[] = Limit::perMinute(60)->by("token:{$key}:write"); } return $limits; }); RateLimiter::for('mcp', fn (Request $request) => Limit::perMinute(120)->by($request->user()?->id ?: $request->ip())); } private function configureScribe(): void { if (! class_exists(Scribe::class)) { return; } $makeScribeUser = function (): User { $user = new User; $user->forceFill(['id' => 'scribe-user-id', 'name' => 'Scribe User', 'email' => 'scribe@example.com']); $team = new Team; $team->forceFill(['id' => 'scribe-team-id', 'name' => 'Scribe Team', 'user_id' => $user->id, 'personal_team' => true]); $team->setRelation('owner', $user); $team->setRelation('users', collect()); $user->forceFill(['current_team_id' => $team->id]); $user->setRelation('currentTeam', $team); return $user; }; Scribe::bootstrap(function (): void { config()->set('scribe.generating', true); }); Scribe::instantiateFormRequestUsing(function (string $className) use ($makeScribeUser): FormRequest { /** @var FormRequest $formRequest */ $formRequest = new $className; $formRequest->setUserResolver(fn (): User => $makeScribeUser()); return $formRequest; }); } /** * Configure the models for the application. */ private function configureModels(): void { Model::unguard(); Model::preventLazyLoading(! $this->app->isProduction()); Relation::enforceMorphMap([ 'team' => Team::class, 'user' => User::class, 'people' => People::class, 'company' => Company::class, 'opportunity' => Opportunity::class, 'task' => Task::class, 'note' => Note::class, 'system_administrator' => SystemAdministrator::class, ]); // Use custom models for custom-fields package CustomFields::useCustomFieldModel(CustomField::class); CustomFields::useSectionModel(CustomFieldSection::class); CustomFields::useOptionModel(CustomFieldOption::class); CustomFields::useValueModel(CustomFieldValue::class); } /** * Configure Filament. */ private function configureFilament(): void { $slideOverActions = ['create', 'edit', 'view']; Action::configureUsing(function (Action $action) use ($slideOverActions): Action { if (in_array($action->getName(), $slideOverActions)) { return $action->slideOver(); } return $action; }); } /** * Configure GitHub stars count. */ private function configureGitHubStars(): void { // Share GitHub stars count with the header component Facades\View::composer('components.layout.header', function (View $view): void { $gitHubService = resolve(GitHubService::class); $starsCount = $gitHubService->getStarsCount(); $formattedStarsCount = $gitHubService->getFormattedStarsCount(); $view->with([ 'githubStars' => $starsCount, 'formattedGithubStars' => $formattedStarsCount, ]); }); } } ================================================ FILE: app/Providers/FaviconServiceProvider.php ================================================ $action->size(Size::Small)->iconPosition('before')); DeleteAction::configureUsing(fn (DeleteAction $action): DeleteAction => $action->label('Delete record')); Section::configureUsing(fn (Section $section): Section => $section->compact()); Table::configureUsing(fn (Table $table): Table => $table); } /** * Configure the Filament admin panel. * * @throws Exception */ public function panel(Panel $panel): Panel { $panel ->default() ->id('app'); if ($domain = config('app.app_panel_domain')) { $panel->domain($domain); } else { $panel->path(config('app.app_panel_path', 'app')); } $panel ->homeUrl(fn (): string => CompanyResource::getUrl()) ->brandName('Relaticle') ->brandLogo(fn (): View|Factory => Auth::user()?->hasVerifiedEmail() ? view('filament.app.logo-empty') : view('filament.app.logo')) ->brandLogoHeight('2.6rem') ->login(Login::class) ->registration(Register::class) ->authGuard('web') ->authPasswordBroker('users') ->passwordReset() ->emailVerification() ->emailChangeVerification() ->strictAuthorization() ->databaseNotifications() ->colors([ 'primary' => [ 50 => 'oklch(0.969 0.016 293.756)', 100 => 'oklch(0.943 0.028 294.588)', 200 => 'oklch(0.894 0.055 293.283)', 300 => 'oklch(0.811 0.101 293.571)', 400 => 'oklch(0.709 0.159 293.541)', 500 => 'oklch(0.606 0.219 292.717)', 600 => 'oklch(0.541 0.247 293.009)', 700 => 'oklch(0.491 0.241 292.581)', 800 => 'oklch(0.432 0.211 292.759)', 900 => 'oklch(0.380 0.178 293.745)', 950 => 'oklch(0.283 0.135 291.089)', 'DEFAULT' => 'oklch(0.541 0.247 293.009)', ], ]) ->viteTheme('resources/css/filament/app/theme.css') ->userMenuItems([ Action::make('profile') ->label('Profile') ->icon('heroicon-m-user-circle') ->url(fn (): string => $this->shouldRegisterMenuItem() ? url(EditProfile::getUrl()) : url($panel->getPath())), ]) ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\Resources') ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages') ->discoverPages(in: base_path('packages/ImportWizard/src/Filament/Pages'), for: 'Relaticle\\ImportWizard\\Filament\\Pages') ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets') ->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\\Filament\\Clusters') ->readOnlyRelationManagersOnResourceViewPagesByDefault(false) ->pages([ EditProfile::class, AccessTokens::class, ]) ->spa() ->breadcrumbs(false) ->sidebarCollapsibleOnDesktop() ->navigationGroups([ NavigationGroup::make() ->label('Tasks') ->icon('heroicon-o-shopping-cart'), ]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) ->authGuard('web') ->authPasswordBroker('users') ->authMiddleware([ Authenticate::class, ]) ->tenantMiddleware( [ ApplyTenantScopes::class, ], isPersistent: true ) ->plugins([ CustomFieldsPlugin::make() ->authorize(fn () => Gate::check('update', Filament::getTenant())), ResizedColumnPlugin::make(), ]) ->renderHook( PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE, fn (): string => Blade::render('@env(\'local\')@endenv'), ) ->renderHook( PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE, fn (): View|Factory => view('filament.auth.social_login_buttons') ) ->renderHook( PanelsRenderHook::AUTH_REGISTER_FORM_BEFORE, fn (): View|Factory => view('filament.auth.social_login_buttons') ) ->renderHook( PanelsRenderHook::HEAD_END, fn (): View|Factory => view('filament.app.analytics') ); if (Features::hasApiFeatures()) { $panel->userMenuItems([ Action::make('api_tokens') ->label(__('access-tokens.user_menu')) ->icon('heroicon-o-key') ->url(fn (): string => $this->shouldRegisterMenuItem() ? url(AccessTokens::getUrl()) : url($panel->getPath())), ]); } $panel ->tenant(Team::class, slugAttribute: 'slug', ownershipRelationship: 'team') ->tenantRegistration(CreateTeam::class) ->tenantProfile(EditTeam::class) ->tenantMenuItems([ Action::make('import_history') ->label('Import History') ->icon(Heroicon::OutlinedClock) ->url(fn (): string => ImportHistory::getUrl()), ]); return $panel; } public function shouldRegisterMenuItem(): bool { $hasVerifiedEmail = Auth::user()?->hasVerifiedEmail(); return Filament::hasTenancy() ? $hasVerifiedEmail && Filament::getTenant() : $hasVerifiedEmail; } } ================================================ FILE: app/Providers/FortifyServiceProvider.php ================================================ app->singleton(CreatesNewSocialUsers::class, CreateNewSocialUser::class); } /** * Bootstrap any application services. */ public function boot(): void { Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class); Fortify::updateUserPasswordsUsing(UpdateUserPassword::class); Fortify::resetUserPasswordsUsing(ResetUserPassword::class); RateLimiter::for('login', function (Request $request) { $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); return Limit::perMinute(5)->by($throttleKey); }); RateLimiter::for('two-factor', fn (Request $request) => Limit::perMinute(5)->by($request->session()->get('login.id'))); } } ================================================ FILE: app/Providers/HealthServiceProvider.php ================================================ isEnabled()) { return; } Health::checks([ DatabaseCheck::new(), DatabaseConnectionCountCheck::new() ->warnWhenMoreConnectionsThan(50) ->failWhenMoreConnectionsThan(100), DatabaseSizeCheck::new() ->failWhenSizeAboveGb(errorThresholdGb: 10.0), DatabaseTableSizeCheck::new() ->table('custom_field_values', maxSizeInMb: 5_000) ->table('notes', maxSizeInMb: 5_000) ->table('companies', maxSizeInMb: 2_000) ->table('people', maxSizeInMb: 2_000) ->table('opportunities', maxSizeInMb: 2_000) ->table('tasks', maxSizeInMb: 2_000) ->table('media', maxSizeInMb: 5_000) ->table('jobs', maxSizeInMb: 1_000), RedisCheck::new(), RedisMemoryUsageCheck::new() ->warnWhenAboveMb(500) ->failWhenAboveMb(1_000), HorizonCheck::new(), QueueCheck::new() ->name('Queue: default'), QueueCheck::new() ->name('Queue: imports') ->onQueue('imports'), UsedDiskSpaceCheck::new() ->warnWhenUsedSpaceIsAbovePercentage(70) ->failWhenUsedSpaceIsAbovePercentage(90), CpuLoadCheck::new() ->failWhenLoadIsHigherInTheLast5Minutes(4.0) ->failWhenLoadIsHigherInTheLast15Minutes(2.0), DebugModeCheck::new(), EnvironmentCheck::new(), ScheduleCheck::new() ->heartbeatMaxAgeInMinutes(2), SecurityAdvisoriesCheck::new(), CacheCheck::new(), AnthropicModelCheck::new() ->name('Anthropic: Summary Model'), ]); } private function isEnabled(): bool { return (bool) config('app.health_checks_enabled', false); } } ================================================ FILE: app/Providers/HorizonServiceProvider.php ================================================ $user->email === 'manuk.minasyan1@gmail.com'); } } ================================================ FILE: app/Providers/JetstreamServiceProvider.php ================================================ configureModels(); $this->configurePermissions(); $this->configureActions(); } /** * Configure the models that Jetstream uses. */ private function configureModels(): void { Jetstream::useUserModel(User::class); Jetstream::useTeamModel(Team::class); } /** * Configure the actions that are available within the application. */ private function configureActions(): void { Jetstream::createTeamsUsing(CreateTeam::class); Jetstream::updateTeamNamesUsing(UpdateTeamName::class); Jetstream::addTeamMembersUsing(AddTeamMember::class); Jetstream::inviteTeamMembersUsing(InviteTeamMember::class); Jetstream::removeTeamMembersUsing(RemoveTeamMember::class); Jetstream::deleteTeamsUsing(DeleteTeam::class); Jetstream::deleteUsersUsing(DeleteUser::class); } /** * Configure the roles and permissions that are available within the application. */ private function configurePermissions(): void { Jetstream::defaultApiTokenPermissions(['read']); Jetstream::role('admin', 'Administrator', [ 'create', 'read', 'update', 'delete', ])->description('Administrator users can perform any action.'); Jetstream::role('editor', 'Editor', [ 'read', 'create', 'update', ])->description('Editor users have the ability to read, create, and update.'); } } ================================================ FILE: app/Providers/MacroServiceProvider.php ================================================ |null $submittedFields * @return array> */ public function toRules(mixed $submittedFields = null): array { $submittedFields = is_array($submittedFields) ? $submittedFields : null; $submittedCodes = is_array($submittedFields) ? array_keys($submittedFields) : []; $customFields = $this->resolveCustomFields($submittedCodes); $rules = ['custom_fields' => ['sometimes', 'array', $this]]; if ($customFields->isNotEmpty()) { $validationService = resolve(ValidationService::class); /** @var BaseCustomField $customField */ foreach ($customFields as $customField) { $fieldRules = $validationService->getValidationRules($customField); if ($fieldRules !== []) { $fieldRules = $this->ensureNullableForDateFields($customField->type, $fieldRules); $rules["custom_fields.{$customField->code}"] = $fieldRules; } $itemRules = $validationService->getItemValidationRules($customField); if ($itemRules !== []) { $rules["custom_fields.{$customField->code}.*"] = $itemRules; } $this->addChoiceFieldOptionRules($customField, $rules); } } return $rules; } /** * Validates that all submitted keys are known custom field codes. * * @param Closure(string, ?string=): PotentiallyTranslatedString $fail */ public function validate(string $attribute, mixed $value, Closure $fail): void { if (! is_array($value)) { return; } $knownCodes = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->tenantId) ->where('entity_type', $this->entityType) ->active() ->pluck('code') ->all(); $unknownKeys = array_diff(array_keys($value), $knownCodes); if ($unknownKeys === []) { return; } $unknownList = implode(', ', $unknownKeys); $fail("Unknown custom field keys: {$unknownList}."); } /** * Prepend 'nullable' to validation rules for date/date_time fields so null clears the value. * * The vendor package's ValidationService does not include 'nullable', causing * the 'date' rule to reject null. We fix this at the application layer. * * @param array $fieldRules * @return array */ private function ensureNullableForDateFields(string $fieldType, array $fieldRules): array { $fieldTypeData = CustomFieldsType::getFieldType($fieldType); if ($fieldTypeData === null || ! $fieldTypeData->dataType->isDateOrDateTime()) { return $fieldRules; } if (in_array('nullable', $fieldRules, true)) { return $fieldRules; } return ['nullable', ...$fieldRules]; } /** * Add Rule::in validation for choice fields to ensure submitted option IDs actually exist. * * For single-choice fields (select, radio): validates the scalar value. * For multi-choice fields (multi_select, checkbox_list): validates each array element. * Skips fields that accept arbitrary values (e.g., tags) or use a lookup_type. * * @param array> $rules */ private function addChoiceFieldOptionRules(BaseCustomField $customField, array &$rules): void { $fieldTypeData = CustomFieldsType::getFieldType($customField->type); if ($fieldTypeData === null) { return; } if (! $fieldTypeData->dataType->isChoiceField()) { return; } if ($fieldTypeData->acceptsArbitraryValues) { return; } if ($customField->lookup_type !== null) { return; } $optionIds = $customField->options->pluck('id')->all(); $inRule = Rule::in($optionIds); $ruleKey = "custom_fields.{$customField->code}"; if ($fieldTypeData->dataType->isMultiChoiceField()) { $rules["{$ruleKey}.*"] = array_merge($rules["{$ruleKey}.*"] ?? [], [$inRule]); } else { $rules[$ruleKey] = array_merge($rules[$ruleKey] ?? [], [$inRule]); } } /** * @param array $submittedCodes * @return EloquentCollection */ private function resolveCustomFields(array $submittedCodes): EloquentCollection { $baseQuery = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->tenantId) ->where('entity_type', $this->entityType) ->active() ->with('options'); if ($this->isUpdate) { if ($submittedCodes === []) { return new EloquentCollection; } return $baseQuery->whereIn('code', $submittedCodes)->get(); } if ($submittedCodes === []) { return $baseQuery ->whereJsonContains('validation_rules', [['name' => 'required']]) ->get(); } return $baseQuery ->where(function (Builder $query) use ($submittedCodes): void { $query->whereIn('code', $submittedCodes) ->orWhereJsonContains('validation_rules', [['name' => 'required']]); }) ->get(); } } ================================================ FILE: app/Rules/ValidTeamSlug.php ================================================ ignoreValue !== null && $value === $this->ignoreValue) { return; } if (in_array($value, Team::RESERVED_SLUGS, true)) { $fail('The :attribute is reserved and cannot be used.'); } } } ================================================ FILE: app/Scribe/Strategies/GetFromSpatieQueryBuilder.php ================================================ > $routeRules * @return array>|null */ public function __invoke(ExtractedEndpointData $endpointData, array $routeRules = []): ?array { if (! $this->isIndexMethod($endpointData)) { return null; } $actionClass = $this->findActionClass($endpointData); if ($actionClass === null) { return null; } return $this->extractQueryParams($actionClass); } private function isIndexMethod(ExtractedEndpointData $endpointData): bool { return $endpointData->method->getName() === 'index'; } /** * Find the List* action class from the controller method's type-hinted parameters. * * @return class-string|null */ private function findActionClass(ExtractedEndpointData $endpointData): ?string { foreach ($endpointData->method->getParameters() as $parameter) { $type = $parameter->getType(); if (! $type instanceof ReflectionNamedType) { continue; } if ($type->isBuiltin()) { continue; } $className = $type->getName(); if (str_starts_with($className, 'App\\Actions\\') && str_starts_with(class_basename($className), 'List') && class_exists($className)) { return $className; } } return null; } /** * Read the execute() method source and extract QB parameters. * * @param class-string $actionClass * @return array> */ private function extractQueryParams(string $actionClass): array { $params = []; try { $reflection = new ReflectionClass($actionClass); $method = $reflection->getMethod('execute'); $source = $this->getMethodSource($method); } catch (\ReflectionException) { return []; } $this->extractFilters($source, $params); $this->extractSorts($source, $params); $this->extractIncludes($source, $params); $this->addPaginationParams($params); return $params; } private function getMethodSource(ReflectionMethod $method): string { $fileName = $method->getFileName(); if ($fileName === false) { return ''; } $file = file($fileName); if ($file === false) { return ''; } $start = $method->getStartLine() - 1; $end = $method->getEndLine(); return implode('', array_slice($file, $start, $end - $start)); } /** * @param array> $params */ private function extractFilters(string $source, array &$params): void { if (preg_match_all("/AllowedFilter::\w+\('([^']+)'/", $source, $matches)) { foreach ($matches[1] as $filter) { $params["filter[{$filter}]"] = [ 'type' => 'string', 'required' => false, 'description' => "Filter results by {$filter}.", 'example' => null, ]; } } } /** * @param array> $params */ private function extractSorts(string $source, array &$params): void { if (preg_match("/allowedSorts\(((?:[^()]*|\((?:[^()]*|\([^()]*\))*\))*)\)/s", $source, $match)) { preg_match_all("/'([^']+)'/", $match[1], $sortMatches); $sorts = $sortMatches[1]; if ($sorts !== []) { $sortList = implode(', ', array_map(fn (string $s): string => "{$s}, -{$s}", $sorts)); $params['sort'] = [ 'type' => 'string', 'required' => false, 'description' => "Sort results. Prefix with `-` for descending. Allowed: {$sortList}.", 'example' => '-created_at', ]; } } } /** * @param array> $params */ private function extractIncludes(string $source, array &$params): void { if (preg_match("/allowedIncludes\(((?:[^()]*|\((?:[^()]*|\([^()]*\))*\))*)\)/s", $source, $match)) { preg_match_all("/'([^']+)'/", $match[1], $includeMatches); $includes = $includeMatches[1]; if ($includes !== []) { $includeList = implode(', ', $includes); $params['include'] = [ 'type' => 'string', 'required' => false, 'description' => "Include related resources (comma-separated). Allowed: {$includeList}.", 'example' => $includes[0], ]; } } } /** * @param array> $params */ private function addPaginationParams(array &$params): void { $params['per_page'] = [ 'type' => 'integer', 'required' => false, 'description' => 'Number of results per page (1-100). Default: 15.', 'example' => 15, ]; $params['cursor'] = [ 'type' => 'string', 'required' => false, 'description' => 'Cursor for cursor-based pagination. When present, switches from offset to cursor pagination.', 'example' => null, ]; $params['page'] = [ 'type' => 'integer', 'required' => false, 'description' => 'Page number for offset pagination (when cursor is not used). Default: 1.', 'example' => 1, ]; } } ================================================ FILE: app/Services/AI/RecordContextBuilder.php ================================================ */ public function buildContext(Model $record): array { return match (true) { $record instanceof Company => $this->buildCompanyContext($record), $record instanceof People => $this->buildPeopleContext($record), $record instanceof Opportunity => $this->buildOpportunityContext($record), default => throw new InvalidArgumentException('Unsupported record type: '.$record::class), }; } /** * @return array */ private function buildCompanyContext(Company $company): array { $company->loadCount(['notes', 'tasks', 'opportunities', 'people']); $company->load([ 'accountOwner', 'customFieldValues.customField.options', 'notes' => $this->recentWithCustomFields('notes'), 'tasks' => $this->recentWithCustomFields('tasks'), 'opportunities' => $this->recentWithCustomFields('opportunities'), ]); return [ 'entity_type' => 'Company', 'name' => $company->name, 'basic_info' => $this->getCompanyBasicInfo($company), 'relationships' => [ 'people_count' => $company->people_count, 'opportunities_count' => $company->opportunities_count, ], 'opportunities' => $this->formatOpportunities($company->opportunities, $company->opportunities_count), 'notes' => $this->formatNotes($company->notes, $company->notes_count), 'tasks' => $this->formatTasks($company->tasks, $company->tasks_count), 'last_updated' => $company->updated_at?->diffForHumans(), 'created' => $company->created_at?->diffForHumans(), ]; } /** * @return array */ private function buildPeopleContext(People $person): array { $person->loadCount(['notes', 'tasks']); $person->load([ 'company', 'customFieldValues.customField.options', 'notes' => $this->recentWithCustomFields('notes'), 'tasks' => $this->recentWithCustomFields('tasks'), ]); return [ 'entity_type' => 'Person', 'name' => $person->name, 'basic_info' => $this->getPeopleBasicInfo($person), 'company' => $person->company?->name, 'notes' => $this->formatNotes($person->notes, $person->notes_count), 'tasks' => $this->formatTasks($person->tasks, $person->tasks_count), 'last_updated' => $person->updated_at?->diffForHumans(), 'created' => $person->created_at?->diffForHumans(), ]; } /** * @return array */ private function buildOpportunityContext(Opportunity $opportunity): array { $opportunity->loadCount(['notes', 'tasks']); $opportunity->load([ 'company', 'contact', 'customFieldValues.customField.options', 'notes' => $this->recentWithCustomFields('notes'), 'tasks' => $this->recentWithCustomFields('tasks'), ]); return [ 'entity_type' => 'Opportunity', 'name' => $this->getOpportunityName($opportunity), 'basic_info' => $this->getOpportunityBasicInfo($opportunity), 'company' => $opportunity->company?->name, 'contact' => $opportunity->contact?->name, 'notes' => $this->formatNotes($opportunity->notes, $opportunity->notes_count), 'tasks' => $this->formatTasks($opportunity->tasks, $opportunity->tasks_count), 'last_updated' => $opportunity->updated_at?->diffForHumans(), 'created' => $opportunity->created_at?->diffForHumans(), ]; } private function recentWithCustomFields(string $table): Closure { return fn (Relation $query): Relation => $query ->with('customFieldValues.customField.options') ->latest("{$table}.created_at") ->limit(self::RELATIONSHIP_LIMIT); } /** * @return array */ private function getCompanyBasicInfo(Company $company): array { $domains = $this->getCustomFieldValue($company, CompanyField::DOMAINS->value); return collect([ 'domain' => is_array($domains) ? implode(', ', $domains) : $domains, 'is_icp' => (bool) $this->getCustomFieldValue($company, CompanyField::ICP->value), 'account_owner' => $company->accountOwner?->name, ])->filter(fn (mixed $value): bool => filled($value))->all(); } /** * @return array */ private function getPeopleBasicInfo(People $person): array { $emails = $this->getCustomFieldValue($person, PeopleField::EMAILS->value); return collect([ 'job_title' => $this->getCustomFieldValue($person, PeopleField::JOB_TITLE->value), 'emails' => is_array($emails) ? implode(', ', $emails) : $emails, ])->filter(fn (mixed $value): bool => filled($value))->all(); } /** * @return array */ private function getOpportunityBasicInfo(Opportunity $opportunity): array { $amount = $this->getCustomFieldValue($opportunity, OpportunityField::AMOUNT->value); $closeDate = $this->getCustomFieldValue($opportunity, OpportunityField::CLOSE_DATE->value); return collect([ 'stage' => $this->getCustomFieldValue($opportunity, OpportunityField::STAGE->value), 'amount' => filled($amount) ? '$'.number_format((float) $amount, 2) : null, 'close_date' => $this->formatDate($closeDate), ])->filter(fn (mixed $value): bool => filled($value))->all(); } private function getOpportunityName(Opportunity $opportunity): string { $stage = $this->getCustomFieldValue($opportunity, OpportunityField::STAGE->value); return $opportunity->company?->name.' - '.($stage ?? 'Opportunity'); } /** * @param Collection $notes * @return array */ private function formatNotes(Collection $notes, int $totalCount): array { $formatted = $notes->map(fn (Note $note): array => [ 'title' => $note->title, 'content' => $this->stripHtml((string) $this->getCustomFieldValue($note, NoteField::BODY->value)), 'created' => $note->created_at?->diffForHumans(), ])->values()->all(); return $this->withPaginationInfo($formatted, $totalCount); } /** * @param Collection $tasks * @return array */ private function formatTasks(Collection $tasks, int $totalCount): array { $formatted = $tasks->map(fn (Task $task): array => [ 'title' => $task->title, 'status' => $this->getCustomFieldValue($task, TaskField::STATUS->value), 'priority' => $this->getCustomFieldValue($task, TaskField::PRIORITY->value), 'due_date' => $this->formatDate($this->getCustomFieldValue($task, TaskField::DUE_DATE->value)), ])->values()->all(); return $this->withPaginationInfo($formatted, $totalCount); } /** * @param Collection $opportunities * @return array */ private function formatOpportunities(Collection $opportunities, int $totalCount): array { $formatted = $opportunities->map(function (Opportunity $opportunity): array { $amount = $this->getCustomFieldValue($opportunity, OpportunityField::AMOUNT->value); return [ 'stage' => $this->getCustomFieldValue($opportunity, OpportunityField::STAGE->value), 'amount' => filled($amount) ? '$'.number_format((float) $amount, 2) : null, ]; })->values()->all(); return $this->withPaginationInfo($formatted, $totalCount); } /** * @param array> $items * @return array */ private function withPaginationInfo(array $items, int $totalCount): array { $showing = count($items); return [ 'items' => $items, 'showing' => $showing, 'total' => $totalCount, 'has_more' => $totalCount > $showing, ]; } private function getCustomFieldValue(Model $model, string $code): mixed { if (! method_exists($model, 'customFieldValues')) { return null; } /** @var Collection $customFieldValues */ $customFieldValues = $model->customFieldValues; // @phpstan-ignore property.notFound $customFieldValue = $customFieldValues->first(fn (CustomFieldValue $cfv): bool => $cfv->customField->code === $code); if ($customFieldValue === null) { return null; } return $model->getCustomFieldValue($customFieldValue->customField); // @phpstan-ignore method.notFound } private function formatDate(mixed $date): ?string { if ($date === null) { return null; } return $date instanceof \DateTimeInterface ? $date->format('M j, Y') : (string) $date; } private function stripHtml(string $html): string { $text = strip_tags($html); return Str::limit(trim((string) preg_replace('/\s+/', ' ', $text)), 500); } } ================================================ FILE: app/Services/AI/RecordSummaryService.php ================================================ aiSummary; // @phpstan-ignore property.notFound if ($cached !== null) { return $cached; } } return $this->generateAndCacheSummary($record); } private function generateAndCacheSummary(Model $record): AiSummary { $context = $this->contextBuilder->buildContext($record); $prompt = $this->formatPrompt($context); $response = Prism::text() ->using(Provider::Anthropic, $this->model()) ->withSystemPrompt($this->getSystemPrompt()) ->withPrompt($prompt) ->generate(); return $this->cacheSummary($record, $response->text, $response->usage); } private function cacheSummary(Model $record, string $summary, Usage $usage): AiSummary { $teamId = Filament::getTenant()?->getKey(); throw_if($teamId === null, RuntimeException::class, 'No team context available for caching AI summary'); if (method_exists($record, 'aiSummary')) { $record->aiSummary()->delete(); } return AiSummary::query()->create([ 'team_id' => $teamId, 'summarizable_type' => $record->getMorphClass(), 'summarizable_id' => $record->getKey(), 'summary' => $summary, 'model_used' => $this->model(), 'prompt_tokens' => $usage->promptTokens, 'completion_tokens' => $usage->completionTokens, ]); } private function getSystemPrompt(): string { return <<<'PROMPT' You are a CRM assistant that generates concise, actionable summaries of business records. Your summaries should: - Be 2-3 sentences maximum - Highlight the most important business context - Include relevant metrics (deal size, last contact date, open tasks) when available - Suggest urgency or opportunity when applicable - Use professional, direct language - Focus on actionable insights for a sales or account management professional Do not use bullet points or formatting. Write in flowing prose that is easy to scan quickly. PROMPT; } /** * @param array $context */ private function formatPrompt(array $context): string { $parts = collect([ "Generate a brief CRM summary for this {$context['entity_type']}:", '', "**{$context['name']}**", ]); $this->addBasicInfo($parts, $context); $this->addRelationships($parts, $context); $this->addOpportunities($parts, $context); $this->addNotes($parts, $context); $this->addTasks($parts, $context); $this->addTimestamps($parts, $context); return $parts->implode("\n"); } /** * @param Collection $parts * @param array $context */ private function addBasicInfo(Collection $parts, array $context): void { if (blank($context['basic_info'])) { return; } $parts->push('', 'Basic Information:'); foreach ($context['basic_info'] as $key => $value) { $displayValue = is_array($value) ? implode(', ', $value) : $value; $parts->push("- {$this->formatLabel($key)}: {$displayValue}"); } if (filled($context['company'] ?? null)) { $parts->push("- Company: {$context['company']}"); } if (filled($context['contact'] ?? null)) { $parts->push("- Contact: {$context['contact']}"); } } /** * @param Collection $parts * @param array $context */ private function addRelationships(Collection $parts, array $context): void { if (blank($context['relationships'] ?? [])) { return; } $parts->push('', 'Relationships:'); foreach ($context['relationships'] as $key => $value) { $parts->push("- {$this->formatLabel($key)}: {$value}"); } } /** * @param Collection $parts * @param array $context */ private function addOpportunities(Collection $parts, array $context): void { $opportunities = Arr::get($context, 'opportunities.items', []); if (blank($opportunities)) { return; } $total = Arr::get($context, 'opportunities.total', count($opportunities)); $showing = Arr::get($context, 'opportunities.showing', count($opportunities)); $header = $total > $showing ? "Opportunities (showing {$showing} of {$total}):" : 'Opportunities:'; $parts->push('', $header); foreach ($opportunities as $opp) { $stage = $opp['stage'] ?? 'Unknown stage'; $amount = $opp['amount'] ?? 'No amount'; $parts->push("- {$stage}: {$amount}"); } } /** * @param Collection $parts * @param array $context */ private function addNotes(Collection $parts, array $context): void { $notes = Arr::get($context, 'notes.items', []); if (blank($notes)) { return; } $total = Arr::get($context, 'notes.total', count($notes)); $showing = Arr::get($context, 'notes.showing', count($notes)); $header = $total > $showing ? "Recent Notes (showing {$showing} of {$total}):" : 'Recent Notes:'; $parts->push('', $header); foreach (array_slice($notes, 0, 5) as $note) { $title = $note['title'] ?? 'Untitled'; $content = $note['content'] ?? ''; $created = $note['created'] ?? ''; $parts->push("- [{$created}] {$title}: {$content}"); } } /** * @param Collection $parts * @param array $context */ private function addTasks(Collection $parts, array $context): void { $tasks = Arr::get($context, 'tasks.items', []); if (blank($tasks)) { return; } $total = Arr::get($context, 'tasks.total', count($tasks)); $showing = Arr::get($context, 'tasks.showing', count($tasks)); $header = $total > $showing ? "Tasks (showing {$showing} of {$total}):" : 'Tasks:'; $parts->push('', $header); foreach ($tasks as $task) { $parts->push($this->formatTaskLine($task)); } } /** * @param array $task */ private function formatTaskLine(array $task): string { $title = $task['title'] ?? 'Untitled'; $status = $task['status'] ?? 'Unknown'; $line = "- {$title} ({$status})"; if (filled($task['priority'] ?? null)) { $line .= " - Priority: {$task['priority']}"; } if (filled($task['due_date'] ?? null)) { $line .= " - Due: {$task['due_date']}"; } return $line; } /** * @param Collection $parts * @param array $context */ private function addTimestamps(Collection $parts, array $context): void { $parts->push( '', "Last updated: {$context['last_updated']}", "Created: {$context['created']}" ); } private function formatLabel(string $key): string { return str($key)->replace('_', ' ')->title()->toString(); } } ================================================ FILE: app/Services/AvatarService.php ================================================ $backgroundColors */ public function __construct( private Cache $cache, private int $cacheTtl = 604800, private string $defaultTextColor = '#FFFFFF', private string $defaultBgColor = '#3182CE', private array $backgroundColors = [], ) {} /** * Generate an SVG avatar for a user with manual color selection. * * @param string $name The user's name * @param int $size The size of the avatar in pixels * @param string|null $bgColor Optional custom background color (hex format) * @param string|null $textColor Optional custom text color (hex format) * @param int $initialCount Number of initials to show (1 or 2) * @return string The URL to the SVG avatar */ public function generate( string $name, int $size = 64, ?string $bgColor = null, ?string $textColor = null, int $initialCount = 2 ): string { $bgColor = $this->validateColor($bgColor) ? $bgColor : null; $textColor = $this->validateColor($textColor) ? $textColor : null; // Add custom colors to cache key if provided $bgColorKey = in_array($bgColor, [null, '', '0'], true) ? '' : "_bg{$bgColor}"; $textColorKey = in_array($textColor, [null, '', '0'], true) ? '' : "_txt{$textColor}"; $cacheKey = 'avatar_'.hash('sha256', "{$name}_{$size}{$bgColorKey}{$textColorKey}_initials{$initialCount}"); return $this->cache->remember( $cacheKey, $this->cacheTtl, fn (): string => $this->createSvgDataUrl($name, $size, $bgColor, $textColor, $initialCount) ); } /** * Generate an SVG avatar with automatically selected colors. * * @param string $name The user's name * @param int $size The size of the avatar in pixels * @param int $initialCount Number of initials to show (1 or 2) * @return string The URL to the SVG avatar */ public function generateAuto(string $name, int $size = 64, int $initialCount = 2): string { $cacheKey = 'avatar_auto_'.hash('sha256', "{$name}_{$size}_initials{$initialCount}"); return $this->cache->remember( $cacheKey, $this->cacheTtl, function () use ($name, $size, $initialCount): string { // Analyze name characteristics $nameAnalysis = $this->analyzeNameCharacteristics($name); // Generate a deterministic hue based on the name $hue = $this->getHueFromName($name); // Adjust saturation and lightness based on name characteristics $saturation = 65 + $nameAnalysis['adjustment']; $lightness = 85 - ($nameAnalysis['adjustment'] / 2); // Ensure values stay within reasonable ranges $saturation = max(50, min(75, $saturation)); $lightness = max(75, min(90, $lightness)); // Generate a pastel background color with adjusted parameters $bgColor = $this->hslToHex($hue, $saturation, $lightness); // Generate a darker text color with proper contrast $textColor = $this->generateContrastingTextColor($bgColor); return $this->createSvgDataUrl($name, $size, $bgColor, $textColor, $initialCount); } ); } /** * Create the SVG data URL for an avatar. */ private function createSvgDataUrl( string $name, int $size, ?string $bgColor, ?string $textColor, int $initialCount = 2 ): string { $initials = $this->getInitials($name, $initialCount); $backgroundColor = $bgColor ?? $this->getBackgroundColor($name); $textFillColor = $textColor ?? $this->defaultTextColor; // Ensure there's enough contrast in auto mode if ($bgColor !== null && $textColor !== null && ! $this->hasEnoughContrast($backgroundColor, $textFillColor)) { $textFillColor = $this->generateContrastingTextColor($backgroundColor); } $svg = $this->generateSvg($initials, $backgroundColor, $textFillColor, $size); return 'data:image/svg+xml;base64,'.base64_encode($svg); } /** * Validate if a color string is a valid hex or RGB color. */ public function validateColor(?string $color): bool { if ($color === null) { return false; } // Validate hex color format (#RGB or #RRGGBB) if (preg_match('/^#([A-Fa-f0-9]{3}){1,2}$/', $color)) { return true; } // Validate rgb() and rgba() formats return (bool) preg_match('/^rgba?\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*(?:,\s*[\d.]+\s*)?\)$/', $color); } /** * Get the initials from a name. * Enhanced to better handle various name formats and cultural patterns. * * @param string $name The name to extract initials from * @param int $initialCount The number of initials to return (1 or 2) * @return string The extracted initials */ private function getInitials(string $name, int $initialCount = 2): string { // Normalize count to either 1 or 2 $count = ($initialCount === 1) ? 1 : 2; // Normalize and trim the name to handle special characters better $name = trim($name); $normalizedName = Str::ascii($name); $nameParts = array_values(array_filter(preg_split('/[\s\-_\.]+/', $normalizedName) ?: [])); if ($nameParts === []) { return '?'; } // For single initial mode, just return the first letter of the first name part if ($count === 1) { return Str::upper(substr($nameParts[0], 0, 1)); } // Single word name handling if (count($nameParts) === 1) { $singleName = $nameParts[0]; $nameLength = Str::length($singleName); // Handle very short names if ($nameLength <= 1) { return Str::upper($singleName); } // Handle common prefixes in surnames (Mc, Mac, O', etc.) if ($nameLength >= 3) { if (Str::startsWith(Str::lower($singleName), ['mc', 'mac'])) { return Str::upper(substr($singleName, 0, 1).substr($singleName, 2, 1)); } if (Str::startsWith(Str::lower($singleName), "o'")) { return Str::upper(substr($singleName, 0, 1).substr($singleName, 2, 1)); } } // Default: For single names with at least 2 characters, return first two return Str::upper(substr($singleName, 0, 2)); } // Handle multi-part names // Check for compound last names (with hyphens, even if normalized) $lastPart = end($nameParts); if (str_contains($name, '-') && ! in_array('-', $nameParts)) { // Original name had hyphens, try to split the last part $possibleCompound = array_filter(explode('-', $name)); if (count($possibleCompound) >= 2) { return Str::upper(substr($nameParts[0], 0, 1). substr(end($possibleCompound), 0, 1)); } } // Handle names with particles or prefixes (von, van, de, etc.) $prefixes = ['van', 'von', 'de', 'la', 'den', 'der', 'di', 'le', 'da']; if (count($nameParts) >= 3 && in_array(Str::lower($nameParts[count($nameParts) - 2]), $prefixes)) { // Use first name and the actual surname after the prefix return Str::upper(substr($nameParts[0], 0, 1).substr($lastPart, 0, 1)); } // Standard case: first and last parts return Str::upper(substr($nameParts[0], 0, 1).substr($lastPart, 0, 1)); } /** * Get a deterministic background color based on the name. */ private function getBackgroundColor(string $name): string { // If a default background color is specified, use that if ($this->defaultBgColor !== '' && $this->defaultBgColor !== '0') { return $this->defaultBgColor; } // If no background colors provided, return a safe default if ($this->backgroundColors === []) { return '#3182CE'; // A nice blue as fallback } // Use more stable hash function $hash = crc32(Str::ascii($name)); $index = $hash % count($this->backgroundColors); return $this->backgroundColors[$index]; } /** * Generate SVG markup for the avatar. */ private function generateSvg(string $initials, string $bgColor, string $textColor, int $size): string { // Adjust font size based on initials length $fontSize = strlen($initials) > 1 ? 44 : 48; return << {$initials} SVG; } /** * Generate a deterministic hue value from a name. */ private function getHueFromName(string $name): int { // Use a combination of hashing techniques for better distribution $hash1 = crc32(Str::ascii($name)); $hash2 = crc32(strrev(Str::ascii($name))); // Blend the two hashes for better distribution across the color wheel $blendedHash = ($hash1 + $hash2) / 2; // Map to hue values, avoiding too much clustering around certain hues $hue = $blendedHash % 360; return $hue; } /** * Generate a contrasting text color for a background. */ private function generateContrastingTextColor(string $bgColor): string { // Convert the background color to HSL [$h, $s, $l] = $this->hexToHsl($bgColor); // For darker background, use lighter text if ($l < 60) { return '#FFFFFF'; } // For lighter background, use a darker shade of the same hue // Adjust saturation and lightness for better contrast $contrastingSaturation = min(95, $s + 20); $contrastingLightness = max(15, $l - 55); return $this->hslToHex($h, $contrastingSaturation, $contrastingLightness); } /** * Convert HSL to hex color. */ private function hslToHex(int $h, float $s, float $l): string { $h /= 360; $s /= 100; $l /= 100; if (abs($s) < 0.001) { // Fixed: Changed strict equality to approximate comparison for float $r = $g = $b = $l; } else { $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s; $p = 2 * $l - $q; $r = $this->hueToRgb($p, $q, $h + 1 / 3); $g = $this->hueToRgb($p, $q, $h); $b = $this->hueToRgb($p, $q, $h - 1 / 3); } return sprintf('#%02x%02x%02x', (int) round($r * 255), (int) round($g * 255), (int) round($b * 255) ); } /** * @return int[] */ private function hexToHsl(string $hexColor): array { // Remove # if present $hex = ltrim($hexColor, '#'); // Handle both shorthand and regular hex formats if (strlen($hex) === 3) { $r = hexdec(str_repeat(substr($hex, 0, 1), 2)) / 255; $g = hexdec(str_repeat(substr($hex, 1, 1), 2)) / 255; $b = hexdec(str_repeat(substr($hex, 2, 1), 2)) / 255; } else { $r = hexdec(substr($hex, 0, 2)) / 255; $g = hexdec(substr($hex, 2, 2)) / 255; $b = hexdec(substr($hex, 4, 2)) / 255; } $max = max($r, $g, $b); $min = min($r, $g, $b); $h = 0; $s = 0; $l = ($max + $min) / 2; if ($max !== $min) { $d = $max - $min; $s = $l > 0.5 ? $d / (2 - $max - $min) : $d / ($max + $min); switch ($max) { case $r: $h = ($g - $b) / $d + ($g < $b ? 6 : 0); break; case $g: $h = ($b - $r) / $d + 2; break; case $b: $h = ($r - $g) / $d + 4; break; } $h /= 6; } return [ (int) round($h * 360), // Convert to 0-359 range (int) round($s * 100), // Convert to 0-100 range (int) round($l * 100), // Convert to 0-100 range ]; } /** * Helper function for HSL to RGB conversion. */ private function hueToRgb(float $p, float $q, float $t): float { if ($t < 0) { $t += 1; } if ($t > 1) { $t -= 1; } if ($t < 1 / 6) { return $p + ($q - $p) * 6 * $t; } if ($t < 1 / 2) { return $q; } if ($t < 2 / 3) { return $p + ($q - $p) * (2 / 3 - $t) * 6; } return $p; } /** * Calculate the contrast ratio between two colors. */ private function calculateContrastRatio(string $color1, string $color2): float { $lum1 = $this->getRelativeLuminance($color1); $lum2 = $this->getRelativeLuminance($color2); $lighter = max($lum1, $lum2); $darker = min($lum1, $lum2); return ($lighter + 0.05) / ($darker + 0.05); } /** * Calculate the relative luminance of a color. */ private function getRelativeLuminance(string $hexColor): float { $hex = ltrim($hexColor, '#'); // Handle both shorthand and regular hex formats if (strlen($hex) === 3) { $r = hexdec(str_repeat(substr($hex, 0, 1), 2)) / 255; $g = hexdec(str_repeat(substr($hex, 1, 1), 2)) / 255; $b = hexdec(str_repeat(substr($hex, 2, 1), 2)) / 255; } else { $r = hexdec(substr($hex, 0, 2)) / 255; $g = hexdec(substr($hex, 2, 2)) / 255; $b = hexdec(substr($hex, 4, 2)) / 255; } // Transform sRGB values $r = $r <= 0.03928 ? $r / 12.92 : (($r + 0.055) / 1.055) ** 2.4; $g = $g <= 0.03928 ? $g / 12.92 : (($g + 0.055) / 1.055) ** 2.4; $b = $b <= 0.03928 ? $b / 12.92 : (($b + 0.055) / 1.055) ** 2.4; // Calculate luminance return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b; } /** * Check if two colors have enough contrast for accessibility. */ private function hasEnoughContrast(string $color1, string $color2): bool { return $this->calculateContrastRatio($color1, $color2) >= self::MINIMUM_CONTRAST_RATIO; } /** * @return array */ private function analyzeNameCharacteristics(string $name): array { $normalizedName = Str::ascii(trim($name)); // Handle empty names if (blank($normalizedName)) { return [ 'length' => 0, 'vowelRatio' => 0.5, 'uniqueness' => 0, 'adjustment' => 0, ]; } // Calculate characteristics $length = mb_strlen($normalizedName); $lengthFactor = min(10, max(1, $length)) / 10; // Count vowels and consonants more accurately $vowels = preg_match_all('/[aeiouàáâãäåæèéêëìíîïòóôõöøùúûüýÿ]/i', $normalizedName, $matches); $consonants = preg_match_all('/[bcdfghjklmnpqrstvwxyzçñß]/i', $normalizedName, $matches); // Names with more vowels tend to be "softer" - adjust colors accordingly $vowelRatio = $vowels / ($vowels + $consonants !== 0 ? $vowels + $consonants : 1); // More sophisticated uniqueness calculation $uniqueness = $this->calculateUniquenessScore($normalizedName); // Calculate overall adjustment (-10 to +10 range) $adjustment = (($lengthFactor - 0.5) * 10) + // Length factor ((0.5 - $vowelRatio) * 10) + // Vowel ratio (fewer vowels = higher adjustment) ($uniqueness - 5); // Uniqueness factor normalized to -5 to +5 range // Ensure the adjustment stays within reasonable bounds $adjustment = max(-10, min(10, $adjustment)); return [ 'length' => $length, 'vowelRatio' => $vowelRatio, 'uniqueness' => $uniqueness, 'adjustment' => $adjustment, ]; } /** * Calculate a uniqueness score for a name. * * @param string $name The normalized name to analyze * @return float A uniqueness score from 0 to 10 */ private function calculateUniquenessScore(string $name): float { if ($name === '' || $name === '0') { return 0; } $name = strtolower($name); $chars = str_split($name); $charFrequency = array_count_values($chars); $uniqueChars = count($charFrequency); // Base uniqueness on ratio of unique characters $uniquenessBase = $uniqueChars / mb_strlen($name) * 5; // Additional points for rare letters $rarityScore = 0; $rareLetters = ['q' => 1.5, 'x' => 1.5, 'z' => 1.5, 'j' => 1, 'k' => 0.8, 'w' => 0.8, 'y' => 0.8, 'v' => 0.7]; foreach ($charFrequency as $char => $freq) { // Award points for rare letters if (isset($rareLetters[$char])) { $rarityScore += $rareLetters[$char]; } // Penalize for highly repetitive patterns if ($freq > 2 && ctype_alpha((string) $char)) { $rarityScore -= ($freq - 2) * 0.5; } } // Combine scores and ensure within 0-10 range $finalScore = $uniquenessBase + $rarityScore; return max(0, min(10, $finalScore)); } } ================================================ FILE: app/Services/Favicon/Drivers/GoogleHighResDriver.php ================================================ urlIsValid($url), InvalidUrlException::class, $url.' is not a valid URL'); if ($this->useCache && $favicon = $this->attemptToFetchFromCache($url)) { return $favicon; } $faviconUrl = self::BASE_URL.'?sz='.$this->size.'&domain='.$url; $response = $this->withRequestExceptionHandling( fn () => $this->httpClient()->get($faviconUrl) ); return $response->successful() ? new Favicon(url: $url, faviconUrl: $faviconUrl, fromDriver: $this) ->setIconSize($this->size) : $this->notFound($url); } public function fetchAll(string $url): FaviconCollection { throw new \Exception('Google API does not support fetching all favicons'); } } ================================================ FILE: app/Services/Favicon/Drivers/HighQualityDriver.php ================================================ urlIsValid($url), InvalidUrlException::class, $url.' is not a valid URL'); if ($this->useCache && $favicon = $this->attemptToFetchFromCache($url)) { return $favicon; } $favicon = $this->tryAppleTouchIcon($url); if ($favicon instanceof Favicon && $this->faviconIsAccessible($favicon)) { return $favicon; } $favicon = $this->tryHighResFavicon($url); if ($favicon instanceof Favicon && $this->faviconIsAccessible($favicon)) { return $favicon; } $favicon = $this->tryGoogleHighRes($url); if ($favicon instanceof Favicon && $this->faviconIsAccessible($favicon)) { return $favicon; } return $this->tryDuckDuckGo($url); } public function fetchAll(string $url): FaviconCollection { throw new \Exception('fetchAll not supported by HighQualityDriver'); } private function tryAppleTouchIcon(string $url): ?Favicon { try { $response = $this->withRequestExceptionHandling( fn () => $this->httpClient()->get($url) ); if (! $response->successful()) { return null; } $html = $response->body(); if (preg_match('/]+rel=["\']apple-touch-icon["\'][^>]+href=["\'](.*?)["\']/i', (string) $html, $matches)) { $iconUrl = $this->convertToAbsoluteUrl($url, $matches[1]); return new Favicon( url: $url, faviconUrl: $iconUrl, fromDriver: $this, )->setIconType(Favicon::TYPE_APPLE_TOUCH_ICON) ->setIconSize(180); } $iconUrl = $this->stripPathFromUrl($url).'/apple-touch-icon.png'; /** @var Response $testResponse */ $testResponse = $this->httpClient()->head($iconUrl); if ($testResponse->successful()) { return new Favicon( url: $url, faviconUrl: $iconUrl, fromDriver: $this, )->setIconType(Favicon::TYPE_APPLE_TOUCH_ICON) ->setIconSize(180); } } catch (\Exception) { // Fall through to next strategy } return null; } private function tryHighResFavicon(string $url): ?Favicon { try { $response = $this->withRequestExceptionHandling( fn () => $this->httpClient()->get($url) ); if (! $response->successful()) { return null; } $html = $response->body(); $patterns = [ '/sizes=["\']512x512["\'][^>]+href=["\'](.*?)["\']/i', '/href=["\'](.*?)["\']\s+[^>]*sizes=["\']512x512["\']/i', '/sizes=["\']256x256["\'][^>]+href=["\'](.*?)["\']/i', '/href=["\'](.*?)["\']\s+[^>]*sizes=["\']256x256["\']/i', '/sizes=["\']192x192["\'][^>]+href=["\'](.*?)["\']/i', '/href=["\'](.*?)["\']\s+[^>]*sizes=["\']192x192["\']/i', ]; foreach ($patterns as $pattern) { if (preg_match($pattern, (string) $html, $matches)) { $iconUrl = $this->convertToAbsoluteUrl($url, $matches[1]); preg_match('/(\d+)x\d+/', $pattern, $sizeMatch); $size = isset($sizeMatch[1]) ? (int) $sizeMatch[1] : null; $favicon = new Favicon( url: $url, faviconUrl: $iconUrl, fromDriver: $this, ); if ($size !== null) { $favicon->setIconSize($size); } return $favicon; } } } catch (\Exception) { // Fall through } return null; } private function tryGoogleHighRes(string $url): ?Favicon { try { $urlWithoutProtocol = str_replace(['https://', 'http://'], '', $url); $faviconUrl = 'https://www.google.com/s2/favicons?sz=256&domain='.$urlWithoutProtocol; $response = $this->withRequestExceptionHandling( fn () => $this->httpClient()->get($faviconUrl) ); if ($response->successful()) { return new Favicon( url: $url, faviconUrl: $faviconUrl, fromDriver: $this, )->setIconSize(256); } } catch (\Exception) { // Fall through } return null; } private function tryDuckDuckGo(string $url): ?Favicon { $urlWithoutProtocol = str_replace(['https://', 'http://'], '', $url); $faviconUrl = 'https://icons.duckduckgo.com/ip3/'.$urlWithoutProtocol.'.ico'; try { $response = $this->withRequestExceptionHandling( fn () => $this->httpClient()->get($faviconUrl) ); if ($response->successful()) { return new Favicon( url: $url, faviconUrl: $faviconUrl, fromDriver: $this, ); } } catch (\Exception) { // Fall through } return $this->notFound($url); } private function faviconIsAccessible(Favicon $favicon): bool { try { /** @var Response $response */ $response = $this->httpClient()->head($favicon->getFaviconUrl()); return $response->successful(); } catch (\Exception) { return false; } } private function convertToAbsoluteUrl(string $baseUrl, string $path): string { if (filter_var($path, FILTER_VALIDATE_URL)) { return $path; } $parsedBase = parse_url($baseUrl); $scheme = $parsedBase['scheme'] ?? 'https'; $host = $parsedBase['host'] ?? ''; if (str_starts_with($path, '//')) { return $scheme.':'.$path; } if (str_starts_with($path, '/')) { return $scheme.'://'.$host.$path; } return $scheme.'://'.$host.'/'.ltrim($path, '/'); } private function stripPathFromUrl(string $url): string { $parsedUrl = parse_url($url); if ($parsedUrl === false || ! isset($parsedUrl['scheme'], $parsedUrl['host'])) { return $url; } $result = $parsedUrl['scheme'].'://'.$parsedUrl['host']; if (isset($parsedUrl['port'])) { $result .= ':'.$parsedUrl['port']; } return $result; } } ================================================ FILE: app/Services/GitHubService.php ================================================ addMinutes($cacheMinutes), function () use ($owner, $repo): int { try { /** @var Response $response */ $response = Http::withHeaders([ 'Accept' => 'application/vnd.github.v3+json', ])->get("https://api.github.com/repos/{$owner}/{$repo}"); if ($response->successful()) { return (int) $response->json('stargazers_count', 0); } Log::warning('Failed to fetch GitHub stars: '.$response->status()); return 0; } catch (Exception $e) { Log::error('Error fetching GitHub stars: '.$e->getMessage()); return 0; } }); } /** * Get the formatted stargazers to count for a GitHub repository * * @param string $owner The repository owner * @param string $repo The repository name * @param int $cacheMinutes Minutes to cache the result (default: 15) */ public function getFormattedStarsCount(string $owner = 'Relaticle', string $repo = 'relaticle', int $cacheMinutes = 15): string { $starsCount = $this->getStarsCount($owner, $repo, $cacheMinutes); if ($starsCount >= 1000) { return (string) Number::abbreviate($starsCount, 1); } return (string) $starsCount; } } ================================================ FILE: app/Support/CustomFieldMerger.php ================================================ $attributes * @return array */ public static function merge(Model $model, array $attributes): array { if (! isset($attributes['custom_fields']) || ! is_array($attributes['custom_fields'])) { return $attributes; } if (! method_exists($model, 'customFieldValues')) { return $attributes; } $model->loadMissing('customFieldValues.customField'); /** @var \Illuminate\Database\Eloquent\Collection $values */ $values = $model->getRelation('customFieldValues'); $existing = $values /** @phpstan-ignore notIdentical.alwaysTrue (orphaned values can exist when a custom field is deleted) */ ->filter(fn (CustomFieldValue $v): bool => $v->customField !== null) ->mapWithKeys(fn (CustomFieldValue $v): array => [ $v->customField->code => self::normalizeValue($v->getValue()), ]) ->all(); $attributes['custom_fields'] = array_merge($existing, $attributes['custom_fields']); return $attributes; } /** * Normalize getValue() output to the input format saveCustomFields() expects. * * getValue() returns Collection for multi-choice fields (link, email, phone), * but saveCustomFields() expects plain arrays. */ private static function normalizeValue(mixed $value): mixed { if ($value instanceof Collection) { return $value->all(); } return $value; } } ================================================ FILE: app/View/Components/GuestLayout.php ================================================ handleCommand(new ArgvInput); exit($status); ================================================ FILE: bootstrap/app.php ================================================ withRouting( web: __DIR__.'/../routes/web.php', health: '/up', then: function (): void { $apiDomain = config('app.api_domain'); $routes = Route::middleware('api'); if ($apiDomain) { $routes->domain($apiDomain); } else { $routes->prefix('api'); } $routes->group(base_path('routes/api.php')); }, ) ->withMiddleware(function (Middleware $middleware): void { $middleware->prepend(SubdomainRootResponse::class); $middleware->prependToPriorityList( before: SubstituteBindings::class, prepend: SetApiTeamContext::class, ); $middleware->alias([ 'signed' => ValidateSignature::class, ]); $middleware->redirectGuestsTo(function (Request $request): string { if ($request->routeIs('team-invitations.accept')) { $invitation = TeamInvitation::query() ->whereKey($request->route('invitation')) ->first(); if ($invitation && User::query()->where('email', $invitation->email)->exists()) { return Filament::getLoginUrl(); } return Filament::getRegistrationUrl(); } return route('login'); }); }) ->withExceptions(function (Exceptions $exceptions): void { Integration::handles($exceptions); $exceptions->shouldRenderJsonWhen(fn (Request $request): bool => $request->is('api/*') || $request->getHost() === config('app.api_domain') || $request->expectsJson()); }) ->withSchedule(function (Schedule $schedule): void { $schedule->command('app:generate-sitemap')->daily(); $schedule->command('import:cleanup')->hourly(); $schedule->command('queue:prune-batches --hours=24')->daily(); $schedule->command('invitations:cleanup')->daily(); if (config('app.health_checks_enabled')) { $schedule->command(RunHealthChecksCommand::class)->everyMinute(); $schedule->command(DispatchQueueCheckJobsCommand::class)->everyMinute(); $schedule->command(ScheduleCheckHeartbeatCommand::class)->everyMinute(); } }) ->booting(function (): void { // Model::automaticallyEagerLoadRelationships(); TODO: Before enabling this, check the test suite for any issues with eager loading. }) ->create(); ================================================ FILE: bootstrap/cache/.gitignore ================================================ * !.gitignore ================================================ FILE: bootstrap/providers.php ================================================ env('APP_NAME', 'Laravel'), /* |-------------------------------------------------------------------------- | Application Environment |-------------------------------------------------------------------------- | | This value determines the "environment" your application is currently | running in. This may determine how you prefer to configure various | services the application utilizes. Set this in your ".env" file. | */ 'env' => env('APP_ENV', 'production'), /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stack traces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => (bool) env('APP_DEBUG', false), /* |-------------------------------------------------------------------------- | Application URL |-------------------------------------------------------------------------- | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of | the application so that it's available within Artisan commands. | */ 'url' => env('APP_URL', 'http://localhost'), /* |-------------------------------------------------------------------------- | System Administrator Panel Configuration |-------------------------------------------------------------------------- | | These values configure how the system administrator panel is accessed. | You can either use a subdomain (sysadmin_domain) or a path (sysadmin_path). | If sysadmin_domain is set, it will be used; otherwise, sysadmin_path will be used. | */ 'sysadmin_domain' => env('SYSADMIN_DOMAIN'), 'sysadmin_path' => env('SYSADMIN_PATH', 'sysadmin'), /* |-------------------------------------------------------------------------- | Application Panel Configuration |-------------------------------------------------------------------------- | | These values configure how the main application (CRM) panel is accessed. | By default, the panel uses path-based routing at /app. For subdomain | routing, set APP_PANEL_DOMAIN (e.g., app.example.com). | */ 'app_panel_domain' => env('APP_PANEL_DOMAIN'), 'app_panel_path' => env('APP_PANEL_PATH', 'app'), /* |-------------------------------------------------------------------------- | MCP Server Configuration |-------------------------------------------------------------------------- | | The domain where the MCP server is publicly accessible. | If set, URL helpers will generate URLs using this domain. | Otherwise, the MCP endpoint is available at {APP_URL}/mcp. | */ 'mcp_domain' => env('MCP_DOMAIN'), /* |-------------------------------------------------------------------------- | API Configuration |-------------------------------------------------------------------------- | | The domain where the REST API is publicly accessible. | If set, URL helpers will generate URLs using this domain. | Otherwise, the API is available at {APP_URL}/api. | */ 'api_domain' => env('API_DOMAIN'), /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. The timezone | is set to "UTC" by default as it is suitable for most use cases. | */ 'timezone' => env('APP_TIMEZONE', 'UTC'), /* |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by Laravel's translation / localization methods. This option can be | set to any locale for which you plan to have translation strings. | */ 'locale' => env('APP_LOCALE', 'en'), 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | | This key is utilized by Laravel's encryption services and should be set | to a random, 32 character string to ensure that all encrypted values | are secure. You should do this prior to deploying the application. | */ 'cipher' => 'AES-256-CBC', 'key' => env('APP_KEY'), 'previous_keys' => [ ...array_filter( explode(',', (string) env('APP_PREVIOUS_KEYS', '')) ), ], /* |-------------------------------------------------------------------------- | Maintenance Mode Driver |-------------------------------------------------------------------------- | | These configuration options determine the driver used to determine and | manage Laravel's "maintenance mode" status. The "cache" driver will | allow maintenance mode to be controlled across multiple machines. | | Supported drivers: "file", "cache" | */ 'maintenance' => [ 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), 'store' => env('APP_MAINTENANCE_STORE', 'database'), ], /* |-------------------------------------------------------------------------- | Health Checks |-------------------------------------------------------------------------- | | When enabled, Spatie Health will register all application health checks. | Set the HEALTH_CHECKS_ENABLED environment variable to true to activate. | */ 'health_checks_enabled' => (bool) env('HEALTH_CHECKS_ENABLED', false), ]; ================================================ FILE: config/auth.php ================================================ [ 'guard' => env('AUTH_GUARD', 'web'), 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), ], /* |-------------------------------------------------------------------------- | Authentication Guards |-------------------------------------------------------------------------- | | Next, you may define every authentication guard for your application. | Of course, a great default configuration has been defined for you | which utilizes session storage plus the Eloquent user provider. | | All authentication guards have a user provider, which defines how the | users are actually retrieved out of your database or other storage | system used by the application. Typically, Eloquent is utilized. | | Supported: "session" | */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'sysadmin' => [ 'driver' => 'session', 'provider' => 'system_administrators', ], ], /* |-------------------------------------------------------------------------- | User Providers |-------------------------------------------------------------------------- | | All authentication guards have a user provider, which defines how the | users are actually retrieved out of your database or other storage | system used by the application. Typically, Eloquent is utilized. | | If you have multiple user tables or models you may configure multiple | providers to represent the model / table. These providers may then | be assigned to any extra authentication guards you have defined. | | Supported: "database", "eloquent" | */ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => env('AUTH_MODEL', User::class), ], 'system_administrators' => [ 'driver' => 'eloquent', 'model' => SystemAdministrator::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], /* |-------------------------------------------------------------------------- | Resetting Passwords |-------------------------------------------------------------------------- | | These configuration options specify the behavior of Laravel's password | reset functionality, including the table utilized for token storage | and the user provider that is invoked to actually retrieve users. | | The expiry time is the number of minutes that each reset token will be | considered valid. This security feature keeps tokens short-lived so | they have less time to be guessed. You may change this as needed. | | The throttle setting is the number of seconds a user must wait before | generating more password reset tokens. This prevents the user from | quickly generating a very large amount of password reset tokens. | */ 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 'expire' => 60, 'throttle' => 60, ], 'system_administrators' => [ 'provider' => 'system_administrators', 'expire' => 60, 'throttle' => 60, ], ], /* |-------------------------------------------------------------------------- | Password Confirmation Timeout |-------------------------------------------------------------------------- | | Here you may define the amount of seconds before a password confirmation | window expires and users are asked to re-enter their password via the | confirmation screen. By default, the timeout lasts for three hours. | */ 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), ]; ================================================ FILE: config/avatar.php ================================================ env('AVATAR_BACKGROUND_COLOR', '#ede9fe'), // Default text color for avatars (hex format) 'default_text_color' => env('AVATAR_TEXT_COLOR', '#5b21b6'), // Time to live for avatar cache (in seconds) 'cache_ttl' => env('AVATAR_CACHE_TTL', 604800), // Default: 1 week (corrected from 1 second) // Available background colors for random/deterministic selection // Only used if background_color is set to null 'background_colors' => [ '#E53E3E', // Red '#DD6B20', // Orange '#D69E2E', // Yellow '#38A169', // Green '#3182CE', // Blue '#805AD5', // Purple '#D53F8C', // Pink '#718096', // Gray '#F87171', // Red '#FBBF24', // Yellow '#34D399', // Green '#3B82F6', // Blue '#A78BFA', // Purple '#F472B6', // Pink '#6B7280', // Gray ], // Minimum contrast ratio for text/background (WCAG AA requires 4.5:1) 'minimum_contrast_ratio' => 4.5, ]; ================================================ FILE: config/blade-icons.php ================================================ [ 'default' => [ /* |----------------------------------------------------------------- | Icons Path |----------------------------------------------------------------- | | Provide the relative path from your app root to your SVG icons | directory. Icons are loaded recursively so there's no need to | list every sub-directory. | | Relative to the disk root when the disk option is set. | */ 'path' => 'resources/svg', /* |----------------------------------------------------------------- | Filesystem Disk |----------------------------------------------------------------- | | Optionally, provide a specific filesystem disk to read | icons from. When defining a disk, the "path" option | starts relatively from the disk root. | */ 'disk' => '', /* |----------------------------------------------------------------- | Default Prefix |----------------------------------------------------------------- | | This config option allows you to define a default prefix for | your icons. The dash separator will be applied automatically | to every icon name. It's required and needs to be unique. | */ 'prefix' => 'icon', /* |----------------------------------------------------------------- | Fallback Icon |----------------------------------------------------------------- | | This config option allows you to define a fallback | icon when an icon in this set cannot be found. | */ 'fallback' => '', /* |----------------------------------------------------------------- | Default Set Classes |----------------------------------------------------------------- | | This config option allows you to define some classes which | will be applied by default to all icons within this set. | */ 'class' => '', /* |----------------------------------------------------------------- | Default Set Attributes |----------------------------------------------------------------- | | This config option allows you to define some attributes which | will be applied by default to all icons within this set. | */ 'attributes' => [ // 'width' => 50, // 'height' => 50, ], ], ], /* |-------------------------------------------------------------------------- | Global Default Classes |-------------------------------------------------------------------------- | | This config option allows you to define some classes which | will be applied by default to all icons. | */ 'class' => '', /* |-------------------------------------------------------------------------- | Global Default Attributes |-------------------------------------------------------------------------- | | This config option allows you to define some attributes which | will be applied by default to all icons. | */ 'attributes' => [ // 'width' => 50, // 'height' => 50, ], /* |-------------------------------------------------------------------------- | Global Fallback Icon |-------------------------------------------------------------------------- | | This config option allows you to define a global fallback | icon when an icon in any set cannot be found. It can | reference any icon from any configured set. | */ 'fallback' => '', /* |-------------------------------------------------------------------------- | Components |-------------------------------------------------------------------------- | | These config options allow you to define some | settings related to Blade Components. | */ 'components' => [ /* |---------------------------------------------------------------------- | Disable Components |---------------------------------------------------------------------- | | This config option allows you to disable Blade components | completely. It's useful to avoid performance problems | when working with large icon libraries. | */ 'disabled' => false, /* |---------------------------------------------------------------------- | Default Icon Component Name |---------------------------------------------------------------------- | | This config option allows you to define the name | for the default Icon class component. | */ 'default' => 'icon', ], ]; ================================================ FILE: config/cache.php ================================================ env('CACHE_STORE', 'database'), /* |-------------------------------------------------------------------------- | Cache Stores |-------------------------------------------------------------------------- | | Here you may define all of the cache "stores" for your application as | well as their drivers. You may even define multiple stores for the | same cache driver to group types of items stored in your caches. | | Supported drivers: "array", "database", "file", "memcached", | "redis", "dynamodb", "octane", "null" | */ 'stores' => [ 'array' => [ 'driver' => 'array', 'serialize' => false, ], 'database' => [ 'driver' => 'database', 'connection' => env('DB_CACHE_CONNECTION'), 'table' => env('DB_CACHE_TABLE', 'cache'), 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), 'lock_table' => env('DB_CACHE_LOCK_TABLE'), ], 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), 'lock_path' => storage_path('framework/cache/data'), ], 'memcached' => [ 'driver' => 'memcached', 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 'sasl' => [ env('MEMCACHED_USERNAME'), env('MEMCACHED_PASSWORD'), ], 'options' => [ // Memcached::OPT_CONNECT_TIMEOUT => 2000, ], 'servers' => [ [ 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 'port' => env('MEMCACHED_PORT', 11211), 'weight' => 100, ], ], ], 'redis' => [ 'driver' => 'redis', 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), ], 'dynamodb' => [ 'driver' => 'dynamodb', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 'endpoint' => env('DYNAMODB_ENDPOINT'), ], 'octane' => [ 'driver' => 'octane', ], ], /* |-------------------------------------------------------------------------- | Cache Key Prefix |-------------------------------------------------------------------------- | | When utilizing the APC, database, memcached, Redis, and DynamoDB cache | stores, there might be other applications using the same cache. For | that reason, you may prefix every cache key to avoid collisions. | */ 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel'), '_').'_cache_'), ]; ================================================ FILE: config/custom-fields.php ================================================ EntityConfigurator::configure() ->discover(app_path('Models')) ->models([ EntityModel::configure( modelClass: People::class, primaryAttribute: 'name', resourceClass: PeopleResource::class, avatarConfiguration: EntityModel::avatar(attribute: 'avatar'), ), EntityModel::configure( modelClass: Company::class, primaryAttribute: 'name', resourceClass: CompanyResource::class, avatarConfiguration: EntityModel::avatar(attribute: 'logo', shape: AvatarShape::Square), ), EntityModel::configure( modelClass: Note::class, primaryAttribute: 'title', resourceClass: NoteResource::class, recordPage: null, ), EntityModel::configure( modelClass: Task::class, primaryAttribute: 'title', resourceClass: TaskResource::class, recordPage: null, ), ]) ->cache(), /* |-------------------------------------------------------------------------- | Advanced Field Type Configuration |-------------------------------------------------------------------------- | | Configure field types using the powerful fluent builder API. | This provides advanced control over validation, security, and behavior. | */ 'field_type_configuration' => FieldTypeConfigurator::configure() // Control which field types are available globally ->enabled([]) // Empty = all enabled, or specify: ['text', 'email', 'select'] ->disabled(['file-upload']) // Disable specific field types ->discover(true) ->cache(enabled: true, ttl: 3600), /* |-------------------------------------------------------------------------- | Features Configuration |-------------------------------------------------------------------------- | | Configure package features using the type-safe enum-based configurator. | This consolidates all feature settings into a single, organized system. | */ 'features' => FeatureConfigurator::configure() ->enable( CustomFieldsFeature::FIELD_ENCRYPTION, CustomFieldsFeature::FIELD_OPTION_COLORS, CustomFieldsFeature::FIELD_MULTI_VALUE, CustomFieldsFeature::FIELD_UNIQUE_VALUE, CustomFieldsFeature::FIELD_CODE_AUTO_GENERATE, CustomFieldsFeature::UI_TABLE_COLUMNS, CustomFieldsFeature::UI_TOGGLEABLE_COLUMNS, CustomFieldsFeature::UI_TABLE_FILTERS, CustomFieldsFeature::SYSTEM_MANAGEMENT_INTERFACE, CustomFieldsFeature::SYSTEM_MULTI_TENANCY, )->disable( CustomFieldsFeature::FIELD_CONDITIONAL_VISIBILITY, CustomFieldsFeature::FIELD_VALIDATION_RULES, CustomFieldsFeature::UI_FIELD_WIDTH_CONTROL, CustomFieldsFeature::SYSTEM_SECTIONS, ), /* |-------------------------------------------------------------------------- | Resource Configuration |-------------------------------------------------------------------------- | | Customize the behavior of entity resources in Filament. | */ 'resource' => [ 'table' => [ 'columns' => true, 'columns_toggleable' => true, 'filters' => true, ], ], /* |-------------------------------------------------------------------------- | Management Interface |-------------------------------------------------------------------------- | | Configure the Custom Fields management interface in Filament. | */ 'management' => [ 'enabled' => true, 'slug' => 'custom-fields', 'navigation_sort' => 100, 'navigation_group' => true, 'cluster' => null, ], /* |-------------------------------------------------------------------------- | Multi-Tenancy |-------------------------------------------------------------------------- | | Enable multi-tenancy support with automatic tenant isolation. | */ 'tenant_aware' => true, /* |-------------------------------------------------------------------------- | Database Configuration |-------------------------------------------------------------------------- | | Configure database table names and migration paths. | */ 'database' => [ 'migrations_path' => database_path('custom-fields'), 'table_names' => [ 'custom_field_sections' => 'custom_field_sections', 'custom_fields' => 'custom_fields', 'custom_field_values' => 'custom_field_values', 'custom_field_options' => 'custom_field_options', ], 'column_names' => [ 'tenant_foreign_key' => 'tenant_id', ], ], ]; ================================================ FILE: config/data.php ================================================ DATE_ATOM, /* * When transforming or casting dates, the following timezone will be used to * convert the date to the correct timezone. If set to null no timezone will * be passed. */ 'date_timezone' => null, /* * It is possible to enable certain features of the package, these would otherwise * be breaking changes, and thus they are disabled by default. In the next major * version of the package, these features will be enabled by default. */ 'features' => [ 'cast_and_transform_iterables' => false, /* * When trying to set a computed property value, the package will throw an exception. * You can disable this behaviour by setting this option to true, which will then just * ignore the value being passed into the computed property and recalculate it. */ 'ignore_exception_when_trying_to_set_computed_property_value' => false, ], /* * Global transformers will take complex types and transform them into simple * types. */ 'transformers' => [ DateTimeInterface::class => DateTimeInterfaceTransformer::class, Arrayable::class => ArrayableTransformer::class, BackedEnum::class => EnumTransformer::class, ], /* * Global casts will cast values into complex types when creating a data * object from simple types. */ 'casts' => [ DateTimeInterface::class => DateTimeInterfaceCast::class, BackedEnum::class => EnumCast::class, // Enumerable::class => Spatie\LaravelData\Casts\EnumerableCast::class, ], /* * Rule inferrers can be configured here. They will automatically add * validation rules to properties of a data object based upon * the type of the property. */ 'rule_inferrers' => [ SometimesRuleInferrer::class, NullableRuleInferrer::class, RequiredRuleInferrer::class, BuiltInTypesRuleInferrer::class, AttributesRuleInferrer::class, ], /* * Normalizers return an array representation of the payload, or null if * it cannot normalize the payload. The normalizers below are used for * every data object, unless overridden in a specific data object class. */ 'normalizers' => [ ModelNormalizer::class, // Spatie\LaravelData\Normalizers\FormRequestNormalizer::class, ArrayableNormalizer::class, ObjectNormalizer::class, ArrayNormalizer::class, JsonNormalizer::class, ], /* * Data objects can be wrapped into a key like 'data' when used as a resource, * this key can be set globally here for all data objects. You can pass in * `null` if you want to disable wrapping. */ 'wrap' => null, /* * Adds a specific caster to the Symphony VarDumper component which hides * some properties from data objects and collections when being dumped * by `dump` or `dd`. Can be 'enabled', 'disabled' or 'development' * which will only enable the caster locally. */ 'var_dumper_caster_mode' => 'development', /* * It is possible to skip the PHP reflection analysis of data objects * when running in production. This will speed up the package. You * can configure where data objects are stored and which cache * store should be used. * * Structures are cached forever as they'll become stale when your * application is deployed with changes. You can set a duration * in seconds if you want the cache to clear after a certain * timeframe. */ 'structure_caching' => [ 'enabled' => true, 'directories' => [app_path('Data')], 'cache' => [ 'store' => env('CACHE_STORE', env('CACHE_DRIVER', 'file')), 'prefix' => 'laravel-data', 'duration' => null, ], 'reflection_discovery' => [ 'enabled' => true, 'base_path' => base_path(), 'root_namespace' => null, ], ], /* * A data object can be validated when created using a factory or when calling the from * method. By default, only when a request is passed the data is being validated. This * behaviour can be changed to always validate or to completely disable validation. */ 'validation_strategy' => ValidationStrategy::OnlyRequests->value, /* * A data object can map the names of its properties when transforming (output) or when * creating (input). By default, the package will not map any names. You can set a * global strategy here, or override it on a specific data object. */ 'name_mapping_strategy' => [ 'input' => null, 'output' => null, ], /* * When using an invalid include, exclude, only or except partial, the package will * throw an exception. You can disable this behaviour by setting this option to true. */ 'ignore_invalid_partials' => false, /* * When transforming a nested chain of data objects, the package can end up in an infinite * loop when including a recursive relationship. The max transformation depth can be * set as a safety measure to prevent this from happening. When set to null, the * package will not enforce a maximum depth. */ 'max_transformation_depth' => null, /* * When the maximum transformation depth is reached, the package will throw an exception. * You can disable this behaviour by setting this option to true which will return an * empty array. */ 'throw_when_max_transformation_depth_reached' => true, /* * When using the `make:data` command, the package will use these settings to generate * the data classes. You can override these settings by passing options to the command. */ 'commands' => [ /* * Provides default configuration for the `make:data` command. These settings can be overridden with options * passed directly to the `make:data` command for generating single Data classes, or if not set they will * automatically fall back to these defaults. See `php artisan make:data --help` for more information */ 'make' => [ /* * The default namespace for generated Data classes. This exists under the application's root namespace, * so the default 'Data` will end up as '\App\Data', and generated Data classes will be placed in the * app/Data/ folder. Data classes can live anywhere, but this is where `make:data` will put them. */ 'namespace' => 'Data', /* * This suffix will be appended to all data classes generated by make:data, so that they are less likely * to conflict with other related classes, controllers or models with a similar name without resorting * to adding an alias for the Data object. Set to a blank string (not null) to disable. */ 'suffix' => 'Data', ], ], /* * When using Livewire, the package allows you to enable or disable the synths * these synths will automatically handle the data objects and their * properties when used in a Livewire component. */ 'livewire' => [ 'enable_synths' => false, ], ]; ================================================ FILE: config/database.php ================================================ env('DB_CONNECTION', 'sqlite'), /* |-------------------------------------------------------------------------- | Database Connections |-------------------------------------------------------------------------- | | Below are all of the database connections defined for your application. | An example configuration is provided for each database system which | is supported by Laravel. You're free to add / remove connections. | */ 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DB_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 'busy_timeout' => null, 'journal_mode' => null, 'synchronous' => null, ], 'mysql' => [ 'driver' => 'mysql', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => env('DB_CHARSET', 'utf8mb4'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'mariadb' => [ 'driver' => 'mariadb', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => env('DB_CHARSET', 'utf8mb4'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', 'sslmode' => 'prefer', ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DB_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, // 'encrypt' => env('DB_ENCRYPT', 'yes'), // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), ], ], /* |-------------------------------------------------------------------------- | Migration Repository Table |-------------------------------------------------------------------------- | | This table keeps track of all the migrations that have already run for | your application. Using this information, we can determine which of | the migrations on disk haven't actually been run on the database. | */ 'migrations' => [ 'table' => 'migrations', 'update_date_on_publish' => true, ], /* |-------------------------------------------------------------------------- | Redis Databases |-------------------------------------------------------------------------- | | Redis is an open source, fast, and advanced key-value store that also | provides a richer body of commands than a typical key-value system | such as Memcached. You may define your connection settings here. | */ 'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel'), '_').'_database_'), ], 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ], 'cache' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_CACHE_DB', '1'), ], ], ]; ================================================ FILE: config/eloquent-sortable.php ================================================ 'order_column', /* * Define if the models should sort when creating. * When true, the package will automatically assign the highest order number to a new model */ 'sort_when_creating' => true, /* * Define if the timestamps should be ignored when sorting. * When true, updated_at will not be updated when using setNewOrder */ 'ignore_timestamps' => true, ]; ================================================ FILE: config/favicon-fetcher.php ================================================ 'unavatar', /* |-------------------------------------------------------------------------- | Caching |-------------------------------------------------------------------------- | | The package provides support for caching the fetched favicon's URLs. | Here, you can specify the different options for caching, such as | cache prefix that is prepended to all the cache keys. | */ 'cache' => [ 'prefix' => 'favicon-fetcher', ], /* |-------------------------------------------------------------------------- | HTTP Timeouts |-------------------------------------------------------------------------- | | Set the timeouts here in seconds for the HTTP requests that are made | to fetch the favicons. If the timeout is set to 0, then no timeout | will be applied. The connect timeout is the time taken to connect | to the server, while the timeout is the time taken to get a | response from the server after the connection is made. | */ 'timeout' => 0, 'connect_timeout' => 0, /* |-------------------------------------------------------------------------- | Verify TLS |-------------------------------------------------------------------------- | | Sets the TLS verification option when making HTTP requests, which is | enabled by default. */ 'verify_tls' => env('FAVICON_FETCHER_VERIFY_TLS', true), /* |-------------------------------------------------------------------------- | HTTP User Agent |-------------------------------------------------------------------------- | | Set the user agent used by the HTTP client when fetching the favicons. | */ 'user_agent' => env('FAVICON_FETCHER_USER_AGENT'), ]; ================================================ FILE: config/filament.php ================================================ env('VITE_PUSHER_APP_KEY') ? [ 'echo' => [ 'broadcaster' => 'pusher', 'key' => env('VITE_PUSHER_APP_KEY'), 'cluster' => env('VITE_PUSHER_APP_CLUSTER'), 'wsHost' => env('VITE_PUSHER_HOST'), 'wsPort' => env('VITE_PUSHER_PORT'), 'wssPort' => env('VITE_PUSHER_PORT'), 'authEndpoint' => '/broadcasting/auth', 'disableStats' => true, 'encrypted' => true, 'forceTLS' => true, ], ] : [], /* |-------------------------------------------------------------------------- | Default Filesystem Disk |-------------------------------------------------------------------------- | | This is the storage disk Filament will use to store files. You may use | any of the disks defined in the `config/filesystems.php`. | */ 'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DISK', 'public'), /* |-------------------------------------------------------------------------- | Assets Path |-------------------------------------------------------------------------- | | This is the directory where Filament's assets will be published to. It | is relative to the `public` directory of your Laravel application. | | After changing the path, you should run `php artisan filament:assets`. | */ 'assets_path' => null, /* |-------------------------------------------------------------------------- | Cache Path |-------------------------------------------------------------------------- | | This is the directory that Filament will use to store cache files that | are used to optimize the registration of components. | | After changing the path, you should run `php artisan filament:cache-components`. | */ 'cache_path' => base_path('bootstrap/cache/filament'), /* |-------------------------------------------------------------------------- | Livewire Loading Delay |-------------------------------------------------------------------------- | | This sets the delay before loading indicators appear. | | Setting this to 'none' makes indicators appear immediately, which can be | desirable for high-latency connections. Setting it to 'default' applies | Livewire's standard 200ms delay. | */ 'livewire_loading_delay' => 'default', ]; ================================================ FILE: config/filesystems.php ================================================ env('FILESYSTEM_DISK', 'local'), /* |-------------------------------------------------------------------------- | Filesystem Disks |-------------------------------------------------------------------------- | | Below you may configure as many filesystem disks as necessary, and you | may even configure multiple disks for the same driver. Examples for | most supported storage drivers are configured here for reference. | | Supported drivers: "local", "ftp", "sftp", "s3" | */ 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'throw' => false, ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, ], 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 'throw' => false, ], ], /* |-------------------------------------------------------------------------- | Symbolic Links |-------------------------------------------------------------------------- | | Here you may configure the symbolic links that will be created when the | `storage:link` Artisan command is executed. The array keys should be | the locations of the links and the values should be their targets. | */ 'links' => [ public_path('storage') => storage_path('app/public'), ], ]; ================================================ FILE: config/fortify.php ================================================ 'web', /* |-------------------------------------------------------------------------- | Fortify Password Broker |-------------------------------------------------------------------------- | | Here you may specify which password broker Fortify can use when a user | is resetting their password. This configured value should match one | of your password brokers setup in your "auth" configuration file. | */ 'passwords' => 'users', /* |-------------------------------------------------------------------------- | Username / Email |-------------------------------------------------------------------------- | | This value defines which model attribute should be considered as your | application's "username" field. Typically, this might be the email | address of the users but you are free to change this value here. | | Out of the box, Fortify expects forgot password and reset password | requests to have a field named 'email'. If the application uses | another name for the field you may define it below as needed. | */ 'username' => 'email', 'email' => 'email', /* |-------------------------------------------------------------------------- | Lowercase Usernames |-------------------------------------------------------------------------- | | This value defines whether usernames should be lowercased before saving | them in the database, as some database system string fields are case | sensitive. You may disable this for your application if necessary. | */ 'lowercase_usernames' => true, /* |-------------------------------------------------------------------------- | Home Path |-------------------------------------------------------------------------- | | Here you may configure the path where users will get redirected during | authentication or password reset when the operations are successful | and the user is authenticated. You are free to change this value. | */ 'home' => '/', /* |-------------------------------------------------------------------------- | Fortify Routes Prefix / Subdomain |-------------------------------------------------------------------------- | | Here you may specify which prefix Fortify will assign to all the routes | that it registers with the application. If necessary, you may change | subdomain under which all of the Fortify routes will be available. | */ 'prefix' => '', 'domain' => null, /* |-------------------------------------------------------------------------- | Fortify Routes Middleware |-------------------------------------------------------------------------- | | Here you may specify which middleware Fortify will assign to the routes | that it registers with the application. If necessary, you may change | these middleware but typically this provided default is preferred. | */ 'middleware' => ['web'], /* |-------------------------------------------------------------------------- | Rate Limiting |-------------------------------------------------------------------------- | | By default, Fortify will throttle logins to five requests per minute for | every email and IP address combination. However, if you would like to | specify a custom rate limiter to call then you may specify it here. | */ 'limiters' => [ 'login' => 'login', 'two-factor' => 'two-factor', ], /* |-------------------------------------------------------------------------- | Register View Routes |-------------------------------------------------------------------------- | | Here you may specify if the routes returning views should be disabled as | you may not need them when building your own application. This may be | especially true if you're writing a custom single-page application. | */ 'views' => true, /* |-------------------------------------------------------------------------- | Features |-------------------------------------------------------------------------- | | Some of the Fortify features are optional. You may disable the features | by removing them from this array. You're free to only remove some of | these features or you can even remove all of these if you need to. | */ 'features' => [ Features::registration(), Features::resetPasswords(), Features::emailVerification(), Features::updateProfileInformation(), Features::updatePasswords(), Features::twoFactorAuthentication([ 'confirm' => true, 'confirmPassword' => true, // 'window' => 0, ]), ], ]; ================================================ FILE: config/health.php ================================================ [ InMemoryHealthResultStore::class, ], /* * You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'. * For Slack you need to install laravel/slack-notification-channel. */ 'notifications' => [ 'enabled' => false, ], /* * You can let Oh Dear monitor the results of all health checks. This way, you'll * get notified of any problems even if your application goes totally down. Via * Oh Dear, you can also have access to more advanced notification options. */ 'oh_dear_endpoint' => [ 'enabled' => filled(env('OH_DEAR_HEALTH_CHECK_SECRET')), 'always_send_fresh_results' => true, 'secret' => env('OH_DEAR_HEALTH_CHECK_SECRET', ''), 'url' => '/oh-dear-health-check-results', ], /* * When enabled, completed `HealthQueueJob`s will be displayed * in Horizon's silenced jobs screen. */ 'silence_health_queue_job' => true, /* * The response code to use for HealthCheckJsonResultsController when a health * check has failed */ 'json_results_failure_status' => 200, ]; ================================================ FILE: config/horizon-watcher.php ================================================ [ app_path(), config_path(), database_path(), resource_path('views'), base_path('.env'), base_path('composer.lock'), base_path('packages'), ], /* * This command will be executed to start Horizon. */ 'command' => 'php artisan horizon', ]; ================================================ FILE: config/horizon.php ================================================ env('HORIZON_DOMAIN'), /* |-------------------------------------------------------------------------- | Horizon Path |-------------------------------------------------------------------------- | | This is the URI path where Horizon will be accessible from. Feel free | to change this path to anything you like. Note that the URI will not | affect the paths of its internal API that aren't exposed to users. | */ 'path' => env('HORIZON_PATH', 'horizon'), /* |-------------------------------------------------------------------------- | Horizon Redis Connection |-------------------------------------------------------------------------- | | This is the name of the Redis connection where Horizon will store the | meta information required for it to function. It includes the list | of supervisors, failed jobs, job metrics, and other information. | */ 'use' => 'default', /* |-------------------------------------------------------------------------- | Horizon Redis Prefix |-------------------------------------------------------------------------- | | This prefix will be used when storing all Horizon data in Redis. You | may modify the prefix when you are running multiple installations | of Horizon on the same server so that they don't have problems. | */ 'prefix' => env( 'HORIZON_PREFIX', Str::slug((string) env('APP_NAME', 'laravel'), '_').'_horizon:' ), /* |-------------------------------------------------------------------------- | Horizon Route Middleware |-------------------------------------------------------------------------- | | These middleware will get attached onto each Horizon route, giving you | the chance to add your own middleware to this list or change any of | the existing middleware. Or, you can simply stick with this list. | */ 'middleware' => ['web'], /* |-------------------------------------------------------------------------- | Queue Wait Time Thresholds |-------------------------------------------------------------------------- | | This option allows you to configure when the LongWaitDetected event | will be fired. Every connection / queue combination may have its | own, unique threshold (in seconds) before this event is fired. | */ 'waits' => [ 'redis:default' => 60, 'redis:imports' => 120, ], /* |-------------------------------------------------------------------------- | Job Trimming Times |-------------------------------------------------------------------------- | | Here you can configure for how long (in minutes) you desire Horizon to | persist the recent and failed jobs. Typically, recent jobs are kept | for one hour while all failed jobs are stored for an entire week. | */ 'trim' => [ 'recent' => 60, 'pending' => 60, 'completed' => 60, 'recent_failed' => 10080, 'failed' => 10080, 'monitored' => 10080, ], /* |-------------------------------------------------------------------------- | Silenced Jobs |-------------------------------------------------------------------------- | | Silencing a job will instruct Horizon to not place the job in the list | of completed jobs within the Horizon dashboard. This setting may be | used to fully remove any noisy jobs from the completed jobs list. | */ 'silenced' => [ // App\Jobs\ExampleJob::class, ], /* |-------------------------------------------------------------------------- | Metrics |-------------------------------------------------------------------------- | | Here you can configure how many snapshots should be kept to display in | the metrics graph. This will get used in combination with Horizon's | `horizon:snapshot` schedule to define how long to retain metrics. | */ 'metrics' => [ 'trim_snapshots' => [ 'job' => 24, 'queue' => 24, ], ], /* |-------------------------------------------------------------------------- | Fast Termination |-------------------------------------------------------------------------- | | When this option is enabled, Horizon's "terminate" command will not | wait on all of the workers to terminate unless the --wait option | is provided. Fast termination can shorten deployment delay by | allowing a new instance of Horizon to start while the last | instance will continue to terminate each of its workers. | */ 'fast_termination' => false, /* |-------------------------------------------------------------------------- | Memory Limit (MB) |-------------------------------------------------------------------------- | | This value describes the maximum amount of memory the Horizon master | supervisor may consume before it is terminated and restarted. For | configuring these limits on your workers, see the next section. | */ 'memory_limit' => 64, /* |-------------------------------------------------------------------------- | Queue Worker Configuration |-------------------------------------------------------------------------- | | Here you may define the queue worker settings used by your application | in all environments. These supervisors and settings handle all your | queued jobs and will be provisioned by Horizon during deployment. | */ 'defaults' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 1, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 128, 'tries' => 1, 'timeout' => 60, 'nice' => 0, ], 'supervisor-2' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 1, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 128, 'tries' => 1, 'timeout' => 60, 'nice' => 0, ], 'supervisor-3' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 1, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 128, 'tries' => 1, 'timeout' => 60, 'nice' => 0, ], 'supervisor-imports' => [ 'connection' => 'redis', 'queue' => ['imports'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 20, 'minProcesses' => 5, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 256, 'tries' => 2, 'timeout' => 300, 'nice' => 0, ], ], 'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'maxProcesses' => 10, 'minProcesses' => 1, 'balanceMaxShift' => 5, 'balanceCooldown' => 1, 'memory' => 128, 'tries' => 1, 'nice' => 0, ], 'supervisor-2' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'maxProcesses' => 10, 'minProcesses' => 1, 'balanceMaxShift' => 5, 'balanceCooldown' => 1, 'memory' => 128, 'tries' => 1, 'nice' => 0, ], 'supervisor-3' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'maxProcesses' => 10, 'minProcesses' => 1, 'balanceMaxShift' => 5, 'balanceCooldown' => 1, 'memory' => 128, 'tries' => 1, 'nice' => 0, ], 'supervisor-imports' => [ 'connection' => 'redis', 'queue' => ['imports'], 'balance' => 'auto', 'maxProcesses' => 15, 'minProcesses' => 3, 'balanceMaxShift' => 5, 'balanceCooldown' => 2, 'memory' => 256, 'tries' => 2, 'timeout' => 300, 'nice' => 0, ], ], 'local' => [ 'supervisor-1' => [ 'maxProcesses' => 3, ], 'supervisor-2' => [ 'maxProcesses' => 3, ], 'supervisor-3' => [ 'maxProcesses' => 3, ], 'supervisor-imports' => [ 'maxProcesses' => 5, ], ], ], ]; ================================================ FILE: config/jetstream.php ================================================ 'livewire', /* |-------------------------------------------------------------------------- | Jetstream Route Middleware |-------------------------------------------------------------------------- | | Here you may specify which middleware Jetstream will assign to the routes | that it registers with the application. When necessary, you may modify | these middleware; however, this default value is usually sufficient. | */ 'middleware' => ['web'], 'auth_session' => AuthenticateSession::class, /* |-------------------------------------------------------------------------- | Jetstream Guard |-------------------------------------------------------------------------- | | Here you may specify the authentication guard Jetstream will use while | authenticating users. This value should correspond with one of your | guards that is already present in your "auth" configuration file. | */ 'guard' => 'sanctum', /* |-------------------------------------------------------------------------- | Features |-------------------------------------------------------------------------- | | Some of Jetstream's features are optional. You may disable the features | by removing them from this array. You're free to only remove some of | these features or you can even remove all of these if you need to. | */ 'features' => [ Features::termsAndPrivacyPolicy(), Features::profilePhotos(), Features::api(), Features::teams(['invitations' => true]), Features::accountDeletion(), ], /* |-------------------------------------------------------------------------- | Profile Photo Disk |-------------------------------------------------------------------------- | | This configuration value determines the default disk that will be used | when storing profile photos for your application's users. Typically | this will be the "public" disk but you may adjust this if needed. | */ 'profile_photo_disk' => 'public', /* |-------------------------------------------------------------------------- | Invitation Expiry |-------------------------------------------------------------------------- | | This value determines how many days a team invitation link remains valid. | After this period, the invitation is considered expired and the invitee | must request a new invitation from the team owner. | */ 'invitation_expiry_days' => 7, ]; ================================================ FILE: config/logging.php ================================================ env('LOG_CHANNEL', 'stack'), /* |-------------------------------------------------------------------------- | Deprecations Log Channel |-------------------------------------------------------------------------- | | This option controls the log channel that should be used to log warnings | regarding deprecated PHP and library features. This allows you to get | your application ready for upcoming major versions of dependencies. | */ 'deprecations' => [ 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 'trace' => env('LOG_DEPRECATIONS_TRACE', false), ], /* |-------------------------------------------------------------------------- | Log Channels |-------------------------------------------------------------------------- | | Here you may configure the log channels for your application. Laravel | utilizes the Monolog PHP logging library, which includes a variety | of powerful log handlers and formatters that you're free to use. | | Available drivers: "single", "daily", "slack", "syslog", | "errorlog", "monolog", "custom", "stack" | */ 'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => explode(',', (string) env('LOG_STACK', 'single')), 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'replace_placeholders' => true, ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => env('LOG_DAILY_DAYS', 14), 'replace_placeholders' => true, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'level' => env('LOG_LEVEL', 'critical'), 'replace_placeholders' => true, ], 'papertrail' => [ 'driver' => 'monolog', 'level' => env('LOG_LEVEL', 'debug'), 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), ], 'processors' => [PsrLogMessageProcessor::class], ], 'stderr' => [ 'driver' => 'monolog', 'level' => env('LOG_LEVEL', 'debug'), 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], 'processors' => [PsrLogMessageProcessor::class], ], 'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), 'replace_placeholders' => true, ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => env('LOG_LEVEL', 'debug'), 'replace_placeholders' => true, ], 'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], 'emergency' => [ 'path' => storage_path('logs/laravel.log'), ], ], ]; ================================================ FILE: config/login-link.php ================================================ ['local'], /* * Login links will only work in these hosts. In all * other hosts, an exception will be thrown. */ 'allowed_hosts' => array_filter([ 'localhost', '127.0.0.1', 'relaticle.test', 'app.relaticle.test', parse_url((string) config('app.url'), PHP_URL_HOST), config('app.app_panel_domain'), ]), /* * The package will automatically create a user model when trying * to log in a user that doesn't exist. */ 'automatically_create_missing_users' => true, /* * The user model that should be logged in. If this is set to `null` * we'll take a look at the model used for the `users` * provider in config/auth.php */ 'user_model' => null, /* * After a login link is clicked, we'll redirect the user to this route. * If it is set to `null`, we'll redirect the user to their last intended/requested url. * You can set it to `/`, for making redirect to the root page. */ 'redirect_route_name' => null, /* * The package will register a route that points to this controller. To have fine * grained control over what happens when a login link is clicked, you can * override this class. */ 'login_link_controller' => LoginLinkController::class, /* * This middleware will be applied on the route * that logs in a user via a link. */ 'middleware' => ['web'], ]; ================================================ FILE: config/mail.php ================================================ env('MAIL_MAILER', 'log'), /* |-------------------------------------------------------------------------- | Mailer Configurations |-------------------------------------------------------------------------- | | Here you may configure all of the mailers used by your application plus | their respective settings. Several examples have been configured for | you and you are free to add your own as your application requires. | | Laravel supports a variety of mail "transport" drivers that can be used | when delivering an email. You may specify which one you're using for | your mailers below. You may also add additional mailers if needed. | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", | "postmark", "resend", "log", "array", | "failover", "roundrobin" | */ 'mailers' => [ 'smtp' => [ 'transport' => 'smtp', 'url' => env('MAIL_URL'), 'host' => env('MAIL_HOST', '127.0.0.1'), 'port' => env('MAIL_PORT', 2525), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), ], 'ses' => [ 'transport' => 'ses', ], 'postmark' => [ 'transport' => 'postmark', // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), // 'client' => [ // 'timeout' => 5, // ], ], 'resend' => [ 'transport' => 'resend', ], 'sendmail' => [ 'transport' => 'sendmail', 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), ], 'log' => [ 'transport' => 'log', 'channel' => env('MAIL_LOG_CHANNEL'), ], 'array' => [ 'transport' => 'array', ], 'failover' => [ 'transport' => 'failover', 'mailers' => [ 'smtp', 'log', ], ], 'roundrobin' => [ 'transport' => 'roundrobin', 'mailers' => [ 'ses', 'postmark', ], ], 'mailcoach' => [ 'transport' => 'mailcoach', 'domain' => env('MAILCOACH_DOMAIN'), 'token' => env('MAILCOACH_API_TOKEN'), ], ], /* |-------------------------------------------------------------------------- | Global "From" Address |-------------------------------------------------------------------------- | | You may wish for all emails sent by your application to be sent from | the same address. Here you may specify a name and address that is | used globally for all emails that are sent by your application. | */ 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], ]; ================================================ FILE: config/mailcoach-sdk.php ================================================ env('MAILCOACH_API_TOKEN'), 'endpoint' => env('MAILCOACH_API_ENDPOINT'), 'enabled_subscribers_sync' => env('MAILCOACH_ENABLED_SUBSCRIBERS_SYNC', false), 'subscribers_list_id' => env('MAILCOACH_SUBSCRIBERS_LIST_ID'), ]; ================================================ FILE: config/markdown-response.php ================================================ env('MARKDOWN_RESPONSE_ENABLED', true), /* * The driver used to convert HTML to markdown. * Supported: "league", "cloudflare" */ 'driver' => env('MARKDOWN_RESPONSE_DRIVER', 'league'), 'detection' => [ /* * The class responsible for detecting whether a request wants * a markdown response. You can extend the default class to * customize the detection logic. */ 'detector' => DetectsMarkdownRequest::class, /* * When enabled, requests with an `Accept: text/markdown` header * will receive a markdown response. */ 'detect_via_accept_header' => true, /* * When enabled, URLs ending in `.md` (e.g. `/about.md`) will * receive a markdown response. The `.md` suffix is stripped * before routing, so `/about.md` resolves to `/about`. */ 'detect_via_md_suffix' => true, /* * Requests from user agents containing any of these strings * will automatically receive a markdown response. Matching * is case-insensitive. */ 'detect_via_user_agents' => [ 'GPTBot', 'ClaudeBot', 'Claude-Web', 'Anthropic', 'ChatGPT-User', 'PerplexityBot', 'Bytespider', 'Google-Extended', ], ], /* * Preprocessors are run on the HTML before it is converted to * markdown. Each class must implement the Preprocessor interface. */ 'preprocessors' => [ RemoveScriptsAndStylesPreprocessor::class, ], /* * Postprocessors are run on the markdown after conversion. * Each class must implement the Postprocessor interface. */ 'postprocessors' => [ RemoveHtmlTagsPostprocessor::class, CollapseBlankLinesPostprocessor::class, ], 'cache' => [ /* * When enabled, converted markdown responses will be cached * so subsequent requests skip the conversion entirely. */ 'enabled' => env('MARKDOWN_RESPONSE_CACHE_ENABLED', true), /* * The cache store to use. Set to null to use the default store. */ 'store' => env('MARKDOWN_RESPONSE_CACHE_STORE'), /* * How long converted markdown should be cached, in seconds. */ 'ttl' => (int) env('MARKDOWN_RESPONSE_CACHE_TTL', 3600), /* * The class responsible for generating cache keys from requests. * You can extend the default class to customize the key generation. */ 'key_generator' => GeneratesCacheKey::class, /* * These query parameters will be stripped when generating cache * keys, so the same page with different tracking parameters * shares a single cache entry. */ 'ignored_query_parameters' => [ 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gclid', 'fbclid', ], ], /* * These signals are sent as a `Content-Signal` response header to * inform AI agents what they are allowed to do with your content. * Set to an empty array to disable the header entirely. * * See: https://contentstandards.org */ 'content_signals' => [ 'ai-train' => 'disallow', 'ai-input' => 'allow', 'search' => 'allow', ], 'driver_options' => [ /* * The league driver uses league/html-to-markdown. * Options are passed directly to the HtmlConverter constructor. * See: https://github.com/thephpleague/html-to-markdown#options */ 'league' => [ 'options' => [ 'strip_tags' => true, 'hard_break' => true, ], ], /* * The Cloudflare driver uses the Workers AI API to convert * HTML to markdown. Requires an account ID and API token. */ 'cloudflare' => [ 'account_id' => env('CLOUDFLARE_ACCOUNT_ID'), 'api_token' => env('CLOUDFLARE_API_TOKEN'), ], ], ]; ================================================ FILE: config/markdown.php ================================================ [ /* * To highlight code, we'll use Shiki under the hood. Make sure it's installed. * * More info: https://spatie.be/docs/laravel-markdown/v1/installation-setup */ 'enabled' => true, /* * The name of or path to a Shiki theme * * More info: https://github.com/shikijs/shiki/blob/main/docs/themes.md */ 'theme' => 'github-dark', ], /* * When enabled, anchor links will be added to all titles */ 'add_anchors_to_headings' => true, /** * When enabled, anchors will be rendered as links. */ 'render_anchors_as_links' => false, /* * These options will be passed to the league/commonmark package which is * used under the hood to render markdown. * * More info: https://spatie.be/docs/laravel-markdown/v1/using-the-blade-component/passing-options-to-commonmark */ 'commonmark_options' => [ 'heading_permalink' => [ 'html_class' => 'heading-permalink', 'id_prefix' => '', 'fragment_prefix' => '', 'insert' => 'before', 'min_heading_level' => 1, 'max_heading_level' => 6, 'title' => 'Permalink', 'symbol' => '#', 'aria_hidden' => false, ], ], /* * Rendering markdown to HTML can be resource intensive. By default * we'll cache the results. * * You can specify the name of a cache store here. When set to `null` * the default cache store will be used. If you do not want to use * caching set this value to `false`. */ 'cache_store' => null, /* * When cache_store is enabled, this value will be used to determine * how long the cache will be valid. If you set this to `null` the * cache will never expire. * */ 'cache_duration' => null, /* * This class will convert markdown to HTML * * You can change this to a class of your own to greatly * customize the rendering process * * More info: https://spatie.be/docs/laravel-markdown/v1/advanced-usage/customizing-the-rendering-process */ 'renderer_class' => MarkdownRenderer::class, /* * These extensions should be added to the markdown environment. A valid * extension implements League\CommonMark\Extension\ExtensionInterface * * More info: https://commonmark.thephpleague.com/2.4/extensions/overview/ */ 'extensions' => [ HeadingPermalinkExtension::class, TableExtension::class, ], /* * These block renderers should be added to the markdown environment. A valid * renderer implements League\CommonMark\Renderer\NodeRendererInterface; * * More info: https://commonmark.thephpleague.com/2.4/customization/rendering/ */ 'block_renderers' => [ // ['class' => FencedCode::class, 'renderer' => MyCustomCodeRenderer::class, 'priority' => 0] ], /* * These inline renderers should be added to the markdown environment. A valid * renderer implements League\CommonMark\Renderer\NodeRendererInterface; * * More info: https://commonmark.thephpleague.com/2.4/customization/rendering/ */ 'inline_renderers' => [ // ['class' => FencedCode::class, 'renderer' => MyCustomCodeRenderer::class, 'priority' => 0] ], /* * These inline parsers should be added to the markdown environment. A valid * parser implements League\CommonMark\Renderer\InlineParserInterface; * * More info: https://commonmark.thephpleague.com/2.4/customization/inline-parsing/ */ 'inline_parsers' => [ // ['parser' => MyCustomInlineParser::class, 'priority' => 0] ], ]; ================================================ FILE: config/media-library.php ================================================ env('MEDIA_DISK', 'public'), /* * The maximum file size of an item in bytes. * Adding a larger file will result in an exception. */ 'max_file_size' => 1024 * 1024 * 10, // 10MB /* * This queue connection will be used to generate derived and responsive images. * Leave empty to use the default queue connection. */ 'queue_connection_name' => env('QUEUE_CONNECTION', 'sync'), /* * This queue will be used to generate derived and responsive images. * Leave empty to use the default queue. */ 'queue_name' => env('MEDIA_QUEUE', ''), /* * By default all conversions will be performed on a queue. */ 'queue_conversions_by_default' => env('QUEUE_CONVERSIONS_BY_DEFAULT', true), /* * Should database transactions be run after database commits? */ 'queue_conversions_after_database_commit' => env('QUEUE_CONVERSIONS_AFTER_DB_COMMIT', true), /* * The fully qualified class name of the media model. */ 'media_model' => Media::class, /* * The fully qualified class name of the media observer. */ 'media_observer' => MediaObserver::class, /* * When enabled, media collections will be serialised using the default * laravel model serialization behaviour. * * Keep this option disabled if using Media Library Pro components (https://medialibrary.pro) */ 'use_default_collection_serialization' => false, /* * The fully qualified class name of the model used for temporary uploads. * * This model is only used in Media Library Pro (https://medialibrary.pro) */ 'temporary_upload_model' => TemporaryUpload::class, /** @phpstan-ignore class.notFound */ /* * When enabled, Media Library Pro will only process temporary uploads that were uploaded * in the same session. You can opt to disable this for stateless usage of * the pro components. */ 'enable_temporary_uploads_session_affinity' => true, /* * When enabled, Media Library pro will generate thumbnails for uploaded file. */ 'generate_thumbnails_for_temporary_uploads' => true, /* * This is the class that is responsible for naming generated files. */ 'file_namer' => DefaultFileNamer::class, /* * The class that contains the strategy for determining a media file's path. */ 'path_generator' => DefaultPathGenerator::class, /* * The class that contains the strategy for determining how to remove files. */ 'file_remover_class' => DefaultFileRemover::class, /* * Here you can specify which path generator should be used for the given class. */ 'custom_path_generators' => [ // Model::class => PathGenerator::class // or // 'model_morph_alias' => PathGenerator::class ], /* * When urls to files get generated, this class will be called. Use the default * if your files are stored locally above the site root or on s3. */ 'url_generator' => DefaultUrlGenerator::class, /* * Moves media on updating to keep path consistent. Enable it only with a custom * PathGenerator that uses, for example, the media UUID. */ 'moves_media_on_update' => false, /* * Whether to activate versioning when urls to files get generated. * When activated, this attaches a ?v=xx query string to the URL. */ 'version_urls' => false, /* * The media library will try to optimize all converted images by removing * metadata and applying a little bit of compression. These are * the optimizers that will be used by default. */ 'image_optimizers' => [ Jpegoptim::class => [ '-m85', // set maximum quality to 85% '--force', // ensure that progressive generation is always done also if a little bigger '--strip-all', // this strips out all text information such as comments and EXIF data '--all-progressive', // this will make sure the resulting image is a progressive one ], Pngquant::class => [ '--force', // required parameter for this package ], Optipng::class => [ '-i0', // this will result in a non-interlaced, progressive scanned image '-o2', // this set the optimization level to two (multiple IDAT compression trials) '-quiet', // required parameter for this package ], Svgo::class => [ '--disable=cleanupIDs', // disabling because it is known to cause troubles ], Gifsicle::class => [ '-b', // required parameter for this package '-O3', // this produces the slowest but best results ], Cwebp::class => [ '-m 6', // for the slowest compression method in order to get the best compression. '-pass 10', // for maximizing the amount of analysis pass. '-mt', // multithreading for some speed improvements. '-q 90', // quality factor that brings the least noticeable changes. ], Avifenc::class => [ '-a cq-level=23', // constant quality level, lower values mean better quality and greater file size (0-63). '-j all', // number of jobs (worker threads, "all" uses all available cores). '--min 0', // min quantizer for color (0-63). '--max 63', // max quantizer for color (0-63). '--minalpha 0', // min quantizer for alpha (0-63). '--maxalpha 63', // max quantizer for alpha (0-63). '-a end-usage=q', // rate control mode set to Constant Quality mode. '-a tune=ssim', // SSIM as tune the encoder for distortion metric. ], ], /* * These generators will be used to create an image of media files. */ 'image_generators' => [ Image::class, Webp::class, Avif::class, Pdf::class, Svg::class, Video::class, ], /* * The path where to store temporary files while performing image conversions. * If set to null, storage_path('media-library/temp') will be used. */ 'temporary_directory_path' => null, /* * The engine that should perform the image conversions. * Should be either `gd` or `imagick`. */ 'image_driver' => env('IMAGE_DRIVER', 'gd'), /* * FFMPEG & FFProbe binaries paths, only used if you try to generate video * thumbnails and have installed the php-ffmpeg/php-ffmpeg composer * dependency. */ 'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'), 'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'), /* * Here you can override the class names of the jobs used by this package. Make sure * your custom jobs extend the ones provided by the package. */ 'jobs' => [ 'perform_conversions' => PerformConversionsJob::class, 'generate_responsive_images' => GenerateResponsiveImagesJob::class, ], /* * When using the addMediaFromUrl method you may want to replace the default downloader. * This is particularly useful when the url of the image is behind a firewall and * need to add additional flags, possibly using curl. */ 'media_downloader' => DefaultDownloader::class, /* * When using the addMediaFromUrl method the SSL is verified by default. * This is option disables SSL verification when downloading remote media. * Please note that this is a security risk and should only be false in a local environment. */ 'media_downloader_ssl' => env('MEDIA_DOWNLOADER_SSL', true), 'remote' => [ /* * Any extra headers that should be included when uploading media to * a remote disk. Even though supported headers may vary between * different drivers, a sensible default has been provided. * * Supported by S3: CacheControl, Expires, StorageClass, * ServerSideEncryption, Metadata, ACL, ContentEncoding */ 'extra_headers' => [ 'CacheControl' => 'max-age=604800', ], ], 'responsive_images' => [ /* * This class is responsible for calculating the target widths of the responsive * images. By default we optimize for filesize and create variations that each are 30% * smaller than the previous one. More info in the documentation. * * https://docs.spatie.be/laravel-medialibrary/v9/advanced-usage/generating-responsive-images */ 'width_calculator' => FileSizeOptimizedWidthCalculator::class, /* * By default rendering media to a responsive image will add some javascript and a tiny placeholder. * This ensures that the browser can already determine the correct layout. * When disabled, no tiny placeholder is generated. */ 'use_tiny_placeholders' => true, /* * This class will generate the tiny placeholder used for progressive image loading. By default * the media library will use a tiny blurred jpg image. */ 'tiny_placeholder_generator' => Blurred::class, ], /* * When enabling this option, a route will be registered that will enable * the Media Library Pro Vue and React components to move uploaded files * in a S3 bucket to their right place. */ 'enable_vapor_uploads' => env('ENABLE_MEDIA_LIBRARY_VAPOR_UPLOADS', false), /* * When converting Media instances to response the media library will add * a `loading` attribute to the `img` tag. Here you can set the default * value of that attribute. * * Possible values: 'lazy', 'eager', 'auto' or null if you don't want to set any loading instruction. * * More info: https://css-tricks.com/native-lazy-loading/ */ 'default_loading_attribute_value' => null, /* * You can specify a prefix for that is used for storing all media. * If you set this to `/my-subdir`, all your media will be stored in a `/my-subdir` directory. */ 'prefix' => env('MEDIA_PREFIX', ''), /* * When forcing lazy loading, media will be loaded even if you don't eager load media and you have * disabled lazy loading globally in the service provider. */ 'force_lazy_loading' => env('FORCE_MEDIA_LIBRARY_LAZY_LOADING', true), ]; ================================================ FILE: config/prism.php ================================================ [ // The middleware that will be applied to the Prism Server routes. 'middleware' => [], 'enabled' => env('PRISM_SERVER_ENABLED', false), ], 'providers' => [ 'openai' => [ 'url' => env('OPENAI_URL', 'https://api.openai.com/v1'), 'api_key' => env('OPENAI_API_KEY', ''), 'organization' => env('OPENAI_ORGANIZATION'), 'project' => env('OPENAI_PROJECT'), ], 'anthropic' => [ 'api_key' => env('ANTHROPIC_API_KEY', ''), 'version' => env('ANTHROPIC_API_VERSION', '2023-06-01'), 'url' => env('ANTHROPIC_URL', 'https://api.anthropic.com/v1'), 'default_thinking_budget' => env('ANTHROPIC_DEFAULT_THINKING_BUDGET', 1024), // Include beta strings as a comma separated list. 'anthropic_beta' => env('ANTHROPIC_BETA'), ], 'ollama' => [ 'url' => env('OLLAMA_URL', 'http://localhost:11434'), ], 'mistral' => [ 'api_key' => env('MISTRAL_API_KEY', ''), 'url' => env('MISTRAL_URL', 'https://api.mistral.ai/v1'), ], 'groq' => [ 'api_key' => env('GROQ_API_KEY', ''), 'url' => env('GROQ_URL', 'https://api.groq.com/openai/v1'), ], 'xai' => [ 'api_key' => env('XAI_API_KEY', ''), 'url' => env('XAI_URL', 'https://api.x.ai/v1'), ], 'gemini' => [ 'api_key' => env('GEMINI_API_KEY', ''), 'url' => env('GEMINI_URL', 'https://generativelanguage.googleapis.com/v1beta/models'), ], 'deepseek' => [ 'api_key' => env('DEEPSEEK_API_KEY', ''), 'url' => env('DEEPSEEK_URL', 'https://api.deepseek.com/v1'), ], 'elevenlabs' => [ 'api_key' => env('ELEVENLABS_API_KEY', ''), 'url' => env('ELEVENLABS_URL', 'https://api.elevenlabs.io/v1/'), ], 'voyageai' => [ 'api_key' => env('VOYAGEAI_API_KEY', ''), 'url' => env('VOYAGEAI_URL', 'https://api.voyageai.com/v1'), ], 'openrouter' => [ 'api_key' => env('OPENROUTER_API_KEY', ''), 'url' => env('OPENROUTER_URL', 'https://openrouter.ai/api/v1'), 'site' => [ 'http_referer' => env('OPENROUTER_SITE_HTTP_REFERER'), 'x_title' => env('OPENROUTER_SITE_X_TITLE'), ], ], ], ]; ================================================ FILE: config/queue.php ================================================ env('QUEUE_CONNECTION', 'database'), /* |-------------------------------------------------------------------------- | Queue Connections |-------------------------------------------------------------------------- | | Here you may configure the connection options for every queue backend | used by your application. An example configuration is provided for | each backend supported by Laravel. You're also free to add more. | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" | */ 'connections' => [ 'sync' => [ 'driver' => 'sync', ], 'database' => [ 'driver' => 'database', 'connection' => env('DB_QUEUE_CONNECTION'), 'table' => env('DB_QUEUE_TABLE', 'jobs'), 'queue' => env('DB_QUEUE', 'default'), 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 'after_commit' => false, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), 'queue' => env('BEANSTALKD_QUEUE', 'default'), 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 'block_for' => 0, 'after_commit' => false, ], 'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('SQS_QUEUE', 'default'), 'suffix' => env('SQS_SUFFIX'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'after_commit' => false, ], 'redis' => [ 'driver' => 'redis', 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 'block_for' => null, 'after_commit' => false, ], ], /* |-------------------------------------------------------------------------- | Job Batching |-------------------------------------------------------------------------- | | The following options configure the database and table that store job | batching information. These options can be updated to any database | connection and table which has been defined by your application. | */ 'batching' => [ 'database' => env('DB_CONNECTION', 'sqlite'), 'table' => 'job_batches', ], /* |-------------------------------------------------------------------------- | Failed Queue Jobs |-------------------------------------------------------------------------- | | These options configure the behavior of failed queue job logging so you | can control how and where failed jobs are stored. Laravel ships with | support for storing failed jobs in a simple file or in a database. | | Supported drivers: "database-uuids", "dynamodb", "file", "null" | */ 'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 'database' => env('DB_CONNECTION', 'sqlite'), 'table' => 'failed_jobs', ], ]; ================================================ FILE: config/relaticle.php ================================================ [ 'email' => env('CONTACT_EMAIL', 'hello@relaticle.com'), ], ]; ================================================ FILE: config/sanctum.php ================================================ explode(',', (string) env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', Sanctum::currentApplicationUrlWithPort() ))), /* |-------------------------------------------------------------------------- | Sanctum Guards |-------------------------------------------------------------------------- | | This array contains the authentication guards that will be checked when | Sanctum is trying to authenticate a request. If none of these guards | are able to authenticate the request, Sanctum will use the bearer | token that's present on an incoming request for authentication. | */ 'guard' => ['web'], /* |-------------------------------------------------------------------------- | Expiration Minutes |-------------------------------------------------------------------------- | | This value controls the number of minutes until an issued token will be | considered expired. This will override any values set in the token's | "expires_at" attribute, but first-party sessions are not affected. | */ 'expiration' => null, /* |-------------------------------------------------------------------------- | Token Prefix |-------------------------------------------------------------------------- | | Sanctum can prefix new tokens in order to take advantage of numerous | security scanning initiatives maintained by open source platforms | that notify developers if they commit tokens into repositories. | | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning | */ 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), /* |-------------------------------------------------------------------------- | Sanctum Middleware |-------------------------------------------------------------------------- | | When authenticating your first-party SPA with Sanctum you may need to | customize some of the middleware Sanctum uses while processing the | request. You may change the middleware listed below as required. | */ 'middleware' => [ 'authenticate_session' => AuthenticateSession::class, 'encrypt_cookies' => EncryptCookies::class, 'validate_csrf_token' => ValidateCsrfToken::class, ], ]; ================================================ FILE: config/scribe.php ================================================ for the generated documentation. 'title' => 'Relaticle API', // A short description of your API. Will be included in the docs webpage, Postman collection and OpenAPI spec. 'description' => 'REST API for managing CRM entities including companies, people, opportunities, tasks, and notes.', // Text to place in the "Introduction" section, right after the `description`. Markdown and HTML are supported. 'intro_text' => <<<'INTRO' Welcome to the Relaticle API documentation. This API follows the [JSON:API](https://jsonapi.org/) specification. All endpoints require authentication via Bearer token. Generate an access token from **Settings > Access Tokens** in the Relaticle app. INTRO , // The base URL displayed in the docs. // If you're using `laravel` type, you can set this to a dynamic string, like '{{ config("app.tenant_url") }}' to get a dynamic base URL. 'base_url' => config('app.api_domain') ? 'https://'.config('app.api_domain') : config('app.url'), // Routes to include in the docs 'routes' => [ [ 'match' => [ // Match only routes whose paths match this pattern (use * as a wildcard to match any characters). Example: 'users/*'. 'prefixes' => config('app.api_domain') ? ['v1/*'] : ['api/v1/*'], // Match only routes whose domains match this pattern (use * as a wildcard to match any characters). Example: 'api.*'. 'domains' => ['*'], ], // Include these routes even if they did not match the rules above. 'include' => [ // 'users.index', 'POST /new', '/auth/*' ], // Exclude these routes even if they matched the rules above. 'exclude' => [ // 'GET /health', 'admin.*' ], ], ], // The type of documentation output to generate. // - "static" will generate a static HTMl page in the /public/docs folder, // - "laravel" will generate the documentation as a Blade view, so you can add routing and authentication. // - "external_static" and "external_laravel" do the same as above, but pass the OpenAPI spec as a URL to an external UI template 'type' => 'external_laravel', // See https://scribe.knuckles.wtf/laravel/reference/config#theme for supported options 'theme' => 'scalar', 'static' => [ // HTML documentation, assets and Postman collection will be generated to this folder. // Source Markdown will still be in resources/docs. 'output_path' => 'public/docs', ], 'laravel' => [ // Whether to automatically create a docs route for you to view your generated docs. You can still set up routing manually. 'add_routes' => true, // URL path to use for the docs endpoint (if `add_routes` is true). // By default, `/docs` opens the HTML page, `/docs.postman` opens the Postman collection, and `/docs.openapi` the OpenAPI spec. 'docs_url' => '/docs/api', // Directory within `public` in which to store CSS and JS assets. // By default, assets are stored in `public/vendor/scribe`. // If set, assets will be stored in `public/{{assets_directory}}` 'assets_directory' => null, // Middleware to attach to the docs endpoint (if `add_routes` is true). 'middleware' => [], ], 'external' => [ 'html_attributes' => [], ], 'try_it_out' => [ // Add a Try It Out button to your endpoints so consumers can test endpoints right from their browser. // Don't forget to enable CORS headers for your endpoints. 'enabled' => true, // The base URL to use in the API tester. Leave as null to be the same as the displayed URL (`scribe.base_url`). 'base_url' => null, // [Laravel Sanctum] Fetch a CSRF token before each request, and add it as an X-XSRF-TOKEN header. 'use_csrf' => false, // The URL to fetch the CSRF token from (if `use_csrf` is true). 'csrf_url' => '/sanctum/csrf-cookie', ], // How is your API authenticated? This information will be used in the displayed docs, generated examples and response calls. 'auth' => [ // Set this to true if ANY endpoints in your API use authentication. 'enabled' => true, // Set this to true if your API should be authenticated by default. If so, you must also set `enabled` (above) to true. // You can then use @unauthenticated or @authenticated on individual endpoints to change their status from the default. 'default' => true, // Where is the auth value meant to be sent in a request? 'in' => AuthIn::BEARER->value, // The name of the auth parameter (e.g. token, key, apiKey) or header (e.g. Authorization, Api-Key). 'name' => 'Authorization', // The value of the parameter to be used by Scribe to authenticate response calls. // This will NOT be included in the generated documentation. If empty, Scribe will use a random value. 'use_value' => env('SCRIBE_AUTH_KEY'), // Placeholder your users will see for the auth parameter in the example requests. // Set this to null if you want Scribe to use a random value as placeholder instead. 'placeholder' => '{YOUR_API_TOKEN}', // Any extra authentication-related info for your users. Markdown and HTML are supported. 'extra_info' => 'Generate an access token from **Settings > Access Tokens** in the Relaticle app.', ], // Example requests for each endpoint will be shown in each of these languages. // Supported options are: bash, javascript, php, python // To add a language of your own, see https://scribe.knuckles.wtf/laravel/advanced/example-requests // Note: does not work for `external` docs types 'example_languages' => ['bash', 'javascript'], // Generate a Postman collection (v2.1.0) in addition to HTML docs. // For 'static' docs, the collection will be generated to public/docs/collection.json. // For 'laravel' docs, it will be generated to storage/app/scribe/collection.json. // Setting `laravel.add_routes` to true (above) will also add a route for the collection. 'postman' => [ 'enabled' => true, 'overrides' => [ // 'info.version' => '2.0.0', ], ], // Generate an OpenAPI spec in addition to docs webpage. // For 'static' docs, the collection will be generated to public/docs/openapi.yaml. // For 'laravel' docs, it will be generated to storage/app/scribe/openapi.yaml. // Setting `laravel.add_routes` to true (above) will also add a route for the spec. 'openapi' => [ 'enabled' => true, // The OpenAPI spec version to generate. Supported versions: '3.0.3', '3.1.0'. // OpenAPI 3.1 is more compatible with JSON Schema and is becoming the dominant version. // See https://spec.openapis.org/oas/v3.1.0 for details on 3.1 changes. 'version' => '3.1.0', 'overrides' => [ 'info.version' => '1.0.0', ], // Additional generators to use when generating the OpenAPI spec. // Should extend `Knuckles\Scribe\Writing\OpenApiSpecGenerators\OpenApiGenerator`. 'generators' => [], ], 'groups' => [ // Endpoints which don't have a @group will be placed in this default group. 'default' => 'Endpoints', // By default, Scribe will sort groups alphabetically, and endpoints in the order their routes are defined. // You can override this by listing the groups, subgroups and endpoints here in the order you want them. // See https://scribe.knuckles.wtf/blog/laravel-v4#easier-sorting and https://scribe.knuckles.wtf/laravel/reference/config#order for details // Note: does not work for `external` docs types 'order' => [ 'Companies', 'People', 'Opportunities', 'Tasks', 'Notes', 'Custom Fields', ], ], // Custom logo path. This will be used as the value of the src attribute for the tag, // so make sure it points to an accessible URL or path. Set to false to not use a logo. // For example, if your logo is in public/img: // - 'logo' => '../img/logo.png' // for `static` type (output folder is public/docs) // - 'logo' => 'img/logo.png' // for `laravel` type 'logo' => false, // Customize the "Last updated" value displayed in the docs by specifying tokens and formats. // Examples: // - {date:F j Y} => March 28, 2022 // - {git:short} => Short hash of the last Git commit // Available tokens are `{date:}` and `{git:}`. // The format you pass to `date` will be passed to PHP's `date()` function. // The format you pass to `git` can be either "short" or "long". // Note: does not work for `external` docs types 'last_updated' => 'Last updated: {date:F j, Y}', 'examples' => [ // Set this to any number to generate the same example values for parameters on each run, 'faker_seed' => 12345, // With API resources and transformers, Scribe tries to generate example models to use in your API responses. // By default, Scribe will try the model's factory, and if that fails, try fetching the first from the database. // You can reorder or remove strategies here. 'models_source' => ['factoryMake'], ], // The strategies Scribe will use to extract information about your routes at each stage. // Use configureStrategy() to specify settings for a strategy in the list. // Use removeStrategies() to remove an included strategy. 'strategies' => [ 'metadata' => [...Defaults::METADATA_STRATEGIES], 'headers' => [ ...Defaults::HEADERS_STRATEGIES, Strategies\StaticData::withSettings( data: [ 'Content-Type' => 'application/json', 'Accept' => 'application/json', ], ), ], 'urlParameters' => [...Defaults::URL_PARAMETERS_STRATEGIES], 'queryParameters' => [ ...Defaults::QUERY_PARAMETERS_STRATEGIES, GetFromSpatieQueryBuilder::class, ], 'bodyParameters' => [...Defaults::BODY_PARAMETERS_STRATEGIES], 'responses' => removeStrategies( Defaults::RESPONSES_STRATEGIES, [Strategies\Responses\ResponseCalls::class], ), 'responseFields' => [...Defaults::RESPONSE_FIELDS_STRATEGIES], ], // For response calls, API resource responses and transformer responses, // Scribe will try to start database transactions, so no changes are persisted to your database. // Tell Scribe which connections should be transacted here. If you only use one db connection, you can leave this as is. 'database_connections_to_transact' => [], 'fractal' => [ // If you are using a custom serializer with league/fractal, you can specify it here. 'serializer' => null, ], ]; ================================================ FILE: config/sentry.php ================================================ env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')), // @see https://spotlightjs.com/ // 'spotlight' => env('SENTRY_SPOTLIGHT', false), // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#logger // 'logger' => Sentry\Logger\DebugFileLogger::class, // By default this will log to `storage_path('logs/sentry.log')` // The release version of your application // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) 'release' => env('SENTRY_RELEASE'), // When left empty or `null` the Laravel environment will be used (usually discovered from `APP_ENV` in your `.env`) 'environment' => env('SENTRY_ENVIRONMENT'), // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#sample-rate 'sample_rate' => env('SENTRY_SAMPLE_RATE') === null ? 1.0 : (float) env('SENTRY_SAMPLE_RATE'), // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces-sample-rate 'traces_sample_rate' => env('SENTRY_TRACES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_TRACES_SAMPLE_RATE'), // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#profiles-sample-rate 'profiles_sample_rate' => env('SENTRY_PROFILES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_PROFILES_SAMPLE_RATE'), // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send-default-pii 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false), // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore-exceptions // 'ignore_exceptions' => [], // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore-transactions 'ignore_transactions' => [ // Ignore Laravel's default health URL '/up', ], // Breadcrumb specific configuration 'breadcrumbs' => [ // Capture Laravel logs as breadcrumbs 'logs' => env('SENTRY_BREADCRUMBS_LOGS_ENABLED', true), // Capture Laravel cache events (hits, writes etc.) as breadcrumbs 'cache' => env('SENTRY_BREADCRUMBS_CACHE_ENABLED', true), // Capture Livewire components like routes as breadcrumbs 'livewire' => env('SENTRY_BREADCRUMBS_LIVEWIRE_ENABLED', true), // Capture SQL queries as breadcrumbs 'sql_queries' => env('SENTRY_BREADCRUMBS_SQL_QUERIES_ENABLED', true), // Capture SQL query bindings (parameters) in SQL query breadcrumbs 'sql_bindings' => env('SENTRY_BREADCRUMBS_SQL_BINDINGS_ENABLED', false), // Capture queue job information as breadcrumbs 'queue_info' => env('SENTRY_BREADCRUMBS_QUEUE_INFO_ENABLED', true), // Capture command information as breadcrumbs 'command_info' => env('SENTRY_BREADCRUMBS_COMMAND_JOBS_ENABLED', true), // Capture HTTP client request information as breadcrumbs 'http_client_requests' => env('SENTRY_BREADCRUMBS_HTTP_CLIENT_REQUESTS_ENABLED', true), // Capture send notifications as breadcrumbs 'notifications' => env('SENTRY_BREADCRUMBS_NOTIFICATIONS_ENABLED', true), ], // Performance monitoring specific configuration 'tracing' => [ // Trace queue jobs as their own transactions (this enables tracing for queue jobs) 'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', true), // Capture queue jobs as spans when executed on the sync driver 'queue_jobs' => env('SENTRY_TRACE_QUEUE_JOBS_ENABLED', true), // Capture SQL queries as spans 'sql_queries' => env('SENTRY_TRACE_SQL_QUERIES_ENABLED', true), // Capture SQL query bindings (parameters) in SQL query spans 'sql_bindings' => env('SENTRY_TRACE_SQL_BINDINGS_ENABLED', false), // Capture where the SQL query originated from on the SQL query spans 'sql_origin' => env('SENTRY_TRACE_SQL_ORIGIN_ENABLED', true), // Define a threshold in milliseconds for SQL queries to resolve their origin 'sql_origin_threshold_ms' => env('SENTRY_TRACE_SQL_ORIGIN_THRESHOLD_MS', 100), // Capture views rendered as spans 'views' => env('SENTRY_TRACE_VIEWS_ENABLED', true), // Capture Livewire components as spans 'livewire' => env('SENTRY_TRACE_LIVEWIRE_ENABLED', true), // Capture HTTP client requests as spans 'http_client_requests' => env('SENTRY_TRACE_HTTP_CLIENT_REQUESTS_ENABLED', true), // Capture Laravel cache events (hits, writes etc.) as spans 'cache' => env('SENTRY_TRACE_CACHE_ENABLED', true), // Capture Redis operations as spans (this enables Redis events in Laravel) 'redis_commands' => env('SENTRY_TRACE_REDIS_COMMANDS', false), // Capture where the Redis command originated from on the Redis command spans 'redis_origin' => env('SENTRY_TRACE_REDIS_ORIGIN_ENABLED', true), // Capture send notifications as spans 'notifications' => env('SENTRY_TRACE_NOTIFICATIONS_ENABLED', true), // Enable tracing for requests without a matching route (404's) 'missing_routes' => env('SENTRY_TRACE_MISSING_ROUTES_ENABLED', false), // Configures if the performance trace should continue after the response has been sent to the user until the application terminates // This is required to capture any spans that are created after the response has been sent like queue jobs dispatched using `dispatch(...)->afterResponse()` for example 'continue_after_response' => env('SENTRY_TRACE_CONTINUE_AFTER_RESPONSE', true), // Enable the tracing integrations supplied by Sentry (recommended) 'default_integrations' => env('SENTRY_TRACE_DEFAULT_INTEGRATIONS_ENABLED', true), ], ]; ================================================ FILE: config/services.php ================================================ [ 'token' => env('POSTMARK_TOKEN'), ], 'ses' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], 'resend' => [ 'key' => env('RESEND_KEY'), ], 'slack' => [ 'notifications' => [ 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), ], ], 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], 'github' => [ 'client_id' => env('GITHUB_CLIENT_ID'), 'client_secret' => env('GITHUB_CLIENT_SECRET'), 'redirect' => '/auth/callback/github', ], 'fathom' => [ 'site_id' => env('FATHOM_ANALYTICS_SITE_ID'), ], 'discord' => [ 'invite_url' => env('DISCORD_INVITE_URL'), ], 'turnstile' => [ 'key' => env('TURNSTILE_SITE_KEY'), 'secret' => env('TURNSTILE_SECRET_KEY'), ], 'anthropic' => [ 'summary_model' => env('ANTHROPIC_SUMMARY_MODEL', 'claude-haiku-4-5'), ], ]; ================================================ FILE: config/session.php ================================================ env('SESSION_DRIVER', 'database'), /* |-------------------------------------------------------------------------- | Session Lifetime |-------------------------------------------------------------------------- | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them | to expire immediately when the browser is closed then you may | indicate that via the expire_on_close configuration option. | */ 'lifetime' => env('SESSION_LIFETIME', 120), 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), /* |-------------------------------------------------------------------------- | Session Encryption |-------------------------------------------------------------------------- | | This option allows you to easily specify that all of your session data | should be encrypted before it's stored. All encryption is performed | automatically by Laravel and you may use the session like normal. | */ 'encrypt' => env('SESSION_ENCRYPT', false), /* |-------------------------------------------------------------------------- | Session File Location |-------------------------------------------------------------------------- | | When utilizing the "file" session driver, the session files are placed | on disk. The default storage location is defined here; however, you | are free to provide another location where they should be stored. | */ 'files' => storage_path('framework/sessions'), /* |-------------------------------------------------------------------------- | Session Database Connection |-------------------------------------------------------------------------- | | When using the "database" or "redis" session drivers, you may specify a | connection that should be used to manage these sessions. This should | correspond to a connection in your database configuration options. | */ 'connection' => env('SESSION_CONNECTION'), /* |-------------------------------------------------------------------------- | Session Database Table |-------------------------------------------------------------------------- | | When using the "database" session driver, you may specify the table to | be used to store sessions. Of course, a sensible default is defined | for you; however, you're welcome to change this to another table. | */ 'table' => env('SESSION_TABLE', 'sessions'), /* |-------------------------------------------------------------------------- | Session Cache Store |-------------------------------------------------------------------------- | | When using one of the framework's cache driven session backends, you may | define the cache store which should be used to store the session data | between requests. This must match one of your defined cache stores. | | Affects: "apc", "dynamodb", "memcached", "redis" | */ 'store' => env('SESSION_STORE'), /* |-------------------------------------------------------------------------- | Session Sweeping Lottery |-------------------------------------------------------------------------- | | Some session drivers must manually sweep their storage location to get | rid of old sessions from storage. Here are the chances that it will | happen on a given request. By default, the odds are 2 out of 100. | */ 'lottery' => [2, 100], /* |-------------------------------------------------------------------------- | Session Cookie Name |-------------------------------------------------------------------------- | | Here you may change the name of the session cookie that is created by | the framework. Typically, you should not need to change this value | since doing so does not grant a meaningful security improvement. | */ 'cookie' => env( 'SESSION_COOKIE', Str::slug((string) env('APP_NAME', 'laravel'), '_').'_session' ), /* |-------------------------------------------------------------------------- | Session Cookie Path |-------------------------------------------------------------------------- | | The session cookie path determines the path for which the cookie will | be regarded as available. Typically, this will be the root path of | your application, but you're free to change this when necessary. | */ 'path' => env('SESSION_PATH', '/'), /* |-------------------------------------------------------------------------- | Session Cookie Domain |-------------------------------------------------------------------------- | | This value determines the domain and subdomains the session cookie is | available to. By default, the cookie will be available to the root | domain and all subdomains. Typically, this shouldn't be changed. | */ 'domain' => env('SESSION_DOMAIN'), /* |-------------------------------------------------------------------------- | HTTPS Only Cookies |-------------------------------------------------------------------------- | | By setting this option to true, session cookies will only be sent back | to the server if the browser has a HTTPS connection. This will keep | the cookie from being sent to you when it can't be done securely. | */ 'secure' => env('SESSION_SECURE_COOKIE'), /* |-------------------------------------------------------------------------- | HTTP Access Only |-------------------------------------------------------------------------- | | Setting this value to true will prevent JavaScript from accessing the | value of the cookie and the cookie will only be accessible through | the HTTP protocol. It's unlikely you should disable this option. | */ 'http_only' => env('SESSION_HTTP_ONLY', true), /* |-------------------------------------------------------------------------- | Same-Site Cookies |-------------------------------------------------------------------------- | | This option determines how your cookies behave when cross-site requests | take place, and can be used to mitigate CSRF attacks. By default, we | will set this value to "lax" to permit secure cross-site requests. | | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value | | Supported: "lax", "strict", "none", null | */ 'same_site' => env('SESSION_SAME_SITE', 'lax'), /* |-------------------------------------------------------------------------- | Partitioned Cookies |-------------------------------------------------------------------------- | | Setting this value to true will tie the cookie to the top-level site for | a cross-site context. Partitioned cookies are accepted by the browser | when flagged "secure" and the Same-Site attribute is set to "none". | */ 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), ]; ================================================ FILE: config/sitemap.php ================================================ [ /* * Whether or not cookies are used in a request. */ RequestOptions::COOKIES => true, /* * The number of seconds to wait while trying to connect to a server. * Use 0 to wait indefinitely. */ RequestOptions::CONNECT_TIMEOUT => 10, /* * The timeout of the request in seconds. Use 0 to wait indefinitely. */ RequestOptions::TIMEOUT => 10, /* * Describes the redirect behavior of a request. */ RequestOptions::ALLOW_REDIRECTS => false, ], /* * The sitemap generator can execute JavaScript on each page so it will * discover links that are generated by your JS scripts. This feature * is powered by headless Chrome. */ 'execute_javascript' => false, /* * The package will make an educated guess as to where Google Chrome is installed. * You can also manually pass its location here. */ 'chrome_binary_path' => null, /* * The sitemap generator uses a CrawlProfile implementation to determine * which urls should be crawled for the sitemap. */ 'crawl_profile' => Profile::class, ]; ================================================ FILE: database/.gitignore ================================================ *.sqlite* ================================================ FILE: database/factories/CompanyFactory.php ================================================ */ final class CompanyFactory extends Factory { protected $model = Company::class; /** * Define the model's default state. * * @return array */ public function definition(): array { return [ 'name' => $this->faker->company(), 'account_owner_id' => User::factory(), 'team_id' => Team::factory(), ]; } public function configure(): Factory { $factory = $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); if (config('scribe.generating')) { return $factory->state([ 'account_owner_id' => (string) Str::ulid(), 'team_id' => (string) Str::ulid(), ]); } return $factory; } } ================================================ FILE: database/factories/CustomFieldFactory.php ================================================ */ final class CustomFieldFactory extends Factory { protected $model = CustomField::class; public function definition(): array { return [ 'code' => $this->faker->unique()->word(), 'name' => $this->faker->name(), 'type' => $this->faker->randomElement(['text', 'number', 'link', 'textarea', 'date', 'select']), 'entity_type' => $this->faker->randomElement(['company', 'people', 'opportunity', 'task', 'note']), 'sort_order' => 1, 'validation_rules' => [], 'active' => true, 'system_defined' => false, 'settings' => new CustomFieldSettingsData(encrypted: false), 'created_at' => now(), 'updated_at' => now(), ]; } public function configure(): static { if (config('scribe.generating')) { return $this->state([ 'entity_type' => 'company', 'code' => 'industry', 'name' => 'Industry', 'type' => 'select', ]); } return $this; } } ================================================ FILE: database/factories/NoteFactory.php ================================================ */ final class NoteFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition(): array { return [ 'title' => $this->faker->sentence(), 'team_id' => Team::factory(), ]; } public function configure(): Factory { $factory = $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); if (config('scribe.generating')) { return $factory->state(['team_id' => (string) Str::ulid()]); } return $factory; } } ================================================ FILE: database/factories/OpportunityFactory.php ================================================ */ final class OpportunityFactory extends Factory { protected $model = Opportunity::class; public function definition(): array { return [ 'name' => $this->faker->sentence(), 'team_id' => Team::factory(), ]; } public function configure(): Factory { $factory = $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); if (config('scribe.generating')) { return $factory->state(['team_id' => (string) Str::ulid()]); } return $factory; } } ================================================ FILE: database/factories/PeopleFactory.php ================================================ */ final class PeopleFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition(): array { return [ 'name' => fake()->name(), 'team_id' => Team::factory(), ]; } public function configure(): Factory { $factory = $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); if (config('scribe.generating')) { return $factory->state(['team_id' => (string) Str::ulid()]); } return $factory; } } ================================================ FILE: database/factories/SystemAdministratorFactory.php ================================================ */ final class SystemAdministratorFactory extends Factory { protected $model = SystemAdministrator::class; /** * Define the model's default state. * * @return array */ public function definition(): array { return [ 'name' => fake()->name(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => Hash::make('password'), 'role' => SystemAdministratorRole::SuperAdministrator, 'remember_token' => Str::random(10), ]; } /** * Indicate that the model's email address should be unverified. */ public function unverified(): static { return $this->state(fn (array $attributes): array => [ 'email_verified_at' => null, ]); } public function configure(): Factory { return $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); } } ================================================ FILE: database/factories/TaskFactory.php ================================================ */ final class TaskFactory extends Factory { protected $model = Task::class; public function definition(): array { return [ 'title' => $this->faker->sentence(3), 'created_at' => Date::now(), 'updated_at' => Date::now(), 'team_id' => Team::factory(), ]; } public function configure(): Factory { $factory = $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); if (config('scribe.generating')) { return $factory->state(['team_id' => (string) Str::ulid()]); } return $factory; } } ================================================ FILE: database/factories/TeamFactory.php ================================================ */ final class TeamFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition(): array { return [ 'name' => $this->faker->unique()->company(), 'user_id' => User::factory(), 'personal_team' => true, ]; } public function configure(): static { $factory = $this->afterMaking(function (Team $team): void { if (blank($team->slug)) { $team->slug = Str::slug($team->name).'-'.Str::lower(Str::random(5)); } })->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); if (config('scribe.generating')) { return $factory->state(['user_id' => (string) Str::ulid()]); } return $factory; } } ================================================ FILE: database/factories/TeamInvitationFactory.php ================================================ */ final class TeamInvitationFactory extends Factory { protected $model = TeamInvitation::class; /** * @return array */ public function definition(): array { return [ 'team_id' => Team::factory(), 'email' => $this->faker->unique()->safeEmail(), 'role' => $this->faker->randomElement(['admin', 'editor']), 'expires_at' => now()->addDays(config('jetstream.invitation_expiry_days', 7)), ]; } public function expired(): static { return $this->state([ 'expires_at' => now()->subDay(), ]); } public function expiresIn(int $days): static { return $this->state([ 'expires_at' => now()->addDays($days), ]); } public function withoutExpiry(): static { return $this->state([ 'expires_at' => null, ]); } } ================================================ FILE: database/factories/UserFactory.php ================================================ */ final class UserFactory extends Factory { /** * The current password being used by the factory. */ private static ?string $password = null; /** * Define the model's default state. * * @return array */ #[\Override] public function definition(): array { return [ 'name' => fake()->name(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => self::$password ??= Hash::make('password'), 'two_factor_secret' => null, 'two_factor_recovery_codes' => null, 'remember_token' => Str::random(10), 'profile_photo_path' => null, 'current_team_id' => null, ]; } /** * Indicate that the model's email address should be unverified. */ public function unverified(): static { return $this->state(fn (array $attributes): array => [ 'email_verified_at' => null, ]); } /** * Indicate that the user should have a personal team. */ public function withPersonalTeam(?callable $callback = null): UserFactory { return $this->afterCreating(function (User $user) use ($callback): void { $team = Team::factory()->create([ 'name' => $user->name.'\'s Team', 'user_id' => $user->id, 'personal_team' => true, ]); if (is_callable($callback)) { $callback($team, $user); } // Update the relationship $user->ownedTeams()->save($team); }); } /** * Indicate that the user should have a standard (non-personal) team. */ public function withTeam(?callable $callback = null): static { return $this->afterCreating(function (User $user) use ($callback): void { $team = Team::factory()->create([ 'name' => $user->name."'s Team", 'user_id' => $user->id, 'personal_team' => false, ]); if (is_callable($callback)) { $callback($team, $user); } $user->ownedTeams()->save($team); $user->switchTeam($team); }); } public function socialOnly(): static { return $this->state(fn (array $attributes): array => [ 'password' => null, ]); } public function configure(): Factory { return $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); } } ================================================ FILE: database/factories/UserSocialAccountFactory.php ================================================ */ final class UserSocialAccountFactory extends Factory { /** * The name of the factory's corresponding model. * * @var class-string */ protected $model = UserSocialAccount::class; public function definition(): array { return [ 'user_id' => User::factory(), 'provider_name' => 'facebook', 'provider_id' => $this->faker->unique()->randomNumber(), ]; } public function configure(): Factory { return $this->sequence(fn (Sequence $sequence): array => [ 'created_at' => now()->subMinutes($sequence->index), 'updated_at' => now()->subMinutes($sequence->index), ]); } } ================================================ FILE: database/migrations/0001_01_01_000000_create_users_table.php ================================================ ulid('id')->primary(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password')->nullable(); $table->rememberToken(); $table->foreignUlid('current_team_id')->nullable(); $table->string('profile_photo_path', 2048)->nullable(); $table->timestamps(); }); Schema::create('password_reset_tokens', function (Blueprint $table): void { $table->string('email')->primary(); $table->string('token'); $table->timestamp('created_at')->nullable(); }); Schema::create('sessions', function (Blueprint $table): void { $table->string('id')->primary(); $table->ulid('user_id')->nullable()->index(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->longText('payload'); $table->integer('last_activity')->index(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('users'); Schema::dropIfExists('password_reset_tokens'); Schema::dropIfExists('sessions'); } }; ================================================ FILE: database/migrations/0001_01_01_000001_create_cache_table.php ================================================ string('key')->primary(); $table->mediumText('value'); $table->integer('expiration'); }); Schema::create('cache_locks', function (Blueprint $table): void { $table->string('key')->primary(); $table->string('owner'); $table->integer('expiration'); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('cache'); Schema::dropIfExists('cache_locks'); } }; ================================================ FILE: database/migrations/0001_01_01_000002_create_jobs_table.php ================================================ id(); $table->string('queue')->index(); $table->longText('payload'); $table->unsignedTinyInteger('attempts'); $table->unsignedInteger('reserved_at')->nullable(); $table->unsignedInteger('available_at'); $table->unsignedInteger('created_at'); }); Schema::create('job_batches', function (Blueprint $table): void { $table->string('id')->primary(); $table->string('name'); $table->integer('total_jobs'); $table->integer('pending_jobs'); $table->integer('failed_jobs'); $table->longText('failed_job_ids'); $table->mediumText('options')->nullable(); $table->integer('cancelled_at')->nullable(); $table->integer('created_at'); $table->integer('finished_at')->nullable(); }); Schema::create('failed_jobs', function (Blueprint $table): void { $table->id(); $table->string('uuid')->unique(); $table->text('connection'); $table->text('queue'); $table->longText('payload'); $table->longText('exception'); $table->timestamp('failed_at')->useCurrent(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('jobs'); Schema::dropIfExists('job_batches'); Schema::dropIfExists('failed_jobs'); } }; ================================================ FILE: database/migrations/2024_08_23_110718_create_teams_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('user_id')->index(); $table->string('name'); $table->boolean('personal_team'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('teams'); } }; ================================================ FILE: database/migrations/2024_08_23_110719_create_team_user_table.php ================================================ id(); $table->foreignUlid('team_id')->constrained('teams')->cascadeOnDelete(); $table->foreignUlid('user_id')->constrained('users')->cascadeOnDelete(); $table->string('role')->nullable(); $table->timestamps(); $table->unique(['team_id', 'user_id']); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('team_user'); } }; ================================================ FILE: database/migrations/2024_08_23_110720_create_team_invitations_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained()->cascadeOnDelete(); $table->string('email'); $table->string('role')->nullable(); $table->timestamps(); $table->unique(['team_id', 'email']); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('team_invitations'); } }; ================================================ FILE: database/migrations/2024_08_24_133803_create_companies_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained('teams')->cascadeOnDelete(); $table->foreignUlid('creator_id')->nullable()->constrained('users')->onDelete('set null'); $table->foreignUlid('account_owner_id')->nullable()->constrained('users')->onDelete('set null'); $table->string('name'); $table->string('creation_source', 50); $table->timestamps(); $table->softDeletes(); $table->index(['team_id', 'deleted_at', 'creation_source', 'created_at'], 'idx_companies_team_activity'); }); } }; ================================================ FILE: database/migrations/2024_09_11_114549_create_tasks_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained('teams')->cascadeOnDelete(); $table->foreignUlid('creator_id')->nullable()->constrained('users')->onDelete('set null'); $table->string('title'); $table->string('creation_source', 50); $table->unsignedBigInteger('order_column')->nullable(); $table->timestamps(); $table->softDeletes(); $table->index(['team_id', 'deleted_at', 'creation_source', 'created_at'], 'idx_tasks_team_activity'); }); } }; ================================================ FILE: database/migrations/2024_09_22_084119_create_notes_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained('teams')->cascadeOnDelete(); $table->foreignUlid('creator_id')->nullable()->constrained('users')->onDelete('set null'); $table->string('title'); $table->string('creation_source', 50); $table->timestamps(); $table->softDeletes(); $table->index(['team_id', 'deleted_at', 'creation_source', 'created_at'], 'idx_notes_team_activity'); }); } }; ================================================ FILE: database/migrations/2024_09_22_091034_create_people_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained('teams')->cascadeOnDelete(); $table->foreignUlid('creator_id')->nullable()->constrained('users')->onDelete('set null'); $table->foreignUlid('company_id')->nullable()->constrained()->onDelete('set null'); $table->string('name'); $table->string('creation_source', 50); $table->timestamps(); $table->softDeletes(); $table->index(['team_id', 'deleted_at', 'creation_source', 'created_at'], 'idx_people_team_activity'); }); } }; ================================================ FILE: database/migrations/2024_09_22_092300_create_task_user_table.php ================================================ id(); $table->foreignUlid('task_id')->constrained('tasks')->cascadeOnDelete(); $table->foreignUlid('user_id')->constrained('users')->cascadeOnDelete(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('task_user'); } }; ================================================ FILE: database/migrations/2024_09_22_110651_add_two_factor_columns_to_users_table.php ================================================ text('two_factor_secret') ->after('password') ->nullable(); $table->text('two_factor_recovery_codes') ->after('two_factor_secret') ->nullable(); if (Fortify::confirmsTwoFactorAuthentication()) { $table->timestamp('two_factor_confirmed_at') ->after('two_factor_recovery_codes') ->nullable(); } }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('users', function (Blueprint $table): void { $table->dropColumn(array_merge([ 'two_factor_secret', 'two_factor_recovery_codes', ], Fortify::confirmsTwoFactorAuthentication() ? [ 'two_factor_confirmed_at', ] : [])); }); } }; ================================================ FILE: database/migrations/2024_09_22_110718_create_personal_access_tokens_table.php ================================================ id(); $table->ulidMorphs('tokenable'); $table->string('name'); $table->string('token', 64)->unique(); $table->text('abilities')->nullable(); $table->timestamp('last_used_at')->nullable(); $table->timestamp('expires_at')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('personal_access_tokens'); } }; ================================================ FILE: database/migrations/2024_09_22_114735_create_opportunities_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained('teams')->cascadeOnDelete(); $table->foreignUlid('creator_id')->nullable()->constrained('users')->onDelete('set null'); $table->foreignUlid('company_id')->nullable()->constrained()->onDelete('set null'); $table->foreignUlid('contact_id')->nullable()->constrained('people')->onDelete('set null'); $table->string('name'); $table->string('creation_source', 50); $table->unsignedBigInteger('order_column')->nullable(); $table->timestamps(); $table->softDeletes(); $table->index(['team_id', 'deleted_at', 'creation_source', 'created_at'], 'idx_opportunities_team_activity'); }); } }; ================================================ FILE: database/migrations/2024_09_26_160649_create_user_social_accounts_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('user_id') ->constrained('users') ->onUpdate('cascade') ->onDelete('cascade'); $table->string('provider_name')->nullable(); $table->string('provider_id')->nullable(); $table->unique(['provider_name', 'provider_id']); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('user_social_accounts'); } }; ================================================ FILE: database/migrations/2024_09_26_170133_create_notifications_table.php ================================================ uuid('id')->primary(); $table->string('type'); $table->ulidMorphs('notifiable'); $table->json('data'); $table->timestamp('read_at')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('notifications'); } }; ================================================ FILE: database/migrations/2025_02_07_192236_create_custom_fields_table.php ================================================ ulid('id')->primary(); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->foreignUlid(config('custom-fields.database.column_names.tenant_foreign_key'))->nullable()->index(); $uniqueColumns[] = config('custom-fields.database.column_names.tenant_foreign_key'); } $table->string('width')->nullable(); $table->string('code'); $table->string('name'); $table->string('type'); $table->string('entity_type'); $table->unsignedBigInteger('sort_order')->nullable(); $table->string('description')->nullable(); $table->boolean('active')->default(true); $table->boolean('system_defined')->default(false); $table->json('settings')->nullable(); $table->unique($uniqueColumns); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->index([config('custom-fields.database.column_names.tenant_foreign_key'), 'entity_type', 'active'], 'custom_field_sections_tenant_entity_active_idx'); } else { $table->index(['entity_type', 'active'], 'custom_field_sections_entity_active_idx'); } $table->timestamps(); }); /** * Custom Fields */ Schema::create(config('custom-fields.database.table_names.custom_fields'), function (Blueprint $table): void { $uniqueColumns = ['code', 'entity_type']; $table->ulid('id')->primary(); $table->foreignUlid('custom_field_section_id')->nullable(); $table->string('width')->nullable(); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->foreignUlid(config('custom-fields.database.column_names.tenant_foreign_key'))->nullable()->index(); $uniqueColumns[] = config('custom-fields.database.column_names.tenant_foreign_key'); } $table->string('code'); $table->string('name'); $table->string('type'); $table->string('lookup_type')->nullable(); $table->string('entity_type'); $table->unsignedBigInteger('sort_order')->nullable(); $table->json('validation_rules')->nullable(); $table->boolean('active')->default(true); $table->boolean('system_defined')->default(false); $table->json('settings')->nullable(); $table->unique($uniqueColumns); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->index([config('custom-fields.database.column_names.tenant_foreign_key'), 'entity_type', 'active'], 'custom_fields_tenant_entity_active_idx'); } else { $table->index(['entity_type', 'active'], 'custom_fields_entity_active_idx'); } $table->timestamps(); }); /** * Custom Field Options */ Schema::create(config('custom-fields.database.table_names.custom_field_options'), function (Blueprint $table): void { $uniqueColumns = ['custom_field_id', 'name']; $table->ulid('id')->primary(); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->foreignUlid(config('custom-fields.database.column_names.tenant_foreign_key'))->nullable()->index(); $uniqueColumns[] = config('custom-fields.database.column_names.tenant_foreign_key'); } $table->foreignUlid('custom_field_id') ->constrained(config('custom-fields.database.table_names.custom_fields')) ->cascadeOnDelete(); $table->string('name')->nullable(); $table->unsignedBigInteger('sort_order')->nullable(); $table->json('settings')->nullable(); $table->timestamps(); $table->unique($uniqueColumns); }); /** * Custom Field Values */ Schema::create(config('custom-fields.database.table_names.custom_field_values'), function (Blueprint $table): void { $uniqueColumns = ['entity_type', 'entity_id', 'custom_field_id']; $table->ulid('id')->primary(); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->foreignUlid(config('custom-fields.database.column_names.tenant_foreign_key'))->nullable()->index(); $uniqueColumns[] = config('custom-fields.database.column_names.tenant_foreign_key'); } $table->ulidMorphs('entity'); $table->foreignUlid('custom_field_id') ->constrained(config('custom-fields.database.table_names.custom_fields')) ->cascadeOnDelete(); $table->text('string_value')->nullable(); $table->longText('text_value')->nullable(); $table->boolean('boolean_value')->nullable(); $table->bigInteger('integer_value')->nullable(); $table->double('float_value')->nullable(); $table->date('date_value')->nullable(); $table->dateTime('datetime_value')->nullable(); $table->json('json_value')->nullable(); $table->unique($uniqueColumns, 'custom_field_values_entity_type_unique'); if (FeatureManager::isEnabled(CustomFieldsFeature::SYSTEM_MULTI_TENANCY)) { $table->index([config('custom-fields.database.column_names.tenant_foreign_key'), 'entity_type', 'entity_id'], 'custom_field_values_tenant_entity_idx'); } else { $table->index(['entity_type', 'entity_id'], 'custom_field_values_entity_idx'); } $table->index(['entity_id', 'custom_field_id'], 'custom_field_values_entity_id_custom_field_id_index'); }); } public function down(): void { Schema::dropIfExists(config('custom-fields.database.table_names.custom_field_values')); Schema::dropIfExists(config('custom-fields.database.table_names.custom_field_options')); Schema::dropIfExists(config('custom-fields.database.table_names.custom_fields')); Schema::dropIfExists(config('custom-fields.database.table_names.custom_field_sections')); } }; ================================================ FILE: database/migrations/2025_03_15_180559_create_taskables_table.php ================================================ id(); $table->foreignUlid('task_id'); $table->ulidMorphs('taskable'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('taskables'); } }; ================================================ FILE: database/migrations/2025_03_15_192334_create_notables_table.php ================================================ id(); $table->foreignUlid('note_id'); $table->ulidMorphs('noteable'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('noteables'); } }; ================================================ FILE: database/migrations/2025_03_17_180206_create_media_table.php ================================================ id(); $table->ulidMorphs('model'); $table->uuid()->nullable()->unique(); $table->string('collection_name'); $table->string('name'); $table->string('file_name'); $table->string('mime_type')->nullable(); $table->string('disk'); $table->string('conversions_disk')->nullable(); $table->unsignedBigInteger('size'); $table->json('manipulations'); $table->json('custom_properties'); $table->json('generated_conversions'); $table->json('responsive_images'); $table->unsignedInteger('order_column')->nullable()->index(); $table->nullableTimestamps(); }); } }; ================================================ FILE: database/migrations/2025_04_30_143551_add_creation_source_to_entity_tables.php ================================================ */ private array $tables = [ 'companies', 'people', 'opportunities', 'tasks', 'notes', ]; public function up(): void { foreach ($this->tables as $table) { if (Schema::hasColumn($table, 'creation_source')) { continue; } Schema::table($table, function (Blueprint $blueprint): void { $blueprint->string('creation_source', 50); }); } foreach ($this->tables as $table) { DB::table($table)->whereNull('creation_source')->update(['creation_source' => CreationSource::WEB->value]); } } }; ================================================ FILE: database/migrations/2025_05_08_112613_create_imports_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->nullable()->constrained('teams')->cascadeOnDelete(); $table->timestamp('completed_at')->nullable(); $table->string('file_name'); $table->string('file_path'); $table->string('importer'); $table->unsignedInteger('processed_rows')->default(0); $table->unsignedInteger('total_rows'); $table->unsignedInteger('successful_rows')->default(0); $table->foreignUlid('user_id')->constrained()->cascadeOnDelete(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('imports'); } }; ================================================ FILE: database/migrations/2025_05_08_112614_create_exports_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->nullable()->constrained('teams')->cascadeOnDelete(); $table->timestamp('completed_at')->nullable(); $table->string('file_disk'); $table->string('file_name')->nullable(); $table->string('exporter'); $table->unsignedInteger('processed_rows')->default(0); $table->unsignedInteger('total_rows'); $table->unsignedInteger('successful_rows')->default(0); $table->foreignUlid('user_id')->constrained()->cascadeOnDelete(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('exports'); } }; ================================================ FILE: database/migrations/2025_05_08_112615_create_failed_import_rows_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->nullable()->constrained('teams')->cascadeOnDelete(); $table->json('data'); $table->foreignUlid('import_id')->constrained()->cascadeOnDelete(); $table->text('validation_error')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('failed_import_rows'); } }; ================================================ FILE: database/migrations/2025_07_05_093310_update_opportunity_amount_field_type_to_currency.php ================================================ where('code', 'amount') ->where('entity_type', 'opportunity') ->where('type', 'number') ->pluck('id'); if ($amountFieldIds->isNotEmpty()) { // Migrate values from integer_value to float_value for all amount fields DB::table('custom_field_values') ->whereIn('custom_field_id', $amountFieldIds) ->whereNotNull('integer_value') ->update([ 'float_value' => DB::raw('CAST(integer_value AS DECIMAL(15,2))'), 'integer_value' => null, ]); // Update the field type from 'number' to 'currency' for all amount fields DB::table('custom_fields') ->whereIn('id', $amountFieldIds) ->update(['type' => 'currency']); } } /** * Determine if this migration should run. */ public function shouldRun(): bool { return true; } }; ================================================ FILE: database/migrations/2025_08_12_202409_add_settings_to_custom_field_options_table.php ================================================ json('settings')->nullable()->after('sort_order'); }); } /** * Determine if this migration should run. */ public function shouldRun(): bool { return Schema::hasTable('custom_field_options') && ! Schema::hasColumn('custom_field_options', 'settings'); } /** * Reverse the migrations. */ public function down(): void { Schema::table('custom_field_options', function (Blueprint $table): void { $table->dropColumn('settings'); }); } }; ================================================ FILE: database/migrations/2025_08_25_173222_update_order_column_to_flowforge_position_for_tasks_and_opportunities.php ================================================ dropColumn('order_column'); }); Schema::table('tasks', function (Blueprint $table): void { $table->flowforgePositionColumn('order_column'); }); // Set proper order_column values for existing tasks $this->setTaskOrderColumns(); // Update opportunities table Schema::table('opportunities', function (Blueprint $table): void { $table->dropColumn('order_column'); }); Schema::table('opportunities', function (Blueprint $table): void { $table->flowforgePositionColumn('order_column'); }); // Set proper order_column values for existing opportunities $this->setOpportunityOrderColumns(); } /** * Set proper order_column values for tasks grouped by team and status. */ private function setTaskOrderColumns(): void { // Get all tasks with their status information, grouped by team and status $tasks = DB::select(" SELECT t.id, t.team_id, COALESCE(cfv.integer_value, 0) as status_id FROM tasks t LEFT JOIN custom_field_values cfv ON ( t.id = cfv.entity_id AND cfv.custom_field_id = ( SELECT id FROM custom_fields WHERE code = 'status' AND entity_type = 'App\\\\Models\\\\Task' LIMIT 1 ) ) ORDER BY t.team_id, status_id, t.id "); // Group tasks by team and status $groupedTasks = []; foreach ($tasks as $task) { $key = "{$task->team_id}_{$task->status_id}"; $groupedTasks[$key][] = $task; } // Set positions for each group foreach ($groupedTasks as $tasks) { $this->setPositionsForGroup($tasks, 'tasks'); } } /** * Set proper order_column values for opportunities grouped by team and stage. */ private function setOpportunityOrderColumns(): void { // Get all opportunities with their stage information, grouped by team and stage $opportunities = DB::select(" SELECT o.id, o.team_id, COALESCE(cfv.integer_value, 0) as stage_id FROM opportunities o LEFT JOIN custom_field_values cfv ON ( o.id = cfv.entity_id AND cfv.custom_field_id = ( SELECT id FROM custom_fields WHERE code = 'stage' AND entity_type = 'App\\\\Models\\\\Opportunity' LIMIT 1 ) ) ORDER BY o.team_id, stage_id, o.id "); // Group opportunities by team and stage $groupedOpportunities = []; foreach ($opportunities as $opportunity) { $key = "{$opportunity->team_id}_{$opportunity->stage_id}"; $groupedOpportunities[$key][] = $opportunity; } // Set positions for each group foreach ($groupedOpportunities as $opportunities) { $this->setPositionsForGroup($opportunities, 'opportunities'); } } /** * Set Flowforge position values for a group of records. * * @param array $records Array of records with id property * @param string $table Table name ('tasks' or 'opportunities') */ private function setPositionsForGroup(array $records, string $table): void { if ($records === []) { return; } $count = count($records); $positions = []; if ($count === 1) { // Single record: use empty sequence position $positions[] = [ 'id' => $records[0]->id, 'position' => Rank::forEmptySequence()->get(), ]; } else { // Multiple records: generate evenly distributed positions $positions[] = [ 'id' => $records[0]->id, 'position' => Rank::forEmptySequence()->get(), ]; $prevRank = Rank::forEmptySequence(); for ($i = 1; $i < $count; $i++) { $nextRank = Rank::after($prevRank); $positions[] = [ 'id' => $records[$i]->id, 'position' => $nextRank->get(), ]; $prevRank = $nextRank; } } // Update the database foreach ($positions as $position) { DB::table($table) ->where('id', $position['id']) ->update(['order_column' => $position['position']]); } } /** * Reverse the migrations. */ public function down(): void { // Revert tasks table Schema::table('tasks', function (Blueprint $table): void { $table->dropColumn('order_column'); }); Schema::table('tasks', function (Blueprint $table): void { $table->integer('order_column')->nullable(); }); // Revert opportunities table Schema::table('opportunities', function (Blueprint $table): void { $table->dropColumn('order_column'); }); Schema::table('opportunities', function (Blueprint $table): void { $table->integer('order_column')->nullable(); }); } }; ================================================ FILE: database/migrations/2025_08_26_124042_create_system_administrators_table.php ================================================ ulid('id')->primary(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('role'); $table->rememberToken(); $table->timestamps(); $table->index('email'); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('system_administrators'); } }; ================================================ FILE: database/migrations/2025_11_30_202612_create_ai_summaries_table.php ================================================ ulid('id')->primary(); $table->foreignUlid('team_id')->constrained()->cascadeOnDelete(); $table->ulidMorphs('summarizable'); $table->text('summary'); $table->string('model_used'); $table->unsignedInteger('prompt_tokens')->nullable(); $table->unsignedInteger('completion_tokens')->nullable(); $table->timestamps(); $table->unique(['summarizable_type', 'summarizable_id', 'team_id']); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('ai_summaries'); } }; ================================================ FILE: database/migrations/2025_12_10_191207_update_people_emails_field_type_to_email.php ================================================ where('code', 'emails') ->where('entity_type', 'people') ->where('type', 'tags-input') ->get(); foreach ($fields as $field) { $settings = json_decode($field->settings ?? '{}', true); // Set the new settings values $settings['allow_multiple'] = true; $settings['max_values'] = 5; $settings['unique_per_entity_type'] = true; DB::table('custom_fields') ->where('id', $field->id) ->update([ 'type' => 'email', 'settings' => json_encode($settings), ]); } } }; ================================================ FILE: database/migrations/2025_12_11_000001_update_company_domain_name_settings.php ================================================ where('code', 'domain_name') ->where('entity_type', 'company') ->get(); foreach ($fields as $field) { $settings = json_decode($field->settings ?? '{}', true); // Set the new settings values $settings['allow_multiple'] = true; $settings['max_values'] = 5; $settings['unique_per_entity_type'] = true; // Rename field code and name, update settings DB::table('custom_fields') ->where('id', $field->id) ->update([ 'code' => 'domains', 'name' => 'Domains', 'settings' => json_encode($settings), ]); } } }; ================================================ FILE: database/migrations/2025_12_20_000000_migrate_to_ulid.php ================================================ */ private array $coreEntityTables = [ 'users', 'teams', 'companies', 'people', 'opportunities', 'tasks', 'notes', ]; /** * Other entity tables that need ULID primary keys. * * @var array */ private array $otherEntityTables = [ 'imports', 'exports', 'team_invitations', 'user_social_accounts', 'failed_import_rows', 'ai_summaries', 'system_administrators', ]; /** * Custom field tables that need ULID primary keys. * These have internal relationships (custom_field_id). * * @var array */ private array $customFieldTables = [ 'custom_fields', 'custom_field_sections', 'custom_field_options', 'custom_field_values', ]; /** * Map morph aliases to their tables. * CRITICAL: Use morph aliases (from Relation::enforceMorphMap) as keys, * NOT full class names, because the database stores aliases. * * @var array */ private array $morphTypes = [ 'user' => 'users', 'team' => 'teams', 'company' => 'companies', 'people' => 'people', 'opportunity' => 'opportunities', 'task' => 'tasks', 'note' => 'notes', 'system_administrator' => 'system_administrators', 'import' => 'imports', 'export' => 'exports', ]; /** * Run the migrations. */ public function up(): void { // Allow long-running migration set_time_limit(0); ini_set('memory_limit', '2048M'); // Disable query log to save memory on large datasets DB::disableQueryLog(); $driver = DB::getDriverName(); // Skip if already using ULID (fresh install or already migrated) if ($this->isAlreadyUlid('users', 'id')) { return; } if ($driver === 'sqlite') { $this->migrateForSqlite(); } else { // MySQL, PostgreSQL, MariaDB $this->migrateForRelationalDb(); } } /** * Migration for MySQL/PostgreSQL/MariaDB. * * Two-phase approach: * Phase A: Add ULID columns and populate (while old IDs exist for JOINs) * Phase B: Cutover (drop old columns, rename new ones) */ private function migrateForRelationalDb(): void { Schema::disableForeignKeyConstraints(); // ===================================================================== // PHASE A: Add ULID columns and populate values (keep old IDs for JOINs) // ===================================================================== // A1: Core entity tables - add ulid column and populate $this->phaseA_addUlidToCoreTables(); // A2: Core entity tables - add foreign key ULID columns and populate $this->phaseA_addForeignUlidsToCoreTablesAndPopulate(); // A3: Other entity tables - add ulid column and foreign ULID columns, populate $this->phaseA_addUlidsToOtherEntityTables(); // A4: Pivot tables - add foreign ULID columns and populate $this->phaseA_addUlidsToPivotTables(); // A5: Polymorphic tables - add morph ULID columns and populate // CRITICAL: Must run while old integer IDs still exist in core tables! $this->phaseA_addUlidsToPolymorphicTables(); // A6: Tenant-scoped tables - add foreign ULID columns and populate $this->phaseA_addUlidsToTenantScopedTables(); // A7: Custom field tables - add ulid and foreign ULID columns, populate $this->phaseA_addUlidsToCustomFieldTables(); // A7b: Migrate SINGLE_CHOICE field value references (integer_value → string_value) // CRITICAL: Must run while option table still has integer IDs for lookup! $this->phaseA7b_migrateOptionValueReferences(); // A8: Migrate email field data format (string_value → json_value) $this->phaseA8_migrateEmailFieldValues(); // A9: Migrate domain field data format (string_value → json_value) $this->phaseA9_migrateDomainFieldValues(); // ===================================================================== // PHASE B: Cutover - drop old columns, rename ULID columns // ===================================================================== // B0: Drop ALL foreign key constraints first (MySQL requirement) // MySQL won't allow dropping PRIMARY KEY if foreign keys reference it $this->phaseB_dropAllForeignKeyConstraints(); // B1: Core entity tables - cutover primary keys $this->phaseB_cutoverCorePrimaryKeys(); // B2: Core entity tables - cutover foreign keys $this->phaseB_cutoverCoreForeignKeys(); // B3: Other entity tables - cutover $this->phaseB_cutoverOtherEntityTables(); // B4: Pivot tables - cutover foreign keys $this->phaseB_cutoverPivotTables(); // B5: Polymorphic tables - cutover morph columns $this->phaseB_cutoverPolymorphicTables(); // B6: Tenant-scoped tables - cutover $this->phaseB_cutoverTenantScopedTables(); // B7: Custom field tables - cutover primary keys and foreign keys $this->phaseB_cutoverCustomFieldTables(); // B8: Recreate composite unique indexes with new ULID columns $this->phaseB_recreateUniqueIndexes(); // B9: Recreate foreign key constraints with ULID references $this->phaseB9_recreateForeignKeyConstraints(); Schema::enableForeignKeyConstraints(); } // ========================================================================= // PHASE A: Add ULID columns and populate // ========================================================================= /** * A1: Add ULID column to core entity tables and populate with values. */ private function phaseA_addUlidToCoreTables(): void { foreach ($this->coreEntityTables as $table) { // Add ulid column Schema::table($table, function (Blueprint $table): void { $table->ulid('ulid')->after('id')->nullable()->unique(); }); // Populate with ULID values DB::table($table) ->whereNull('ulid') ->lazyById(100) ->each(function ($record) use ($table): void { DB::table($table) ->where('id', $record->id) ->update(['ulid' => (string) Str::ulid()]); }); } } /** * A2: Add foreign key ULID columns to core tables and populate. */ private function phaseA_addForeignUlidsToCoreTablesAndPopulate(): void { // Companies: team_id, creator_id, account_owner_id $this->addAndPopulateForeignUlid('companies', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('companies', 'creator_id', 'users'); $this->addAndPopulateForeignUlid('companies', 'account_owner_id', 'users'); // People: team_id, creator_id, company_id $this->addAndPopulateForeignUlid('people', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('people', 'creator_id', 'users'); $this->addAndPopulateForeignUlid('people', 'company_id', 'companies'); // Opportunities: team_id, creator_id, company_id, contact_id $this->addAndPopulateForeignUlid('opportunities', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('opportunities', 'creator_id', 'users'); $this->addAndPopulateForeignUlid('opportunities', 'company_id', 'companies'); $this->addAndPopulateForeignUlid('opportunities', 'contact_id', 'people'); // Tasks: team_id, creator_id $this->addAndPopulateForeignUlid('tasks', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('tasks', 'creator_id', 'users'); // Notes: team_id, creator_id $this->addAndPopulateForeignUlid('notes', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('notes', 'creator_id', 'users'); // Users: current_team_id $this->addAndPopulateForeignUlid('users', 'current_team_id', 'teams'); // Teams: user_id $this->addAndPopulateForeignUlid('teams', 'user_id', 'users'); } /** * A3: Add ULID columns to other entity tables and populate. */ private function phaseA_addUlidsToOtherEntityTables(): void { // imports: id (primary), team_id, user_id $this->addUlidPrimaryKeyColumn('imports'); $this->addAndPopulateForeignUlid('imports', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('imports', 'user_id', 'users'); // exports: id (primary), team_id, user_id $this->addUlidPrimaryKeyColumn('exports'); $this->addAndPopulateForeignUlid('exports', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('exports', 'user_id', 'users'); // team_invitations: id (primary), team_id $this->addUlidPrimaryKeyColumn('team_invitations'); $this->addAndPopulateForeignUlid('team_invitations', 'team_id', 'teams'); // user_social_accounts: id (primary), user_id $this->addUlidPrimaryKeyColumn('user_social_accounts'); $this->addAndPopulateForeignUlid('user_social_accounts', 'user_id', 'users'); // failed_import_rows: id (primary), team_id, import_id $this->addUlidPrimaryKeyColumn('failed_import_rows'); $this->addAndPopulateForeignUlid('failed_import_rows', 'team_id', 'teams'); // Note: import_id references imports which still has integer id at this point $this->addAndPopulateForeignUlid('failed_import_rows', 'import_id', 'imports'); // ai_summaries: id (primary), team_id // Note: summarizable_id is already char(26), so only need primary key and team_id $this->addUlidPrimaryKeyColumn('ai_summaries'); $this->addAndPopulateForeignUlid('ai_summaries', 'team_id', 'teams'); // system_administrators: id (primary only, no foreign keys) $this->addUlidPrimaryKeyColumn('system_administrators'); } /** * A4: Add ULID columns to pivot tables and populate. * Pivot tables keep their integer primary key, only foreign keys are converted. */ private function phaseA_addUlidsToPivotTables(): void { // team_user: team_id, user_id $this->addAndPopulateForeignUlid('team_user', 'team_id', 'teams'); $this->addAndPopulateForeignUlid('team_user', 'user_id', 'users'); // task_user: task_id, user_id $this->addAndPopulateForeignUlid('task_user', 'task_id', 'tasks'); $this->addAndPopulateForeignUlid('task_user', 'user_id', 'users'); // taskables: task_id, taskable_id (morph) $this->addAndPopulateForeignUlid('taskables', 'task_id', 'tasks'); $this->addAndPopulateMorphUlid('taskables', 'taskable'); // noteables: note_id, noteable_id (morph) $this->addAndPopulateForeignUlid('noteables', 'note_id', 'notes'); $this->addAndPopulateMorphUlid('noteables', 'noteable'); } /** * A5: Add ULID columns to polymorphic tables and populate. * CRITICAL: Must run while old integer IDs still exist! */ private function phaseA_addUlidsToPolymorphicTables(): void { // notifications: notifiable_id $this->addAndPopulateMorphUlid('notifications', 'notifiable'); // media: model_id $this->addAndPopulateMorphUlid('media', 'model'); // ai_summaries: summarizable_id $this->addAndPopulateMorphUlid('ai_summaries', 'summarizable'); // personal_access_tokens: tokenable_id $this->addAndPopulateMorphUlid('personal_access_tokens', 'tokenable'); // custom_field_values: entity_id $this->addAndPopulateMorphUlid('custom_field_values', 'entity'); } /** * A6: Add ULID columns to tenant-scoped tables and populate. */ private function phaseA_addUlidsToTenantScopedTables(): void { // sessions: user_id $this->addAndPopulateForeignUlid('sessions', 'user_id', 'users'); // custom_fields: tenant_id $this->addAndPopulateForeignUlid('custom_fields', 'tenant_id', 'teams'); // custom_field_options: tenant_id $this->addAndPopulateForeignUlid('custom_field_options', 'tenant_id', 'teams'); // custom_field_sections: tenant_id $this->addAndPopulateForeignUlid('custom_field_sections', 'tenant_id', 'teams'); // custom_field_values: tenant_id (entity_id already handled in polymorphic) $this->addAndPopulateForeignUlid('custom_field_values', 'tenant_id', 'teams'); } /** * A7: Add ULID columns to custom field tables and populate. */ private function phaseA_addUlidsToCustomFieldTables(): void { // Add ULID primary key columns to all custom field tables foreach ($this->customFieldTables as $table) { $this->addUlidPrimaryKeyColumn($table); } // custom_fields: custom_field_section_id references custom_field_sections $this->addAndPopulateForeignUlid('custom_fields', 'custom_field_section_id', 'custom_field_sections'); // custom_field_options: custom_field_id references custom_fields $this->addAndPopulateForeignUlid('custom_field_options', 'custom_field_id', 'custom_fields'); // custom_field_values: custom_field_id references custom_fields $this->addAndPopulateForeignUlid('custom_field_values', 'custom_field_id', 'custom_fields'); } /** * A7b: Migrate SINGLE_CHOICE field value references from integer_value to string_value. * * Maps old integer option IDs to new ULID option IDs. * CRITICAL: Must run while custom_field_options still has both 'id' (integer) and 'ulid' columns. * * IDEMPOTENT: Only migrates values with non-null integer_value. */ private function phaseA7b_migrateOptionValueReferences(): void { $fieldTable = 'custom_fields'; $valueTable = 'custom_field_values'; $optionTable = 'custom_field_options'; // Find all SINGLE_CHOICE type fields (select, radio) $singleChoiceFieldIds = DB::table($fieldTable) ->whereIn('type', ['select', 'radio']) ->pluck('id'); if ($singleChoiceFieldIds->isEmpty()) { return; // No single-choice fields } // Migrate in chunks to avoid memory issues DB::table($valueTable) ->whereIn('custom_field_id', $singleChoiceFieldIds) ->whereNotNull('integer_value') ->lazyById(100) ->each(function ($value) use ($valueTable, $optionTable): void { // Get the option's new ULID using the old integer id stored in integer_value // At this point, options still have both 'id' (original integer) and 'ulid' columns $optionUlid = DB::table($optionTable) ->where('id', $value->integer_value) ->value('ulid'); if ($optionUlid) { DB::table($valueTable) ->where('id', $value->id) ->update([ 'string_value' => $optionUlid, 'integer_value' => null, ]); } }); } /** * A8: Migrate email field values from string_value to json_value format. * * EmailFieldType was changed from STRING data type (string_value) to * MULTI_CHOICE (json_value array format) to support multiple emails. * * IDEMPOTENT: Only migrates values with non-empty string_value and empty json_value. */ private function phaseA8_migrateEmailFieldValues(): void { $fieldTable = 'custom_fields'; $valueTable = 'custom_field_values'; // Find all email type custom fields (using integer id, we're in Phase A) $emailFieldIds = DB::table($fieldTable) ->where('type', 'email') ->pluck('id'); if ($emailFieldIds->isEmpty()) { return; // No email fields } // Find values needing migration: has string_value, empty/null json_value $valuesToMigrate = DB::table($valueTable) ->whereIn('custom_field_id', $emailFieldIds) ->whereNotNull('string_value') ->where('string_value', '!=', '') ->where(function (Builder $query): void { $query->whereNull('json_value') ->orWhereRaw('"json_value"::text = ?', ['[]']) ->orWhereRaw('"json_value"::text = ?', ['null']); }) ->select(['id', 'string_value']) ->get(); if ($valuesToMigrate->isEmpty()) { return; // Already migrated } // Migrate in chunks to avoid memory issues foreach ($valuesToMigrate->chunk(100) as $chunk) { foreach ($chunk as $value) { DB::table($valueTable) ->where('id', $value->id) ->update([ 'json_value' => json_encode([$value->string_value]), 'string_value' => null, ]); } } } /** * A9: Migrate domain field values from string_value to json_value format. * * Domains field (company) was changed from STRING data type (string_value) to * array format (json_value) to support multiple domains. * * IDEMPOTENT: Only migrates values with non-empty string_value and empty json_value. */ private function phaseA9_migrateDomainFieldValues(): void { $fieldTable = 'custom_fields'; $valueTable = 'custom_field_values'; // Find all domains custom fields (code 'domains' or legacy 'domain_name') $domainFieldIds = DB::table($fieldTable) ->where('entity_type', 'company') ->where(function (Builder $query): void { $query->where('code', 'domains') ->orWhere('code', 'domain_name'); }) ->pluck('id'); if ($domainFieldIds->isEmpty()) { return; // No domain fields } // Find values needing migration: has string_value, empty/null json_value $valuesToMigrate = DB::table($valueTable) ->whereIn('custom_field_id', $domainFieldIds) ->whereNotNull('string_value') ->where('string_value', '!=', '') ->where(function (Builder $query): void { $query->whereNull('json_value') ->orWhereRaw('"json_value"::text = ?', ['[]']) ->orWhereRaw('"json_value"::text = ?', ['null']); }) ->select(['id', 'string_value']) ->get(); if ($valuesToMigrate->isEmpty()) { return; // Already migrated } // Migrate in chunks to avoid memory issues foreach ($valuesToMigrate->chunk(100) as $chunk) { foreach ($chunk as $value) { // Handle comma-separated domains $domains = array_filter( array_map(trim(...), explode(',', (string) $value->string_value)), fn ($d): bool => $d !== '' ); DB::table($valueTable) ->where('id', $value->id) ->update([ 'json_value' => json_encode(array_values($domains)), 'string_value' => null, ]); } } } // ========================================================================= // PHASE B: Cutover - drop old columns, rename ULID columns // ========================================================================= /** * B0: Drop ALL foreign key constraints and composite unique indexes. * * MySQL: Cannot drop PRIMARY KEY if foreign keys reference it, * cannot drop column if it's part of a unique index. * PostgreSQL: Same logical requirement, different SQL syntax. */ private function phaseB_dropAllForeignKeyConstraints(): void { $driver = DB::getDriverName(); if ($driver === 'pgsql') { $foreignKeys = DB::select(" SELECT tc.table_name, tc.constraint_name FROM information_schema.table_constraints tc WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = 'public' "); foreach ($foreignKeys as $fk) { try { DB::statement("ALTER TABLE \"{$fk->table_name}\" DROP CONSTRAINT IF EXISTS \"{$fk->constraint_name}\""); } catch (Throwable) { } } $indexesToDrop = [ 'team_invitations_team_id_email_unique', 'team_user_team_id_user_id_unique', 'ai_summaries_summarizable_type_summarizable_id_team_id_unique', 'custom_field_options_custom_field_id_name_tenant_id_unique', 'custom_field_sections_entity_type_code_tenant_id_unique', 'custom_field_values_entity_type_unique', 'custom_fields_code_entity_type_tenant_id_unique', ]; foreach ($indexesToDrop as $indexName) { try { DB::statement("DROP INDEX IF EXISTS \"{$indexName}\""); } catch (Throwable) { } } } else { $foreignKeys = DB::select(' SELECT TABLE_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_SCHEMA = DATABASE() '); foreach ($foreignKeys as $fk) { try { DB::statement("ALTER TABLE `{$fk->TABLE_NAME}` DROP FOREIGN KEY `{$fk->CONSTRAINT_NAME}`"); } catch (Throwable) { } } $indexesToDrop = [ 'team_invitations' => 'team_invitations_team_id_email_unique', 'team_user' => 'team_user_team_id_user_id_unique', 'ai_summaries' => 'ai_summaries_summarizable_type_summarizable_id_team_id_unique', 'custom_field_options' => 'custom_field_options_custom_field_id_name_tenant_id_unique', 'custom_field_sections' => 'custom_field_sections_entity_type_code_tenant_id_unique', 'custom_field_values' => 'custom_field_values_entity_type_unique', 'custom_fields' => 'custom_fields_code_entity_type_tenant_id_unique', ]; foreach ($indexesToDrop as $table => $indexName) { try { DB::statement("ALTER TABLE `{$table}` DROP INDEX `{$indexName}`"); } catch (Throwable) { } } } } /** * B1: Cutover core table primary keys. */ private function phaseB_cutoverCorePrimaryKeys(): void { foreach ($this->coreEntityTables as $table) { $this->cutoverPrimaryKey($table); } } /** * B2: Cutover core table foreign keys. */ private function phaseB_cutoverCoreForeignKeys(): void { // Companies $this->cutoverForeignKeyColumn('companies', 'team_id'); $this->cutoverForeignKeyColumn('companies', 'creator_id'); $this->cutoverForeignKeyColumn('companies', 'account_owner_id'); // People $this->cutoverForeignKeyColumn('people', 'team_id'); $this->cutoverForeignKeyColumn('people', 'creator_id'); $this->cutoverForeignKeyColumn('people', 'company_id'); // Opportunities $this->cutoverForeignKeyColumn('opportunities', 'team_id'); $this->cutoverForeignKeyColumn('opportunities', 'creator_id'); $this->cutoverForeignKeyColumn('opportunities', 'company_id'); $this->cutoverForeignKeyColumn('opportunities', 'contact_id'); // Tasks $this->cutoverForeignKeyColumn('tasks', 'team_id'); $this->cutoverForeignKeyColumn('tasks', 'creator_id'); // Notes $this->cutoverForeignKeyColumn('notes', 'team_id'); $this->cutoverForeignKeyColumn('notes', 'creator_id'); // Users $this->cutoverForeignKeyColumn('users', 'current_team_id'); // Teams $this->cutoverForeignKeyColumn('teams', 'user_id'); } /** * B3: Cutover other entity tables. */ private function phaseB_cutoverOtherEntityTables(): void { foreach ($this->otherEntityTables as $table) { $this->cutoverPrimaryKey($table); } // Cutover foreign keys $this->cutoverForeignKeyColumn('imports', 'team_id'); $this->cutoverForeignKeyColumn('imports', 'user_id'); $this->cutoverForeignKeyColumn('exports', 'team_id'); $this->cutoverForeignKeyColumn('exports', 'user_id'); $this->cutoverForeignKeyColumn('team_invitations', 'team_id'); $this->cutoverForeignKeyColumn('user_social_accounts', 'user_id'); $this->cutoverForeignKeyColumn('failed_import_rows', 'team_id'); $this->cutoverForeignKeyColumn('failed_import_rows', 'import_id'); $this->cutoverForeignKeyColumn('ai_summaries', 'team_id'); } /** * B4: Cutover pivot tables (foreign keys only, keep integer id). */ private function phaseB_cutoverPivotTables(): void { // team_user $this->cutoverForeignKeyColumn('team_user', 'team_id'); $this->cutoverForeignKeyColumn('team_user', 'user_id'); // task_user $this->cutoverForeignKeyColumn('task_user', 'task_id'); $this->cutoverForeignKeyColumn('task_user', 'user_id'); // taskables $this->cutoverForeignKeyColumn('taskables', 'task_id'); $this->cutoverMorphColumn('taskables', 'taskable'); // noteables $this->cutoverForeignKeyColumn('noteables', 'note_id'); $this->cutoverMorphColumn('noteables', 'noteable'); } /** * B5: Cutover polymorphic tables. */ private function phaseB_cutoverPolymorphicTables(): void { $this->cutoverMorphColumn('notifications', 'notifiable'); $this->cutoverMorphColumn('media', 'model'); $this->cutoverMorphColumn('ai_summaries', 'summarizable'); $this->cutoverMorphColumn('personal_access_tokens', 'tokenable'); $this->cutoverMorphColumn('custom_field_values', 'entity'); } /** * B6: Cutover tenant-scoped tables. */ private function phaseB_cutoverTenantScopedTables(): void { $this->cutoverForeignKeyColumn('sessions', 'user_id'); $this->cutoverForeignKeyColumn('custom_fields', 'tenant_id'); $this->cutoverForeignKeyColumn('custom_field_options', 'tenant_id'); $this->cutoverForeignKeyColumn('custom_field_sections', 'tenant_id'); $this->cutoverForeignKeyColumn('custom_field_values', 'tenant_id'); } /** * B7: Cutover custom field tables - primary keys and foreign keys. */ private function phaseB_cutoverCustomFieldTables(): void { foreach ($this->customFieldTables as $table) { $this->cutoverPrimaryKey($table); } // Cutover foreign keys $this->cutoverForeignKeyColumn('custom_fields', 'custom_field_section_id'); $this->cutoverForeignKeyColumn('custom_field_options', 'custom_field_id'); $this->cutoverForeignKeyColumn('custom_field_values', 'custom_field_id'); } /** * B8: Recreate composite unique indexes with new ULID columns. */ private function phaseB_recreateUniqueIndexes(): void { // team_invitations: (team_id, email) unique Schema::table('team_invitations', function (Blueprint $table): void { $table->unique(['team_id', 'email'], 'team_invitations_team_id_email_unique'); }); // team_user: (team_id, user_id) unique Schema::table('team_user', function (Blueprint $table): void { $table->unique(['team_id', 'user_id'], 'team_user_team_id_user_id_unique'); }); // ai_summaries: (summarizable_type, summarizable_id, team_id) unique Schema::table('ai_summaries', function (Blueprint $table): void { $table->unique(['summarizable_type', 'summarizable_id', 'team_id'], 'ai_summaries_summarizable_type_summarizable_id_team_id_unique'); }); // custom_field_options: (custom_field_id, name, tenant_id) unique Schema::table('custom_field_options', function (Blueprint $table): void { $table->unique(['custom_field_id', 'name', 'tenant_id'], 'custom_field_options_custom_field_id_name_tenant_id_unique'); }); // custom_field_sections: (entity_type, code, tenant_id) unique Schema::table('custom_field_sections', function (Blueprint $table): void { $table->unique(['entity_type', 'code', 'tenant_id'], 'custom_field_sections_entity_type_code_tenant_id_unique'); }); // custom_field_values: (entity_type, entity_id, custom_field_id, tenant_id) unique Schema::table('custom_field_values', function (Blueprint $table): void { $table->unique(['entity_type', 'entity_id', 'custom_field_id', 'tenant_id'], 'custom_field_values_entity_type_unique'); }); // custom_fields: (code, entity_type, tenant_id) unique Schema::table('custom_fields', function (Blueprint $table): void { $table->unique(['code', 'entity_type', 'tenant_id'], 'custom_fields_code_entity_type_tenant_id_unique'); }); } /** * B9: Recreate foreign key constraints with ULID references. * * CRITICAL: Foreign keys were dropped in B0, must be recreated * to restore referential integrity. */ private function phaseB9_recreateForeignKeyConstraints(): void { // Core entity foreign keys Schema::table('companies', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('creator_id')->references('id')->on('users')->onDelete('set null'); $table->foreign('account_owner_id')->references('id')->on('users')->onDelete('set null'); }); Schema::table('people', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('creator_id')->references('id')->on('users')->onDelete('set null'); $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); }); Schema::table('opportunities', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('creator_id')->references('id')->on('users')->onDelete('set null'); $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); $table->foreign('contact_id')->references('id')->on('people')->onDelete('set null'); }); Schema::table('tasks', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('creator_id')->references('id')->on('users')->onDelete('set null'); }); Schema::table('notes', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('creator_id')->references('id')->on('users')->onDelete('set null'); }); Schema::table('users', function (Blueprint $table): void { $table->foreign('current_team_id')->references('id')->on('teams')->onDelete('set null'); }); Schema::table('teams', function (Blueprint $table): void { $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); // Related entity foreign keys Schema::table('imports', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); }); Schema::table('exports', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); }); Schema::table('team_invitations', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); }); Schema::table('user_social_accounts', function (Blueprint $table): void { $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); Schema::table('failed_import_rows', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('import_id')->references('id')->on('imports')->onDelete('cascade'); }); Schema::table('ai_summaries', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); }); // Pivot table foreign keys Schema::table('team_user', function (Blueprint $table): void { $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); Schema::table('task_user', function (Blueprint $table): void { $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade'); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); Schema::table('taskables', function (Blueprint $table): void { $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade'); // taskable_id is polymorphic, no FK constraint }); Schema::table('noteables', function (Blueprint $table): void { $table->foreign('note_id')->references('id')->on('notes')->onDelete('cascade'); // noteable_id is polymorphic, no FK constraint }); // Tenant-scoped table foreign keys Schema::table('sessions', function (Blueprint $table): void { $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); Schema::table('custom_fields', function (Blueprint $table): void { $table->foreign('tenant_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('custom_field_section_id')->references('id')->on('custom_field_sections')->onDelete('cascade'); }); Schema::table('custom_field_options', function (Blueprint $table): void { $table->foreign('tenant_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('custom_field_id')->references('id')->on('custom_fields')->onDelete('cascade'); }); Schema::table('custom_field_sections', function (Blueprint $table): void { $table->foreign('tenant_id')->references('id')->on('teams')->onDelete('cascade'); }); Schema::table('custom_field_values', function (Blueprint $table): void { $table->foreign('tenant_id')->references('id')->on('teams')->onDelete('cascade'); $table->foreign('custom_field_id')->references('id')->on('custom_fields')->onDelete('cascade'); // entity_id is polymorphic, no FK constraint }); } // ========================================================================= // Helper Methods - Phase A (Add and Populate) // ========================================================================= /** * Add a ULID column for primary key and populate with values. */ private function addUlidPrimaryKeyColumn(string $tableName): void { Schema::table($tableName, function (Blueprint $table): void { $table->ulid('ulid')->after('id')->nullable(); }); DB::table($tableName) ->whereNull('ulid') ->lazyById(100) ->each(function ($record) use ($tableName): void { DB::table($tableName) ->where('id', $record->id) ->update(['ulid' => (string) Str::ulid()]); }); } /** * Add a ULID foreign key column and populate by looking up the referenced table. */ private function addAndPopulateForeignUlid(string $tableName, string $fkColumn, string $refTable): void { $ulidColumn = $fkColumn.'_ulid'; // Add ULID column Schema::table($tableName, function (Blueprint $table) use ($fkColumn, $ulidColumn): void { $table->char($ulidColumn, 26)->nullable()->after($fkColumn); }); // Populate by looking up the referenced table's ulid column // At this point, referenced tables have both 'id' (integer) and 'ulid' columns DB::statement(" UPDATE {$tableName} SET {$ulidColumn} = ( SELECT ulid FROM {$refTable} WHERE {$refTable}.id = {$tableName}.{$fkColumn} ) WHERE {$fkColumn} IS NOT NULL "); } /** * Add a ULID morph column and populate by looking up each morph type. * Handles both morph aliases ('company') and full class names ('App\Models\Company'). */ private function addAndPopulateMorphUlid(string $tableName, string $morphName): void { $morphIdColumn = $morphName.'_id'; $morphTypeColumn = $morphName.'_type'; $morphUlidColumn = $morphIdColumn.'_ulid'; // Add ULID column Schema::table($tableName, function (Blueprint $table) use ($morphIdColumn, $morphUlidColumn): void { $table->char($morphUlidColumn, 26)->nullable()->after($morphIdColumn); }); // Populate for each morph type using aliases (e.g., 'company', 'people') // These match what's stored in the database via Relation::enforceMorphMap() foreach ($this->morphTypes as $morphAlias => $refTable) { // At this point, core tables have both 'id' (integer) and 'ulid' columns DB::statement(" UPDATE {$tableName} SET {$morphUlidColumn} = ( SELECT ulid FROM {$refTable} WHERE {$refTable}.id = {$tableName}.{$morphIdColumn} ) WHERE {$morphTypeColumn} = '{$morphAlias}' AND {$morphIdColumn} IS NOT NULL "); } // SPECIAL CASE: Handle full class names (e.g., Spatie Media Library) // Check if any rows still have NULL after alias-based population $nullCount = DB::table($tableName) ->whereNull($morphUlidColumn) ->whereNotNull($morphIdColumn) ->count(); if ($nullCount > 0) { // Populate using full class name mapping $fullClassMap = [ User::class => 'users', Team::class => 'teams', Company::class => 'companies', People::class => 'people', Opportunity::class => 'opportunities', Task::class => 'tasks', Note::class => 'notes', 'App\\Models\\Import' => 'imports', Export::class => 'exports', 'App\\Models\\SystemAdministrator' => 'system_administrators', ]; foreach ($fullClassMap as $fullClass => $refTable) { DB::statement(" UPDATE {$tableName} SET {$morphUlidColumn} = ( SELECT ulid FROM {$refTable} WHERE {$refTable}.id = {$tableName}.{$morphIdColumn} ) WHERE {$morphTypeColumn} = '{$fullClass}' AND {$morphIdColumn} IS NOT NULL "); } } } // ========================================================================= // Helper Methods - Phase B (Cutover) // ========================================================================= /** * Cutover a primary key from integer to ULID. * * MySQL requires removing AUTO_INCREMENT before dropping the primary key (Error 1075). * PostgreSQL uses sequences — this step is unnecessary and skipped. */ private function cutoverPrimaryKey(string $table): void { $driver = DB::getDriverName(); if ($driver === 'mysql') { Schema::table($table, function (Blueprint $blueprint): void { $blueprint->unsignedBigInteger('id')->change(); }); } Schema::table($table, function (Blueprint $blueprint): void { $blueprint->dropPrimary(['id']); }); Schema::table($table, function (Blueprint $blueprint): void { $blueprint->dropColumn('id'); }); Schema::table($table, function (Blueprint $blueprint): void { $blueprint->renameColumn('ulid', 'id'); }); Schema::table($table, function (Blueprint $blueprint): void { $blueprint->primary('id'); }); } /** * Cutover a foreign key column: drop old, rename ULID column. */ private function cutoverForeignKeyColumn(string $tableName, string $fkColumn): void { $ulidColumn = $fkColumn.'_ulid'; // Drop old integer column Schema::table($tableName, function (Blueprint $table) use ($fkColumn): void { $table->dropColumn($fkColumn); }); // Rename ULID column to original name Schema::table($tableName, function (Blueprint $table) use ($fkColumn, $ulidColumn): void { $table->renameColumn($ulidColumn, $fkColumn); }); } /** * Cutover a morph column: drop old, rename ULID column, recreate index. */ private function cutoverMorphColumn(string $tableName, string $morphName): void { $morphIdColumn = $morphName.'_id'; $morphTypeColumn = $morphName.'_type'; $morphUlidColumn = $morphIdColumn.'_ulid'; // Drop index if exists try { Schema::table($tableName, function (Blueprint $table) use ($tableName, $morphTypeColumn, $morphIdColumn): void { $table->dropIndex("{$tableName}_{$morphTypeColumn}_{$morphIdColumn}_index"); }); } catch (Throwable) { // Index might not exist } // Drop old morph id column Schema::table($tableName, function (Blueprint $table) use ($morphIdColumn): void { $table->dropColumn($morphIdColumn); }); // Rename ULID column to original name Schema::table($tableName, function (Blueprint $table) use ($morphIdColumn, $morphUlidColumn): void { $table->renameColumn($morphUlidColumn, $morphIdColumn); }); // Recreate index Schema::table($tableName, function (Blueprint $table) use ($morphTypeColumn, $morphIdColumn): void { $table->index([$morphTypeColumn, $morphIdColumn]); }); } // ========================================================================= // SQLite Implementation (for tests) // ========================================================================= /** * Migration for SQLite (used in tests). * Uses table rebuild approach due to SQLite limitations. */ private function migrateForSqlite(): void { DB::statement('PRAGMA foreign_keys = OFF'); // SQLite requires table rebuilds to change column types // This simplified approach works for fresh test databases // Core entity tables foreach ($this->coreEntityTables as $table) { $this->rebuildTableWithUlidPrimarySqlite($table); } // Other entity tables foreach ($this->otherEntityTables as $table) { $this->rebuildTableWithUlidPrimarySqlite($table); } // Pivot tables - rebuild with ULID foreign keys (keep integer id) $this->rebuildPivotTableSqlite('team_user', ['team_id', 'user_id']); $this->rebuildPivotTableSqlite('task_user', ['task_id', 'user_id']); $this->rebuildPivotWithMorphSqlite('taskables', 'task_id', 'taskable_id'); $this->rebuildPivotWithMorphSqlite('noteables', 'note_id', 'noteable_id'); // Polymorphic tables - rebuild with ULID morph columns $this->rebuildMorphTableSqlite('notifications', 'notifiable_id'); $this->rebuildMorphTableSqlite('media', 'model_id'); $this->rebuildMorphTableSqlite('ai_summaries', 'summarizable_id'); $this->rebuildMorphTableSqlite('personal_access_tokens', 'tokenable_id'); $this->rebuildMorphTableSqlite('custom_field_values', 'entity_id'); // Tenant-scoped tables - rebuild foreign keys $this->rebuildForeignKeysSqlite('sessions', ['user_id']); $this->rebuildForeignKeysSqlite('custom_fields', ['tenant_id']); $this->rebuildForeignKeysSqlite('custom_field_options', ['tenant_id']); $this->rebuildForeignKeysSqlite('custom_field_sections', ['tenant_id']); // custom_field_values tenant_id already handled above DB::statement('PRAGMA foreign_keys = ON'); } /** * Rebuild a table with ULID primary key (SQLite). */ private function rebuildTableWithUlidPrimarySqlite(string $tableName): void { $columns = DB::select("PRAGMA table_info({$tableName})"); $columnDefs = []; $columnNames = []; foreach ($columns as $col) { $columnNames[] = $col->name; if ($col->name === 'id') { // Change id to TEXT for ULID $columnDefs[] = 'id TEXT PRIMARY KEY'; } else { $type = $col->type; $nullable = $col->notnull ? '' : ''; $default = $col->dflt_value !== null ? " DEFAULT {$col->dflt_value}" : ''; $columnDefs[] = "{$col->name} {$type}{$nullable}{$default}"; } } // Create new table $columnDefsStr = implode(', ', $columnDefs); DB::statement("CREATE TABLE {$tableName}_new ({$columnDefsStr})"); // Copy data (excluding id, we'll generate new ULIDs) $otherColumns = array_filter($columnNames, fn ($c): bool => $c !== 'id'); if ($otherColumns !== []) { $otherColumnsStr = implode(', ', $otherColumns); $rows = DB::select("SELECT {$otherColumnsStr} FROM {$tableName}"); foreach ($rows as $row) { $values = [(string) Str::ulid()]; $placeholders = ['?']; foreach ($otherColumns as $col) { $values[] = $row->$col; $placeholders[] = '?'; } $placeholdersStr = implode(', ', $placeholders); DB::insert("INSERT INTO {$tableName}_new (id, {$otherColumnsStr}) VALUES ({$placeholdersStr})", $values); } } // Swap tables DB::statement("DROP TABLE {$tableName}"); DB::statement("ALTER TABLE {$tableName}_new RENAME TO {$tableName}"); } /** * Rebuild pivot table with ULID foreign keys (SQLite). * * @param array $foreignKeys */ private function rebuildPivotTableSqlite(string $tableName, array $foreignKeys): void { $columns = DB::select("PRAGMA table_info({$tableName})"); $columnDefs = []; $columnNames = []; foreach ($columns as $col) { $columnNames[] = $col->name; if (in_array($col->name, $foreignKeys, true)) { // Change foreign keys to TEXT for ULID $columnDefs[] = "{$col->name} TEXT"; } else { $type = $col->type; $pk = $col->pk ? ' PRIMARY KEY AUTOINCREMENT' : ''; $columnDefs[] = "{$col->name} {$type}{$pk}"; } } $columnDefsStr = implode(', ', $columnDefs); DB::statement("CREATE TABLE {$tableName}_new ({$columnDefsStr})"); // No data to copy for fresh tests DB::statement("DROP TABLE {$tableName}"); DB::statement("ALTER TABLE {$tableName}_new RENAME TO {$tableName}"); } /** * Rebuild pivot table with morph (SQLite). */ private function rebuildPivotWithMorphSqlite(string $tableName, string $fkColumn, string $morphIdColumn): void { $columns = DB::select("PRAGMA table_info({$tableName})"); $columnDefs = []; foreach ($columns as $col) { if ($col->name === $fkColumn || $col->name === $morphIdColumn) { $columnDefs[] = "{$col->name} TEXT"; } else { $type = $col->type; $pk = $col->pk ? ' PRIMARY KEY AUTOINCREMENT' : ''; $columnDefs[] = "{$col->name} {$type}{$pk}"; } } $columnDefsStr = implode(', ', $columnDefs); DB::statement("CREATE TABLE {$tableName}_new ({$columnDefsStr})"); DB::statement("DROP TABLE {$tableName}"); DB::statement("ALTER TABLE {$tableName}_new RENAME TO {$tableName}"); } /** * Rebuild morph table (SQLite). */ private function rebuildMorphTableSqlite(string $tableName, string $morphIdColumn): void { $columns = DB::select("PRAGMA table_info({$tableName})"); $columnDefs = []; foreach ($columns as $col) { if ($col->name === $morphIdColumn) { $columnDefs[] = "{$col->name} TEXT"; } else { $type = $col->type; $pk = $col->pk ? ' PRIMARY KEY AUTOINCREMENT' : ''; $columnDefs[] = "{$col->name} {$type}{$pk}"; } } $columnDefsStr = implode(', ', $columnDefs); DB::statement("CREATE TABLE {$tableName}_new ({$columnDefsStr})"); DB::statement("DROP TABLE {$tableName}"); DB::statement("ALTER TABLE {$tableName}_new RENAME TO {$tableName}"); } /** * Rebuild table with ULID foreign keys (SQLite). * * @param array $foreignKeys */ private function rebuildForeignKeysSqlite(string $tableName, array $foreignKeys): void { $columns = DB::select("PRAGMA table_info({$tableName})"); $columnDefs = []; foreach ($columns as $col) { if (in_array($col->name, $foreignKeys, true)) { $columnDefs[] = "{$col->name} TEXT"; } else { $type = $col->type; $pk = $col->pk ? ' PRIMARY KEY' : ''; $columnDefs[] = "{$col->name} {$type}{$pk}"; } } $columnDefsStr = implode(', ', $columnDefs); DB::statement("CREATE TABLE {$tableName}_new ({$columnDefsStr})"); DB::statement("DROP TABLE {$tableName}"); DB::statement("ALTER TABLE {$tableName}_new RENAME TO {$tableName}"); } // ========================================================================= // Utility Methods // ========================================================================= /** * Check if a column is already using ULID (char/string type). */ private function isAlreadyUlid(string $table, string $column): bool { if (! Schema::hasTable($table) || ! Schema::hasColumn($table, $column)) { return false; } $columnType = Schema::getColumnType($table, $column); return in_array($columnType, ['string', 'char', 'varchar', 'bpchar', 'text'], true); } }; ================================================ FILE: database/migrations/2025_12_27_122241_convert_order_column_to_decimal_and_regenerate_positions.php ================================================ dropColumn('order_column'); }); Schema::table('tasks', function (Blueprint $table): void { $table->decimal('order_column', 20, 10)->nullable(); }); // Regenerate positions for tasks $this->regenerateTaskPositions(); // Convert opportunities table order_column from VARCHAR to DECIMAL Schema::table('opportunities', function (Blueprint $table): void { $table->dropColumn('order_column'); }); Schema::table('opportunities', function (Blueprint $table): void { $table->decimal('order_column', 20, 10)->nullable(); }); // Regenerate positions for opportunities $this->regenerateOpportunityPositions(); } /** * Regenerate positions for tasks using DecimalPosition service. */ private function regenerateTaskPositions(): void { // Get all tasks with their status information, grouped by team and status // CRITICAL: Preserve existing order_column (user's manual arrangement) when regenerating positions $tasks = DB::select(" SELECT t.id, t.team_id, COALESCE(cfv.integer_value, 0) as status_id FROM tasks t LEFT JOIN custom_field_values cfv ON ( t.id = cfv.entity_id AND cfv.custom_field_id = ( SELECT id FROM custom_fields WHERE code = 'status' AND entity_type = 'App\\\\Models\\\\Task' LIMIT 1 ) ) ORDER BY t.team_id, status_id, t.order_column IS NULL, t.order_column, t.id "); // Group tasks by team and status $groupedTasks = []; foreach ($tasks as $task) { $key = "{$task->team_id}_{$task->status_id}"; $groupedTasks[$key][] = $task; } // Set positions for each group using DecimalPosition foreach ($groupedTasks as $tasks) { $this->setPositionsForGroup($tasks, 'tasks'); } } /** * Regenerate positions for opportunities using DecimalPosition service. */ private function regenerateOpportunityPositions(): void { // Get all opportunities with their stage information, grouped by team and stage // CRITICAL: Preserve existing order_column (user's manual arrangement) when regenerating positions $opportunities = DB::select(" SELECT o.id, o.team_id, COALESCE(cfv.integer_value, 0) as stage_id FROM opportunities o LEFT JOIN custom_field_values cfv ON ( o.id = cfv.entity_id AND cfv.custom_field_id = ( SELECT id FROM custom_fields WHERE code = 'stage' AND entity_type = 'App\\\\Models\\\\Opportunity' LIMIT 1 ) ) ORDER BY o.team_id, stage_id, o.order_column IS NULL, o.order_column, o.id "); // Group opportunities by team and stage $groupedOpportunities = []; foreach ($opportunities as $opportunity) { $key = "{$opportunity->team_id}_{$opportunity->stage_id}"; $groupedOpportunities[$key][] = $opportunity; } // Set positions for each group using DecimalPosition foreach ($groupedOpportunities as $opportunities) { $this->setPositionsForGroup($opportunities, 'opportunities'); } } /** * Set positions for a group of records using DecimalPosition. * * @param array $records Array of records with id property * @param string $table Table name ('tasks' or 'opportunities') */ private function setPositionsForGroup(array $records, string $table): void { if ($records === []) { return; } $count = count($records); // Generate sequential positions using DecimalPosition $positions = DecimalPosition::generateSequence($count); // Update database with new positions foreach ($records as $index => $record) { DB::table($table) ->where('id', $record->id) ->update(['order_column' => $positions[$index]]); } } /** * Reverse the migrations. */ public function down(): void { // Revert tasks table Schema::table('tasks', function (Blueprint $table): void { $table->dropColumn('order_column'); }); Schema::table('tasks', function (Blueprint $table): void { $table->string('order_column')->nullable(); }); // Revert opportunities table Schema::table('opportunities', function (Blueprint $table): void { $table->dropColumn('order_column'); }); Schema::table('opportunities', function (Blueprint $table): void { $table->string('order_column')->nullable(); }); } }; ================================================ FILE: database/migrations/2026_01_02_152157_update_phone_number_custom_fields_type.php ================================================ */ $phoneFieldIds = DB::table('custom_fields') ->where('code', 'phone_number') ->where('type', 'text') ->pluck('id'); if ($phoneFieldIds->isEmpty()) { return; } // Update the field type from text to phone DB::table('custom_fields') ->whereIn('id', $phoneFieldIds) ->update(['type' => 'phone']); // Migrate values from text_value to json_value (as JSON array) // Phone type uses multiChoice schema which stores values in json_value // NOTE: Uses lazyById() instead of each() to avoid OFFSET pagination bug // where updating rows causes them to drop from the result set, skipping subsequent rows. DB::table('custom_field_values') ->whereIn('custom_field_id', $phoneFieldIds) ->whereNotNull('text_value') ->whereNull('json_value') ->lazyById(100) ->each(function (object $row): void { DB::table('custom_field_values') ->where('id', $row->id) ->update([ 'json_value' => json_encode([$row->text_value]), 'text_value' => null, ]); }); } }; ================================================ FILE: database/migrations/2026_01_12_225824_upgrade_custom_fields_to_v3.php ================================================ true, '--skip' => 'clear-caches', ]); } }; ================================================ FILE: database/migrations/2026_02_11_232804_add_slug_to_teams_table.php ================================================ string('slug')->nullable()->after('name'); }); $this->backfillSlugs(); Schema::table('teams', function (Blueprint $table): void { $table->string('slug')->nullable(false)->unique()->change(); }); } private function backfillSlugs(): void { $teams = DB::table('teams')->oldest()->get(); $usedSlugs = []; foreach ($teams as $team) { $baseSlug = Str::slug($team->name); if ($baseSlug === '') { $baseSlug = Str::lower(Str::random(8)); } $slug = $baseSlug; $counter = 2; while (in_array($slug, $usedSlugs, true)) { $slug = "{$baseSlug}-{$counter}"; $counter++; } $usedSlugs[] = $slug; DB::table('teams')->where('id', $team->id)->update(['slug' => $slug]); } } }; ================================================ FILE: database/migrations/2026_02_12_222910_expand_imports_table.php ================================================ string('entity_type')->nullable()->after('user_id'); $table->string('status')->default('uploading')->after('entity_type'); $table->json('headers')->nullable()->after('status'); $table->json('column_mappings')->nullable()->after('headers'); $table->json('results')->nullable()->after('column_mappings'); $table->json('failed_rows_data')->nullable()->after('results'); $table->unsignedInteger('created_rows')->default(0)->after('successful_rows'); $table->unsignedInteger('updated_rows')->default(0)->after('created_rows'); $table->unsignedInteger('skipped_rows')->default(0)->after('updated_rows'); $table->string('file_path')->nullable()->change(); $table->string('importer')->nullable()->change(); }); } }; ================================================ FILE: database/migrations/2026_02_13_002721_cleanup_imports_table.php ================================================ unsignedInteger('failed_rows')->default(0)->after('skipped_rows'); }); Schema::table('imports', function (Blueprint $table): void { $table->dropColumn([ 'file_path', 'importer', 'processed_rows', 'successful_rows', 'results', 'failed_rows_data', ]); }); } }; ================================================ FILE: database/migrations/2026_02_15_214730_drop_sessions_user_id_foreign_key.php ================================================ contains('name', 'sessions_user_id_foreign'); if (! $hasForeignKey) { return; } Schema::table('sessions', function (Blueprint $table): void { $table->dropForeign(['user_id']); }); } }; ================================================ FILE: database/migrations/2026_02_20_212853_add_team_id_to_personal_access_tokens_table.php ================================================ ensureTeamsPrimaryKey(); Schema::table('personal_access_tokens', function (Blueprint $table): void { $table->foreignUlid('team_id')->nullable()->after('tokenable_id')->index()->constrained('teams')->cascadeOnDelete(); }); } /** * The ULID migration may leave teams.id without a primary key on PostgreSQL. * A foreign key constraint requires a unique/primary constraint on the referenced column. */ private function ensureTeamsPrimaryKey(): void { if (DB::getDriverName() !== 'pgsql') { return; } $hasPrimary = DB::selectOne( "SELECT 1 FROM pg_constraint WHERE conrelid = 'teams'::regclass AND contype = 'p'" ); if (! $hasPrimary) { Schema::table('teams', function (Blueprint $table): void { $table->primary('id'); }); } } }; ================================================ FILE: database/migrations/2026_02_25_124942_add_team_id_indexes_to_entity_tables.php ================================================ */ private array $tables = ['companies', 'people', 'opportunities', 'tasks', 'notes']; public function up(): void { foreach ($this->tables as $table) { $indexName = "idx_{$table}_team_activity"; if (Schema::hasIndex($table, $indexName)) { continue; } Schema::table($table, function (Blueprint $blueprint) use ($indexName): void { $blueprint->index( ['team_id', 'deleted_at', 'creation_source', 'created_at'], $indexName, ); }); } } }; ================================================ FILE: database/migrations/2026_03_15_201741_add_custom_field_value_filtering_indexes.php ================================================ index(['custom_field_id', 'float_value'], 'cfv_field_float_idx'); $table->index(['custom_field_id', 'date_value'], 'cfv_field_date_idx'); $table->index(['custom_field_id', 'datetime_value'], 'cfv_field_datetime_idx'); $table->index(['custom_field_id', 'string_value'], 'cfv_field_string_idx'); $table->index(['custom_field_id', 'integer_value'], 'cfv_field_integer_idx'); $table->index(['custom_field_id', 'boolean_value'], 'cfv_field_boolean_idx'); }); } }; ================================================ FILE: database/migrations/2026_03_18_202956_add_expires_at_to_team_invitations_table.php ================================================ timestamp('expires_at')->nullable()->after('role'); $table->index('expires_at'); }); } }; ================================================ FILE: database/seeders/DatabaseSeeder.php ================================================ call([ LocalSeeder::class, ]); } } ================================================ FILE: database/seeders/LocalSeeder.php ================================================ isLocal()) { $this->command->info('Skipping local seeding as the environment is not local.'); return; } $this->call(SystemAdministratorSeeder::class); $user = User::factory() ->withPersonalTeam() ->create([ 'name' => 'Manuk Minasyan', 'email' => 'manuk.minasyan1@gmail.com', ]); $teamId = $user->personalTeam()->id; // // User::factory() // ->withPersonalTeam() // ->create([ // 'name' => 'Test User', // 'email' => 'test@example.com', // ]); // // // Create 10 Test Users User::factory() ->count(10) ->create() ->after(function (User $user) use ($teamId): void { // Assign the user to the personal team. $user->teams()->attach($teamId, [ 'role' => 'member', ]); }); // // // Set the current user and tenant. // Auth::setUser($user); // Filament::setTenant($user->personalTeam()); // // $customFields = CustomField::query() // ->whereIn('code', ['icp', 'stage', 'domain_name']) // ->get() // ->keyBy('code'); // // Company::factory() // ->for($user->personalTeam(), 'team') // ->count(50) // ->afterCreating(function (Company $company) use ($customFields): void { // $company->saveCustomFieldValue($customFields->get('domain_name'), 'https://'.fake()->domainName()); // $company->saveCustomFieldValue($customFields->get('icp'), fake()->boolean(70)); // }) // ->create(); // // // Create people. // People::factory() // ->for($user->personalTeam(), 'team') // ->for($user->currentTeam->companies->random(), 'company') // ->state(new Sequence( // fn (Sequence $sequence): array => ['company_id' => $user->personalTeam()->companies->random()->id] // )) // ->count(500)->create(); // // // Create opportunities. // Opportunity::factory()->for($user->personalTeam(), 'team') // ->count(150) // ->afterCreating(function (Opportunity $opportunity) use ($customFields): void { // $opportunity->saveCustomFieldValue($customFields->get('stage'), $customFields->get('stage')->options->random()->id); // }) // ->create(); } } ================================================ FILE: database/seeders/SystemAdministratorSeeder.php ================================================ firstOrCreate(['email' => 'sysadmin@relaticle.com'], [ 'name' => 'System Administrator', 'password' => bcrypt('password'), 'role' => SystemAdministratorRole::SuperAdministrator, 'email_verified_at' => now(), ]); } } ================================================ FILE: lang/en/access-tokens.php ================================================ 'Access Tokens', 'sections' => [ 'create' => [ 'title' => 'Create Access Token', 'description' => 'Access tokens allow third-party services and AI agents to authenticate with our application on your behalf.', ], 'manage' => [ 'title' => 'Manage Access Tokens', 'description' => 'You may delete any of your existing tokens if they are no longer needed.', ], ], 'form' => [ 'name' => 'Token Name', 'team' => 'Team', 'expiration' => 'Expiration', 'permissions' => 'Permissions', ], 'actions' => [ 'create' => 'Create', ], 'modals' => [ 'show_token' => [ 'title' => 'Access Token', 'description' => 'Please copy your new access token. For your security, it won\'t be shown again.', ], 'permissions' => [ 'title' => 'Access Token Permissions', ], 'delete' => [ 'title' => 'Delete Access Token', 'description' => 'Are you sure you would like to delete this access token?', ], ], 'notifications' => [ 'permissions_updated' => 'Access token permissions updated.', 'deleted' => 'Access token deleted.', ], 'empty_state' => [ 'heading' => 'No access tokens', 'description' => 'Create a token above to get started.', ], 'integrations' => [ 'heading' => 'What to do next', 'api_link' => 'REST API', 'api_description' => 'Manage CRM data programmatically.', 'mcp_link' => 'MCP Server', 'mcp_description' => 'Connect AI assistants like Claude.', ], 'user_menu' => 'Access Tokens', ]; ================================================ FILE: lang/en/profile.php ================================================ [ 'name' => [ 'label' => 'Name', ], 'email' => [ 'label' => 'Email', ], 'profile_photo' => [ 'label' => 'Photo', ], 'current_password' => [ 'label' => 'Current Password', ], 'new_password' => [ 'label' => 'New Password', ], 'confirm_password' => [ 'label' => 'Confirm Password', ], 'password' => [ 'label' => 'Password', ], ], 'sections' => [ 'update_profile_information' => [ 'title' => 'Profile Information', 'description' => 'Update your account\'s profile information and email address.', ], 'update_password' => [ 'title' => 'Update Password', 'description' => 'Ensure your account is using a long, random password to stay secure.', ], 'set_password' => [ 'title' => 'Set Password', 'description' => 'Add a password to your account so you can also sign in with your email and password.', ], 'browser_sessions' => [ 'title' => 'Browser Sessions', 'description' => 'Manage and log out your active sessions on other browsers and devices.', 'notice' => 'If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.', 'labels' => [ 'current_device' => 'This device', 'last_active' => 'Last active', 'unknown_device' => 'Unknown', ], ], 'delete_account' => [ 'title' => 'Delete Account', 'description' => 'Permanently delete your account.', 'notice' => 'Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.', ], ], 'actions' => [ 'save' => 'Save', 'delete_account' => 'Delete Account', 'log_out_other_browsers' => 'Log Out Other Browser Sessions', ], 'notifications' => [ 'save' => [ 'success' => 'Saved.', ], 'logged_out_other_sessions' => [ 'success' => 'All other browser sessions have been logged out successfully.', ], ], 'modals' => [ 'delete_account' => [ 'notice' => 'Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.', 'notice_no_password' => 'Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted.', ], 'log_out_other_browsers' => [ 'title' => 'Log Out Other Browser Sessions', 'description' => 'Enter your password to confirm you would like to log out of your other browser sessions across all of your devices.', 'description_no_password' => 'Are you sure you would like to log out of your other browser sessions across all of your devices?', ], ], 'edit_profile' => 'Edit Profile', ]; ================================================ FILE: lang/en/teams.php ================================================ [ 'team_name' => [ 'label' => 'Team Name', ], 'team_slug' => [ 'label' => 'Team Slug', 'helper_text' => 'Only lowercase letters, numbers, and hyphens. This appears in your team URL.', ], 'email' => [ 'label' => 'Email', ], ], 'sections' => [ 'update_team_name' => [ 'title' => 'Team Name', 'description' => 'The team\'s name and owner information.', ], 'add_team_member' => [ 'title' => 'Add Team Member', 'description' => 'Add a new team member to your team, allowing them to collaborate with you.', 'notice' => 'Please provide the email address of the person you would like to add to this team.', ], 'team_members' => [ 'title' => 'Team Members', 'description' => 'All of the people that are part of this team.', ], 'pending_team_invitations' => [ 'title' => 'Pending Team Invitations', 'description' => 'These people have been invited to your team and have been sent an invitation email. They may join the team by accepting the email invitation.', ], 'delete_team' => [ 'title' => 'Delete Team', 'description' => 'Permanently delete this team.', 'notice' => 'Once a team is deleted, all of its resources and data will be permanently deleted. Before deleting this team, please download any data or information that you wish to retain.', ], ], 'actions' => [ 'save' => 'Save', 'add_team_member' => 'Add', 'update_team_role' => 'Manage Role', 'remove_team_member' => 'Remove', 'leave_team' => 'Leave', 'resend_team_invitation' => 'Resend', 'extend_team_invitation' => 'Extend', 'copy_invite_link' => 'Copy Link', 'cancel_team_invitation' => 'Cancel', 'delete_team' => 'Delete Team', ], 'notifications' => [ 'save' => [ 'success' => 'Saved.', ], 'team_invitation_sent' => [ 'success' => 'Team invitation sent.', ], 'team_invitation_cancelled' => [ 'success' => 'Team invitation cancelled.', ], 'team_invitation_extended' => [ 'success' => 'Team invitation extended.', ], 'invite_link_copied' => [ 'success' => 'Invite link copied to clipboard.', ], 'team_member_removed' => [ 'success' => 'You have removed this team member.', ], 'leave_team' => [ 'success' => 'You have left the team.', ], 'team_deleted' => [ 'success' => 'Team deleted!', ], 'permission_denied' => [ 'cannot_update_team_member' => 'You do not have permission to update this team member.', 'cannot_leave_team' => 'You may not leave a team that you created.', 'cannot_remove_team_member' => 'You do not have permission to remove this team member.', ], ], 'validation' => [ 'email_already_invited' => 'This user has already been invited to the team.', ], 'modals' => [ 'leave_team' => [ 'notice' => 'Are you sure you would like to leave this team?', ], 'delete_team' => [ 'notice' => 'Are you sure you want to delete this team? Once a team is deleted, all of its resources and data will be permanently deleted.', ], ], 'edit_team' => 'Edit Team', ]; ================================================ FILE: package.json ================================================ { "private": true, "type": "module", "scripts": { "dev": "vite", "prebuild": "rm -f public/hot", "build": "vite build" }, "devDependencies": { "@tailwindcss/forms": "^0.5.11", "@tailwindcss/typography": "^0.5.19", "autoprefixer": "^10.4.27", "chokidar": "^5.0.0", "laravel-vite-plugin": "^2.1", "playwright": "^1.54.1", "postcss": "^8.5.8", "postcss-nesting": "^14.0.0", "tailwindcss": "^4.2.1", "vite": "^7.3" }, "dependencies": { "@alpinejs/collapse": "^3.15.10", "@tailwindcss/vite": "^4.2.1", "alpinejs": "^3.15.10", "motion": "^12.34.3", "shiki": "^4.0.2" } } ================================================ FILE: packages/Documentation/README.md ================================================ # Documentation Package A dedicated documentation package for the Relaticle application with a modern, customized frontend architecture. ## Features - Modern frontend architecture with TailwindCSS 3 and Alpine.js 3 - Responsive design with mobile-first approach - Dark mode support with system preference detection - Interactive table of contents with active state highlighting - Code block syntax highlighting with copy functionality - Search functionality with highlighted results - Custom callout components for warnings, tips, notes - Keyboard navigation and accessibility improvements - Print styles for documentation pages ## Installation The Documentation package is included in the Relaticle application by default. If you need to install it manually: ```bash # Publish the package's resources php artisan vendor:publish --tag=documentation-views php artisan vendor:publish --tag=documentation-markdown php artisan vendor:publish --tag=documentation-config # Install dependencies cd packages/Documentation npm install # Build assets npm run build ``` ## Development To work on the Documentation package's frontend: ```bash # Start the Vite development server cd packages/Documentation npm run dev ``` ## Asset Architecture The Documentation package uses a dedicated asset pipeline with separate CSS and JS files: - `resources/css/documentation.css`: Main CSS file with Tailwind directives - `resources/js/documentation.js`: Main JS file with Alpine.js components - `tailwind.config.js`: TailwindCSS configuration for the Documentation package - `vite.config.js`: Vite configuration for the Documentation package ## Components ### Layout Components - ``: The main layout component for documentation pages - ``: The content component for documentation pages ### UI Components - ``: Callout component for warnings, tips, notes ## Usage To render a documentation page: ```php ``` To create a callout: ```php This is a helpful tip for the documentation. ``` Available callout types: - `info` (default) - `warning` - `danger` - `tip` ## Customization ### Styling The Documentation package uses TailwindCSS 3 with a custom configuration. You can customize the styles by editing: - `tailwind.config.js`: Colors, typography, and other Tailwind settings - `resources/css/documentation.css`: Custom components and utilities ### Templates The Documentation package's templates are located in: - `resources/views/components/`: Blade components - `resources/views/`: Blade templates ## Accessibility The Documentation package is designed with accessibility in mind: - Proper ARIA attributes on interactive elements - Keyboard navigation for all features - Focus management for interactive components - Color contrast meeting WCAG AA standards - Dark mode support for reduced eye strain ## Browser Support The Documentation package supports all modern browsers: - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) ## License The Documentation package is open-source software licensed under the [MIT license](https://opensource.org/licenses/MIT). ================================================ FILE: packages/Documentation/config/documentation.php ================================================ [ 'enabled' => env('DOCUMENTATION_CACHE_ENABLED', true), 'ttl' => env('DOCUMENTATION_CACHE_TTL', 3600), // In seconds ], /* |-------------------------------------------------------------------------- | Search Settings |-------------------------------------------------------------------------- | | Controls search functionality behavior and constraints. | */ 'search' => [ 'enabled' => true, 'min_length' => 3, 'highlight' => true, ], /* |-------------------------------------------------------------------------- | Documentation Types |-------------------------------------------------------------------------- | | Defines the types of documentation available in the system. | */ 'documents' => [ 'getting-started' => [ 'title' => 'Getting Started', 'file' => 'getting-started.md', 'description' => 'Set up your account and learn the basics.', ], 'import' => [ 'title' => 'Import Guide', 'file' => 'import-guide.md', 'description' => 'Import data from CSV files.', ], 'developer' => [ 'title' => 'Developer Guide', 'file' => 'developer-guide.md', 'description' => 'Installation, architecture, and contributing.', ], 'self-hosting' => [ 'title' => 'Self-Hosting Guide', 'file' => 'self-hosting-guide.md', 'description' => 'Deploy Relaticle with Docker or manually.', ], 'mcp' => [ 'title' => 'MCP Server', 'file' => 'mcp-guide.md', 'description' => 'Connect AI assistants like Claude to your CRM.', ], 'api' => [ 'title' => 'API Reference', 'url' => '/docs/api', 'description' => 'REST API documentation for managing CRM entities.', ], ], /* |-------------------------------------------------------------------------- | Markdown Processing |-------------------------------------------------------------------------- | | Settings for markdown processing and rendering. | */ 'markdown' => [ 'allow_html' => false, 'code_highlighting' => true, 'table_of_contents' => true, 'base_path' => base_path('packages/Documentation/resources/markdown'), ], ]; ================================================ FILE: packages/Documentation/resources/css/documentation.css ================================================ @import 'tailwindcss'; @import "~/css/theme.css"; mark { background: oklch(0.42 0.24 287.23 / 0.1); color: inherit; padding: 1px 3px; border-radius: 3px; } :is(.dark) mark { background: oklch(0.42 0.24 287.23 / 0.2); } #documentation-content { h1, h2, h3 { @apply font-display relative; } h2, h3 { @apply cursor-pointer w-fit; } .heading-permalink { @apply absolute -left-6 top-1/2 -translate-y-1/2 opacity-0 text-gray-300 dark:text-gray-600 transition-all no-underline; } h2:hover .heading-permalink, h3:hover .heading-permalink { @apply opacity-100 text-[var(--color-primary)] dark:text-[var(--color-primary-400)]; } h1 .heading-permalink { @apply hidden; } /* Code block wrapper for sticky copy button */ .code-block-wrapper { @apply relative rounded-lg bg-gray-900 dark:bg-gray-950; margin: 1rem 0; } .code-block-wrapper pre { @apply rounded-lg bg-transparent text-gray-100 text-sm leading-relaxed overflow-x-auto m-0; padding: 1rem 1.25rem; } /* Standalone pre without wrapper */ pre:not(.code-block-wrapper pre) { @apply rounded-lg bg-gray-900 dark:bg-gray-950 text-gray-100 text-sm leading-relaxed overflow-x-auto; padding: 1rem 1.25rem; margin: 1rem 0; } pre code { @apply bg-transparent p-0 text-sm font-mono; white-space: pre; word-spacing: normal; word-break: normal; tab-size: 4; } /* Inline code */ :not(pre) > code { @apply bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 px-1.5 py-0.5 rounded text-sm font-mono; } /* Copy button - positioned on wrapper, stays fixed during scroll */ .copy-button { @apply absolute top-2 right-2 p-1.5 rounded-md bg-gray-700/80 hover:bg-gray-600 text-gray-400 hover:text-gray-200 transition-all opacity-0 cursor-pointer border-0 flex items-center justify-center w-8 h-8 z-10; } .code-block-wrapper:hover .copy-button, pre:hover > .copy-button { @apply opacity-100; } .copy-button.copied { @apply text-green-400; } .copy-button svg { @apply w-4 h-4 shrink-0; } } ================================================ FILE: packages/Documentation/resources/js/documentation.js ================================================ // Copy button functionality for code blocks function addCopyButtons() { const codeBlocks = document.querySelectorAll('pre code'); codeBlocks.forEach((codeBlock) => { const pre = codeBlock.parentElement; // Skip if already wrapped if (pre.parentElement?.classList.contains('code-block-wrapper')) return; // Create wrapper div to hold pre and copy button const wrapper = document.createElement('div'); wrapper.className = 'code-block-wrapper'; // Insert wrapper before pre and move pre inside pre.parentNode.insertBefore(wrapper, pre); wrapper.appendChild(pre); // Create copy button const copyButton = document.createElement('button'); copyButton.className = 'copy-button'; copyButton.setAttribute('aria-label', 'Copy code to clipboard'); copyButton.innerHTML = ` `; // Add click handler copyButton.addEventListener('click', async () => { const text = codeBlock.textContent; try { await navigator.clipboard.writeText(text); // Show success state with subtle feedback copyButton.classList.add('copied'); copyButton.querySelector('.copy-icon').style.display = 'none'; copyButton.querySelector('.check-icon').style.display = 'block'; // Reset after 1.5 seconds setTimeout(() => { copyButton.classList.remove('copied'); copyButton.querySelector('.copy-icon').style.display = 'block'; copyButton.querySelector('.check-icon').style.display = 'none'; }, 1500); } catch (err) { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; textArea.style.opacity = '0'; document.body.appendChild(textArea); textArea.select(); try { document.execCommand('copy'); copyButton.classList.add('copied'); copyButton.querySelector('.copy-icon').style.display = 'none'; copyButton.querySelector('.check-icon').style.display = 'block'; setTimeout(() => { copyButton.classList.remove('copied'); copyButton.querySelector('.copy-icon').style.display = 'block'; copyButton.querySelector('.check-icon').style.display = 'none'; }, 1500); } catch (err) { console.error('Failed to copy code:', err); } document.body.removeChild(textArea); } }); // Append button to wrapper (not pre), so it stays fixed during horizontal scroll wrapper.appendChild(copyButton); }); } // Simple smooth scrolling for anchor links document.addEventListener('DOMContentLoaded', function() { // Add copy buttons to code blocks addCopyButtons(); // Watch for dynamic content changes const observer = new MutationObserver(() => { addCopyButtons(); }); const contentElement = document.getElementById('documentation-content'); if (contentElement) { observer.observe(contentElement, { childList: true, subtree: true }); } // Make h2/h3 heading text clickable -- navigate to their anchor document.querySelectorAll('#documentation-content h2, #documentation-content h3').forEach(function(heading) { heading.addEventListener('click', function(e) { if (e.target.closest('a')) return; if (e.target !== heading && !heading.contains(e.target)) return; var permalink = heading.querySelector('.heading-permalink'); if (permalink) { var href = permalink.getAttribute('href'); if (href) { var targetId = href.substring(1); var targetEl = document.getElementById(targetId); if (targetEl) { var pos = targetEl.getBoundingClientRect().top + window.scrollY - 80; window.scrollTo({ top: pos, behavior: 'smooth' }); history.pushState(null, null, href); } } } }); }); // Add smooth scrolling document.addEventListener('click', function(e) { const link = e.target.closest('a[href^="#"]'); if (link) { e.preventDefault(); const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); if (targetElement) { // Calculate the element's position relative to the document const elementPosition = targetElement.getBoundingClientRect().top + window.scrollY; const offsetPosition = elementPosition - 80; // Scroll with offset for fixed header window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); // Update the URL hash without scrolling history.pushState(null, null, `#${targetId}`); } } }); }); // Ensure sidebars can properly scroll function adjustSidebarHeights() { // Calculate available height for sidebars const viewportHeight = window.innerHeight; const topOffset = 96; // 24 (top-24 in TailwindCSS) = 6rem const sidebarMaxHeight = viewportHeight - topOffset; // Apply height to sidebar containers if needed document.querySelectorAll('.docs-sidebar > div, .toc').forEach(sidebar => { if (sidebar) { sidebar.style.maxHeight = `${sidebarMaxHeight}px`; } }); } // Run on load and resize window.addEventListener('load', adjustSidebarHeights); window.addEventListener('resize', adjustSidebarHeights); ================================================ FILE: packages/Documentation/resources/markdown/developer-guide.md ================================================ # Developer Guide Technical documentation for developers and contributors. --- ## Quick Start ``` git clone https://github.com/Relaticle/relaticle.git cd relaticle && composer app-install composer run dev ``` Visit `http://localhost:8000` to access the application. --- ## Tech Stack | Component | Technology | |-----------|---------------------------------------| | Backend | PHP 8.4, Laravel 12 | | Admin UI | Filament 5 | | Frontend | Livewire 4, Alpine.js, Tailwind CSS 4 | | Database | PostgreSQL | | Queue | Laravel Horizon | | Testing | Pest v4 | | Static Analysis | PHPStan (Level 7) | | Code Style | Laravel Pint, Rector | | Auth | Laravel Jetstream | --- ## Architecture ### Core Models ``` Team ─┬─ User (via Membership) ├─ Company ─┬─ People │ └─ Opportunity ─── Contact (People) ├─ Task (many-to-many with Company, People, Opportunity) └─ Note (many-to-many with Company, People, Opportunity) ``` ### Multi-Tenancy All workspace data is isolated via the `HasTeam` trait. Every query automatically scopes to the current team. ### Key Traits | Trait | Purpose | |-------|---------| | `HasTeam` | Workspace isolation | | `HasCreator` | Tracks record creator | | `HasNotes` | Polymorphic notes relationship | | `HasAiSummary` | AI-generated summaries | --- ## Development Setup ### Requirements - **PHP 8.4+** with extensions: pdo_pgsql, gd, bcmath, mbstring, xml - **PostgreSQL 17+** - **Node.js 20+** - **Composer 2+** ### Manual Installation ``` git clone https://github.com/Relaticle/relaticle.git cd relaticle composer install npm install cp .env.example .env php artisan key:generate php artisan migrate php artisan storage:link npm run build composer run dev ``` ### Environment Config For PostgreSQL: ``` DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=relaticle DB_USERNAME=postgres DB_PASSWORD=your_password ``` --- ## Quality Tools ``` composer lint # Format with Pint + Rector composer test:lint # Check formatting composer test:types # PHPStan analysis composer test:pest # Run tests composer test # All checks (required before PR) ``` ### Git Hooks Enable pre-commit checks: ``` git config core.hooksPath .githooks ``` --- ## Testing All contributions require: - Unit tests for new functionality - Feature tests for user interactions - Minimum 99.9% type coverage Run specific tests: ``` php artisan test tests/Feature/ExampleTest.php php artisan test --filter="test_method_name" ``` --- ## Custom Fields Relaticle includes a custom fields system for extending entities without migrations. - **License**: AGPL-3.0 (free for open source) or Commercial - **Docs**: [Custom Fields Documentation](https://relaticle.github.io/custom-fields/) --- ## Deployment For production deployment instructions, including Docker setup, environment configuration, reverse proxy, and platform-specific guides (Dokploy, Coolify), see the **Self-Hosting Guide**. --- ## Troubleshooting | Issue | Solution | |-------|----------| | Queue not processing | `php artisan queue:restart` | | File upload errors | `chmod -R 775 storage bootstrap/cache` | | Slow queries | Use Laravel Telescope to identify, then add indexes | | View cache issues | `php artisan view:clear && npm run build` | --- ## Contributing 1. Fork the repository 2. Create a feature branch: `git checkout -b feat/your-feature` 3. Make changes following coding standards 4. Run tests: `composer test` 5. Commit with conventional messages 6. Open a Pull Request PRs must pass all checks before merge. --- ## Resources - [Laravel Docs](https://laravel.com/docs/12.x) - [Filament Docs](https://filamentphp.com/docs) - [Livewire Docs](https://livewire.laravel.com/) - [Pest Docs](https://pestphp.com/) ================================================ FILE: packages/Documentation/resources/markdown/getting-started.md ================================================ # Getting Started Welcome to Relaticle. This guide gets you up and running in 5 minutes. --- ## Quick Setup ### 1. Create Your Account 1. Go to the registration page 2. Enter your name, email, and password 3. You'll be taken to your new workspace ### 2. Complete Your Profile 1. Click your avatar in the top-right corner 2. Select **Profile** 3. Add your profile photo and details ### 3. Invite Team Members 1. Click your workspace name in the sidebar 2. Select **Team Settings** 3. Click **Invite Member** 4. Enter their email address and select a role --- ## Core Concepts Relaticle organizes your customer data into five connected entities: | Entity | Purpose | Example | |--------|---------|---------| | **Companies** | Organizations you work with | Acme Corporation | | **People** | Contacts at companies | John Doe, CEO at Acme | | **Opportunities** | Deals in your sales pipeline | Q1 Enterprise Contract | | **Tasks** | Actions to complete | Follow up on proposal | | **Notes** | Important information to remember | Meeting notes from call | **How they connect:** - People belong to Companies - Opportunities link to Companies and People - Tasks and Notes can be attached to any record --- ## Your First Actions ### Add a Company 1. Click **Companies** in the sidebar 2. Click **New Company** (top right) 3. Enter the company name (required) 4. Add optional details: website, address, phone 5. Click **Create** ### Add a Contact 1. Open the company you just created 2. In the **People** section, click **Create People** 3. Enter the contact's name (required) 4. Add their email, phone, and title 5. Click **Create** ### Create an Opportunity 1. Click **Opportunities** in the sidebar 2. Click **New Opportunity** 3. Enter the opportunity name 4. Select the **Company** and **Contact** 5. Click **Create** ### Add a Follow-Up Task 1. Open your opportunity 2. In the **Tasks** section, click **Create Task** 3. Enter a title (e.g., "Send proposal") 4. Set a due date and priority 5. Assign it to yourself or a team member 6. Click **Create** --- ## Custom Fields Every entity supports custom fields for tracking data specific to your business. **To manage custom fields:** 1. Click the **Settings** icon in the sidebar 2. Select **Custom Fields** 3. Choose the entity type (Companies, People, etc.) 4. Add, edit, or reorder fields **Field types available:** - Text, Number, Date, Email, URL - Select (dropdown), Multi-select - Boolean (yes/no) --- ## Import Existing Data Already have data in spreadsheets? Import it directly. 1. Go to any entity list (Companies, People, etc.) 2. Click **Import** in the header 3. Upload your CSV file 4. Map columns to Relaticle fields 5. Review and import See the **Import Guide** for detailed instructions and CSV templates. --- ## Daily Workflow **Start of day:** - Check your **Tasks** for today's priorities - Review any new **Opportunities** **Throughout the day:** - Update records after customer interactions - Add **Notes** to capture important details - Create **Tasks** for follow-ups **End of day:** - Ensure all activities are logged - Update opportunity stages as needed --- ## What's Next - **Import data** → See the Import Guide - **Customize fields** → Settings > Custom Fields - **Integrate via API** → [API Reference](/docs/api) ================================================ FILE: packages/Documentation/resources/markdown/import-guide.md ================================================ # Import Guide Relaticle's import wizard lets you bulk import data from CSV files into your CRM. ## Supported Entities - **Companies** - Organizations and accounts - **People** - Contacts linked to companies - **Opportunities** - Deals and sales pipeline - **Tasks** - Action items and to-dos - **Notes** - Meeting notes and observations --- ## Quick Start ### File Requirements | Requirement | Value | |-------------|-------| | Format | CSV (comma-separated values) | | Encoding | UTF-8 | | Max Rows | 10,000 per file | | Max Size | 10MB | | Headers | Required in first row | **Tip**: In Excel, use "Save As" → "CSV UTF-8 (Comma delimited)". ### Required Fields | Entity | Required | |--------|----------| | Companies | Name | | People | Name | | Opportunities | Name | | Tasks | Title | | Notes | Title | --- ## The 4-Step Process ### Step 1: Upload 1. Navigate to the entity list (Companies, People, etc.) 2. Click **Import** 3. Select your CSV file 4. Review file info (columns found, row count) ### Step 2: Map Columns The wizard automatically matches CSV columns to Relaticle fields by comparing column names. **Auto-Mapping Examples**: - "company_name", "Company", "Organization" → Company Name - "email", "Email Address", "contact_email" → Email - "custom_fields_industry" → Industry custom field **Manual Adjustment**: Click any dropdown to change the mapping or select "Don't Import" to skip a column. **Linking Related Records**: When mapping a column to a relationship (like Company or Contact), a submenu appears where you choose the match method — by Record ID, Domain, Email, or Name. ### Step 3: Review Values The wizard analyzes your data and flags validation issues. **Actions You Can Take**: - **Fix**: Enter a corrected value to apply to all rows with that value - **Skip**: Click the skip icon to exclude a value. The row will still be imported, but this field will be empty - **Change Date Format**: For date columns, select the correct format if auto-detection is uncertain ### Step 4: Preview & Import Review what will happen: - **New**: Records that will be created - **Update**: Existing records that will be modified Click **Start Import** when ready. Large imports process in the background. --- ## Date Format Detection The import wizard automatically detects date formats in your CSV and handles three common formats: ### Supported Formats | Format | Pattern | Example | |--------|---------|---------| | **ISO** | YYYY-MM-DD | 2024-05-15 | | **European** | DD/MM/YYYY or DD-MM-YYYY | 15/05/2024, 15 May 2024 | | **American** | MM/DD/YYYY or MM-DD-YYYY | 05/15/2024, May 15th 2024 | ### How Detection Works The wizard analyzes your date values to determine the format: 1. **Unambiguous dates**: When the day is > 12, the format is clear - `31/01/2024` → Must be European (DD/MM) - `01/31/2024` → Must be American (MM/DD) 2. **Ambiguous dates**: When both positions are ≤ 12 - `01/02/2024` → Could be Jan 2 or Feb 1 - You'll see a warning and can select the correct format 3. **ISO dates**: Always unambiguous - `2024-01-15` → Clearly January 15 ### Selecting Date Format In Step 3 (Review Values), date columns show a format dropdown: - **High confidence**: Format auto-selected, dropdown shows detected format - **Low confidence**: Warning icon appears, select the correct format manually **Example**: If your CSV has `01/02/2024` and you know it means February 1st (European), select "European" from the dropdown. --- ## Matching Existing Records When you map a field that uniquely identifies records (like email or domain), the wizard automatically finds matches in your existing data. How matching works depends on the match method you choose in Step 2. ### Match Methods | Method | Behavior | Available For | |--------|----------|---------------| | **Record ID** | Updates the exact record. Skips if ID not found. | All entities | | **Domain** | Finds existing company by domain, or creates new. | Companies | | **Email** | Finds existing person by email, or creates new. | People | | **Phone** | Finds existing person by phone, or creates new. | People | | **Name** | Always creates a new record (names aren't unique). | Companies, People | ### What Happens in Preview After the wizard resolves matches, Step 4 shows the result: - Rows matched to existing records → **Update** - Rows with no match (or using Name matching) → **Create new** - Rows with an ID that doesn't exist → **Skip** ### No Unique Field Mapped? If you don't map any matchable field, the wizard shows a warning: all rows will be created as new records. You can go back and map a field, or continue anyway. ### Update Behavior When the wizard matches a CSV row to an existing record, updates follow these rules: - **Blank fields are ignored**: If a CSV column is empty, the existing value is preserved. You don't need to fill in every column — only include the fields you want to change. - **Multi-value fields merge**: For fields that accept multiple values (emails, phone numbers, tags, multi-select), new values are merged with existing ones rather than replacing them. - **Duplicates within the CSV**: If the same record appears multiple times in your file (e.g., two rows with the same email), the second row updates the first instead of creating a duplicate. --- ## ID-Based Updates For precise updates, include Record IDs from a previous export. ### Workflow 1. **Export** your records (includes `id` column with ULIDs) 2. **Modify** the CSV, keeping the `id` column intact 3. **Re-import** - rows with valid IDs update those exact records ### Example ``` id,name,custom_fields_industry 01KCCFMZ52QWZSQZWVG0AP704V,Acme Corporation,Software 01KCCFN1A8XVQR4ZFWB3KC5M7P,TechStart Inc,Hardware ``` **Preview shows**: - Rows with valid IDs → "Update" - Rows without IDs → "New" ### Mixed Imports You can create and update in the same file: ``` id,name 01KCCFMZ52QWZSQZWVG0AP704V,Update This Company ,New Company (blank ID = create new) ``` --- ## Entity-Specific Details ### Companies **Fields**: - `name` (required) - Company name - `account_owner_email` - Team member email for ownership - Custom fields with `custom_fields_` prefix **Matching**: By domain (`custom_fields_domains`) or Record ID ``` name,account_owner_email,custom_fields_industry,custom_fields_domains Acme Corporation,owner@yourcompany.com,Technology,acme.com ``` ### People **Fields**: - `name` (required) - Person's full name - Custom fields with `custom_fields_` prefix **Relationships** (mapped in Step 2): - **Company** - Link to a company. Match by Record ID, Domain, or Name (creates new). **Matching**: By email (`custom_fields_emails`), phone (`custom_fields_phone_number`), or Record ID ``` name,company,custom_fields_emails,custom_fields_title John Doe,acme.com,john@acme.com,CEO Jane Smith,acme.com,jane@acme.com,CTO ``` **Note**: In the example above, the `company` column is mapped to the Company relationship. In Step 2, choose "Match by Domain" so `acme.com` links to the existing company. If you choose "Match by Name", a new company will always be created. ### Opportunities **Fields**: - `name` (required) - Opportunity name - Custom fields (amount, stage, close_date, etc.) **Relationships** (mapped in Step 2): - **Company** - Link to a company. Match by Record ID, Domain, or Name. - **Contact** - Link to a person. Match by Record ID, Email, Phone, or Name. **Matching**: Record ID only ``` name,company,contact,custom_fields_amount,custom_fields_stage Q1 Enterprise Deal,acme.com,john@acme.com,50000,Proposal ``` **Note**: Map the `company` column to Company → Domain and the `contact` column to Contact → Email for the best matching results. ### Tasks **Fields**: - `title` (required) - Task title **Relationships** (mapped in Step 2): - **Companies** - Link to one or more companies - **People** - Link to one or more people - **Opportunities** - Link to one or more opportunities - **Assignees** - Assign to team members by email **Matching**: Record ID only ``` title,assignee,company,custom_fields_due_date,custom_fields_priority Follow up with client,assignee@yourcompany.com,acme.com,2024-03-15,High ``` **Note**: The `assignee` column is mapped to the Assignees relationship in Step 2. Choose "Match by Email" to link to team members by their email address. ### Notes **Fields**: - `title` (required) - Note title **Relationships** (mapped in Step 2): - **Companies** - Link to one or more companies - **People** - Link to one or more people - **Opportunities** - Link to one or more opportunities **Matching**: None. Notes are always created as new records. ``` title,company Meeting Notes,acme.com ``` --- ## Custom Fields ### Column Naming Use the prefix `custom_fields_` followed by the field code: ``` custom_fields_industry custom_fields_emails custom_fields_website ``` Find field codes in **Settings → Custom Fields** under the "Code" column. ### Field Type Formatting | Type | Format | Example | |------|--------|---------| | Text | Plain text | `Technology` | | Number | Numeric, no symbols | `50000` | | Date | YYYY-MM-DD, DD/MM/YYYY, or MM/DD/YYYY | `2024-03-15` | | Email | Valid email(s), comma-separated | `john@acme.com,jane@acme.com` | | Select | Exact option label | `Enterprise` | | Multi-Select | Comma-separated labels | `CRM,Analytics` | | Boolean | true/false, yes/no, 1/0 | `true` | --- ## CSV Best Practices ### Do - Include headers in the first row - Save as UTF-8 encoding - Quote values containing commas: `"Last, First"` - Use consistent formatting within each column - Test with a small sample first (5-10 rows) ### Don't - Use Excel's default encoding (use "CSV UTF-8") - Mix date formats in the same column - Include currency symbols in numbers: use `50000` not `$50,000` - Leave empty rows at the end of the file ### Date Formatting Tips The wizard accepts multiple date formats, but consistency is key: **Good** (pick one format per column): - `2024-03-15` (ISO - recommended) - `15/03/2024` (European) - `03/15/2024` (American) **Avoid**: - Mixing formats: `2024-03-15` and `03/15/2024` in same column - Two-digit years without context: `03/15/24` --- ## Troubleshooting ### Upload Issues | Problem | Solution | |---------|----------| | File too large | Split into files under 10,000 rows each | | Invalid format | Re-save as "CSV UTF-8" from Excel | | Upload fails | Check internet, try smaller file | ### Mapping Issues | Problem | Solution | |---------|----------| | Column not auto-mapped | Manually select from dropdown | | Custom field missing | Check field code in Settings → Custom Fields | | Required field red | Map a CSV column to the required field | ### Validation Issues | Problem | Solution | |---------|----------| | Invalid email | Fix email format: `user@domain.com` | | Invalid date | Use a supported format (ISO, European, or American) | | Invalid ID | Re-export to get fresh Record IDs | | Unknown select option | Use exact option label from field settings | ### Import Issues | Problem | Solution | |---------|----------| | Stuck at "Processing" | Large imports take time; check back in a few minutes | | Some rows failed | Download failed rows, fix errors, re-import | | Unexpected duplicates | Map a unique field (email, domain, or ID) in Step 2 | --- ## FAQ **Can I import multiple entity types at once?** No, each entity imports separately. When importing People, related companies can be auto-created if you choose "Match by Name" for the Company relationship. **What happens if my import fails halfway?** Successful rows remain. Failed rows can be downloaded, fixed, and re-imported. **Can I undo an import?** No automatic undo. Test with small samples first and backup important data. **How do I update existing records?** Include the `id` column from a previous export. For People, email or phone matching also works. For Companies, domain matching works. **What date formats are supported?** ISO (YYYY-MM-DD), European (DD/MM/YYYY), and American (MM/DD/YYYY). The wizard auto-detects the format. **What if a date is ambiguous (like 01/02/2024)?** You'll see a warning. Use the format dropdown to select European or American interpretation. **What's the maximum file size?** 10MB or 10,000 rows per file. Split larger datasets into multiple imports. **Do imports run in real-time?** Small imports complete immediately. Large imports process in the background with progress updates. **How does the wizard match existing records?** It depends on which match method you choose in Step 2. Record ID updates exact records. Domain and email find existing records or create new ones. Name always creates new records. **Can Notes be updated via import?** No. Notes are always created as new records regardless of whether you include an ID column. --- ## CSV Templates Export existing records to get perfectly formatted templates with all your custom fields. ### Company Template ``` id,name,account_owner_email,custom_fields_industry,custom_fields_domains ,Acme Corporation,owner@yourcompany.com,Technology,acme.com ``` ### People Template ``` id,name,company,custom_fields_emails,custom_fields_title ,John Doe,acme.com,john@acme.com,CEO ``` **Tip**: Map the `company` column to Company → Domain to link to existing companies. Choose "Match by Name" only when you want to create new companies. ### Opportunity Template ``` id,name,company,contact,custom_fields_amount,custom_fields_stage ,Q1 Enterprise Deal,acme.com,john@acme.com,50000,Proposal ``` **Tip**: Map `company` to Company → Domain and `contact` to Contact → Email to link to existing records. ### Task Template ``` id,title,assignee,custom_fields_due_date,custom_fields_priority ,Follow up with client,assignee@yourcompany.com,2024-03-15,High ``` **Tip**: Map the `assignee` column to Assignees → Email to assign tasks to team members. ### Note Template ``` title,company Meeting Notes,acme.com ``` **Tip**: Export any existing record to get a template with all your workspace's custom fields already included. ================================================ FILE: packages/Documentation/resources/markdown/mcp-guide.md ================================================ # MCP Server MCP (Model Context Protocol) lets AI assistants like Claude work directly with your Relaticle CRM data. Instead of copy-pasting between tools, your AI assistant can list companies, create tasks, update contacts, and more -- all from a natural conversation. --- ## What You Can Do With the Relaticle MCP server, your AI assistant can: - **List and search** companies, people, opportunities, tasks, and notes - **Create new records** directly from a conversation - **Update existing records** -- rename a company, reassign a task - **Delete records** you no longer need - **Read entity schemas** to understand your custom fields - **Get a CRM overview** with record counts and recent activity --- ## Prerequisites Before connecting an AI assistant, you need an access token: 1. Log in to Relaticle 2. Click your avatar in the top-right corner 3. Select **Access Tokens** 4. Click **Create** and give your token a name 5. Copy the token -- it won't be shown again The token scopes your access to the team you select when creating it. All MCP operations use that team's data. --- ## Setup by Client The MCP server endpoint is `https://mcp.relaticle.com`. Replace `YOUR_TOKEN` in the examples below with the access token you created above. ### Claude Desktop Add this to your Claude Desktop configuration file (`claude_desktop_config.json`): ```json { "mcpServers": { "relaticle": { "type": "streamable-http", "url": "https://mcp.relaticle.com", "headers": { "Authorization": "Bearer YOUR_TOKEN" } } } } ``` ### Claude Code Add the server from your terminal: ```bash claude mcp add relaticle \ --transport streamable-http \ https://mcp.relaticle.com \ --header "Authorization: Bearer YOUR_TOKEN" ``` ### Cursor Add this to your Cursor MCP configuration (`.cursor/mcp.json`): ```json { "mcpServers": { "relaticle": { "type": "streamable-http", "url": "https://mcp.relaticle.com", "headers": { "Authorization": "Bearer YOUR_TOKEN" } } } } ``` ### VS Code (GitHub Copilot) Add this to your VS Code settings (`.vscode/mcp.json`): ```json { "servers": { "relaticle": { "type": "streamable-http", "url": "https://mcp.relaticle.com", "headers": { "Authorization": "Bearer YOUR_TOKEN" } } } } ``` --- ## Available Tools The server provides 30 tools across five CRM entities: ### Companies | Tool | Description | |------|-------------| | `list_companies` | List companies with optional search by name and pagination | | `create_company` | Create a new company (requires `name`) | | `update_company` | Update a company by ID | | `delete_company` | Soft-delete a company by ID | ### People | Tool | Description | |------|-------------| | `list_people` | List contacts with optional search, filter by company | | `create_people` | Create a new contact (requires `name`, optional `company_id`) | | `update_people` | Update a contact by ID | | `delete_people` | Soft-delete a contact by ID | ### Opportunities | Tool | Description | |------|-------------| | `list_opportunities` | List deals with optional search, filter by company | | `create_opportunity` | Create a new deal (requires `name`, optional `company_id`, `contact_id`) | | `update_opportunity` | Update a deal by ID | | `delete_opportunity` | Soft-delete a deal by ID | ### Tasks | Tool | Description | |------|-------------| | `list_tasks` | List tasks with optional search by title | | `create_task` | Create a new task (requires `title`) | | `update_task` | Update a task by ID | | `delete_task` | Soft-delete a task by ID | ### Notes | Tool | Description | |------|-------------| | `list_notes` | List notes with optional search by title | | `create_note` | Create a new note (requires `title`) | | `update_note` | Update a note by ID | | `delete_note` | Soft-delete a note by ID | All list tools support `search`, `per_page` (default 15), and `page` parameters. Create and update tools accept `custom_fields` as key-value pairs when your team has custom fields configured. --- ## Schema Resources The server exposes five schema resources that describe each entity's fields, including any custom fields your team has configured: | Resource URI | Description | |---|---| | `relaticle://schema/company` | Company fields and custom fields | | `relaticle://schema/people` | People (contact) fields and custom fields | | `relaticle://schema/opportunity` | Opportunity (deal) fields and custom fields | | `relaticle://schema/task` | Task fields and custom fields | | `relaticle://schema/note` | Note fields and custom fields | AI assistants read these schemas automatically to understand what data they can work with, including your team's custom fields. --- ## CRM Overview Prompt The server includes a built-in prompt called **CRM Overview** that gives your AI assistant a snapshot of your CRM data -- record counts for each entity and recently created companies and people. This is a great starting point for any conversation. --- ## Example Prompts Once connected, try these in your AI assistant: - "List all my companies" - "Create a new company called Acme Corp" - "Show me the people at company X" - "Create a task to follow up with John next week" - "Give me an overview of my CRM" - "Update the name of company X to Y" - "Delete the task with ID abc-123" --- ## Troubleshooting ### "Unauthorized" or 401 Error Your access token may be expired or invalid. Create a new one from **Settings > Access Tokens**. ### No Data Returned The MCP server scopes all data to the team associated with your token. Make sure the token was created for the correct team and that the team has data. ### Connection Refused Verify the MCP URL is correct: `https://mcp.relaticle.com`. ### Custom Fields Not Showing Custom fields are team-specific. If you don't see them, confirm they're configured for your team in **Settings > Custom Fields**. The AI assistant reads schema resources automatically to discover available fields. ### Rate Limiting The MCP server uses the same rate limits as the REST API. If you hit limits, wait a moment and retry. ================================================ FILE: packages/Documentation/resources/markdown/self-hosting-guide.md ================================================ # Self-Hosting Guide Deploy Relaticle on your own infrastructure with Docker or manually. --- ## Quick Start Get Relaticle running in 5 steps: 1. Download the compose file: ```bash curl -o compose.yml https://raw.githubusercontent.com/Relaticle/relaticle/main/compose.yml ``` 2. Generate an application key: ```bash echo "APP_KEY=base64:$(openssl rand -base64 32)" ``` 3. Create a `.env` file with your settings: ```bash APP_KEY=base64:your-generated-key-here DB_PASSWORD=your-secure-database-password APP_URL=https://crm.example.com ``` 4. Start the containers: ```bash docker compose up -d ``` 5. Create your admin account: ```bash docker compose exec app php artisan make:filament-user ``` Your CRM is now available at `{APP_URL}/app`. --- ## Requirements | Resource | Minimum | Recommended | |----------|---------|-------------| | RAM | 2 GB | 4 GB | | CPU | 1 core | 2 cores | | Disk | 10 GB | 20 GB+ | | Docker | 20.10+ | Latest | | Docker Compose | v2.0+ | Latest | --- ## Environment Variables ### Required These must be set or the containers will refuse to start. | Variable | Description | |----------|-------------| | `APP_KEY` | Encryption key. Generate with `openssl rand -base64 32`, then prefix with `base64:`. | | `DB_PASSWORD` | PostgreSQL password. Use a strong random value. | ### Application | Variable | Default | Description | |----------|---------|-------------| | `APP_NAME` | `Relaticle` | Displayed in the browser tab and emails. | | `APP_ENV` | `production` | Set to `production` for self-hosting. | | `APP_DEBUG` | `false` | Set to `true` only for debugging. Never in production. | | `APP_TIMEZONE` | `UTC` | Application timezone. | | `APP_URL` | `http://localhost` | Full URL where Relaticle is accessible. Include the scheme. | | `APP_PORT` | `80` | Host port the app container binds to. | | `APP_PANEL_DOMAIN` | (empty) | Set for subdomain routing (e.g., `app.example.com`). Leave empty for path mode (`/app`). | | `LOG_CHANNEL` | `stderr` | Where logs go. `stderr` is recommended for Docker. | | `LOG_LEVEL` | `warning` | Minimum log level. Use `debug` for troubleshooting. | ### Mail | Variable | Default | Description | |----------|---------|-------------| | `MAIL_MAILER` | `log` | Mail driver: `smtp`, `ses`, `mailgun`, `postmark`, or `log`. | | `MAIL_HOST` | (empty) | SMTP host (e.g., `smtp.mailgun.org`). | | `MAIL_PORT` | `587` | SMTP port. | | `MAIL_USERNAME` | (empty) | SMTP username. | | `MAIL_PASSWORD` | (empty) | SMTP password. | | `MAIL_ENCRYPTION` | `tls` | `tls` or `ssl`. | | `MAIL_FROM_ADDRESS` | `hello@example.com` | Sender email address. | | `MAIL_FROM_NAME` | `Relaticle` | Sender display name. | ### Database and Redis These are pre-configured in `compose.yml` and generally don't need changing. | Variable | Default | Description | |----------|---------|-------------| | `DB_DATABASE` | `relaticle` | PostgreSQL database name. | | `DB_USERNAME` | `relaticle` | PostgreSQL username. | | `REDIS_PASSWORD` | `null` | Redis password. Leave as `null` for no auth. | ### Optional | Variable | Description | |----------|-------------| | `GOOGLE_CLIENT_ID` | Google OAuth client ID for social login. | | `GOOGLE_CLIENT_SECRET` | Google OAuth client secret. | | `GITHUB_CLIENT_ID` | GitHub OAuth client ID for social login. | | `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret. | | `SENTRY_LARAVEL_DSN` | Sentry DSN for error tracking. | | `FATHOM_ANALYTICS_SITE_ID` | Fathom Analytics site ID. | --- ## Architecture The Docker setup runs 5 containers: | Container | Image | Purpose | |-----------|-------|---------| | **app** | `ghcr.io/relaticle/relaticle:latest` | Web server (nginx + PHP-FPM) on port 8080. Runs migrations automatically on startup. | | **horizon** | `ghcr.io/relaticle/relaticle:latest` | Queue worker powered by Laravel Horizon. Processes background jobs. | | **scheduler** | `ghcr.io/relaticle/relaticle:latest` | Runs `schedule:work` for recurring tasks (e.g., cleanup, notifications). | | **postgres** | `postgres:17-alpine` | PostgreSQL 17 database. | | **redis** | `redis:7-alpine` | Cache, sessions, and queue backend. Runs with append-only persistence. | ### Volumes | Volume | Purpose | |--------|---------| | `postgres` | Database files. Back this up. | | `redis` | Redis persistence data. | | `storage` | Uploaded files and application storage. Back this up. | ### Networking The app container listens on port 8080 internally and maps to `APP_PORT` (default 80) on the host. All containers communicate through Docker's internal network. Only the app container exposes a port to the host. --- ## Creating Your Admin Account After starting the containers, create your first admin user: ```bash docker compose exec app php artisan make:filament-user ``` You will be prompted for a name, email, and password. Once created, access the CRM panel at `{APP_URL}/app`. **Note**: By default the CRM panel is available at the `/app` path. To use subdomain routing instead (e.g., `app.example.com`), set the `APP_PANEL_DOMAIN` environment variable. --- ## Reverse Proxy and SSL The app container serves HTTP on port 8080 internally. Place a reverse proxy in front to handle SSL termination and route traffic to the container. ### Nginx ```nginx server { listen 443 ssl http2; server_name crm.example.com; ssl_certificate /etc/letsencrypt/live/crm.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/crm.example.com/privkey.pem; location / { proxy_pass http://127.0.0.1:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } server { listen 80; server_name crm.example.com; return 301 https://$server_name$request_uri; } ``` ### Caddy ``` crm.example.com { reverse_proxy 127.0.0.1:80 } ``` Caddy handles SSL certificates automatically via Let's Encrypt. ### Traefik Add these labels to the `app` service in your `compose.yml`: ```yaml labels: - "traefik.enable=true" - "traefik.http.routers.relaticle.rule=Host(`crm.example.com`)" - "traefik.http.routers.relaticle.entrypoints=websecure" - "traefik.http.routers.relaticle.tls.certresolver=letsencrypt" - "traefik.http.services.relaticle.loadbalancer.server.port=8080" ``` **Note**: When using a reverse proxy, set `APP_URL` to your public HTTPS URL (e.g., `https://crm.example.com`). The `TRUSTED_PROXIES` environment variable defaults to `*` in Docker, so forwarded headers are handled automatically. --- ## Deploying on Dokploy [Dokploy](https://dokploy.com/) is an open-source deployment platform. Here's how to deploy Relaticle on it. ### 1. Create a Project In the Dokploy dashboard, click **Create Project** and give it a name (e.g., "Relaticle"). ### 2. Add a Compose Service 1. Inside your project, click **Create Service** and select **Compose** 2. Set the source to **Raw** and paste the contents of the [compose.yml](https://raw.githubusercontent.com/Relaticle/relaticle/main/compose.yml) 3. Click **Create** ### 3. Set Environment Variables In the service's **Environment** tab, add the required variables: ```bash APP_KEY=base64:your-generated-key-here DB_PASSWORD=your-secure-database-password APP_URL=https://crm.yourdomain.com APP_PORT=8080 ``` Generate your `APP_KEY` with: ```bash echo "base64:$(openssl rand -base64 32)" ``` **Note**: Set `APP_PORT=8080` so the container maps port 8080:8080, avoiding conflicts with Dokploy's own port 80. ### 4. Deploy Click **Deploy**. Dokploy will pull the images and start all 5 containers. Wait for health checks to pass. ### 5. Configure Domain 1. Go to the **Domains** tab of the `app` service 2. Add your domain (e.g., `crm.yourdomain.com`) 3. Set the container port to `8080` 4. Enable HTTPS (Dokploy handles Let's Encrypt automatically) ### 6. Create Admin User Open the Dokploy terminal for the `app` container and run: ```bash php artisan make:filament-user ``` Your Relaticle instance is now live at `https://crm.yourdomain.com/app`. --- ## Deploying on Coolify [Coolify](https://coolify.io/) is an open-source, self-hostable platform for deploying applications. ### 1. Create a New Project In the Coolify dashboard, click **New Project** and give it a name. ### 2. Add a Docker Compose Resource 1. Click **Add Resource** in your project 2. Select **Docker Compose** 3. Choose **Empty** as the source, then paste the contents of the [compose.yml](https://raw.githubusercontent.com/Relaticle/relaticle/main/compose.yml) ### 3. Configure Environment Variables In the resource's **Environment Variables** section, add: ```bash APP_KEY=base64:your-generated-key-here DB_PASSWORD=your-secure-database-password APP_URL=https://crm.yourdomain.com ``` ### 4. Set Up Domain 1. Go to the app service's **Settings** 2. Set your domain (e.g., `crm.yourdomain.com`) 3. Coolify will automatically provision an SSL certificate ### 5. Deploy Click **Deploy**. Coolify will pull the images, create containers, and start the services. ### 6. Create Admin User Use Coolify's **Terminal** feature to run in the `app` container: ```bash php artisan make:filament-user ``` Access your CRM at `https://crm.yourdomain.com/app`. --- ## Upgrading ### 1. Back Up Your Data Always back up before upgrading. See the Backup and Restore section below. ### 2. Pull the Latest Images ```bash docker compose pull ``` ### 3. Restart the Containers ```bash docker compose up -d ``` Database migrations run automatically on startup. The app container will apply any pending migrations before serving traffic. **Note**: Check the [release notes](https://github.com/Relaticle/relaticle/releases) before upgrading. Breaking changes will be documented there. --- ## Backup and Restore ### Database Backup ```bash docker compose exec postgres pg_dump -U relaticle relaticle > backup-$(date +%Y%m%d).sql ``` ### Database Restore ```bash docker compose exec -T postgres psql -U relaticle relaticle < backup-20260320.sql ``` ### Storage Backup Back up the storage volume which contains uploaded files: ```bash docker compose cp app:/var/www/html/storage/app ./storage-backup ``` ### Automated Backups Add a cron job to back up daily: ```bash 0 3 * * * cd /path/to/relaticle && docker compose exec -T postgres pg_dump -U relaticle relaticle | gzip > /backups/relaticle-$(date +\%Y\%m\%d).sql.gz ``` --- ## Manual Deployment If you prefer not to use Docker, you can deploy Relaticle directly on a server. ### Requirements - PHP 8.4+ with extensions: pdo_pgsql, gd, bcmath, mbstring, xml, redis - PostgreSQL 17+ - Redis 7+ - Node.js 20+ - Composer 2+ - Nginx or Apache - Supervisor (for queue workers) ### Installation 1. Clone the repository: ```bash git clone https://github.com/Relaticle/relaticle.git /var/www/relaticle cd /var/www/relaticle ``` 2. Install dependencies: ```bash composer install --no-dev --optimize-autoloader npm ci && npm run build ``` 3. Configure the environment: ```bash cp .env.example .env php artisan key:generate ``` Edit `.env` with your database credentials, mail settings, and `APP_URL`. 4. Set up the database: ```bash php artisan migrate --force php artisan storage:link ``` 5. Set permissions: ```bash chown -R www-data:www-data storage bootstrap/cache chmod -R 775 storage bootstrap/cache ``` 6. Create your admin user: ```bash php artisan make:filament-user ``` ### Nginx Configuration ```nginx server { listen 80; server_name crm.example.com; root /var/www/relaticle/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/run/php/php8.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } } ``` ### Supervisor for Horizon Create `/etc/supervisor/conf.d/relaticle-horizon.conf`: ```ini [program:relaticle-horizon] process_name=%(program_name)s command=php /var/www/relaticle/artisan horizon autostart=true autorestart=true user=www-data redirect_stderr=true stdout_logfile=/var/www/relaticle/storage/logs/horizon.log stopwaitsecs=3600 ``` Then start it: ```bash sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start relaticle-horizon ``` ### Scheduler Cron Add to `www-data`'s crontab: ```bash * * * * * cd /var/www/relaticle && php artisan schedule:run >> /dev/null 2>&1 ``` --- ## Troubleshooting ### "APP_KEY is required" error on startup The `APP_KEY` environment variable is not set. Generate one: ```bash echo "base64:$(openssl rand -base64 32)" ``` Add it to your `.env` file and restart: ```bash docker compose up -d ``` ### Container restart loops Check the logs: ```bash docker compose logs app --tail 50 ``` Common causes: - Missing required environment variables (`APP_KEY`, `DB_PASSWORD`) - PostgreSQL not ready yet (the app waits for a health check, but custom configs may skip this) - Insufficient memory (need at least 2 GB) ### 500 errors after deployment 1. Check `APP_DEBUG=true` temporarily to see the full error 2. View logs: `docker compose logs app --tail 100` 3. Ensure `APP_URL` matches your actual domain (including scheme) 4. Run `docker compose exec app php artisan optimize:clear` to clear all caches ### Email not sending 1. Verify `MAIL_MAILER` is set to `smtp` (not `log`) 2. Check your SMTP credentials are correct 3. Test with: `docker compose exec app php artisan tinker --execute "Mail::raw('Test', fn(\$m) => \$m->to('you@example.com')->subject('Test'))"` 4. Check logs: `docker compose logs app | grep -i mail` ### Horizon not processing jobs 1. Check Horizon status: `docker compose exec app php artisan horizon:status` 2. Verify the horizon container is running: `docker compose ps` 3. Check horizon logs: `docker compose logs horizon --tail 50` 4. Restart Horizon: `docker compose restart horizon` ### Permission errors on storage ```bash docker compose exec app chown -R www-data:www-data /var/www/html/storage docker compose exec app chmod -R 775 /var/www/html/storage ``` ### Database connection refused 1. Verify PostgreSQL is running: `docker compose ps postgres` 2. Check PostgreSQL logs: `docker compose logs postgres --tail 20` 3. Ensure `DB_PASSWORD` matches between the app and postgres containers (both read from the same `.env` variable by default) ================================================ FILE: packages/Documentation/resources/views/components/card.blade.php ================================================ @props([ 'title', 'description', 'link', 'icon' => null, ]) merge(['class' => 'group block p-6 md:p-8 transition-colors duration-200 hover:bg-gray-50/50 dark:hover:bg-white/[0.02]']) }}>
@if($icon) @else @endif

{{ $title }}

@if($description)

{{ $description }}

@else {{ $slot }} @endif
Read docs
================================================ FILE: packages/Documentation/resources/views/components/layout.blade.php ================================================ @php $documentTitle = ''; if (isset($document)) { if (is_array($document)) { $documentTitle = $document['title'] ?? ''; } else { $documentTitle = $document->title ?? ''; } } @endphp @pushonce('header') @vite(['packages/Documentation/resources/js/documentation.js', 'packages/Documentation/resources/css/documentation.css']) @endpushonce
{{ $slot }}
@php $breadcrumbItems = [ \Spatie\SchemaOrg\Schema::listItem() ->position(1) ->name('Home') ->item(url('/')), \Spatie\SchemaOrg\Schema::listItem() ->position(2) ->name('Documentation') ->item(route('documentation.index')), ]; if (! empty($documentTitle)) { $breadcrumbItems[] = \Spatie\SchemaOrg\Schema::listItem() ->position(3) ->name($documentTitle) ->item(url()->current()); } $breadcrumbs = \Spatie\SchemaOrg\Schema::breadcrumbList() ->itemListElement($breadcrumbItems); @endphp {!! $breadcrumbs->toScript() !!}
================================================ FILE: packages/Documentation/resources/views/components/search-form.blade.php ================================================ @props(['query' => ''])
merge(['class' => 'relative']) }}>
================================================ FILE: packages/Documentation/resources/views/index.blade.php ================================================

Documentation

Guides and resources to help you get the most out of Relaticle CRM.

@php $documentIcons = [ 'getting-started' => 'ri-rocket-2-line', 'import' => 'ri-upload-2-line', 'mcp' => 'ri-cpu-line', 'developer' => 'ri-code-s-slash-line', 'self-hosting' => 'ri-server-line', 'api' => 'ri-terminal-box-line', ]; $allDocs = collect($documentTypes); @endphp

Available Guides

@foreach($allDocs as $type => $document) @if($loop->index % 2 === 0 && !$loop->first)
@endif @endforeach
================================================ FILE: packages/Documentation/resources/views/search.blade.php ================================================
{{-- Back link --}} {{-- Header --}}

Search Results

@if($results->isNotEmpty())

{{ $results->count() }} {{ Str::plural('result', $results->count()) }} for "{{ $query }}"

@endif
{{-- Search form --}}
@if($results->isEmpty()) {{-- Empty state --}}

No matches found

We couldn't find anything matching "{{ $query }}"

Search tips

Try simpler or alternate terms
Check spelling of search terms
Use fewer keywords to broaden results
@else {{-- Results --}} @endif
================================================ FILE: packages/Documentation/resources/views/show.blade.php ================================================
{!! $content !!}
@php $editFile = config("documentation.documents.{$currentType}.file"); @endphp @if($editFile) @endif
================================================ FILE: packages/Documentation/routes/web.php ================================================ prefix('docs')->name('documentation.')->group(function (): void { Route::get('/', [DocumentationController::class, 'index'])->name('index'); Route::get('/search', [DocumentationController::class, 'search'])->name('search'); Route::get('/{type}', [DocumentationController::class, 'show'])->name('show'); }); ================================================ FILE: packages/Documentation/src/Components/Card.php ================================================ $tableOfContents */ public array $tableOfContents, public ?string $description = null, ) {} /** * Create a document from the given type */ public static function fromType(string $type): self { $documents = config('documentation.documents', []); abort_if(! isset($documents[$type]), 404, 'Document not found'); $documentConfig = $documents[$type]; $file = $documentConfig['file']; $title = $documentConfig['title']; $description = $documentConfig['description'] ?? null; $path = self::getMarkdownPath($file); // Validate the path is within the intended directory $realPath = realpath($path); $resourcePath = realpath(config('documentation.markdown.base_path')); abort_if($resourcePath === false, 500, 'Unable to determine resource path'); abort_if($realPath === '0' || $realPath === false || ! str_starts_with($realPath, $resourcePath) || ! file_exists($realPath), 404, 'Document not found'); $content = file_get_contents($realPath); abort_if($content === false, 500, 'Unable to read document content'); $renderedContent = resolve(MarkdownRenderer::class)->toHtml($content); $tableOfContents = self::extractTableOfContents($renderedContent); return new self( type: $type, title: $title, content: $renderedContent, tableOfContents: $tableOfContents, description: $description, ); } /** * Extract table of contents from the rendered HTML * * @return array */ private static function extractTableOfContents(string $contents): array { $matches = []; preg_match_all('/#<\/a>([^<]+)/', $contents, $matches); if (blank($matches[1]) || blank($matches[2])) { return []; } return array_combine($matches[1], $matches[2]); } /** * Get the path to the Markdown file */ private static function getMarkdownPath(string $file): string { return config('documentation.markdown.base_path').'/'.$file; } } ================================================ FILE: packages/Documentation/src/Data/DocumentSearchRequest.php ================================================ > */ public static function rules(): array { $minLength = config('documentation.search.min_length', 3); $documentTypes = array_keys(config('documentation.documents', [])); return [ 'query' => ['required', 'string', 'min:'.$minLength], 'type' => ['nullable', 'string', Rule::in($documentTypes)], ]; } } ================================================ FILE: packages/Documentation/src/Data/DocumentSearchResultData.php ================================================ $type]); } } ================================================ FILE: packages/Documentation/src/DocumentationServiceProvider.php ================================================ mergeConfigFrom(__DIR__.'/../config/documentation.php', 'documentation'); $this->app->singleton(DocumentationService::class); } /** * Bootstrap any application services. */ public function boot(): void { $this->registerRoutes(); $this->registerViews(); $this->registerComponents(); $this->registerPublishing(); } /** * Register the package routes. */ private function registerRoutes(): void { Route::middleware('web') ->group(function (): void { $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); }); } /** * Register the package views. */ private function registerViews(): void { $this->loadViewsFrom(__DIR__.'/../resources/views', 'documentation'); } /** * Register Blade components. */ private function registerComponents(): void { // Register components with the 'documentation::' namespace Blade::componentNamespace('Relaticle\\Documentation\\Components', 'documentation'); // Register anonymous components $this->loadViewComponentsAs('documentation', []); } /** * Register publishable resources. */ private function registerPublishing(): void { if ($this->app->runningInConsole()) { // Config $this->publishes([ __DIR__.'/../config/documentation.php' => config_path('documentation.php'), ], 'documentation-config'); // Views $this->publishes([ __DIR__.'/../resources/views' => resource_path('views/vendor/documentation'), ], 'documentation-views'); // Markdown $this->publishes([ __DIR__.'/../resources/markdown' => resource_path('markdown/documentation'), ], 'documentation-markdown'); } } } ================================================ FILE: packages/Documentation/src/Http/Controllers/DocumentationController.php ================================================ $this->documentationService->getAllDocumentTypes(), ]); } /** * Display a specific documentation page */ public function show(string $type = 'business'): View { $document = $this->documentationService->getDocument($type); return view('documentation::show', [ 'document' => $document, 'content' => $document->content, 'tableOfContents' => $document->tableOfContents, 'currentType' => $document->type, 'documentTitle' => $document->title, 'documentTypes' => $this->documentationService->getAllDocumentTypes(), ]); } /** * Search documentation */ public function search(Request $request): View { $searchRequest = DocumentSearchRequest::from($request); $results = $this->documentationService->search($searchRequest); return view('documentation::search', [ 'results' => $results, 'query' => $searchRequest->query, 'documentTypes' => $this->documentationService->getAllDocumentTypes(), ]); } } ================================================ FILE: packages/Documentation/src/Services/DocumentationService.php ================================================ DocumentData::fromType($type) ); } /** * Get all document types * * @return array> */ public function getAllDocumentTypes(): array { return config('documentation.documents', []); } /** * Search for documents matching the query * * @return Collection */ public function search(DocumentSearchRequest $searchRequest): Collection { $query = $searchRequest->query; $type = $searchRequest->type; $minLength = config('documentation.search.min_length', 3); if (strlen($query) < $minLength) { return DocumentSearchResultData::collect([], Collection::class); } $documentTypes = $this->getAllDocumentTypes(); // If a specific type is requested, only search that type if ($type && isset($documentTypes[$type])) { $documentTypes = [$type => $documentTypes[$type]]; } $results = collect(); foreach ($documentTypes as $docType => $document) { if (! isset($document['file'])) { continue; } $path = $this->getMarkdownPath($document['file']); if (! file_exists($path)) { continue; } $content = file_get_contents($path); if ($content === false) { continue; } if (stripos($content, $query) === false) { continue; } $results->push( new DocumentSearchResultData( type: $docType, title: $document['title'], excerpt: $this->generateExcerpt($content, $query), url: DocumentSearchResultData::generateUrl($docType), relevance: $this->calculateRelevance($content, $query), ) ); } // Sort by relevance $sortedResults = $results->sortByDesc('relevance')->values(); return DocumentSearchResultData::collect($sortedResults, Collection::class); } /** * Generate an excerpt from content with the query highlighted */ private function generateExcerpt(string $content, string $query): string { $position = stripos($content, $query); if ($position === false) { return Str::limit($content, 150); } $start = max(0, $position - 75); $length = 150; $excerpt = substr($content, $start, $length); // Add ellipsis if needed if ($start > 0) { $excerpt = '...'.$excerpt; } if ($start + $length < strlen($content)) { $excerpt .= '...'; } // Highlight the matched query if configured if (config('documentation.search.highlight', true)) { $pattern = '/('.preg_quote($query, '/').')/i'; $excerpt = preg_replace($pattern, '$1', $excerpt); } return $excerpt; } /** * Calculate the relevance score for a document based on the query */ private function calculateRelevance(string $content, string $query): float { // Count occurrences $count = substr_count(strtolower($content), strtolower($query)); // Check if the query is in a heading (more relevant) $headingRelevance = 0; if (preg_match('/#+ .*'.preg_quote($query, '/').'.*$/im', $content)) { $headingRelevance = 2.0; } // Give more weight to exact case matches $exactCaseCount = substr_count($content, $query); $exactCaseMultiplier = $exactCaseCount > 0 ? 1.5 : 1.0; // Calculate base relevance $baseRelevance = $count / (strlen($content) / 1000); return ($baseRelevance * $exactCaseMultiplier) + $headingRelevance; } /** * Get the path to the markdown file */ private function getMarkdownPath(string $file): string { return config('documentation.markdown.base_path').'/'.$file; } } ================================================ FILE: packages/ImportWizard/config/import-wizard.php ================================================ 10_000, 'max_file_size' => 10 * 1024 * 1024, // 10MB 'storage_path' => storage_path('app/imports'), 'chunk_size' => 500, ]; ================================================ FILE: packages/ImportWizard/resources/lang/en/validation.php ================================================ 'Cannot parse as :format date format.', 'invalid_choice' => '":value" is not a valid option.', 'invalid_number' => 'Cannot parse as number with :format decimal separator.', ]; ================================================ FILE: packages/ImportWizard/resources/views/components/field-select.blade.php ================================================ @props([ 'fields', 'entityLinks' => [], 'selected' => null, 'mappedFieldKeys' => [], 'mappedEntityLinkMatchers' => [], 'column', 'placeholder' => 'Select attribute', ]) @php $dropdownId = "fs-{$column}"; $isFieldMapping = $selected?->isFieldMapping() ?? false; $isEntityLinkMapping = $selected?->isEntityLinkMapping() ?? false; $selectedField = $isFieldMapping ? $fields->get($selected->target) : null; $selectedEntityLink = $isEntityLinkMapping ? ($entityLinks[$selected->entityLink] ?? null) : null; $selectedMatcher = $selectedEntityLink?->getMatcher($selected->target); $hasValue = $selectedField !== null || $selectedEntityLink !== null; $sortedItems = collect($fields->all()) ->map(fn($f) => (object)[ 'type' => 'field', 'item' => $f, 'key' => $f->key, 'order' => $f->sortOrder ?? -1 ]) ->concat( collect($entityLinks)->map(fn($link, $key) => (object)[ 'type' => 'link', 'item' => $link, 'key' => $key, 'order' => $link->sortOrder ?? -1 ]) ) ->sortBy('order'); @endphp
{{-- Trigger Button --}} {{-- Dropdown Panel --}}
{{-- Search Header --}}
{{-- Options (unified sorted list) --}}
@foreach ($sortedItems as $entry) @if ($entry->type === 'field') @php $field = $entry->item; $isSelected = $isFieldMapping && $selected->target === $field->key; $isMapped = in_array($field->key, $mappedFieldKeys) && !$isSelected; @endphp @else @php $linkKey = $entry->key; $link = $entry->item; $isLinkSelected = $isEntityLinkMapping && $selected->entityLink === $linkKey; $linkMappedMatchers = $mappedEntityLinkMatchers[$linkKey] ?? []; $isLinkFullyMapped = count($linkMappedMatchers) >= count($link->matchableFields) && !$isLinkSelected; @endphp
@endif @endforeach
{{-- Teleported Submenus --}} @foreach ($entityLinks as $linkKey => $link) @php $isLinkSelected = $isEntityLinkMapping && $selected->entityLink === $linkKey; @endphp @endforeach
================================================ FILE: packages/ImportWizard/resources/views/components/multi-value-input.blade.php ================================================ @props([ 'value' => '', 'placeholder' => 'Add value...', 'disabled' => false, 'inputType' => 'text', 'borderless' => false, 'errors' => [], 'eventName' => 'input', ]) @php $inputmode = match($inputType) { 'email' => 'email', 'url' => 'url', 'tel' => 'tel', default => 'text', }; $linkPrefix = match($inputType) { 'email' => 'mailto:', 'tel' => 'tel:', 'url' => '', default => null, }; @endphp
merge(['class' => 'relative w-full']) }} > {{-- Trigger Button --}} {{-- Popover Panel - teleported to body to avoid Livewire re-render z-index issues --}}
================================================ FILE: packages/ImportWizard/resources/views/components/select-menu.blade.php ================================================ @props([ 'options' => [], 'multiple' => false, 'searchable' => true, 'placeholder' => 'Select...', 'disabled' => false, 'label' => null, 'inlineLabel' => null, 'icon' => null, 'value' => null, 'borderless' => false, ]) @php // Normalize options to consistent format: [{value, label, description?, invalid?}] $normalizedOptions = collect($options)->map(function ($option, $key) { if (is_array($option) && isset($option['value'])) { return [ 'value' => $option['value'], 'label' => (string) ($option['label'] ?? $option['value']), 'description' => isset($option['description']) ? (string) $option['description'] : null, 'invalid' => ! empty($option['invalid']), ]; } if (is_string($key)) { return ['value' => $key, 'label' => (string) $option, 'description' => null, 'invalid' => false]; } return ['value' => $option, 'label' => (string) $option, 'description' => null, 'invalid' => false]; })->values()->all(); // Extract wire:model for Livewire integration $wireModel = $attributes->wire('model')->value(); $hasLiveModifier = $attributes->wire('model')->hasModifier('live'); @endphp
whereDoesntStartWith(['wire:model', 'x-model'])->merge(['class' => 'relative']) }} > {{-- Hidden live region for screen reader announcements --}}
{{-- Optional visible label --}} @if ($label) @endif {{-- Trigger Button --}} {{-- Dropdown Panel --}}
@if ($searchable)
@endif {{-- Listbox --}}
================================================ FILE: packages/ImportWizard/resources/views/components/value-row-actions.blade.php ================================================ {{-- Shared action buttons for value row partials --}} @props([ 'selectedColumn', 'rawValue', 'hasCorrection' => false, 'showSkip' => true, 'showUndo' => null, 'undoTitle' => 'Undo correction', ]) @php $showUndo = $showUndo ?? $hasCorrection; @endphp
@if ($showUndo) @if ($showSkip)
@endif @endif @if ($showSkip) @endif {{ $slot }}
================================================ FILE: packages/ImportWizard/resources/views/filament/pages/import-history.blade.php ================================================ {{ $this->table }} ================================================ FILE: packages/ImportWizard/resources/views/filament/pages/import-page.blade.php ================================================ ================================================ FILE: packages/ImportWizard/resources/views/livewire/import-wizard.blade.php ================================================
{{-- Step Progress --}} @include('import-wizard-new::livewire.partials.step-indicator') {{-- Step Content (Child Components) --}}
@if($currentStep === self::STEP_UPLOAD) @elseif($currentStep === self::STEP_MAP) @elseif($currentStep === self::STEP_REVIEW) @elseif($currentStep === self::STEP_PREVIEW) @endif
{{-- Filament Action Modals --}}
================================================ FILE: packages/ImportWizard/resources/views/livewire/partials/step-indicator.blade.php ================================================ ================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/mapping-step.blade.php ================================================
{{-- Column Mapping List --}}
{{-- Header --}}
File column
Map to
{{-- Mapping Rows --}}
@foreach ($headers as $index => $header) @php $mapping = $this->getMapping($header); $allMappedMatchers = $this->getMappedEntityLinkMatchers(); $mappedEntityLinkMatchers = []; foreach ($allMappedMatchers as $lk => $matcherFields) { $currentMappingMatcher = ($mapping?->entityLink === $lk) ? $mapping?->target : null; $mappedEntityLinkMatchers[$lk] = array_values( array_filter($matcherFields, fn ($f) => $f !== $currentMappingMatcher) ); } @endphp
{{-- File Column Name --}}
{{ $header }}
{{-- Arrow --}}
{{-- Attribute Selector --}}
@endforeach
{{-- Preview Panel --}}
Preview
@foreach ($headers as $header)
@foreach ($this->previewValues($header, 50) as $value)
{{ $value ?: '—' }}
@endforeach
@endforeach

Showing sample values

{{-- Required Fields Warning --}} @if ($this->unmappedRequired->isNotEmpty()) @php $unmappedLabels = $this->unmappedRequired->pluck('label'); @endphp

Required: {{ $unmappedLabels->join(', ') }}

@endif
{{-- Navigation --}}
Start over {{ $this->continueAction }}
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/partials/value-row-choice.blade.php ================================================ {{-- Choice field value row: Select dropdown for single/multi choice fields --}} @php $isMulti = $selectedColumn->getType()->isMultiChoiceField(); $validOptions = $this->choiceOptions; $validationError = $valueData->validation_error; $isValid = $validationError === null; // Parse values - trim handles both "a, b" and "a,b" formats $selectedValue = $isMulti ? collect(explode(',', $mappedValue))->map(fn ($v) => trim($v))->filter()->values()->all() : $mappedValue; // Build options: for multi-select include invalid values first, for single-select only valid // Single-select: user must select valid option or skip (no deselecting invalid) $validValues = collect($validOptions)->pluck('value'); $invalidOptions = $isMulti ? collect((array) $selectedValue) ->filter(fn ($v) => $v && ! $validValues->contains($v)) ->unique() ->map(fn ($v) => ['value' => $v, 'label' => $v, 'invalid' => true]) ->values() : collect(); $options = $invalidOptions->merge($validOptions)->all(); $rowKey = 'choice-' . crc32($rawValue); @endphp
{{-- Show warning icon only for multi-select (single-select has badge inside) --}} @if (! $isValid) @endif
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/partials/value-row-date.blade.php ================================================ {{-- Date/DateTime value row: Bordered container with date picker --}} @php use Relaticle\ImportWizard\Enums\DateFormat; $dateFormat = $this->selectedColumn->dateFormat ?? DateFormat::ISO; $isTimestamp = $this->selectedColumn->getType()->isTimestamp(); $validationError = $valueData->validation_error; $parsedDate = $dateFormat->parse($mappedValue ?? $rawValue, $isTimestamp); // Fallback: Try ISO format for corrections (date picker always outputs ISO) // This handles cases where format changed after correction was made if ($parsedDate === null && $dateFormat !== DateFormat::ISO && $mappedValue !== null) { $parsedDate = DateFormat::ISO->parse($mappedValue, $isTimestamp); } $pickerValue = $parsedDate ? $dateFormat->toPickerValue($parsedDate, $isTimestamp) : ''; $formattedDisplay = $parsedDate ? $dateFormat->format($parsedDate, $isTimestamp) : ''; $isValid = $validationError === null && $parsedDate !== null; @endphp
{{-- Invisible date input positioned over clickable area --}} @if ($isValid) {{-- Valid: Show formatted date --}}
{{ $formattedDisplay }}
@else {{-- Invalid: Show warning and raw value --}}
{{ $rawValue }}
{{-- Actions: Fix (opens picker) and Skip --}}
@endif
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/partials/value-row-multi-value.blade.php ================================================ {{-- Multi-value arbitrary field row: For email, phone, tags etc. --}} @php use Relaticle\ImportWizard\Support\Validation\ValidationError; $storedError = $valueData->validation_error; $validationError = ValidationError::fromStorageFormat($storedError); $perValueErrors = $validationError?->getItemErrors() ?? []; $simpleMessage = $validationError?->getMessage(); $hasErrors = !empty($perValueErrors) || $simpleMessage !== null; $inputType = match(true) { str_contains(strtolower($selectedColumn->target), 'email') => 'email', str_contains(strtolower($selectedColumn->target), 'phone') => 'tel', str_contains(strtolower($selectedColumn->target), 'url') || str_contains(strtolower($selectedColumn->target), 'website') => 'url', default => 'text', }; $placeholder = match($inputType) { 'email' => 'Add email...', 'tel' => 'Add phone...', 'url' => 'Add URL...', default => 'Add value...', }; $rowKey = 'multi-value-' . crc32($rawValue); @endphp
@if ($simpleMessage !== null) @endif
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/partials/value-row-number.blade.php ================================================ {{-- Number value row: Bordered container with number input --}} @php use Relaticle\ImportWizard\Enums\NumberFormat; $numberFormat = $this->selectedColumn->numberFormat ?? NumberFormat::POINT; $validationError = $valueData->validation_error; $parsedNumber = $numberFormat->parse($mappedValue ?? $rawValue); $formattedDisplay = $parsedNumber !== null ? $numberFormat->format($parsedNumber) : ''; $isValid = $validationError === null && $parsedNumber !== null; @endphp
@unless ($isValid) @else @endunless
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/partials/value-row-skipped.blade.php ================================================ {{-- Skipped value row: Bordered container with skip icon and restore action --}}
Skipped
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/partials/value-row-text.blade.php ================================================ {{-- Text value row: Bordered container with text input --}} @php $validationError = $valueData->validation_error; $isValid = $validationError === null; @endphp
@unless ($isValid) @else @endunless
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/preview-step.blade.php ================================================
@if($this->isCompleted)

Import Complete

@if($this->results)
{{ number_format($this->results['created'] ?? 0) }} created {{ number_format($this->results['updated'] ?? 0) }} updated {{ number_format($this->results['failed'] ?? 0) }} failed
@if(($this->results['failed'] ?? 0) > 0) {{ $this->downloadFailedRowsAction }} @endif @endif
@elseif($this->isImporting)

Importing... {{ number_format($this->processedCount) }} of {{ number_format($this->totalRowCount) }} rows

{{ $this->progressPercent }}%
@endif
@foreach($this->relationshipTabs as $tab) @endforeach
@if($activeTab === 'all')
{{ number_format($this->createCount) }} will be created {{ number_format($this->updateCount) }} will be updated
@foreach($this->columns as $column)
{{ $column->getLabel() }}
@endforeach
@forelse($this->previewRows as $row)
@if($row->match_action) match_action->color()]) /> @endif
@foreach($this->columns as $column)
@if($column->isEntityLinkMapping()) @php $relMatch = $row->relationships?->first(fn ($m) => $m->relationship === $column->entityLink); $rawValue = $row->raw_data->get($column->source); @endphp @if($relMatch && filled($rawValue)) @if($relMatch->isExisting()) @else @endif {{ Str::limit((string) $rawValue, 28) }} @endif @else @php $value = $row->getFinalValue($column->source) @endphp @if(filled($value)) {{ Str::limit((string) $value, 30) }} @endif @endif
@endforeach
@empty
No rows to display
@endforelse
@if($this->previewRows->lastPage() > 1)
{{ number_format($this->previewRows->firstItem()) }}–{{ number_format($this->previewRows->lastItem()) }} of {{ number_format($this->previewRows->total()) }}
@endif @else
{{ number_format($this->relationshipStats['link']) }} will be linked {{ number_format($this->relationshipStats['create']) }} will be created
Value
Resolution
Rows
@forelse($this->relationshipSummary as $entry)
@if($entry['action'] === 'link') @else @endif
{{ Str::limit($entry['name'], 30) }}
@if($entry['action'] === 'link') Link existing @else Create new @endif
{{ $entry['count'] }}
@empty
No relationships to display
@endforelse
@if($this->relationshipSummary->lastPage() > 1)
{{ number_format($this->relationshipSummary->firstItem()) }}–{{ number_format($this->relationshipSummary->lastItem()) }} of {{ number_format($this->relationshipSummary->total()) }}
@endif @endif
@if(! $this->isImporting && ! $this->isCompleted)
Back {{ $this->startImportAction }}
@endif
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/review-step.blade.php ================================================ @php use Relaticle\ImportWizard\Enums\DateFormat; use Relaticle\ImportWizard\Enums\NumberFormat; use Relaticle\ImportWizard\Enums\ReviewFilter; use Relaticle\ImportWizard\Enums\SortField; use Relaticle\ImportWizard\Enums\SortDirection; @endphp
{{-- Main Content --}}
{{-- Column List (Left Panel) --}}
Mapped Columns
@foreach ($this->columns as $column) @php $isSelected = $selectedColumn->source === $column->source @endphp @endforeach
{{-- Values Panel (Right Panel) --}}
{{-- Header (always visible) --}}

{{ $selectedColumn->source }}

Mapped to {{ $selectedColumn->getLabel() }} @if (!$this->isSelectedColumnValidating) · {{ number_format($this->selectedColumnRows->total()) }} unique values @endif

@if (!$this->isSelectedColumnValidating) @if ($this->selectedColumn->getType()->isDateOrDateTime()) @endif @if ($this->selectedColumn->getType()->isFloat()) @endif @endif
@if ($this->isSelectedColumnValidating) {{-- Loading State with Fake Progress Animation --}}

Processing column values...

Validating and preparing data for review

{{-- Fake Progress Bar --}}
complete
@else {{-- Filters --}}
@foreach (ReviewFilter::cases() as $filterCase) @endforeach
{{-- Search --}}
{{-- Sort Dropdown --}}
@foreach(SortField::cases() as $field) @endforeach
@foreach(SortDirection::cases() as $direction) @endforeach
{{-- Table Header --}}
Raw Data
Mapped Value
{{-- Values List --}}
@forelse ($this->selectedColumnRows as $index => $valueData) @php $rawValue = $valueData->raw_value ?? ''; $hasCorrection = $valueData->correction !== null; $mappedValue = $hasCorrection ? $valueData->correction : $rawValue; $isRawBlank = blank($rawValue); $isSkipped = (bool) ($valueData->is_skipped ?? false); $count = (int) $valueData->count; @endphp
{{-- Raw Data + Row Count --}}
$isRawBlank, 'text-gray-900 dark:text-white' => !$isRawBlank, ]) title="{{ $rawValue }}"> {{ $isRawBlank ? '(blank)' : Str::limit($rawValue, 35) }} {{ $count }} {{ Str::plural('row', $count) }}
{{-- Arrow --}}
{{-- Mapped Value + Actions --}}
@if ($isSkipped) @include('import-wizard-new::livewire.steps.partials.value-row-skipped', compact('rawValue', 'selectedColumn')) @elseif ($isRawBlank) (blank) @elseif ($this->selectedColumn->getType()->isDateOrDateTime()) @include('import-wizard-new::livewire.steps.partials.value-row-date', compact('rawValue', 'mappedValue', 'hasCorrection', 'selectedColumn', 'valueData')) @elseif ($this->selectedColumn->getType()->isFloat()) @include('import-wizard-new::livewire.steps.partials.value-row-number', compact('rawValue', 'mappedValue', 'hasCorrection', 'selectedColumn', 'valueData')) @elseif ($this->selectedColumn->isMultiChoicePredefined()) @include('import-wizard-new::livewire.steps.partials.value-row-choice', compact('rawValue', 'mappedValue', 'hasCorrection', 'selectedColumn', 'valueData')) @elseif ($this->selectedColumn->isMultiChoiceArbitrary()) @include('import-wizard-new::livewire.steps.partials.value-row-multi-value', compact('rawValue', 'mappedValue', 'hasCorrection', 'selectedColumn', 'valueData')) @else @include('import-wizard-new::livewire.steps.partials.value-row-text', compact('rawValue', 'mappedValue', 'hasCorrection', 'selectedColumn', 'valueData')) @endif
@empty
@if ($search !== '' && $filter !== ReviewFilter::All) No values match your search and filter @elseif ($search !== '') No values match "{{ $search }}" @elseif ($filter !== ReviewFilter::All) No {{ $filter->getLabel() }} values @else No values to display @endif @if ($search !== '' || $filter !== ReviewFilter::All) @endif
@endforelse
{{-- Pagination --}} @if ($this->selectedColumnRows->lastPage() > 1)
{{ number_format($this->selectedColumnRows->firstItem()) }}–{{ number_format($this->selectedColumnRows->lastItem()) }} of {{ number_format($this->selectedColumnRows->total()) }}
@endif @endif
{{-- Navigation --}}
Back Continue
================================================ FILE: packages/ImportWizard/resources/views/livewire/steps/upload-step.blade.php ================================================
{{-- File Upload Container --}}
@if ($isParsed) @php $fileName = $uploadedFile?->getClientOriginalName() ?? 'import.csv'; $fileExtension = strtoupper(pathinfo($fileName, PATHINFO_EXTENSION)); $fileSizeFormatted = Number::fileSize($uploadedFile?->getSize() ?? 0, precision: 1); @endphp
{{-- File Info Card --}}
{{-- Hidden file input for replace --}} {{-- File Header --}}

{{ $fileName }}

.{{ $fileExtension }} file - {{ $fileSizeFormatted }}

{{-- Divider --}}
{{-- Stats --}}
Columns found

{{ count($headers) }}

Rows found

{{ number_format($rowCount) }}

{{-- Column Preview --}} @if (count($headers) > 0)

Column preview

@foreach (array_slice($headers, 0, 5) as $header) {{ Str::limit($header, 15) }} @endforeach @if (count($headers) > 5) +{{ count($headers) - 5 }} more @endif
@endif
@else
{{-- Hidden file input (NOT covering the zone) --}} {{-- Content (hidden during loading) --}}

Drop your .CSV file onto this area to upload

Max 10,000 rows • Max 10MB

or
Choose a .CSV file {{-- Validation Error --}} @error('uploadedFile')

{{ $message }}

@enderror
{{-- Loading (absolute centered) --}}

Analyzing your file...

Detecting columns and counting rows

@endif
{{-- Navigation --}}
Import Guide Continue Processing...
================================================ FILE: packages/ImportWizard/routes/web.php ================================================ name('import-history.failed-rows.download') ->middleware('signed'); ================================================ FILE: packages/ImportWizard/src/Commands/CleanupImportsCommand.php ================================================ option('hours'); $completedHours = (int) $this->option('completed-hours'); $deleted = 0; $deleted += $this->cleanupTerminalImportFiles($completedHours); $deleted += $this->cleanupAbandonedImports($staleHours); $deleted += $this->cleanupOrphanedDirectories(); $this->comment("Cleaned up {$deleted} import(s)."); } private function cleanupTerminalImportFiles(int $completedHours): int { $deleted = 0; $terminalImports = Import::query() ->whereIn('status', [ImportStatus::Completed, ImportStatus::Failed]) ->where('updated_at', '<', now()->subHours($completedHours)) ->get(); foreach ($terminalImports as $import) { $store = ImportStore::load($import->id); if (! $store instanceof ImportStore) { continue; } $this->info("Cleaning up files for import {$import->id} (status: {$import->status->value})"); $store->destroy(); $deleted++; } return $deleted; } private function cleanupAbandonedImports(int $staleHours): int { $deleted = 0; $abandonedImports = Import::query() ->whereNotIn('status', [ImportStatus::Completed, ImportStatus::Failed]) ->where('updated_at', '<', now()->subHours($staleHours)) ->get(); foreach ($abandonedImports as $import) { $this->info("Cleaning up abandoned import {$import->id} (status: {$import->status->value})"); ImportStore::load($import->id)?->destroy(); $import->delete(); $deleted++; } return $deleted; } private function cleanupOrphanedDirectories(): int { $deleted = 0; $importsPath = storage_path('app/imports'); if (! File::isDirectory($importsPath)) { return 0; } foreach (File::directories($importsPath) as $directory) { $id = basename((string) $directory); if (Import::query()->where('id', $id)->exists()) { continue; } $this->info("Cleaning up orphaned directory {$id}"); File::deleteDirectory($directory); $deleted++; } return $deleted; } } ================================================ FILE: packages/ImportWizard/src/Data/ColumnData.php ================================================ importField->type ?? FieldDataType::STRING; } /** * Check if this is a MULTI_CHOICE field with predefined options (not arbitrary). * * Returns false for fields like email/phone that use MULTI_CHOICE type * but accept arbitrary values without predefined options. */ public function isMultiChoicePredefined(): bool { return $this->getType()->isMultiChoiceField() && ! ($this->importField->acceptsArbitraryValues ?? false); } public function isSingleChoicePredefined(): bool { return $this->getType()->isChoiceField() && ! $this->getType()->isMultiChoiceField(); } public function isMultiChoiceArbitrary(): bool { return $this->getType()->isMultiChoiceField() && ($this->importField->acceptsArbitraryValues ?? false); } /** @return array */ public function getRules(): array { return $this->importField->rules ?? []; } public function getLabel(): string { if ($this->isFieldMapping()) { return $this->importField->label ?? $this->target; } return $this->entityLinkField->label ?? $this->entityLink ?? $this->target; } public function getIcon(): string { if ($this->isEntityLinkMapping()) { return $this->entityLinkField?->icon() ?? 'heroicon-o-link'; } return $this->importField->icon ?? 'heroicon-o-squares-2x2'; } public function getMatcher(): ?MatchableField { if (! $this->isEntityLinkMapping()) { return null; } return $this->entityLinkField?->getMatcher($this->target); } public function isFieldMapping(): bool { return $this->entityLink === null; } public function isEntityLinkMapping(): bool { return $this->entityLink !== null; } /** * Get the EntityLink and MatchableField for this column. * * Uses hydrated entityLinkField if available, otherwise looks up from importer. * * @return array{link: EntityLink, matcher: MatchableField}|null */ public function resolveEntityLinkContext(BaseImporter $importer): ?array { if (! $this->isEntityLinkMapping()) { return null; } $link = $this->entityLinkField ?? ($importer->entityLinks()[$this->entityLink] ?? null); if ($link === null) { return null; } $matcher = $link->getMatcher($this->target); if ($matcher === null) { return null; } return ['link' => $link, 'matcher' => $matcher]; } /** @return array */ public function toArray(): array { return [ 'source' => $this->source, 'target' => $this->target, 'entityLink' => $this->entityLink, 'dateFormat' => $this->dateFormat, 'numberFormat' => $this->numberFormat, ]; } public function withDateFormat(DateFormat $format): self { return $this->cloneWith(dateFormat: $format); } public function withNumberFormat(NumberFormat $format): self { return $this->cloneWith(numberFormat: $format); } private function cloneWith(?DateFormat $dateFormat = null, ?NumberFormat $numberFormat = null): self { $new = new self( source: $this->source, target: $this->target, entityLink: $this->entityLink, dateFormat: $dateFormat ?? $this->dateFormat, numberFormat: $numberFormat ?? $this->numberFormat, ); $new->importField = $this->importField; $new->entityLinkField = $this->entityLinkField; return $new; } } ================================================ FILE: packages/ImportWizard/src/Data/EntityLink.php ================================================ $targetModelClass The target model class * @param array $matchableFields Fields that can match related records * @param EntityLinkStorage $storageType How the link is persisted * @param string $label Display label * @param bool $allowMultiple Whether multiple values are allowed * @param string|null $foreignKey FK column (for ForeignKey storage) * @param string|null $morphRelation Relation name (for MorphToMany storage) * @param string|null $customFieldCode Custom field code (for CustomFieldValue storage) * @param array $guesses Column name aliases for auto-mapping * @param int|null $sortOrder Display order for custom field entity links */ public function __construct( public readonly string $key, public readonly EntityLinkSource $source, public readonly string $targetEntity, public readonly string $targetModelClass, #[DataCollectionOf(MatchableField::class)] public readonly array $matchableFields = [], public readonly EntityLinkStorage $storageType = EntityLinkStorage::ForeignKey, public readonly string $label = '', public readonly bool $allowMultiple = false, public readonly ?string $foreignKey = null, public readonly ?string $morphRelation = null, public readonly ?string $customFieldCode = null, public readonly array $guesses = [], public readonly ?int $sortOrder = null, ) {} /** @var array */ private static array $storageStrategies = []; /** @param array $overrides */ private function cloneWith(array $overrides): self { return new self( key: $overrides['key'] ?? $this->key, source: $overrides['source'] ?? $this->source, targetEntity: $overrides['targetEntity'] ?? $this->targetEntity, targetModelClass: $overrides['targetModelClass'] ?? $this->targetModelClass, matchableFields: $overrides['matchableFields'] ?? $this->matchableFields, storageType: $overrides['storageType'] ?? $this->storageType, label: $overrides['label'] ?? $this->label, allowMultiple: $overrides['allowMultiple'] ?? $this->allowMultiple, foreignKey: $overrides['foreignKey'] ?? $this->foreignKey, morphRelation: $overrides['morphRelation'] ?? $this->morphRelation, customFieldCode: $overrides['customFieldCode'] ?? $this->customFieldCode, guesses: $overrides['guesses'] ?? $this->guesses, sortOrder: $overrides['sortOrder'] ?? $this->sortOrder, ); } /** @param class-string $modelClass */ public static function belongsTo(string $name, string $modelClass): self { return new self( key: $name, source: EntityLinkSource::Relationship, targetEntity: self::getEntityAliasForModel($modelClass), targetModelClass: $modelClass, storageType: EntityLinkStorage::ForeignKey, label: ucfirst($name), ); } /** @param class-string $modelClass */ public static function morphToMany(string $name, string $modelClass): self { return new self( key: $name, source: EntityLinkSource::Relationship, targetEntity: self::getEntityAliasForModel($modelClass), targetModelClass: $modelClass, storageType: EntityLinkStorage::MorphToMany, label: ucfirst($name), allowMultiple: true, morphRelation: $name, ); } public static function fromCustomField(CustomField $customField): self { $lookupType = $customField->lookup_type; $modelClass = Relation::getMorphedModel($lookupType); throw_if($modelClass === null, \InvalidArgumentException::class, "Unknown lookup type: {$lookupType}"); return new self( key: "custom_fields_{$customField->code}", source: EntityLinkSource::CustomField, targetEntity: $lookupType, targetModelClass: $modelClass, matchableFields: self::getUniqueMatchableFieldsForEntity($modelClass), storageType: EntityLinkStorage::CustomFieldValue, label: $customField->name, allowMultiple: $customField->typeData->supportsMultiValue ?? false, customFieldCode: $customField->code, guesses: [ $customField->code, $customField->name, strtolower($customField->name), str_replace(' ', '_', strtolower($customField->name)), ], sortOrder: $customField->sort_order, ); } public static function company(): self { return self::belongsTo('company', Company::class) ->matchableFields([ MatchableField::id(), MatchableField::domain('custom_fields_domains'), MatchableField::name(), ]) ->foreignKey('company_id') ->guess([ 'company', 'company_name', 'organization', 'account', 'employer', 'company id', 'company_id', ]); } public static function contact(): self { return self::belongsTo('contact', People::class) ->matchableFields([ MatchableField::id(), MatchableField::email('custom_fields_emails'), MatchableField::phone('custom_fields_phone_number'), MatchableField::name(), ]) ->foreignKey('contact_id') ->guess([ 'contact', 'contact_name', 'person', 'contact_id', 'person_id', 'people_id', ]); } public static function polymorphicCompanies(): self { return self::morphToMany('companies', Company::class) ->matchableFields([ MatchableField::id(), MatchableField::domain('custom_fields_domains'), MatchableField::name(), ]) ->guess([ 'company', 'companies', 'company_name', 'company_id', ]); } public static function polymorphicPeople(): self { return self::morphToMany('people', People::class) ->matchableFields([ MatchableField::id(), MatchableField::email('custom_fields_emails'), MatchableField::phone('custom_fields_phone_number'), MatchableField::name(), ]) ->guess([ 'person', 'people', 'contact', 'contact_name', 'person_id', ]); } public static function polymorphicOpportunities(): self { return self::morphToMany('opportunities', Opportunity::class) ->matchableFields([ MatchableField::id(), ]) ->guess([ 'opportunity', 'opportunities', 'deal', 'opportunity_id', ]); } /** @param array $matchableFields */ public function matchableFields(array $matchableFields): self { return $this->cloneWith(['matchableFields' => $matchableFields]); } public function foreignKey(string $foreignKey): self { return $this->cloneWith(['foreignKey' => $foreignKey]); } public function morphRelation(string $relation): self { return $this->cloneWith(['morphRelation' => $relation]); } /** @param array $guesses */ public function guess(array $guesses): self { return $this->cloneWith(['guesses' => $guesses]); } public function label(string $label): self { return $this->cloneWith(['label' => $label]); } public function getHighestPriorityMatcher(): ?MatchableField { if ($this->matchableFields === []) { return null; } return collect($this->matchableFields) ->sortByDesc(fn (MatchableField $field): int => $field->priority) ->first(); } public function getMatcher(string $field): ?MatchableField { return collect($this->matchableFields) ->first(fn (MatchableField $m): bool => $m->field === $field); } public function matchesHeader(string $header): bool { $normalized = $this->normalizeHeader($header); $candidates = array_merge([$this->key, $this->label], $this->guesses); return array_any($candidates, fn (string $candidate): bool => $this->normalizeHeader($candidate) === $normalized); } private function normalizeHeader(string $value): string { return str($value)->lower()->replace(['-', '_'], ' ')->squish()->toString(); } public function icon(): string { return Entities::getEntity($this->targetEntity)?->getIcon() ?? 'heroicon-o-link'; } public function isForeignKey(): bool { return $this->storageType === EntityLinkStorage::ForeignKey; } public function isMorphToMany(): bool { return $this->storageType === EntityLinkStorage::MorphToMany; } public function isCustomFieldValue(): bool { return $this->storageType === EntityLinkStorage::CustomFieldValue; } public function isFromRelationship(): bool { return $this->source === EntityLinkSource::Relationship; } public function isFromCustomField(): bool { return $this->source === EntityLinkSource::CustomField; } public function getStorageStrategy(): EntityLinkStorageInterface { return self::$storageStrategies[$this->storageType->value] ??= match ($this->storageType) { EntityLinkStorage::ForeignKey => new ForeignKeyStorage, EntityLinkStorage::MorphToMany => new MorphToManyStorage, EntityLinkStorage::CustomFieldValue => new CustomFieldValueStorage, }; } /** @param class-string $modelClass */ private static function getEntityAliasForModel(string $modelClass): string { return match ($modelClass) { Company::class => 'company', People::class => 'people', Opportunity::class => 'opportunity', default => (new $modelClass)->getMorphClass(), }; } /** * @param class-string $modelClass * @return array */ private static function getUniqueMatchableFieldsForEntity(string $modelClass): array { return match ($modelClass) { Company::class => [ MatchableField::id(), MatchableField::domain('custom_fields_domains'), MatchableField::name(), ], People::class => [ MatchableField::id(), MatchableField::email('custom_fields_emails'), MatchableField::name(), ], default => [ MatchableField::id(), ], }; } } ================================================ FILE: packages/ImportWizard/src/Data/ImportField.php ================================================ $rules Laravel validation rules * @param array $guesses Column name aliases for auto-mapping * @param string|null $example Example value for display * @param bool $isCustomField Whether this is a custom field * @param FieldDataType|null $type The data type * @param string|null $icon The display icon (Heroicon name) * @param int|null $sortOrder Display order for custom fields * @param bool $acceptsArbitraryValues Whether field accepts arbitrary values (email, phone, tags) * @param array|null $options Choice options for select fields */ public function __construct( public readonly string $key, public readonly string $label, public readonly bool $required = false, public readonly array $rules = [], public readonly array $guesses = [], public readonly ?string $example = null, public readonly bool $isCustomField = false, public readonly ?FieldDataType $type = null, public readonly ?string $icon = null, public readonly ?int $sortOrder = null, public readonly bool $acceptsArbitraryValues = false, public readonly ?array $options = null, ) {} /** * Create a new ImportField. */ public static function make(string $key): self { return new self( key: $key, label: ucfirst(str_replace('_', ' ', $key)), ); } /** * Create a pre-configured ID field for record matching. */ public static function id(): self { return new self( key: 'id', label: 'Record ID', required: false, rules: ['nullable', 'ulid'], guesses: ['id', 'record_id', 'ulid', 'record id'], example: '01KCCFMZ52QWZSQZWVG0AP704V', icon: 'heroicon-o-finger-print', ); } /** * Set the display label. */ public function label(string $label): self { return $this->cloneWith(['label' => $label]); } /** * Set whether the field is required. */ public function required(bool $required = true): self { return $this->cloneWith(['required' => $required]); } /** * Set validation rules. * * @param array $rules */ public function rules(array $rules): self { return $this->cloneWith(['rules' => $rules]); } /** * Set column name aliases for auto-mapping. * * @param array $aliases */ public function guess(array $aliases): self { return $this->cloneWith(['guesses' => $aliases]); } /** * Set an example value. */ public function example(string $example): self { return $this->cloneWith(['example' => $example]); } /** * Mark as a custom field. */ public function asCustomField(bool $isCustomField = true): self { return $this->cloneWith(['isCustomField' => $isCustomField]); } /** * Set the data type. */ public function type(?FieldDataType $type): self { return $this->cloneWith(['type' => $type]); } /** * Set the display icon. */ public function icon(?string $icon): self { return $this->cloneWith(['icon' => $icon]); } /** * Set the sort order. */ public function sortOrder(?int $sortOrder): self { return $this->cloneWith(['sortOrder' => $sortOrder]); } /** * Mark field as accepting arbitrary values (email, phone, tags). */ public function acceptsArbitraryValues(bool $accepts = true): self { return $this->cloneWith(['acceptsArbitraryValues' => $accepts]); } /** * Set choice options for select fields. * * @param array|null $options */ public function options(?array $options): self { return $this->cloneWith(['options' => $options]); } /** * Create a new instance with specified property overrides. * * @param array $overrides */ private function cloneWith(array $overrides): self { return new self( key: $overrides['key'] ?? $this->key, label: $overrides['label'] ?? $this->label, required: $overrides['required'] ?? $this->required, rules: $overrides['rules'] ?? $this->rules, guesses: $overrides['guesses'] ?? $this->guesses, example: $overrides['example'] ?? $this->example, isCustomField: $overrides['isCustomField'] ?? $this->isCustomField, type: $overrides['type'] ?? $this->type, icon: $overrides['icon'] ?? $this->icon, sortOrder: $overrides['sortOrder'] ?? $this->sortOrder, acceptsArbitraryValues: $overrides['acceptsArbitraryValues'] ?? $this->acceptsArbitraryValues, options: $overrides['options'] ?? $this->options, ); } /** * Check if this field matches a given column header. * * Normalizes spaces, dashes, and underscores as interchangeable (Filament convention). */ public function matchesHeader(string $header): bool { $normalized = $this->normalizeHeader($header); $candidates = array_merge([$this->key, $this->label], $this->guesses); return array_any($candidates, fn (string $candidate): bool => $this->normalizeHeader($candidate) === $normalized); } private function normalizeHeader(string $value): string { return str($value)->lower()->replace(['-', '_'], ' ')->squish()->toString(); } } ================================================ FILE: packages/ImportWizard/src/Data/ImportFieldCollection.php ================================================ */ final class ImportFieldCollection extends Collection { /** @phpstan-param ImportField|null $default */ public function get(mixed $key, mixed $default = null): ?ImportField { return $this->first(fn (ImportField $f): bool => $f->key === $key) ?? $default; } /** * Check if a field with the given key exists. */ public function hasKey(string $key): bool { return $this->get($key) instanceof ImportField; } /** * Find the best matching field for a CSV column header. * * Returns the first field that matches the header based on: * 1. Exact key match * 2. Exact label match * 3. Guess alias match */ public function guessFor(string $header): ?ImportField { return $this->first(fn (ImportField $f): bool => $f->matchesHeader($header)); } /** * Get all required fields. */ public function required(): static { return $this->filter(fn (ImportField $f): bool => $f->required); } /** * Get all optional fields. */ public function optional(): static { return $this->reject(fn (ImportField $f): bool => $f->required); } /** * Get standard (non-custom) fields. */ public function standard(): static { return $this->reject(fn (ImportField $f): bool => $f->isCustomField); } /** * Get custom fields only. */ public function custom(): static { return $this->filter(fn (ImportField $f): bool => $f->isCustomField); } } ================================================ FILE: packages/ImportWizard/src/Data/InferenceResult.php ================================================ $suggestedFields Field keys that match this type */ public function __construct( public readonly ?string $type, public readonly float $confidence, public readonly array $suggestedFields = [], ) {} } ================================================ FILE: packages/ImportWizard/src/Data/MatchableField.php ================================================ behavior->description(); } public function isCreate(): bool { return $this->behavior === MatchBehavior::Create; } } ================================================ FILE: packages/ImportWizard/src/Data/RelationshipMatch.php ================================================ action === RowMatchAction::Update; } public function isCreate(): bool { return $this->action === RowMatchAction::Create; } } ================================================ FILE: packages/ImportWizard/src/Enums/DateFormat.php ================================================ 'ISO standard', self::EUROPEAN => 'European', self::AMERICAN => 'American', }; } /** * Get example patterns for UI display. * * @return array */ public function getExamples(bool $withTime = false): array { if ($withTime) { return match ($this) { self::ISO => ['2024-05-15 16:00:00'], self::EUROPEAN => ['16:00 15-05-2024', '21:30:02 15 May 2024'], self::AMERICAN => ['16:00 05-15-2024', '21:30:02 May 15th 2024'], }; } return match ($this) { self::ISO => ['2024-05-15'], self::EUROPEAN => ['15-05-2024', '15/05/2024', '15 May 2024'], self::AMERICAN => ['05-15-2024', '05/15/2024', 'May 15th 2024'], }; } /** * Format a Carbon instance for display. */ public function format(Carbon $date, bool $withTime = false): string { if ($withTime) { return match ($this) { self::ISO => $date->format('Y-m-d H:i:s'), self::EUROPEAN => $date->format('H:i:s d/m/Y'), self::AMERICAN => $date->format('H:i:s m/d/Y'), }; } return match ($this) { self::ISO => $date->format('Y-m-d'), self::EUROPEAN => $date->format('d/m/Y'), self::AMERICAN => $date->format('m/d/Y'), }; } /** * @return array */ public static function toOptions(bool $withTime = false): array { $options = []; foreach (self::cases() as $case) { $options[$case->value] = [ 'value' => $case->value, 'label' => $case->getLabel(), 'description' => implode(', ', $case->getExamples($withTime)), ]; } return $options; } /** * Parse a date string into a Carbon instance. * * Attempts multiple format variations to handle real-world CSV data. */ public function parse(string $value, bool $withTime = false): ?Carbon { $value = trim($value); if ($value === '') { return null; } foreach ($this->getParseFormats($withTime) as $format) { try { $date = Date::createFromFormat($format, $value); if ($date instanceof Carbon) { return $date; } } catch (\Exception) { continue; } } return null; } /** * Format a Carbon instance for use in HTML date/datetime-local input. */ public function toPickerValue(Carbon $date, bool $withTime = false): string { return $date->format($withTime ? 'Y-m-d\TH:i' : 'Y-m-d'); } /** * Get the parse formats to attempt for this date format. * * @return array */ private function getParseFormats(bool $withTime): array { if ($withTime) { return match ($this) { self::ISO => [ 'Y-m-d H:i:s', 'Y-m-d\TH:i:s', 'Y-m-d\TH:i', 'Y-m-d H:i', ], self::EUROPEAN => [ 'd/m/Y H:i:s', 'd-m-Y H:i:s', 'd.m.Y H:i:s', 'j/n/Y H:i:s', 'd/m/Y H:i', 'd-m-Y H:i', 'd.m.Y H:i', 'j/n/Y H:i', 'H:i:s d/m/Y', 'H:i:s d-m-Y', 'H:i d/m/Y', 'H:i d-m-Y', ], self::AMERICAN => [ 'm/d/Y H:i:s', 'm-d-Y H:i:s', 'n/j/Y H:i:s', 'm/d/Y H:i', 'm-d-Y H:i', 'n/j/Y H:i', 'H:i:s m/d/Y', 'H:i:s m-d-Y', 'H:i m/d/Y', 'H:i m-d-Y', ], }; } return match ($this) { self::ISO => [ 'Y-m-d', ], self::EUROPEAN => [ 'd/m/Y', 'd-m-Y', 'd.m.Y', 'j/n/Y', 'j-n-Y', 'j.n.Y', ], self::AMERICAN => [ 'm/d/Y', 'm-d-Y', 'n/j/Y', 'n-j-Y', ], }; } } ================================================ FILE: packages/ImportWizard/src/Enums/EntityLinkSource.php ================================================ 'Companies', self::People => 'People', self::Opportunity => 'Opportunities', self::Task => 'Tasks', self::Note => 'Notes', }; } public function singular(): string { return match ($this) { self::Company => 'Company', self::People => 'Person', self::Opportunity => 'Opportunity', self::Task => 'Task', self::Note => 'Note', }; } /** * Get the importer class for this entity type. * * @return class-string */ public function importerClass(): string { return match ($this) { self::Company => CompanyImporter::class, self::People => PeopleImporter::class, self::Opportunity => OpportunityImporter::class, self::Task => TaskImporter::class, self::Note => NoteImporter::class, }; } public function icon(): string { return match ($this) { self::Company => 'heroicon-o-building-office', self::People => 'heroicon-o-users', self::Opportunity => 'heroicon-o-currency-dollar', self::Task => 'heroicon-o-clipboard-document-check', self::Note => 'heroicon-o-document-text', }; } public function importer(string $teamId): BaseImporter { $class = $this->importerClass(); return new $class($teamId); } } ================================================ FILE: packages/ImportWizard/src/Enums/ImportStatus.php ================================================ 'Only update existing records. Skip if not found.', self::MatchOrCreate => 'Find existing record or create new if not found.', self::Create => 'Always create a new record (no lookup).', }; } public function performsLookup(): bool { return $this !== self::Create; } public function createsOnNoMatch(): bool { return $this === self::MatchOrCreate || $this === self::Create; } } ================================================ FILE: packages/ImportWizard/src/Enums/NumberFormat.php ================================================ 'Point', self::COMMA => 'Comma', }; } /** * Get example pattern for UI display */ public function getExample(): string { return match ($this) { self::POINT => '1,000.00', self::COMMA => '1.000,00', }; } /** * Parse a string value into a float. * * Strips non-numeric characters except the decimal separator, * then normalizes to PHP float format. */ public function parse(string $value): ?float { $value = trim($value); if ($value === '') { return null; } $decimalSeparator = match ($this) { self::POINT => '.', self::COMMA => ',', }; $otherSeparator = match ($this) { self::POINT => ',', self::COMMA => '.', }; $value = str_replace(' ', '', $value); $value = str_replace($otherSeparator, '', $value); if ($decimalSeparator === ',') { $value = str_replace(',', '.', $value); } if (! is_numeric($value)) { return null; } return (float) $value; } /** * Format a float value for display. */ public function format(float $value, int $decimals = 2): string { return match ($this) { self::POINT => number_format($value, $decimals, '.', ''), self::COMMA => number_format($value, $decimals, ',', ''), }; } /** * Get select options for UI display. * * @return array */ public static function toOptions(): array { $options = []; foreach (self::cases() as $case) { $options[$case->value] = [ 'value' => $case->value, 'label' => $case->getLabel(), 'description' => $case->getExample(), ]; } return $options; } } ================================================ FILE: packages/ImportWizard/src/Enums/ReviewFilter.php ================================================ 'All', self::NeedsReview => 'Needs Review', self::Modified => 'Modified', self::Skipped => 'Skipped', }; } public function getIcon(): ?string { return match ($this) { self::NeedsReview => 'heroicon-o-exclamation-triangle', default => null, }; } } ================================================ FILE: packages/ImportWizard/src/Enums/RowMatchAction.php ================================================ 'heroicon-m-plus', self::Update => 'heroicon-m-arrow-path', self::Skip => 'heroicon-m-minus', }; } public function color(): string { return match ($this) { self::Create => 'text-success-500', self::Update => 'text-primary-500', self::Skip => 'text-gray-400', }; } } ================================================ FILE: packages/ImportWizard/src/Enums/SortDirection.php ================================================ 'Descending', self::Asc => 'Ascending', }; } public function getIcon(): string { return match ($this) { self::Desc => 'heroicon-o-bars-arrow-down', self::Asc => 'heroicon-o-bars-arrow-up', }; } } ================================================ FILE: packages/ImportWizard/src/Enums/SortField.php ================================================ 'Row count', self::Value => 'Value', }; } public function getIcon(): string { return match ($this) { self::Count => 'heroicon-o-hashtag', self::Value => 'heroicon-o-language', }; } } ================================================ FILE: packages/ImportWizard/src/Filament/Pages/ImportCompanies.php ================================================ query( Import::query() ->forTeam((string) filament()->getTenant()?->getKey()) ->whereIn('status', [ImportStatus::Completed, ImportStatus::Failed, ImportStatus::Importing]) ->latest() ) ->columns([ TextColumn::make('entity_type') ->label('Type') ->badge() ->formatStateUsing(fn (ImportEntityType $state): string => $state->label()) ->icon(fn (ImportEntityType $state): string => $state->icon()), TextColumn::make('file_name') ->label('File') ->searchable() ->limit(30), TextColumn::make('status') ->badge() ->color(fn (ImportStatus $state): string => match ($state) { ImportStatus::Completed => 'success', ImportStatus::Failed => 'danger', ImportStatus::Importing => 'warning', default => 'gray', }), TextColumn::make('total_rows') ->label('Total') ->numeric(), TextColumn::make('created_rows') ->label('Created') ->numeric() ->color('success'), TextColumn::make('updated_rows') ->label('Updated') ->numeric() ->color('info'), TextColumn::make('skipped_rows') ->label('Skipped') ->numeric() ->color('gray'), TextColumn::make('failed_rows') ->label('Failed') ->numeric() ->color('danger'), TextColumn::make('user.name') ->label('User'), TextColumn::make('created_at') ->label('Date') ->since() ->sortable(), ]) ->filters([ SelectFilter::make('entity_type') ->options(ImportEntityType::class), SelectFilter::make('status') ->options([ ImportStatus::Completed->value => 'Completed', ImportStatus::Failed->value => 'Failed', ImportStatus::Importing->value => 'Importing', ]), ]) ->actions([ Action::make('downloadFailedRows') ->label('Failed Rows') ->icon(Heroicon::OutlinedArrowDownTray) ->color('danger') ->url(fn (Import $record): string => URL::temporarySignedRoute( 'import-history.failed-rows.download', now()->addHour(), ['import' => $record], ), shouldOpenInNewTab: true) ->visible(fn (Import $record): bool => $record->failedRows()->exists()), ]) ->defaultSort('created_at', 'desc') ->poll('10s'); } } ================================================ FILE: packages/ImportWizard/src/Filament/Pages/ImportNotes.php ================================================ label(); } #[Override] public function getSubheading(): string { return 'Import '.strtolower(static::getEntityType()->label()).' from a CSV file'; } /** * Get breadcrumbs for navigation context. * * @return array */ public function getBreadcrumbs(): array { $resourceClass = static::getResourceClass(); $breadcrumbs = []; if (method_exists($resourceClass, 'getUrl')) { $breadcrumbs[$resourceClass::getUrl()] = static::getEntityType()->label(); } $breadcrumbs[] = 'Import'; return $breadcrumbs; } /** * Get the URL to redirect to after import completion. */ public function getReturnUrl(): string { $resourceClass = static::getResourceClass(); return $resourceClass::getUrl(); } } ================================================ FILE: packages/ImportWizard/src/Filament/Pages/ImportPeople.php ================================================ user(); abort_unless( (string) $import->team_id === (string) $user->currentTeam?->getKey(), 403, ); $columnHeaders = $import->headers; $csvHeaders = [...$columnHeaders, 'Import Error']; return response()->streamDownload(function () use ($import, $columnHeaders, $csvHeaders): void { $handle = fopen('php://output', 'w'); if ($handle === false) { return; } fwrite($handle, "\xEF\xBB\xBF"); fputcsv($handle, $csvHeaders, escape: '\\'); $import->failedRows() ->lazyById(100) ->each(function (FailedImportRow $row) use ($handle, $columnHeaders): void { $data = $row->data; $values = array_map(fn (string $header): string => $data[$header] ?? '', $columnHeaders); $values[] = $row->validation_error ?? 'System error'; fputcsv($handle, $values, escape: '\\'); }); fclose($handle); }, "failed-rows-{$import->id}.csv", ['Content-Type' => 'text/csv']); } } ================================================ FILE: packages/ImportWizard/src/ImportWizardNewServiceProvider.php ================================================ mergeConfigFrom(__DIR__.'/../config/import-wizard.php', 'import-wizard-new'); } public function boot(): void { $this->registerCommands(); $this->registerRoutes(); $this->registerViews(); $this->registerTranslations(); $this->registerLivewireComponents(); } private function registerCommands(): void { $this->commands([ CleanupImportsCommand::class, ]); } private function registerRoutes(): void { Route::middleware(['web', 'auth']) ->group(function (): void { $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); }); } private function registerViews(): void { $this->loadViewsFrom(__DIR__.'/../resources/views', 'import-wizard-new'); } private function registerTranslations(): void { $this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'import-wizard-new'); } private function registerLivewireComponents(): void { Livewire::component('import-wizard-new.wizard', ImportWizard::class); Livewire::component('import-wizard-new.steps.upload', UploadStep::class); Livewire::component('import-wizard-new.steps.mapping', MappingStep::class); Livewire::component('import-wizard-new.steps.review', ReviewStep::class); Livewire::component('import-wizard-new.steps.preview', PreviewStep::class); } } ================================================ FILE: packages/ImportWizard/src/Importers/BaseImporter.php ================================================ |null */ private ?array $entityLinksCache = null; private ?Team $teamCache = null; public function __construct( protected readonly string $teamId, ) {} public function getTeamId(): string { return $this->teamId; } public function getTeam(): ?Team { return $this->teamCache ??= Team::query()->find($this->teamId); } /** * Get all fields including custom fields, excluding Record-type fields. * * Record-type custom fields are excluded because they appear in entityLinks() instead. * Results are cached for the lifetime of this importer instance. */ public function allFields(): ImportFieldCollection { return $this->allFieldsCache ??= $this->fields()->merge($this->customFields()); } /** * Get all entity links (hardcoded relationships + Record-type custom fields). * * This unifies relationship definitions and Record custom fields into a single * collection for consistent handling in the UI and import process. * Results are cached for the lifetime of this importer instance. * * @return array */ public function entityLinks(): array { if ($this->entityLinksCache !== null) { return $this->entityLinksCache; } $links = $this->defineEntityLinks(); foreach ($this->getRecordCustomFields() as $customField) { $link = EntityLink::fromCustomField($customField); $links[$link->key] = $link; } return $this->entityLinksCache = $links; } /** * Define hardcoded entity links for this importer. * * Override in child classes to define entity-specific relationships. * * @return array */ protected function defineEntityLinks(): array { return []; } /** @return EloquentCollection */ protected function getRecordCustomFields(): EloquentCollection { return CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->teamId) ->where('entity_type', $this->entityName()) ->forType('record') ->active() ->orderBy('sort_order') ->get(); } /** * Get fields that can be used to match imported rows to existing records. * * Override in child classes to specify entity-specific matching fields. * * @return array */ public function matchableFields(): array { return [ MatchableField::id(), ]; } /** * Prepare data for saving to the database. * * Base implementation strips the ID field and passes through other data. * Override this to add custom data transformations. * * @param array $data * @param array &$context * @return array */ public function prepareForSave(array $data, ?Model $existing, array &$context): array { unset($data['id']); return $data; } /** * Perform post-save operations. * * Base implementation does nothing. Override for relationship syncing, etc. * * @param array $context */ public function afterSave(Model $record, array $context): void { $this->saveCustomFieldValues($record); } /** * Get custom fields for this entity as ImportField objects. * * Excludes Record-type custom fields since they appear in entityLinks() instead. * Eager loads options for choice fields. */ protected function customFields(): ImportFieldCollection { $customFields = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->teamId) ->where('entity_type', $this->entityName()) ->where('type', '!=', 'record') ->active() ->with('options') ->orderBy('sort_order') ->get(); $validationService = resolve(ValidationService::class); $fields = $customFields->map(function (CustomField $customField) use ($validationService): ImportField { // For multi-value arbitrary fields (email, phone), use item-level rules // since CSV values are strings that may be comma-separated $isMultiChoiceArbitrary = $customField->typeData->dataType->isMultiChoiceField() && $customField->typeData->acceptsArbitraryValues; $rules = $isMultiChoiceArbitrary ? $validationService->getItemValidationRules($customField) : $validationService->getValidationRules($customField); // Filter out object rules (like UniqueCustomFieldValue) for import preview $importRules = array_filter($rules, is_string(...)); // Load options for real choice fields (not email/phone which accept arbitrary values) $options = $this->shouldLoadOptions($customField) ? $customField->options->map(fn (CustomFieldOption $o): array => ['label' => $o->name, 'value' => $o->name])->all() : null; return ImportField::make("custom_fields_{$customField->code}") ->label($customField->name) ->guess($this->buildCustomFieldGuesses($customField->code, $customField->name)) ->required($validationService->isRequired($customField)) ->rules($importRules) ->asCustomField() ->type($customField->typeData->dataType) ->icon($customField->typeData->icon) ->sortOrder($customField->sort_order) ->acceptsArbitraryValues($customField->typeData->acceptsArbitraryValues) ->options($options); }); return new ImportFieldCollection($fields->all()); } private function shouldLoadOptions(CustomField $customField): bool { return $customField->typeData->dataType->isChoiceField() && ! $customField->typeData->acceptsArbitraryValues; } /** * @return array */ private function buildCustomFieldGuesses(string $code, string $name): array { $guesses = [$code, $name]; $singularCode = Str::singular($code); if ($singularCode !== $code) { $guesses[] = $singularCode; } $singularName = Str::singular($name); if ($singularName !== $name) { $guesses[] = $singularName; } return $guesses; } /** * Initialize a new record with team, creator, and source. * * Call this in prepareForSave when the record is new. * * @param array $data * @return array */ protected function initializeNewRecordData(array $data, ?string $creatorId = null): array { $data['team_id'] = $this->teamId; $data['creator_id'] = $creatorId; $data['creation_source'] = CreationSource::IMPORT; return $data; } protected function saveCustomFieldValues(Model $record): void { $team = $this->getTeam(); if (! $team instanceof Team) { return; } CustomFields::importer()->forModel($record)->saveValues($team); } /** * @param array $mappedFields */ public function getMatchFieldForMappedColumns(array $mappedFields): ?MatchableField { return collect($this->matchableFields()) ->sortByDesc(fn (MatchableField $field): int => $field->priority) ->first(fn (MatchableField $field): bool => in_array($field->field, $mappedFields, true)); } } ================================================ FILE: packages/ImportWizard/src/Importers/CompanyImporter.php ================================================ label('Name') ->required() ->rules(['required', 'string', 'max:255']) ->guess([ 'name', 'company_name', 'company', 'organization', 'account', 'account_name', 'company name', 'associated company', 'company domain name', 'account name', 'parent account', 'billing name', 'business', 'business_name', 'org', 'org_name', 'organisation', 'firm', 'client', 'customer', 'customer_name', 'vendor', 'vendor_name', ]) ->example('Acme Corporation') ->icon('heroicon-o-building-office-2'), ]); } /** @return array */ protected function defineEntityLinks(): array { return [ 'account_owner' => EntityLink::belongsTo('account_owner', User::class) ->matchableFields([ MatchableField::id(), MatchableField::email('email', MatchBehavior::MatchOnly), ]) ->foreignKey('account_owner_id') ->label('Account Owner') ->guess([ 'account_owner', 'owner_email', 'owner', 'assigned_to', 'account_manager', 'owner email', 'sales rep', 'sales_rep', 'rep', 'salesperson', 'sales_owner', 'account_rep', 'assigned_user', 'manager_email', 'contact_owner', 'account_owner_email', 'owner_id', ]), ]; } /** @return array */ public function matchableFields(): array { return [ MatchableField::id(), MatchableField::domain('custom_fields_domains'), ]; } /** * @param array $data * @param array &$context * @return array */ public function prepareForSave(array $data, ?Model $existing, array &$context): array { $data = parent::prepareForSave($data, $existing, $context); if (! $existing instanceof Model) { return $this->initializeNewRecordData($data, $context['creator_id'] ?? null); } return $data; } } ================================================ FILE: packages/ImportWizard/src/Importers/Contracts/ImporterContract.php ================================================ */ public function modelClass(): string; /** * Get the entity name identifier (e.g., 'company', 'people'). */ public function entityName(): string; /** * Get the standard fields for this entity. */ public function fields(): ImportFieldCollection; /** * Get all fields including custom fields. */ public function allFields(): ImportFieldCollection; /** * Get entity links (relationships and Record custom fields) for this entity. * * @return array */ public function entityLinks(): array; /** * Get fields that can be used to match imported rows to existing records. * * @return array */ public function matchableFields(): array; /** * Get the highest priority matchable field that is mapped. * * @param array $mappedFields List of mapped field keys */ public function getMatchFieldForMappedColumns(array $mappedFields): ?MatchableField; /** * Prepare data for saving to the database. * * This method transforms the mapped CSV data into model-ready data. * Override this to handle special cases like entity link resolution. * * @param array $data The mapped row data * @param Model|null $existing The existing record if updating * @param array &$context Additional context (e.g., match field info), passed by reference * @return array The prepared data ready for fill() */ public function prepareForSave(array $data, ?Model $existing, array &$context): array; /** * Perform post-save operations. * * Called after the record is saved. Use for entity link syncing, * polymorphic links, and other operations that require the saved record. * * @param Model $record The saved record * @param array $context Additional context from prepareForSave */ public function afterSave(Model $record, array $context): void; } ================================================ FILE: packages/ImportWizard/src/Importers/NoteImporter.php ================================================ label('Title') ->required() ->rules(['required', 'string', 'max:255']) ->guess([ 'title', 'subject', 'note_title', 'heading', 'note subject', 'summary', ]) ->example('Meeting Notes') ->icon('heroicon-o-pencil-square'), ]); } /** * @return array */ protected function defineEntityLinks(): array { return [ 'companies' => EntityLink::polymorphicCompanies(), 'people' => EntityLink::polymorphicPeople(), 'opportunities' => EntityLink::polymorphicOpportunities(), ]; } /** * Notes cannot be matched - always create new. * * @return array */ public function matchableFields(): array { return []; } /** * @param array $data * @param array &$context * @return array */ public function prepareForSave(array $data, ?Model $existing, array &$context): array { $data = parent::prepareForSave($data, $existing, $context); if (! $existing instanceof Model) { return $this->initializeNewRecordData($data, $context['creator_id'] ?? null); } return $data; } } ================================================ FILE: packages/ImportWizard/src/Importers/OpportunityImporter.php ================================================ label('Name') ->required() ->rules(['required', 'string', 'max:255']) ->guess([ 'name', 'opportunity_name', 'deal', 'deal_name', 'opportunity', 'title', 'subject', 'deal title', 'opportunity title', 'pipeline', ]) ->example('Enterprise License Deal') ->icon('heroicon-o-currency-dollar'), ]); } /** * @return array */ protected function defineEntityLinks(): array { return [ 'company' => EntityLink::company(), 'contact' => EntityLink::contact(), ]; } /** * @return array */ public function matchableFields(): array { return [ MatchableField::id(), ]; } /** * @param array $data * @param array &$context * @return array */ public function prepareForSave(array $data, ?Model $existing, array &$context): array { $data = parent::prepareForSave($data, $existing, $context); if (! $existing instanceof Model) { return $this->initializeNewRecordData($data, $context['creator_id'] ?? null); } return $data; } } ================================================ FILE: packages/ImportWizard/src/Importers/PeopleImporter.php ================================================ label('Name') ->required() ->rules(['required', 'string', 'max:255']) ->guess([ 'name', 'full_name', 'person_name', 'contact', 'contact_name', 'person', 'individual', 'member', 'employee', 'full name', 'display_name', 'displayname', 'contact name', 'lead name', 'prospect name', ]) ->example('John Doe') ->icon('heroicon-o-user'), ]); } /** * @return array */ protected function defineEntityLinks(): array { return [ 'company' => EntityLink::company(), ]; } /** * @return array */ public function matchableFields(): array { return [ MatchableField::id(), MatchableField::email('custom_fields_emails'), MatchableField::phone('custom_fields_phone_number'), ]; } /** * @param array $data * @param array &$context * @return array */ public function prepareForSave(array $data, ?Model $existing, array &$context): array { $data = parent::prepareForSave($data, $existing, $context); if (! $existing instanceof Model) { return $this->initializeNewRecordData($data, $context['creator_id'] ?? null); } return $data; } } ================================================ FILE: packages/ImportWizard/src/Importers/TaskImporter.php ================================================ label('Title') ->required() ->rules(['required', 'string', 'max:255']) ->guess([ 'title', 'task_title', 'name', 'subject', 'todo', 'task', 'task name', 'action', 'action item', 'to do', 'todo item', 'activity', ]) ->example('Follow up with client') ->icon('heroicon-o-check-circle'), ]); } /** * @return array */ protected function defineEntityLinks(): array { return [ 'companies' => EntityLink::polymorphicCompanies(), 'people' => EntityLink::polymorphicPeople(), 'opportunities' => EntityLink::polymorphicOpportunities(), 'assignees' => EntityLink::morphToMany('assignees', User::class) ->matchableFields([ MatchableField::id(), MatchableField::email('email', MatchBehavior::MatchOnly), ]) ->label('Assignee') ->guess([ 'assignee', 'assigned_to', 'owner', 'assignee_email', 'assigned_email', 'owner_email', 'responsible', ]), ]; } /** * @return array */ public function matchableFields(): array { return [ MatchableField::id(), ]; } /** * @param array $data * @param array &$context * @return array */ public function prepareForSave(array $data, ?Model $existing, array &$context): array { $data = parent::prepareForSave($data, $existing, $context); if (! $existing instanceof Model) { return $this->initializeNewRecordData($data, $context['creator_id'] ?? null); } return $data; } } ================================================ FILE: packages/ImportWizard/src/Jobs/ExecuteImportJob.php ================================================ */ public array $backoff = [10, 30]; private const string CUSTOM_FIELD_PREFIX = 'custom_fields_'; /** @var array Dedup map for auto-created records: "{entityLinkKey}:{name}" => id */ private array $createdRecords = []; /** @var array Matchable value => record ID for intra-import dedup */ private array $matchableValueCache = []; /** @var list}> */ private array $failedRows = []; /** @var list */ private array $processedRows = []; /** @var list Row numbers promoted from Create to Update by intra-import dedup */ private array $dedupedRows = []; /** @var list> */ private array $pendingCustomFieldValues = []; public function __construct( private readonly string $importId, private readonly string $teamId, ) { $this->onQueue('imports'); } public function handle(): void { $import = Import::query()->findOrFail($this->importId); if ($import->team_id !== $this->teamId) { return; } $store = ImportStore::load($this->importId); if (! $store instanceof ImportStore) { return; } $store->ensureProcessedColumn(); $importer = $import->getImporter(); $mappings = $import->columnMappings(); $results = [ 'created' => $import->created_rows, 'updated' => $import->updated_rows, 'skipped' => $import->skipped_rows, 'failed' => $import->failed_rows, ]; $allowedKeys = $this->allowedAttributeKeys($importer); $customFieldDefs = $this->loadCustomFieldDefinitions($importer); $fieldMappings = $mappings->filter(fn (ColumnData $col): bool => $col->isFieldMapping()); $customFieldFormatMap = $this->buildCustomFieldFormatMap($fieldMappings); $matchField = $this->resolveMatchField($importer, $fieldMappings); $matchSourceColumn = $matchField instanceof MatchableField ? $this->findMatchSourceColumn($matchField, $fieldMappings) : null; $context = [ 'team_id' => $this->teamId, 'creator_id' => $import->user_id, ]; try { $store->query() ->where('processed', false) ->orderBy('row_number') ->chunkById(500, function (Collection $rows) use ($importer, $fieldMappings, $allowedKeys, $customFieldDefs, $customFieldFormatMap, $matchField, $matchSourceColumn, $context, &$results, $store, $import): void { $existingRecords = $this->preloadExistingRecords($rows, $importer); foreach ($rows as $row) { $this->processRow($row, $importer, $fieldMappings, $allowedKeys, $customFieldDefs, $customFieldFormatMap, $matchField, $matchSourceColumn, $context, $results, $existingRecords); $this->flushProcessedRows($store); } $this->flushCustomFieldValues(); $this->flushFailedRows($import); $this->persistResults($import, $results); }); $import->update([ 'status' => ImportStatus::Completed, 'completed_at' => now(), 'created_rows' => $results['created'], 'updated_rows' => $results['updated'], 'skipped_rows' => $results['skipped'], 'failed_rows' => $results['failed'], ]); $this->notifyUser($import, $results); } catch (\Throwable $e) { $this->flushFailedRows($import); $this->persistResults($import, $results); $import->update(['status' => ImportStatus::Failed]); try { $this->notifyUser($import, $results, failed: true); } catch (\Throwable) { } throw $e; } } public function failed(\Throwable $exception): void { $import = Import::query()->find($this->importId); if ($import === null) { return; } if (! in_array($import->status, [ImportStatus::Completed, ImportStatus::Failed], true)) { $import->update(['status' => ImportStatus::Failed]); } $this->flushFailedRows($import); try { $this->notifyUser($import, [ 'created' => $import->created_rows, 'updated' => $import->updated_rows, 'skipped' => $import->skipped_rows, 'failed' => $import->failed_rows, ], failed: true); } catch (\Throwable) { } } /** * @param Collection $fieldMappings * @param array $allowedKeys * @param Collection $customFieldDefs * @param array $customFieldFormatMap * @param array $context * @param array $results * @param array $existingRecords */ private function processRow( ImportRow $row, BaseImporter $importer, Collection $fieldMappings, array $allowedKeys, Collection $customFieldDefs, array $customFieldFormatMap, ?MatchableField $matchField, ?string $matchSourceColumn, array $context, array &$results, array $existingRecords = [], ): void { if (! $row->isCreate() && ! $row->isUpdate()) { $results['skipped']++; $this->markProcessed($row); return; } $effectiveAction = $row->match_action; $effectiveMatchedId = $row->matched_id; if ($effectiveAction === RowMatchAction::Create && $matchField instanceof MatchableField && $matchSourceColumn !== null ) { $cachedRecordId = $this->lookupMatchableValueCache($row, $matchField, $matchSourceColumn); if ($cachedRecordId !== null) { $effectiveAction = RowMatchAction::Update; $effectiveMatchedId = $cachedRecordId; $this->dedupedRows[] = $row->row_number; } } $isCreate = $effectiveAction === RowMatchAction::Create; try { $data = $this->buildDataFromRow($row, $fieldMappings); $existing = $isCreate ? (null) : $existingRecords[(string) $effectiveMatchedId] ?? $this->findExistingRecord($importer, $effectiveMatchedId); if (! $isCreate && ! $existing instanceof Model) { $results['skipped']++; $this->markProcessed($row); return; } DB::transaction(function () use ($row, $importer, $data, $existing, $context, $isCreate, $matchField, $matchSourceColumn, $allowedKeys, $customFieldDefs, $customFieldFormatMap, &$results): void { $pendingRelationships = $this->resolveEntityLinkRelationships($row, $data, $importer, $context); $prepared = $importer->prepareForSave($data, $existing, $context); $customFieldData = $this->extractCustomFieldData($prepared); $prepared = array_intersect_key($prepared, $allowedKeys); if (! $isCreate) { unset($prepared['team_id'], $prepared['creator_id'], $prepared['creation_source']); $prepared = array_filter($prepared, filled(...)); } $record = $isCreate ? new ($importer->modelClass()) : $existing; if ($customFieldData !== []) { ImportDataStorage::setMultiple($record, $customFieldData); } $record->forceFill($prepared); $record->save(); if ($isCreate && $matchField instanceof MatchableField && $matchSourceColumn !== null) { $this->registerInMatchableValueCache($row, $matchField, $matchSourceColumn, (string) $record->getKey()); } $this->storeEntityLinkRelationships($record, $pendingRelationships, $context); $results[$isCreate ? 'created' : 'updated']++; $storedCustomFieldData = ImportDataStorage::pull($record); $batchableData = array_intersect_key($storedCustomFieldData, $customFieldDefs->all()); $remainingData = array_diff_key($storedCustomFieldData, $batchableData); $this->collectCustomFieldValues($record, $batchableData, $customFieldDefs, $customFieldFormatMap, $isCreate); if ($remainingData !== []) { ImportDataStorage::setMultiple($record, $remainingData); } $importer->afterSave($record, $context); }); $this->markProcessed($row); } catch (\Throwable $e) { $results['failed']++; $this->recordFailedRow($row->row_number, $row->raw_data->all(), $e); report($e); } } /** @return Collection */ private function loadCustomFieldDefinitions(BaseImporter $importer): Collection { /** @phpstan-ignore return.type (App\Models\CustomField extends vendor class at runtime via model swapping) */ return CustomField::query() ->withoutGlobalScopes() ->with(['options' => fn (HasMany $q) => $q->withoutGlobalScopes()]) ->where('tenant_id', $this->teamId) ->where('entity_type', $importer->entityName()) ->where('type', '!=', 'record') ->active() ->get() ->keyBy('code'); } /** * @param array $customFieldData * @param Collection $customFieldDefs * @param array $customFieldFormatMap */ private function collectCustomFieldValues( Model $record, array $customFieldData, Collection $customFieldDefs, array $customFieldFormatMap = [], bool $isCreate = true, ): void { if ($customFieldData === []) { return; } $tenantKey = config('custom-fields.database.column_names.tenant_foreign_key'); foreach ($customFieldData as $code => $value) { $cf = $customFieldDefs->get($code); if ($cf === null) { continue; } $value = $this->convertCustomFieldValue($value, $cf, $customFieldFormatMap[$code] ?? null); $valueColumn = CustomFieldValue::getValueColumn($cf->type); $safeValue = SafeValueConverter::toDbSafe($value, $cf->type); if (! $isCreate && $cf->typeData->dataType === FieldDataType::MULTI_CHOICE && is_array($safeValue)) { $safeValue = $this->mergeWithExistingMultiChoiceValues($record, $cf, $safeValue, $tenantKey); } $row = [ 'id' => (string) Str::ulid(), 'entity_type' => $record->getMorphClass(), 'entity_id' => $record->getKey(), 'custom_field_id' => $cf->getKey(), $tenantKey => $this->teamId, 'string_value' => null, 'text_value' => null, 'integer_value' => null, 'float_value' => null, 'json_value' => null, 'boolean_value' => null, 'date_value' => null, 'datetime_value' => null, ]; $row[$valueColumn] = $valueColumn === 'json_value' && $safeValue !== null ? json_encode($safeValue) : $safeValue; $this->pendingCustomFieldValues[] = $row; } } /** * @param array $newValues * @return array */ private function mergeWithExistingMultiChoiceValues( Model $record, CustomField $cf, array $newValues, string $tenantKey, ): array { $entityType = $record->getMorphClass(); $entityId = $record->getKey(); $cfId = $cf->getKey(); $existingValues = []; foreach ($this->pendingCustomFieldValues as $pending) { if ($pending['entity_type'] === $entityType && (string) $pending['entity_id'] === (string) $entityId && (string) $pending['custom_field_id'] === (string) $cfId && $pending['json_value'] !== null ) { $existingValues = json_decode($pending['json_value'], true) ?? []; } } if ($existingValues === []) { $table = config('custom-fields.database.table_names.custom_field_values'); $dbRow = DB::table($table) ->where('entity_type', $entityType) ->where('entity_id', $entityId) ->where('custom_field_id', $cfId) ->where($tenantKey, $this->teamId) ->value('json_value'); if ($dbRow !== null) { $existingValues = json_decode($dbRow, true) ?? []; } } if ($existingValues === []) { return $newValues; } return array_values(array_unique([...$existingValues, ...$newValues])); } private function flushCustomFieldValues(): void { if ($this->pendingCustomFieldValues === []) { return; } $tenantKey = config('custom-fields.database.column_names.tenant_foreign_key'); $table = config('custom-fields.database.table_names.custom_field_values'); $uniqueBy = ['entity_type', 'entity_id', 'custom_field_id', $tenantKey]; $updateColumns = [ 'string_value', 'text_value', 'integer_value', 'float_value', 'json_value', 'boolean_value', 'date_value', 'datetime_value', ]; $deduplicated = []; foreach ($this->pendingCustomFieldValues as $row) { $key = $row['entity_type'].'|'.$row['entity_id'].'|'.$row['custom_field_id'].'|'.$row[$tenantKey]; $deduplicated[$key] = $row; } foreach (array_chunk(array_values($deduplicated), 500) as $chunk) { DB::table($table)->upsert($chunk, $uniqueBy, $updateColumns); } $this->pendingCustomFieldValues = []; } private function markProcessed(ImportRow $row): void { $this->processedRows[] = $row->row_number; } private function flushProcessedRows(ImportStore $store): void { if ($this->dedupedRows !== []) { $store->connection()->table('import_rows') ->whereIn('row_number', $this->dedupedRows) ->update(['match_action' => RowMatchAction::Update->value]); $this->dedupedRows = []; } if ($this->processedRows === []) { return; } $store->connection()->table('import_rows') ->whereIn('row_number', $this->processedRows) ->update(['processed' => true]); $this->processedRows = []; } /** * @param Collection $rows * @return array */ private function preloadExistingRecords(Collection $rows, BaseImporter $importer): array { $updateIds = $rows ->filter(fn (ImportRow $row): bool => $row->isUpdate() && $row->matched_id !== null) ->pluck('matched_id') ->unique() ->all(); if ($updateIds === []) { return []; } $modelClass = $importer->modelClass(); return $modelClass::query() ->where('team_id', $this->teamId) ->whereIn((new $modelClass)->getKeyName(), $updateIds) ->get() ->keyBy(fn (Model $model): string => (string) $model->getKey()) ->all(); } /** @param array $rawData */ private function recordFailedRow(int $rowNumber, array $rawData, \Throwable $e): void { $this->failedRows[] = [ 'row' => $rowNumber, 'error' => Str::limit($e->getMessage(), 500), 'data' => $rawData, ]; } /** @param array $results */ private function persistResults(Import $import, array $results): void { $import->update([ 'created_rows' => $results['created'], 'updated_rows' => $results['updated'], 'skipped_rows' => $results['skipped'], 'failed_rows' => $results['failed'], ]); } private function flushFailedRows(Import $import): void { if ($this->failedRows === []) { return; } $now = now(); $rows = collect($this->failedRows)->map(fn (array $row): array => [ 'id' => (string) Str::ulid(), 'import_id' => $import->id, 'team_id' => $this->teamId, 'data' => json_encode($row['data'] ?? ['row_number' => $row['row']]), 'validation_error' => $row['error'], 'created_at' => $now, 'updated_at' => $now, ]); foreach ($rows->chunk(100) as $chunk) { $import->failedRows()->insert($chunk->all()); } $this->failedRows = []; } /** * @param Collection $fieldMappings * @return array */ private function buildDataFromRow(ImportRow $row, Collection $fieldMappings): array { return $fieldMappings ->mapWithKeys(fn (ColumnData $mapping): array => [ $mapping->target => $row->getFinalValue($mapping->source), ]) ->all(); } /** * @param array $prepared * @return array */ private function extractCustomFieldData(array &$prepared): array { $customFieldData = []; foreach ($prepared as $key => $value) { if (! str_starts_with($key, self::CUSTOM_FIELD_PREFIX)) { continue; } unset($prepared[$key]); if (blank($value)) { continue; } $customFieldData[Str::after($key, self::CUSTOM_FIELD_PREFIX)] = $value; } return $customFieldData; } /** * Build a map from custom field code to its ColumnData for format lookups. * * @param Collection $fieldMappings * @return array */ private function buildCustomFieldFormatMap(Collection $fieldMappings): array { return $fieldMappings ->filter(fn (ColumnData $m): bool => str_starts_with($m->target, self::CUSTOM_FIELD_PREFIX)) ->mapWithKeys(fn (ColumnData $m): array => [ Str::after($m->target, self::CUSTOM_FIELD_PREFIX) => $m, ]) ->all(); } /** * Apply format-aware conversion for date/datetime and float custom field values. */ private function convertCustomFieldValue(mixed $value, CustomField $cf, ?ColumnData $columnData): mixed { if (! is_string($value) || $value === '') { return $value; } $dataType = $cf->typeData->dataType; if ($dataType === FieldDataType::DATE || $dataType === FieldDataType::DATE_TIME) { $format = $columnData instanceof ColumnData ? ($columnData->dateFormat ?? DateFormat::ISO) : DateFormat::ISO; $parsed = $format->parse($value, $dataType->isTimestamp()); if (! $parsed instanceof Carbon) { return $value; } return $dataType === FieldDataType::DATE ? $parsed->format('Y-m-d') : $parsed->format('Y-m-d H:i:s'); } if ($dataType === FieldDataType::FLOAT) { $format = $columnData instanceof ColumnData ? ($columnData->numberFormat ?? NumberFormat::POINT) : NumberFormat::POINT; return $format->parse($value); } if ($dataType === FieldDataType::SINGLE_CHOICE) { return $this->resolveChoiceValue($cf, $value); } if ($dataType === FieldDataType::MULTI_CHOICE) { return $this->resolveMultiChoiceValue($cf, $value); } return $value; } private function resolveChoiceValue(CustomField $cf, string $value): int|string { $option = $cf->options->firstWhere('name', $value); if (! $option) { $option = $cf->options->first( fn (CustomFieldOption $opt): bool => mb_strtolower((string) $opt->name) === mb_strtolower($value) ); } if ($option) { $key = $option->getKey(); return CustomFields::optionModelUsesStringKeys() ? (string) $key : $key; } $isExistingId = $cf->options->contains(fn (CustomFieldOption $opt): bool => (string) $opt->getKey() === $value); if ($isExistingId) { return CustomFields::optionModelUsesStringKeys() ? $value : (int) $value; } return $value; } /** * @return array */ private function resolveMultiChoiceValue(CustomField $cf, string $value): array { $items = array_map(trim(...), explode(',', $value)); if ($cf->typeData->acceptsArbitraryValues) { return $items; } $resolved = []; foreach ($items as $item) { $resolved[] = $this->resolveChoiceValue($cf, $item); } return $resolved; } /** @return array */ private function allowedAttributeKeys(BaseImporter $importer): array { $keys = collect($importer->allFields()) ->reject(fn (ImportField $field): bool => $field->key === 'id') ->pluck('key') ->merge(['team_id', 'creator_id', 'creation_source']) ->merge( collect($importer->entityLinks()) ->pluck('foreignKey') ->filter() ) ->all(); /** @var array */ return array_fill_keys($keys, true); } private function findExistingRecord(BaseImporter $importer, ?string $matchedId): ?Model { if ($matchedId === null) { return null; } $modelClass = $importer->modelClass(); return $modelClass::query() ->where('team_id', $this->teamId) ->find($matchedId); } /** * Resolve the highest-priority matchable field from the mapped columns. * * Returns null if no matchable field is mapped or the match behavior is Create-only. * * @param Collection $fieldMappings */ private function resolveMatchField(BaseImporter $importer, Collection $fieldMappings): ?MatchableField { $mappedFieldKeys = $fieldMappings->pluck('target')->all(); $matchField = $importer->getMatchFieldForMappedColumns($mappedFieldKeys); if (! $matchField instanceof MatchableField || $matchField->isCreate()) { return null; } return $matchField; } /** * Find the CSV source column name that maps to the given matchable field. * * @param Collection $fieldMappings */ private function findMatchSourceColumn(MatchableField $matchField, Collection $fieldMappings): ?string { $mapping = $fieldMappings->first( fn (ColumnData $col): bool => $col->target === $matchField->field ); return $mapping?->source; } private function lookupMatchableValueCache(ImportRow $row, MatchableField $matchField, string $sourceColumn): ?string { foreach ($this->normalizeMatchableValues($row, $matchField, $sourceColumn) as $normalized) { if (isset($this->matchableValueCache[$normalized])) { return $this->matchableValueCache[$normalized]; } } return null; } private function registerInMatchableValueCache(ImportRow $row, MatchableField $matchField, string $sourceColumn, string $recordId): void { foreach ($this->normalizeMatchableValues($row, $matchField, $sourceColumn) as $normalized) { $this->matchableValueCache[$normalized] = $recordId; } } /** * Extract and normalize the matchable values from a row's source column. * * For multi-value fields (email, phone), splits on commas. * Returns lowercased, trimmed, non-empty strings. * * @return list */ private function normalizeMatchableValues(ImportRow $row, MatchableField $matchField, string $sourceColumn): array { $rawValue = $row->getFinalValue($sourceColumn); if (blank($rawValue)) { return []; } $parts = $matchField->multiValue ? explode(',', (string) $rawValue) : [(string) $rawValue]; return array_values(array_filter( array_map(fn (string $part): string => mb_strtolower(trim($part)), $parts), fn (string $v): bool => $v !== '', )); } /** * @param array $data * @param array $context * @return array}> */ private function resolveEntityLinkRelationships( ImportRow $row, array &$data, BaseImporter $importer, array $context, ): array { if ($row->relationships === null || $row->relationships->count() === 0) { return []; } $entityLinks = $importer->entityLinks(); $pending = []; $grouped = collect($row->relationships->all())->groupBy('relationship'); foreach ($grouped as $linkKey => $matches) { $link = $entityLinks[$linkKey] ?? null; if ($link === null) { continue; } $resolvedId = $this->resolveGroupedMatches($matches, $link, $context); if ($resolvedId === null) { continue; } $storageStrategy = $link->getStorageStrategy(); $data = $storageStrategy->prepareData($data, $link, [$resolvedId]); $pending[] = [ 'link' => $link, 'strategy' => $storageStrategy, 'ids' => [$resolvedId], ]; } return $pending; } /** * @param Collection $matches * @param array $context */ private function resolveGroupedMatches( Collection $matches, EntityLink $link, array $context, ): ?string { foreach ($matches as $match) { if ($match->isExisting() && $match->id !== null) { return $match->id; } } $creationMatch = $this->resolveCreationMatch($matches); if (! $creationMatch instanceof RelationshipMatch || blank($creationMatch->name)) { return null; } $creationName = trim($creationMatch->name); if ($creationName === '') { return null; } $dedupKey = "{$link->key}:".mb_strtolower($creationName); if (isset($this->createdRecords[$dedupKey])) { return $this->createdRecords[$dedupKey]; } if ($link->storageType === EntityLinkStorage::CustomFieldValue) { return $this->resolveRecordFieldByName($link, $creationName, $context, $dedupKey); } /** @var Model $record */ $record = new $link->targetModelClass; $record->forceFill([ 'name' => $creationName, 'team_id' => $context['team_id'], 'creator_id' => $context['creator_id'], 'creation_source' => CreationSource::IMPORT, ]); $record->save(); $this->populateMatchingCustomField($record, $link, $creationMatch, $context); $id = (string) $record->getKey(); $this->createdRecords[$dedupKey] = $id; return $id; } /** @param Collection $matches */ private function resolveCreationMatch(Collection $matches): ?RelationshipMatch { $preferred = $matches->first( fn (RelationshipMatch $m): bool => $m->isCreate() && $m->behavior === MatchBehavior::Create ); return $preferred ?? $matches->first( fn (RelationshipMatch $m): bool => $m->isCreate() && $m->behavior === MatchBehavior::MatchOrCreate ); } /** @param array $context */ private function populateMatchingCustomField( Model $record, EntityLink $link, RelationshipMatch $match, array $context, ): void { if ($match->matchField === null) { return; } if (! str_starts_with($match->matchField, self::CUSTOM_FIELD_PREFIX)) { return; } $fieldCode = Str::after($match->matchField, self::CUSTOM_FIELD_PREFIX); $cf = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $context['team_id']) ->where('entity_type', $link->targetEntity) ->where('code', $fieldCode) ->first(); if ($cf === null) { return; } $valueColumn = CustomFieldValue::getValueColumn($cf->type); $tenantKey = config('custom-fields.database.column_names.tenant_foreign_key'); $value = $match->name; $isJsonColumn = $valueColumn === 'json_value'; $safeValue = $isJsonColumn ? [$value] : $value; $this->pendingCustomFieldValues[] = [ 'id' => (string) Str::ulid(), 'entity_type' => $record->getMorphClass(), 'entity_id' => $record->getKey(), 'custom_field_id' => $cf->getKey(), $tenantKey => $context['team_id'], 'string_value' => null, 'text_value' => null, 'integer_value' => null, 'float_value' => null, 'json_value' => null, 'boolean_value' => null, 'date_value' => null, 'datetime_value' => null, $valueColumn => $isJsonColumn ? json_encode($safeValue) : $safeValue, ]; } /** * Record custom fields should never auto-create target entities, only match existing ones. * * @param array $context */ private function resolveRecordFieldByName( EntityLink $link, string $name, array $context, string $dedupKey, ): ?string { $record = $link->targetModelClass::query() ->where('team_id', $context['team_id']) ->where('name', $name) ->first(); if ($record === null) { return null; } $id = (string) $record->getKey(); $this->createdRecords[$dedupKey] = $id; return $id; } /** @param array $results */ private function notifyUser(Import $import, array $results, bool $failed = false): void { $user = User::query()->find($import->user_id); if ($user === null) { return; } $entityLabel = $import->entity_type->label(); $status = $failed ? 'failed' : 'completed'; $notification = Notification::make() ->title("Import of {$entityLabel} {$status}") ->viewData(['results' => $results]); $failed ? $notification->danger() : $notification->success(); $notification->sendToDatabase($user); } /** * @param array}> $pendingRelationships * @param array $context */ private function storeEntityLinkRelationships( Model $record, array $pendingRelationships, array $context, ): void { foreach ($pendingRelationships as $pending) { $pending['strategy']->store($record, $pending['link'], $pending['ids'], $context); } } } ================================================ FILE: packages/ImportWizard/src/Jobs/ResolveMatchesJob.php ================================================ onQueue('imports'); } public function handle(): void { if ($this->batch()?->cancelled()) { return; } $import = Import::query()->findOrFail($this->importId); $store = ImportStore::load($this->importId); if (! $store instanceof ImportStore) { return; } $importer = $import->getImporter(); new MatchResolver($store, $import, $importer)->resolve(); } } ================================================ FILE: packages/ImportWizard/src/Jobs/ValidateColumnJob.php ================================================ onQueue('imports'); } public function handle(): void { if ($this->batch()?->cancelled()) { return; } $import = Import::query()->findOrFail($this->importId); $store = ImportStore::load($this->importId); if (! $store instanceof ImportStore) { return; } $connection = $store->connection(); $jsonPath = '$.'.$this->column->source; if ($this->column->isEntityLinkMapping()) { $this->validateEntityLink($import, $store, $connection, $jsonPath); return; } $this->clearValidationForCorrectedDateFields($connection, $jsonPath); $uniqueValues = $this->fetchUncorrectedUniqueValues($store, $jsonPath); if ($uniqueValues === []) { return; } $results = $this->validateValues($import, $uniqueValues); $this->updateValidationErrors($connection, $jsonPath, $results); } private function validateEntityLink(Import $import, ImportStore $store, Connection $connection, string $jsonPath): void { $uniqueValues = $this->fetchUncorrectedUniqueValues($store, $jsonPath); if ($uniqueValues === []) { return; } $validator = new EntityLinkValidator($import->team_id); $errorMap = $validator->batchValidateFromColumn($this->column, $import->getImporter(), $uniqueValues); $results = []; foreach ($errorMap as $value => $error) { $results[] = [ 'raw_value' => $value, 'validation_error' => $error, ]; } $this->updateValidationErrors($connection, $jsonPath, $results); $this->writeEntityLinkRelationships($import, $connection, $jsonPath, $validator, $uniqueValues, $validator->getLastFormatErrors()); } /** * @param array $uniqueValues * @param array $errorMap */ private function writeEntityLinkRelationships( Import $import, Connection $connection, string $jsonPath, EntityLinkValidator $validator, array $uniqueValues, array $errorMap = [], ): void { $context = $this->column->resolveEntityLinkContext($import->getImporter()); if ($context === null) { return; } $link = $context['link']; $matcher = $context['matcher']; $validValues = array_filter($uniqueValues, fn (string $v): bool => ($errorMap[$v] ?? null) === null); $resolvedMap = $matcher->behavior === MatchBehavior::Create ? array_fill_keys($validValues, null) : $validator->getResolver()->batchResolve($link, $matcher, $validValues); $connection->statement(' CREATE TEMPORARY TABLE IF NOT EXISTS temp_relationships ( lookup_value TEXT, relationship_json TEXT ) '); try { $inserts = []; foreach ($resolvedMap as $value => $resolvedId) { if ($resolvedId === null && $matcher->behavior === MatchBehavior::MatchOnly) { continue; } $match = $resolvedId !== null ? RelationshipMatch::existing($link->key, (string) $resolvedId, $matcher->behavior, $matcher->field) : RelationshipMatch::create($link->key, (string) $value, $matcher->behavior, $matcher->field); $inserts[] = [ 'lookup_value' => (string) $value, 'relationship_json' => json_encode($match->toArray()), ]; } if ($inserts === []) { return; } $connection->table('temp_relationships')->insert($inserts); $connection->statement(" UPDATE import_rows SET relationships = json_insert( COALESCE(relationships, '[]'), '\$[#]', json(temp.relationship_json) ) FROM temp_relationships AS temp WHERE json_extract(import_rows.raw_data, ?) = temp.lookup_value ", [$jsonPath]); } finally { $connection->statement('DROP TABLE IF EXISTS temp_relationships'); } } private function clearValidationForCorrectedDateFields( Connection $connection, string $jsonPath, ): void { if (! $this->column->getType()->isDateOrDateTime()) { return; } $connection->statement(" UPDATE import_rows SET validation = json_remove(COALESCE(validation, '{}'), ?) WHERE json_extract(corrections, ?) IS NOT NULL ", [$jsonPath, $jsonPath]); } /** @return array */ private function fetchUncorrectedUniqueValues(ImportStore $store, string $jsonPath): array { return $store->query() ->selectRaw('DISTINCT json_extract(raw_data, ?) as value', [$jsonPath]) ->whereRaw('json_extract(corrections, ?) IS NULL', [$jsonPath]) ->pluck('value') ->filter() ->all(); } /** * @param array $uniqueValues * @return array */ private function validateValues(Import $import, array $uniqueValues): array { $this->hydrateColumnField($import); $validator = new ColumnValidator; $results = []; foreach ($uniqueValues as $value) { $error = $validator->validate($this->column, $value); $results[] = [ 'raw_value' => $value, 'validation_error' => $error?->toStorageFormat(), ]; } return $results; } private function hydrateColumnField(Import $import): void { if ($this->column->importField instanceof ImportField) { return; } $importer = $import->getImporter(); $this->column->importField = $importer->allFields()->get($this->column->target); } /** * @param array $results * * @throws \Throwable */ private function updateValidationErrors( Connection $connection, string $jsonPath, array $results, ): void { $connection->transaction(function () use ($connection, $jsonPath, $results): void { $connection->statement(' CREATE TEMPORARY TABLE IF NOT EXISTS temp_validation ( raw_value TEXT, validation_error TEXT ) '); try { $connection->table('temp_validation')->insert($results); $connection->statement(" UPDATE import_rows SET validation = CASE WHEN temp.validation_error IS NULL THEN json_remove(COALESCE(validation, '{}'), ?) ELSE json_set(COALESCE(validation, '{}'), ?, temp.validation_error) END FROM temp_validation AS temp WHERE json_extract(import_rows.raw_data, ?) = temp.raw_value AND json_extract(import_rows.corrections, ?) IS NULL ", [$jsonPath, $jsonPath, $jsonPath, $jsonPath]); } finally { $connection->statement('DROP TABLE IF EXISTS temp_validation'); } }); } } ================================================ FILE: packages/ImportWizard/src/Livewire/Concerns/WithImportStore.php ================================================ storeId = $storeId; $this->entityType = $entityType; } protected function import(): Import { if ($this->import === null) { $this->import = Import::query() ->forTeam($this->getCurrentTeamId() ?? '') ->findOrFail($this->storeId); } return $this->import; } protected function refreshImport(): Import { $this->import = null; return $this->import(); } protected function store(): ImportStore { $store = $this->store ??= ImportStore::load($this->storeId); abort_if(! $store instanceof ImportStore, 404, 'Import session not found or expired.'); return $store; } private function getCurrentTeamId(): ?string { $tenant = filament()->getTenant(); return $tenant instanceof Model ? (string) $tenant->getKey() : null; } /** @return list */ protected function headers(): array { return $this->import()->headers ?? []; } protected function rowCount(): int { return $this->import()->total_rows; } } ================================================ FILE: packages/ImportWizard/src/Livewire/ImportWizard.php ================================================ entityType = $entityType; $this->returnUrl = $this->sanitizeReturnUrl($returnUrl); $this->restoreFromStore(); } public function render(): View { return view('import-wizard-new::livewire.import-wizard'); } public function onUploadCompleted(string $storeId, int $rowCount, int $columnCount): void { $this->storeId = $storeId; $this->rowCount = $rowCount; $this->columnCount = $columnCount; $this->nextStep(); } public function nextStep(): void { $this->currentStep = min($this->currentStep + 1, self::STEP_PREVIEW); } public function goBack(): void { if ($this->importStarted) { return; } $this->currentStep = max($this->currentStep - 1, self::STEP_UPLOAD); $this->syncStepStatus(); } public function goToStep(int $step): void { if ($this->importStarted) { return; } if ($step < self::STEP_UPLOAD || $step >= $this->currentStep) { return; } if ($step === self::STEP_UPLOAD) { $this->mountAction('startOver'); return; } $this->currentStep = $step; $this->syncStepStatus(); } public function getStepTitle(): string { return match ($this->currentStep) { self::STEP_UPLOAD => 'Upload CSV', self::STEP_MAP => 'Map Columns', self::STEP_REVIEW => 'Review Values', self::STEP_PREVIEW => 'Preview & Import', default => '', }; } public function getStepDescription(): string { $label = $this->entityType->label(); $singular = $this->entityType->singular(); return match ($this->currentStep) { self::STEP_UPLOAD => "Upload your CSV file to import {$label}", self::STEP_MAP => "Match CSV columns to {$singular} fields", self::STEP_REVIEW => 'Review and fix any data issues', self::STEP_PREVIEW => 'Preview changes and start import', default => '', }; } public function cancelImport(): void { if ($this->storeId !== null) { $this->destroyImportAndStore($this->storeId); } if ($this->returnUrl !== null) { $this->redirect($this->returnUrl); } } #[On('import-started')] public function onImportStarted(): void { $this->importStarted = true; } public function startOverAction(): Action { return Action::make('startOver') ->label('Start over') ->color('gray') ->icon(Heroicon::OutlinedArrowPath) ->requiresConfirmation() ->modalHeading('Start a new import?') ->modalDescription('Are you sure you want to start a new import? Your current progress will be lost.') ->modalSubmitActionLabel('Start over') ->modalCancelActionLabel('Cancel') ->action(fn () => $this->startOver()); } public function startOver(): void { if ($this->storeId !== null) { $this->destroyImportAndStore($this->storeId); } $this->storeId = null; $this->rowCount = 0; $this->columnCount = 0; $this->importStarted = false; $this->currentStep = self::STEP_UPLOAD; } private function restoreFromStore(): void { $import = $this->findCurrentImport(); if (! $import instanceof Import) { $this->storeId = null; return; } $this->rowCount = $import->total_rows; $this->columnCount = count($import->headers ?? []); $this->currentStep = $this->stepFromStatus($import->status); $this->importStarted = in_array($import->status, [ ImportStatus::Importing, ImportStatus::Completed, ImportStatus::Failed, ], true); } private function syncStepStatus(): void { $this->findCurrentImport() ?->update(['status' => $this->statusForStep($this->currentStep)]); } private function findCurrentImport(): ?Import { if ($this->storeId === null) { return null; } $teamId = $this->getCurrentTeamId(); if ($teamId === null) { return null; } $import = Import::query() ->forTeam($teamId) ->find($this->storeId); return $import instanceof Import ? $import : null; } private function statusForStep(int $step): ImportStatus { return match ($step) { self::STEP_UPLOAD => ImportStatus::Uploading, self::STEP_MAP => ImportStatus::Mapping, self::STEP_REVIEW => ImportStatus::Reviewing, default => ImportStatus::Previewing, }; } private function stepFromStatus(ImportStatus $status): int { return match ($status) { ImportStatus::Uploading => self::STEP_UPLOAD, ImportStatus::Mapping => self::STEP_MAP, ImportStatus::Reviewing => self::STEP_REVIEW, ImportStatus::Previewing, ImportStatus::Importing, ImportStatus::Completed, ImportStatus::Failed => self::STEP_PREVIEW, }; } private function destroyImportAndStore(string $importId): void { $teamId = $this->getCurrentTeamId(); if ($teamId === null) { return; } Import::query() ->forTeam($teamId) ->where('id', $importId) ->delete(); ImportStore::load($importId)?->destroy(); } private function sanitizeReturnUrl(?string $url): ?string { if ($url === null) { return null; } if (str_starts_with($url, '/') && ! str_starts_with($url, '//')) { return $url; } return null; } private function getCurrentTeamId(): ?string { $tenant = filament()->getTenant(); return $tenant instanceof Model ? (string) $tenant->getKey() : null; } } ================================================ FILE: packages/ImportWizard/src/Livewire/Steps/MappingStep.php ================================================ > */ public array $columns = []; private ?BaseImporter $importer = null; public function mount(string $storeId, ImportEntityType $entityType): void { $this->mountWithImportStore($storeId, $entityType); $this->loadMappings(); if ($this->columns === []) { $this->autoMap(); } } public function render(): View { return view('import-wizard-new::livewire.steps.mapping-step', [ 'headers' => $this->headers(), 'rowCount' => $this->rowCount(), ]); } #[Computed] public function allFields(): ImportFieldCollection { return $this->getImporter()->allFields(); } /** @return array */ #[Computed] public function entityLinks(): array { return $this->getImporter()->entityLinks(); } #[Computed] public function unmappedRequired(): ImportFieldCollection { $mappedFieldKeys = $this->mappedFieldKeys(); return $this->allFields()->filter( fn (ImportField $field): bool => $field->required && ! in_array($field->key, $mappedFieldKeys, true) ); } #[Computed] public function hasEntityLinks(): bool { return $this->entityLinks() !== []; } /** @return list */ #[Computed] public function mappedFieldKeys(): array { /** @var list */ return collect($this->columns) ->filter(fn (array $m): bool => ($m['entityLink'] ?? null) === null) ->pluck('target') ->values() ->all(); } public function isMapped(string $source): bool { return isset($this->columns[$source]); } public function isTargetMapped(string $target): bool { return collect($this->columns) ->contains(fn (array $m): bool => $m['target'] === $target && ($m['entityLink'] ?? null) === null); } public function getMapping(string $source): ?ColumnData { if (! isset($this->columns[$source])) { return null; } return ColumnData::from($this->columns[$source]); } public function getSourceForTarget(string $target): ?string { return collect($this->columns) ->filter(fn (array $m): bool => $m['target'] === $target && ($m['entityLink'] ?? null) === null) ->keys() ->first(); } public function getFieldForSource(string $source): ?ImportField { $mapping = $this->getMapping($source); if (! $mapping instanceof ColumnData || $mapping->isEntityLinkMapping()) { return null; } return $this->allFields()->get($mapping->target); } /** @return array{linkKey: string, link: EntityLink, matcherKey: string}|null */ public function getEntityLinkForSource(string $source): ?array { $mapping = $this->getMapping($source); if (! $mapping instanceof ColumnData || $mapping->isFieldMapping()) { return null; } $link = $this->entityLinks()[$mapping->entityLink] ?? null; if ($link === null) { return null; } return ['linkKey' => $mapping->entityLink, 'link' => $link, 'matcherKey' => $mapping->target]; } /** @return array */ public function previewValues(string $column, int $limit = 5): array { return $this->store()->query() ->limit($limit) ->get() ->pluck('raw_data') ->map(fn (Collection $data): string => (string) ($data[$column] ?? '')) ->all(); } public function canProceed(): bool { return $this->unmappedRequired()->isEmpty(); } public function autoMap(): void { $this->autoMapByHeaders(); $this->autoMapEntityLinks(); $this->inferDataTypes(); } private function autoMapByHeaders(): void { $headers = $this->headers(); $allFields = $this->allFields(); foreach ($headers as $header) { if ($this->isMapped($header)) { continue; } $field = $allFields->guessFor($header); if ($field instanceof ImportField && ! $this->isTargetMapped($field->key)) { $this->columns[$header] = ColumnData::toField($header, $field->key)->toArray(); } } } private function autoMapEntityLinks(): void { $headers = $this->headers(); $entityLinks = $this->entityLinks(); foreach ($entityLinks as $linkKey => $entityLink) { if ($this->isEntityLinkMapped($linkKey)) { continue; } foreach ($headers as $header) { if ($this->isMapped($header)) { continue; } if ($entityLink->matchesHeader($header)) { $highestMatcher = $entityLink->getHighestPriorityMatcher(); if ($highestMatcher !== null) { $this->columns[$header] = ColumnData::toEntityLink( $header, $highestMatcher->field, $linkKey, )->toArray(); break; } } } } } public function isEntityLinkMapped(string $linkKey): bool { return collect($this->columns) ->contains(fn (array $m): bool => ($m['entityLink'] ?? null) === $linkKey); } /** @return array> */ public function getMappedEntityLinkMatchers(): array { /** @var array> */ return collect($this->columns) ->filter(fn (array $m): bool => ($m['entityLink'] ?? null) !== null) ->groupBy(fn (array $m): string => $m['entityLink']) ->map(fn (Collection $group): array => $group->pluck('target')->values()->all()) ->all(); } private function inferDataTypes(): void { $headers = $this->headers(); $inferencer = new DataTypeInferencer( entityName: $this->entityType->value, teamId: $this->import()->team_id, ); $allFields = $this->allFields(); foreach ($headers as $header) { if ($this->isMapped($header)) { continue; } $values = $this->previewValues($header, 10); $result = $inferencer->infer($values); if ($result->confidence >= 0.8) { $suggestedField = array_find( $result->suggestedFields, fn (string $fieldKey): bool => $allFields->hasKey($fieldKey) && ! $this->isTargetMapped($fieldKey) ); if ($suggestedField !== null) { $this->columns[$header] = ColumnData::toField($header, $suggestedField)->toArray(); } } } } public function mapToField(string $source, string $target): void { if ($target === '') { unset($this->columns[$source]); return; } if (! $this->isTargetMapped($target)) { $this->columns[$source] = ColumnData::toField($source, $target)->toArray(); } } public function mapToEntityLink(string $source, string $matcherKey, string $entityLinkKey): void { $this->columns[$source] = ColumnData::toEntityLink($source, $matcherKey, $entityLinkKey)->toArray(); } public function unmapColumn(string $source): void { unset($this->columns[$source]); } public function continueAction(): Action { $needsConfirmation = ! $this->hasMatchableFieldMapped(); $action = Action::make('continue') ->label('Continue') ->color('primary') ->disabled(fn (): bool => ! $this->canProceed()) ->action(function (): void { $this->saveMappings(); $this->import()->update(['status' => ImportStatus::Reviewing]); $this->dispatch('completed'); }); if ($needsConfirmation) { $action ->requiresConfirmation() ->modalWidth(Width::Large) ->modalIcon('heroicon-o-exclamation-triangle') ->modalIconColor('warning') ->modalHeading('Avoid creating duplicate records') ->modalDescription($this->buildMatchWarningDescription()) ->modalSubmitActionLabel('Continue without mapping') ->modalCancelActionLabel('Go Back'); } return $action; } public function hasMatchableFieldMapped(): bool { $matchableFields = collect($this->getImporter()->matchableFields()) ->reject(fn (MatchableField $field): bool => $field->isCreate()); if ($matchableFields->isEmpty()) { return true; } $mappedKeys = $this->mappedFieldKeys(); return $matchableFields ->contains(fn (MatchableField $field): bool => in_array($field->field, $mappedKeys, true)); } private function buildMatchWarningDescription(): string { $matchableFields = collect($this->getImporter()->matchableFields()) ->reject(fn (MatchableField $field): bool => $field->isCreate()) ->sortByDesc(fn (MatchableField $field): int => $field->priority); $fieldLabels = $matchableFields ->map(fn (MatchableField $field): string => $field->label) ->values() ->all(); $entityLabel = $this->entityType->label(); $fieldList = implode(' or ', $fieldLabels); return "To avoid creating duplicate records, make sure you map a column that uniquely identifies each record.\n\nFor {$entityLabel}, map a {$fieldList} column."; } private function saveMappings(): void { $mappings = collect($this->columns) ->map(fn (array $data): ColumnData => ColumnData::from($data)) ->values(); $this->import()->setColumnMappings($mappings); } private function loadMappings(): void { $this->columns = $this->import()->columnMappings() ->keyBy('source') ->map(fn (ColumnData $m): array => $m->toArray()) ->all(); } private function getImporter(): BaseImporter { return $this->importer ??= $this->import()->getImporter(); } } ================================================ FILE: packages/ImportWizard/src/Livewire/Steps/PreviewStep.php ================================================ mountWithImportStore($storeId, $entityType); $this->syncCompletionState(); $this->syncMatchResolutionState(); } public function setActiveTab(string $tab): void { $this->activeTab = $tab; $this->resetPage(); } #[Computed] public function createCount(): int { return $this->store()->query()->toCreate()->count(); } #[Computed] public function updateCount(): int { return $this->store()->query()->toUpdate()->count(); } #[Computed] public function skipCount(): int { return $this->store()->query()->toSkip()->count(); } #[Computed] public function errorCount(): int { return $this->store()->query() ->whereNotNull('validation') ->where('validation', '!=', '{}') ->count(); } #[Computed] public function isImporting(): bool { if ($this->isCompleted) { return false; } return $this->batchId !== null || $this->import()->status === ImportStatus::Importing; } #[Computed] public function progressPercent(): int { if ($this->isCompleted) { return 100; } $processed = $this->processedCount(); $total = $this->totalRowCount(); if ($processed === 0 || $total === 0) { return 0; } return (int) min(round(($processed / $total) * 100), 99); } #[Computed] public function processedCount(): int { return array_sum($this->results()); } #[Computed] public function matchField(): ?string { $mappedFieldKeys = $this->columns() ->filter(fn (ColumnData $col): bool => $col->isFieldMapping()) ->pluck('target') ->all(); return $this->import()->getImporter() ->getMatchFieldForMappedColumns($mappedFieldKeys) ?->label; } #[Computed] public function totalRowCount(): int { return $this->store()->query()->count(); } /** @return Collection */ #[Computed] public function columns(): Collection { return $this->import()->columnMappings(); } /** @return LengthAwarePaginator */ #[Computed] public function previewRows(): LengthAwarePaginator { $query = $this->store()->query()->orderBy('row_number'); if ($this->activeTab !== 'all') { $query->whereRaw( "EXISTS (SELECT 1 FROM json_each(relationships) WHERE json_extract(value, '$.relationship') = ?)", [$this->activeTab] ); } return $query->paginate(25); } /** * @return array */ #[Computed] public function relationshipTabs(): array { $connection = $this->store()->connection(); return $this->columns() ->filter(fn (ColumnData $col): bool => $col->isEntityLinkMapping()) ->unique(fn (ColumnData $col): string => $col->entityLink) ->map(function (ColumnData $col) use ($connection): array { $uniqueCount = $connection->selectOne( "SELECT COUNT(*) as total FROM ({$this->uniqueRelationshipSubquery()}) sub", [$col->entityLink], ); return [ 'key' => $col->entityLink, 'label' => $col->getLabel(), 'icon' => $col->getIcon(), 'count' => (int) $uniqueCount->total, ]; }) ->values() ->all(); } /** @phpstan-ignore missingType.generics */ #[Computed] public function relationshipSummary(): Paginator { if ($this->activeTab === 'all') { return new Paginator([], 0, 25); } $perPage = 25; $page = $this->getPage(); $offset = ($page - 1) * $perPage; $connection = $this->store()->connection(); $groupBy = $this->relationshipGroupByClause(); $rows = $connection->select(" SELECT json_extract(je.value, '$.action') as action, COALESCE(json_extract(je.value, '$.name'), 'Record #' || json_extract(je.value, '$.id')) as name, json_extract(je.value, '$.id') as id, COUNT(*) as count FROM import_rows, json_each(import_rows.relationships) AS je WHERE json_extract(je.value, '$.relationship') = ? GROUP BY action, {$groupBy} ORDER BY count DESC LIMIT ? OFFSET ? ", [$this->activeTab, $perPage, $offset]); $total = $connection->selectOne( "SELECT COUNT(*) as total FROM ({$this->uniqueRelationshipSubquery()}) sub", [$this->activeTab], ); /** @var list $items */ $items = array_map(fn (\stdClass $row): array => [ 'action' => $row->action === 'update' ? 'link' : 'create', 'name' => $row->name, 'id' => $row->id, 'count' => (int) $row->count, ], $rows); return new Paginator( $items, $total->total, $perPage, $page, ); } /** @return array{link: int, create: int} */ #[Computed] public function relationshipStats(): array { if ($this->activeTab === 'all') { return ['link' => 0, 'create' => 0]; } $rows = $this->store()->connection()->select(" SELECT action, COUNT(*) as count FROM ( SELECT json_extract(je.value, '$.action') as action FROM import_rows, json_each(import_rows.relationships) AS je WHERE json_extract(je.value, '$.relationship') = ? GROUP BY action, {$this->relationshipGroupByClause()} ) GROUP BY action ", [$this->activeTab]); $stats = ['link' => 0, 'create' => 0]; foreach ($rows as $row) { if ($row->action === 'update') { $stats['link'] = (int) $row->count; } else { $stats['create'] = (int) $row->count; } } return $stats; } /** @return array{created: int, updated: int, skipped: int, failed: int} */ #[Computed] public function results(): array { $import = $this->import(); return [ 'created' => $import->created_rows, 'updated' => $import->updated_rows, 'skipped' => $import->skipped_rows, 'failed' => $import->failed_rows, ]; } public function startImportAction(): Action { return Action::make('startImport') ->label($this->matchResolutionBatchId !== null ? 'Resolving matches...' : 'Start Import') ->color('primary') ->icon($this->matchResolutionBatchId !== null ? Heroicon::OutlinedArrowPath : Heroicon::OutlinedPlay) ->disabled(fn (): bool => $this->matchResolutionBatchId !== null) ->requiresConfirmation() ->modalHeading('Start import') ->modalDescription('Are you sure that you want to start running this import?') ->modalSubmitActionLabel('Start import') ->action(fn () => $this->startImport()); } public function downloadFailedRowsAction(): Action { return Action::make('downloadFailedRows') ->label('Download Failed Rows') ->color('danger') ->icon(Heroicon::OutlinedArrowDownTray) ->visible(fn (): bool => $this->isCompleted && $this->import()->failed_rows > 0) ->action(fn (): StreamedResponse => $this->downloadFailedRows()); } public function downloadFailedRows(): StreamedResponse { $import = $this->import(); $headers = $import->headers; return response()->streamDownload(function () use ($import, $headers): void { $handle = fopen('php://output', 'w'); if ($handle === false) { return; } fwrite($handle, "\xEF\xBB\xBF"); fputcsv($handle, [...$headers, 'Import Error'], escape: '\\'); $import->failedRows() ->lazyById(100) ->each(function (FailedImportRow $row) use ($handle, $headers): void { $values = []; foreach ($headers as $header) { $values[] = $row->data[$header] ?? ''; } $values[] = $row->validation_error ?? ''; fputcsv($handle, $values, escape: '\\'); }); fclose($handle); }, 'failed-rows.csv', ['Content-Type' => 'text/csv']); } public function checkMatchResolution(): void { $this->syncMatchResolutionState(); if ($this->matchResolutionBatchId === null) { $this->dispatch('match-resolution-complete'); } } public function startImport(): void { if ($this->matchResolutionBatchId !== null || $this->batchId !== null || $this->isCompleted) { return; } if (! $this->import()->transitionToImporting()) { return; } $batch = Bus::batch([ new ExecuteImportJob( importId: $this->import()->id, teamId: $this->import()->team_id, ), ])->dispatch(); $this->batchId = $batch->id; $this->dispatch('import-polling-start'); $this->dispatch('import-started')->to(ImportWizard::class); } public function checkImportProgress(): void { $this->refreshImport(); $this->syncCompletionState(); unset($this->results, $this->progressPercent, $this->processedCount, $this->isImporting); if ($this->isCompleted) { $this->dispatch('import-polling-complete'); } } public function render(): View { return view('import-wizard-new::livewire.steps.preview-step'); } private function syncCompletionState(): void { $this->isCompleted = in_array($this->import()->status, [ ImportStatus::Completed, ImportStatus::Failed, ], true); } private function syncMatchResolutionState(): void { if ($this->matchResolutionBatchId !== null) { $batch = Bus::findBatch($this->matchResolutionBatchId); if ($batch === null || $batch->finished()) { $this->matchResolutionBatchId = null; } return; } $batchId = Cache::get("import-{$this->storeId}-match-resolution-batch"); if ($batchId === null) { return; } $batch = Bus::findBatch($batchId); $this->matchResolutionBatchId = ($batch !== null && ! $batch->finished()) ? $batchId : null; } private function relationshipGroupByClause(): string { return "CASE WHEN json_extract(je.value, '$.action') = 'update' THEN json_extract(je.value, '$.id') ELSE json_extract(je.value, '$.name') END"; } private function uniqueRelationshipSubquery(): string { return "SELECT 1 FROM import_rows, json_each(import_rows.relationships) AS je WHERE json_extract(je.value, '$.relationship') = ? GROUP BY json_extract(je.value, '$.action'), {$this->relationshipGroupByClause()}"; } } ================================================ FILE: packages/ImportWizard/src/Livewire/Steps/ReviewStep.php ================================================ */ public Collection $columns; public ColumnData $selectedColumn; /** @var array Column source => batch ID */ public array $batchIds = []; private function connection(): Connection { return $this->store()->connection(); } private function selectedColumnJsonPath(): string { return "$.{$this->selectedColumn->source}"; } private function validateValue(ColumnData $column, string $value, bool $isCorrection = false): ?string { if ($column->isEntityLinkMapping()) { return $this->validateEntityLinkValue($column, $value); } if ($isCorrection && $column->getType()->isDateOrDateTime()) { return DateFormat::ISO->parse($value, $column->getType()->isTimestamp()) instanceof Carbon ? null : 'Invalid date format'; } return (new ColumnValidator)->validate($column, $value)?->toStorageFormat(); } private function validateEntityLinkValue(ColumnData $column, string $value): ?string { $validator = new EntityLinkValidator($this->import()->team_id); return $validator->validateFromColumn($column, $this->import()->getImporter(), $value); } private function updateValidationForRawValue(string $jsonPath, string $rawValue, ?string $error): void { if ($error === null) { $this->connection()->statement(' UPDATE import_rows SET validation = json_remove(validation, ?) WHERE json_extract(raw_data, ?) = ? ', [$jsonPath, $jsonPath, $rawValue]); return; } $this->connection()->statement(" UPDATE import_rows SET validation = json_set(COALESCE(validation, '{}'), ?, ?) WHERE json_extract(raw_data, ?) = ? ", [$jsonPath, $error, $jsonPath, $rawValue]); } private function validateColumnAsync(ColumnData $column): string { $batch = Bus::batch([ new ValidateColumnJob($this->import()->id, $column), ]) ->name("Validate {$column->source}") ->dispatch(); return $batch->id; } private function clearRelationshipsForReentry(): void { $this->connection()->statement('UPDATE import_rows SET relationships = NULL'); } private function dispatchMatchResolution(): string { $batch = Bus::batch([ new ResolveMatchesJob( importId: $this->import()->id, ), ]) ->name('Match resolution') ->dispatch(); return $batch->id; } public function mount(): void { $this->columns = $this->import()->columnMappings(); $this->selectedColumn = $this->columns->first(); $currentHash = $this->currentMappingsHash(); $cached = Cache::get($this->validationCacheKey()); if ($cached !== null && $cached['hash'] === $currentHash) { $this->batchIds = $this->filterRunningBatches($cached['batch_ids']); return; } $this->cancelOldBatches($cached); $this->clearRelationshipsForReentry(); foreach ($this->columns as $column) { $this->batchIds[$column->source] = $this->validateColumnAsync($column); } $this->batchIds['__match_resolution'] = $this->dispatchMatchResolution(); $this->cacheValidationState($currentHash); } public function hydrate(): void { $this->columns = $this->import()->columnMappings(); $this->selectedColumn = $this->import()->getColumnMapping($this->selectedColumn->source); } public function render(): View { return view('import-wizard-new::livewire.steps.review-step'); } /** @return LengthAwarePaginator */ #[Computed] public function selectedColumnRows(): LengthAwarePaginator { $column = $this->selectedColumn->source; return $this->store()->query() ->uniqueValuesFor($column) ->forFilter($this->filter, $column) ->when(filled($this->search), fn (Builder $q) => $q->searchValue($column, $this->search)) ->orderBy($this->sortField->value, $this->sortDirection->value) ->paginate(100); } /** @return array */ #[Computed] public function filterCounts(): array { return ImportRow::countUniqueValuesByFilter( $this->store()->query(), $this->selectedColumn->source ); } public function selectColumn(string $columnSource): void { $this->selectedColumn = $this->columns->firstWhere('source', $columnSource); $this->setFilter(ReviewFilter::All->value); } /** @return array */ #[Computed] public function choiceOptions(): array { if (! $this->selectedColumn->isMultiChoicePredefined()) { return []; } return $this->selectedColumn->importField->options ?? []; } public function setFilter(string $filter): void { $this->filter = ReviewFilter::from($filter); $this->resetPage(); } public function setSortField(string $field): void { $this->sortField = SortField::from($field); $this->resetPage(); } public function setSortDirection(string $direction): void { $this->sortDirection = SortDirection::from($direction); $this->resetPage(); } public function clearFilters(): void { $this->search = ''; $this->filter = ReviewFilter::All; $this->resetPage(); } public function updatedSearch(): void { $this->resetPage(); } public function setColumnFormat(string $type, string $value): void { $currentValue = match ($type) { 'date' => $this->selectedColumn->dateFormat?->value, 'number' => $this->selectedColumn->numberFormat?->value, default => null, }; if ($currentValue === $value) { return; } $updated = match ($type) { 'date' => $this->selectedColumn->withDateFormat(DateFormat::from($value)), 'number' => $this->selectedColumn->withNumberFormat(NumberFormat::from($value)), default => throw new \InvalidArgumentException("Unknown format type: {$type}"), }; $this->import()->updateColumnMapping($this->selectedColumn->source, $updated); $this->columns = $this->columns->map( fn (ColumnData $col): ColumnData => $col->source === $updated->source ? $updated : $col ); $this->selectedColumn = $updated; $oldBatchId = $this->batchIds[$this->selectedColumn->source] ?? null; if ($oldBatchId !== null) { Bus::findBatch($oldBatchId)?->cancel(); } $this->batchIds[$this->selectedColumn->source] = $this->validateColumnAsync($this->selectedColumn); $this->cacheValidationState($this->currentMappingsHash()); } /** @return array */ public function updateMappedValue(string $rawValue, string $newValue): array { if (blank($newValue)) { $this->skipValue($rawValue); return []; } $error = $this->validateValue($this->selectedColumn, $newValue, isCorrection: true); $jsonPath = $this->selectedColumnJsonPath(); $this->connection()->statement(" UPDATE import_rows SET corrections = json_set(COALESCE(corrections, '{}'), ?, ?) WHERE json_extract(raw_data, ?) = ? ", [$jsonPath, $newValue, $jsonPath, $rawValue]); $this->updateValidationForRawValue($jsonPath, $rawValue, $error); unset($this->columnErrorStatuses); if ($error === null || ! $this->selectedColumn->isMultiChoiceArbitrary()) { return []; } $validationError = ValidationError::fromStorageFormat($error); return $validationError?->getItemErrors() ?? []; } public function undoCorrection(string $rawValue): void { $error = $this->validateValue($this->selectedColumn, $rawValue, isCorrection: false); $jsonPath = $this->selectedColumnJsonPath(); $this->connection()->statement(' UPDATE import_rows SET corrections = json_remove(corrections, ?) WHERE json_extract(raw_data, ?) = ? ', [$jsonPath, $jsonPath, $rawValue]); $this->updateValidationForRawValue($jsonPath, $rawValue, $error); unset($this->columnErrorStatuses); } public function skipValue(string $rawValue): void { $jsonPath = $this->selectedColumnJsonPath(); $error = $this->validateValue($this->selectedColumn, $rawValue, isCorrection: false); $this->connection()->statement(" UPDATE import_rows SET skipped = json_set(COALESCE(skipped, '{}'), ?, json('true')), corrections = json_remove(corrections, ?) WHERE json_extract(raw_data, ?) = ? ", [$jsonPath, $jsonPath, $jsonPath, $rawValue]); $this->updateValidationForRawValue($jsonPath, $rawValue, $error); unset($this->columnErrorStatuses); } public function unskipValue(string $rawValue): void { $jsonPath = $this->selectedColumnJsonPath(); $this->connection()->statement(' UPDATE import_rows SET skipped = json_remove(skipped, ?) WHERE json_extract(raw_data, ?) = ? ', [$jsonPath, $jsonPath, $rawValue]); unset($this->columnErrorStatuses); } public function checkProgress(): void { $hasCompleted = false; foreach ($this->batchIds as $columnSource => $batchId) { if (Bus::findBatch($batchId)?->finished()) { unset($this->batchIds[$columnSource]); $this->dispatch('validation-complete', column: $columnSource); $hasCompleted = true; } } if ($hasCompleted) { unset($this->columnErrorStatuses); $this->cacheValidationState($this->currentMappingsHash()); } if ($this->batchIds === []) { $this->dispatch('polling-complete'); } } #[Computed] public function isSelectedColumnValidating(): bool { return isset($this->batchIds[$this->selectedColumn->source]); } #[Computed] public function isValidating(): bool { return array_any( array_keys($this->batchIds), fn (string $key): bool => $key !== '__match_resolution' ); } /** @return array */ #[Computed(persist: true, seconds: 60)] public function columnErrorStatuses(): array { $columnSources = $this->columns->pluck('source')->all(); return ImportRow::getColumnErrorStatuses($this->store()->query(), $columnSources); } public function continueToPreview(): void { if ($this->isValidating()) { return; } $matchBatchId = $this->batchIds['__match_resolution'] ?? null; if ($matchBatchId !== null) { Cache::put( "import-{$this->storeId}-match-resolution-batch", $matchBatchId, now()->addHour(), ); } $this->import()->update(['status' => ImportStatus::Previewing]); $this->dispatch('completed'); } private function currentMappingsHash(): string { $mappings = $this->import()->column_mappings ?? []; return hash('xxh128', (string) json_encode($mappings)); } private function validationCacheKey(): string { return "import-{$this->storeId}-validation"; } private function cacheValidationState(string $hash): void { Cache::put($this->validationCacheKey(), [ 'hash' => $hash, 'batch_ids' => $this->batchIds, ], now()->addHour()); } /** * @param array $batchIds * @return array */ private function filterRunningBatches(array $batchIds): array { return array_filter($batchIds, function (string $batchId): bool { $batch = Bus::findBatch($batchId); return $batch !== null && ! $batch->finished(); }); } /** @param array{hash: string, batch_ids: array}|null $cached */ private function cancelOldBatches(?array $cached): void { if ($cached === null) { return; } foreach ($cached['batch_ids'] as $batchId) { Bus::findBatch($batchId)?->cancel(); } } } ================================================ FILE: packages/ImportWizard/src/Livewire/Steps/UploadStep.php ================================================ */ public array $headers = []; public int $rowCount = 0; public bool $isParsed = false; private ?Import $import = null; private ?ImportStore $store = null; public function mount(ImportEntityType $entityType, ?string $storeId = null): void { $this->entityType = $entityType; $this->storeId = $storeId; if ($storeId === null) { return; } $this->import = Import::query() ->forTeam($this->getCurrentTeamId() ?? '') ->find($storeId); if (! $this->import instanceof Import) { return; } $this->headers = $this->import->headers ?? []; $this->rowCount = $this->import->total_rows; $this->isParsed = true; } private function getCurrentTeamId(): ?string { $tenant = filament()->getTenant(); return $tenant instanceof Model ? (string) $tenant->getKey() : null; } public function render(): View { return view('import-wizard-new::livewire.steps.upload-step'); } public function updatedUploadedFile(): void { $this->resetErrorBag('uploadedFile'); $this->validateFile(); } private function validateFile(): void { if (! $this->uploadedFile instanceof TemporaryUploadedFile) { return; } $this->cleanupExisting(); $this->reset(['headers', 'rowCount', 'isParsed']); try { $reader = SimpleExcelReader::create($this->uploadedFile->getRealPath())->trimHeaderRow(); $rawHeaders = $reader->getHeaders(); if (blank($rawHeaders)) { $this->addError('uploadedFile', 'CSV file is empty'); return; } $headers = $this->processHeaders($rawHeaders); if ($headers === null) { return; } $rowCount = $reader ->getRows() ->reject(fn (array $row): bool => array_all($row, blank(...))) ->take($this->maxRows() + 1) ->count(); if ($rowCount === 0) { $this->addError('uploadedFile', 'CSV file has no data rows'); return; } if ($rowCount > $this->maxRows()) { $this->addError('uploadedFile', "Maximum {$this->maxRows()} rows allowed."); return; } $this->headers = $headers; $this->rowCount = $rowCount; $this->isParsed = true; } catch (\Exception $e) { report($e); $this->addError('uploadedFile', 'Unable to process this file. Please check the format and try again.'); } } public function continueToMapping(): void { if (! $this->isParsed || ! $this->uploadedFile instanceof TemporaryUploadedFile) { $this->addError('uploadedFile', 'File no longer available. Please re-upload.'); $this->reset(['headers', 'rowCount', 'isParsed']); return; } $teamId = $this->getCurrentTeamId(); if (blank($teamId)) { $this->addError('uploadedFile', 'Unable to determine your workspace. Please refresh and try again.'); return; } try { $this->import = Import::query()->create([ 'team_id' => $teamId, 'user_id' => (string) auth()->id(), 'entity_type' => $this->entityType, 'file_name' => $this->uploadedFile->getClientOriginalName(), 'status' => ImportStatus::Uploading, 'total_rows' => 0, 'headers' => $this->headers, ]); $this->store = ImportStore::create($this->import->id); $rowCount = 0; SimpleExcelReader::create($this->uploadedFile->getRealPath()) ->trimHeaderRow() ->getRows() ->reject(fn (array $row): bool => array_all($row, blank(...))) ->take($this->maxRows()) ->map(function (array $row) use (&$rowCount): array { return [ 'row_number' => ++$rowCount + 1, 'raw_data' => json_encode( array_combine($this->headers, $this->normalizeRow($row)), JSON_UNESCAPED_UNICODE ) ?: '{}', 'validation' => null, 'corrections' => null, ]; }) ->chunk($this->chunkSize()) ->each(fn (LazyCollection $chunk) => $this->store->query()->insert($chunk->all())); if ($rowCount === 0) { $this->store->destroy(); $this->store = null; $this->import->delete(); $this->import = null; $this->addError('uploadedFile', 'Could not read file. Please re-upload.'); $this->reset(['headers', 'rowCount', 'isParsed']); return; } $this->import->update([ 'total_rows' => $rowCount, 'status' => ImportStatus::Mapping, ]); $this->dispatch('completed', storeId: $this->import->id, rowCount: $rowCount, columnCount: count($this->headers)); } catch (\Exception $e) { report($e); if ($this->store !== null) { /** @phpstan-ignore notIdentical.alwaysFalse */ $this->store->destroy(); $this->store = null; } if ($this->import !== null) { /** @phpstan-ignore notIdentical.alwaysTrue */ $this->import->delete(); $this->import = null; } $this->addError('uploadedFile', 'Unable to process this file. Please try again or use a different file.'); } } /** * @param array $rawHeaders * @return list|null */ private function processHeaders(array $rawHeaders): ?array { /** @var list $headers */ $headers = collect($rawHeaders) ->values() ->map(fn (string $h, int $i): string => filled($h) ? $h : 'Column_'.($i + 1)) ->map(fn (string $h): string => preg_replace('/[^a-zA-Z0-9_ \-]/', '', $h)) ->map(fn (string $h, int $i): string => filled($h) ? $h : 'Column_'.($i + 1)) ->all(); if (count($headers) !== count(array_unique($headers))) { $this->addError('uploadedFile', 'Duplicate column names found.'); return null; } return $headers; } /** * @param array $row * @return list */ private function normalizeRow(array $row): array { $headerCount = count($this->headers); $values = array_values($row); return array_slice(array_pad($values, $headerCount, ''), 0, $headerCount); } public function removeFile(): void { $this->cleanupExisting(); $this->reset(['storeId', 'uploadedFile', 'headers', 'rowCount', 'isParsed']); } private function cleanupExisting(): void { if ($this->store instanceof ImportStore) { $this->store->destroy(); $this->store = null; } if ($this->import instanceof Import) { $this->import->delete(); $this->import = null; } } private function maxRows(): int { return once(fn (): int => (int) config('import-wizard.max_rows', 10_000)); } private function chunkSize(): int { return once(fn (): int => (int) config('import-wizard.chunk_size', 500)); } } ================================================ FILE: packages/ImportWizard/src/Models/FailedImportRow.php ================================================ $data * @property string|null $validation_error */ final class FailedImportRow extends Model { use HasUlids; use MassPrunable; /** @var list */ protected $fillable = [ 'import_id', 'team_id', 'data', 'validation_error', ]; protected function casts(): array { return [ 'data' => 'array', ]; } /** @return BelongsTo */ public function import(): BelongsTo { return $this->belongsTo(Import::class); } /** @return Builder */ public function prunable(): Builder { return self::query()->where('created_at', '<=', now()->subMonth()); } } ================================================ FILE: packages/ImportWizard/src/Models/Import.php ================================================ $headers * @property list> $column_mappings * @property Carbon|null $completed_at * @property int $total_rows * @property int $created_rows * @property int $updated_rows * @property int $skipped_rows * @property int $failed_rows */ final class Import extends Model { use HasUlids; /** @var list */ protected $fillable = [ 'team_id', 'user_id', 'entity_type', 'file_name', 'status', 'total_rows', 'headers', 'column_mappings', 'created_rows', 'updated_rows', 'skipped_rows', 'failed_rows', 'completed_at', ]; private ?BaseImporter $importerCache = null; protected function casts(): array { return [ 'entity_type' => ImportEntityType::class, 'status' => ImportStatus::class, 'headers' => 'array', 'column_mappings' => 'array', 'completed_at' => 'datetime', 'total_rows' => 'integer', 'created_rows' => 'integer', 'updated_rows' => 'integer', 'skipped_rows' => 'integer', 'failed_rows' => 'integer', ]; } /** @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** @return BelongsTo */ public function team(): BelongsTo { return $this->belongsTo(Team::class); } /** @return HasMany */ public function failedRows(): HasMany { return $this->hasMany(FailedImportRow::class); } /** @param Builder $query */ #[Scope] protected function completed(Builder $query): void { $query->where('status', ImportStatus::Completed); } /** @param Builder $query */ #[Scope] protected function failed(Builder $query): void { $query->where('status', ImportStatus::Failed); } /** @param Builder $query */ #[Scope] protected function forTeam(Builder $query, string $teamId): void { $query->where('team_id', $teamId); } public function storagePath(): string { return storage_path("app/imports/{$this->id}"); } public function getImporter(): BaseImporter { return $this->importerCache ??= $this->entity_type->importer($this->team_id); } /** * @return Collection */ public function columnMappings(): Collection { $raw = $this->column_mappings ?? []; $importer = $this->getImporter(); $fields = $importer->allFields(); $entityLinks = collect($importer->entityLinks()); $headerOrder = array_flip($this->headers ?? []); return ColumnData::collect($raw, Collection::class) ->each(function (ColumnData $col) use ($fields, $entityLinks): void { if ($col->isFieldMapping()) { $col->importField = $fields->get($col->target); } else { $col->entityLinkField = $entityLinks->get($col->entityLink); } }) ->sortBy(fn (ColumnData $col): int => $headerOrder[$col->source] ?? PHP_INT_MAX) ->values(); } /** @param iterable $mappings */ public function setColumnMappings(iterable $mappings): void { $raw = collect($mappings) ->map(fn (ColumnData $m): array => $m->toArray()) ->values() ->all(); $this->update(['column_mappings' => $raw]); } public function getColumnMapping(string $source): ?ColumnData { return $this->columnMappings()->firstWhere('source', $source); } public function updateColumnMapping(string $source, ColumnData $newMapping): void { $mappings = $this->columnMappings() ->map(fn (ColumnData $m): ColumnData => $m->source === $source ? $newMapping : $m); $this->setColumnMappings($mappings); } public function transitionToImporting(): bool { $lock = Cache::lock("import-{$this->id}-start", 10); if (! $lock->get()) { return false; } try { $this->refresh(); if (in_array($this->status, [ImportStatus::Importing, ImportStatus::Completed, ImportStatus::Failed], true)) { return false; } $this->update(['status' => ImportStatus::Importing]); return true; } finally { $lock->release(); } } } ================================================ FILE: packages/ImportWizard/src/Rules/ImportChoiceRule.php ================================================ $options Available choice options * @param bool $isMultiChoice Whether multiple selections are allowed (comma-separated) */ public function __construct( private array $options, private bool $isMultiChoice = false, ) {} /** * Run the validation rule. * * ValueValidator guarantees non-empty string; keep type check only. * * @param Closure(string, ?string=): PotentiallyTranslatedString $fail */ public function validate(string $attribute, mixed $value, Closure $fail): void { if (! is_string($value)) { return; } $validValues = array_map( fn (array $option): string => mb_strtolower($option['value']), $this->options, ); $values = $this->isMultiChoice ? array_map(trim(...), explode(',', $value)) : [$value]; foreach ($values as $v) { if ($v !== '' && ! in_array(mb_strtolower($v), $validValues, true)) { $fail(__('import-wizard-new::validation.invalid_choice', [ 'value' => $v, ])); return; } } } } ================================================ FILE: packages/ImportWizard/src/Rules/ImportDateRule.php ================================================ format->parse($value) instanceof Carbon) { $fail(__('import-wizard-new::validation.invalid_date', [ 'format' => $this->format->getLabel(), ])); } } } ================================================ FILE: packages/ImportWizard/src/Rules/ImportNumberRule.php ================================================ format->parse($value) === null) { $fail(__('import-wizard-new::validation.invalid_number', [ 'format' => $this->format->getLabel(), ])); } } } ================================================ FILE: packages/ImportWizard/src/Store/ImportRow.php ================================================ $raw_data * @property Collection|null $validation * @property Collection|null $corrections * @property Collection|null $skipped * @property RowMatchAction|null $match_action * @property string|null $matched_id * @property DataCollection|null $relationships * @property bool $processed * * @method static Builder withErrors(string $column) * @method static Builder withCorrections(string $column) * @method static Builder withSkipped(string $column) * @method static Builder valid() * @method static Builder toCreate() * @method static Builder toUpdate() * @method static Builder toSkip() * @method static Builder uniqueValuesFor(string $column) * @method static Builder searchValue(string $column, string $search) * @method static Builder forFilter(ReviewFilter $filter, string $column) */ final class ImportRow extends Model { /** @use HasFactory> */ use HasFactory; protected $table = 'import_rows'; protected $primaryKey = 'row_number'; public $incrementing = false; public $timestamps = false; /** @var list */ protected $fillable = [ 'row_number', 'raw_data', 'validation', 'corrections', 'skipped', 'match_action', 'matched_id', 'relationships', 'processed', ]; /** * @return array */ protected function casts(): array { return [ 'raw_data' => AsCollection::class, 'validation' => AsCollection::class, 'corrections' => AsCollection::class, 'skipped' => AsCollection::class, 'match_action' => RowMatchAction::class, 'relationships' => DataCollection::class.':'.RelationshipMatch::class, 'processed' => 'boolean', ]; } /** * @param Builder $query */ #[Scope] protected function withErrors(Builder $query, string $column): void { $query->whereRaw('json_extract(validation, ?) IS NOT NULL', ['$.'.$column]); } /** * @param Builder $query */ #[Scope] protected function withCorrections(Builder $query, string $column): void { $query->whereRaw('json_extract(corrections, ?) IS NOT NULL', ['$.'.$column]); } /** * @param Builder $query */ #[Scope] protected function withSkipped(Builder $query, string $column): void { $query->whereRaw('json_extract(skipped, ?) IS NOT NULL', ['$.'.$column]); } /** * @param Builder $query */ #[Scope] protected function valid(Builder $query): void { $query->where(function (Builder $q): void { $q->whereNull('validation')->orWhere('validation', '=', '{}'); }); } /** * @param Builder $query */ #[Scope] protected function toCreate(Builder $query): void { $query->where('match_action', RowMatchAction::Create->value); } /** * @param Builder $query */ #[Scope] protected function toUpdate(Builder $query): void { $query->where('match_action', RowMatchAction::Update->value); } /** * @param Builder $query */ #[Scope] protected function toSkip(Builder $query): void { $query->where('match_action', RowMatchAction::Skip->value); } /** * @param Builder $query */ #[Scope] protected function uniqueValuesFor(Builder $query, string $column): void { $jsonPath = '$.'.$column; $query->selectRaw( 'json_extract(raw_data, ?) as raw_value, COUNT(*) as count, MAX(json_extract(validation, ?)) as validation_error, MAX(json_extract(corrections, ?)) as correction, MAX(CASE WHEN json_extract(skipped, ?) IS NOT NULL THEN 1 ELSE 0 END) as is_skipped', [$jsonPath, $jsonPath, $jsonPath, $jsonPath] ) ->groupBy('raw_value') ->orderByRaw('CASE WHEN raw_value IS NULL OR raw_value = "" THEN 0 ELSE 1 END'); } /** * @param Builder $query */ #[Scope] protected function searchValue(Builder $query, string $column, string $search): void { $escaped = str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $search); $query->whereRaw('json_extract(raw_data, ?) LIKE ? ESCAPE ?', ['$.'.$column, "%{$escaped}%", '\\']); } /** * @param Builder $query */ #[Scope] protected function forFilter(Builder $query, ReviewFilter $filter, string $column): void { match ($filter) { ReviewFilter::All => null, ReviewFilter::NeedsReview => $query ->whereRaw('json_extract(validation, ?) IS NOT NULL', ['$.'.$column]) ->whereRaw('json_extract(skipped, ?) IS NULL', ['$.'.$column]), ReviewFilter::Modified => $query ->whereRaw('json_extract(corrections, ?) IS NOT NULL', ['$.'.$column]) ->whereRaw('json_extract(skipped, ?) IS NULL', ['$.'.$column]), ReviewFilter::Skipped => $query->whereRaw('json_extract(skipped, ?) IS NOT NULL', ['$.'.$column]), }; } /** * @param Builder $query * @return array */ public static function countUniqueValuesByFilter(Builder $query, string $column): array { $jsonPath = '$.'.$column; $result = $query ->selectRaw(' COUNT(DISTINCT json_extract(raw_data, ?)) as all_count, COUNT(DISTINCT CASE WHEN json_extract(validation, ?) IS NOT NULL AND json_extract(skipped, ?) IS NULL THEN json_extract(raw_data, ?) END) as needs_review_count, COUNT(DISTINCT CASE WHEN json_extract(corrections, ?) IS NOT NULL AND json_extract(skipped, ?) IS NULL THEN json_extract(raw_data, ?) END) as modified_count, COUNT(DISTINCT CASE WHEN json_extract(skipped, ?) IS NOT NULL THEN json_extract(raw_data, ?) END) as skipped_count ', [$jsonPath, $jsonPath, $jsonPath, $jsonPath, $jsonPath, $jsonPath, $jsonPath, $jsonPath, $jsonPath]) ->first(); return [ ReviewFilter::All->value => (int) $result?->getAttribute('all_count'), ReviewFilter::NeedsReview->value => (int) $result?->getAttribute('needs_review_count'), ReviewFilter::Modified->value => (int) $result?->getAttribute('modified_count'), ReviewFilter::Skipped->value => (int) $result?->getAttribute('skipped_count'), ]; } /** * @param Builder $query * @param array $columns * @return array */ public static function getColumnErrorStatuses(Builder $query, array $columns): array { if ($columns === []) { return []; } $selectParts = []; $bindings = []; foreach ($columns as $column) { $selectParts[] = 'MAX(CASE WHEN json_extract(validation, ?) IS NOT NULL AND json_extract(skipped, ?) IS NULL THEN 1 ELSE 0 END) as '.$query->getGrammar()->wrap("has_error_{$column}"); $bindings[] = '$.'.$column; $bindings[] = '$.'.$column; } $result = $query->selectRaw(implode(', ', $selectParts), $bindings)->first(); $statuses = []; foreach ($columns as $column) { $statuses[$column] = (bool) ($result?->getAttribute("has_error_{$column}") ?? false); } return $statuses; } public function hasErrors(): bool { return $this->validation?->isNotEmpty() ?? false; } public function hasCorrections(): bool { return $this->corrections?->isNotEmpty() ?? false; } public function getFinalValue(string $column): mixed { if ($this->isValueSkipped($column)) { return null; } if ($this->hasValidationError($column)) { return null; } if ($this->corrections?->has($column)) { return $this->corrections->get($column); } return $this->raw_data->get($column); } public function isValueSkipped(string $column): bool { return $this->skipped?->has($column) ?? false; } public function hasValidationError(string $column): bool { return $this->validation?->has($column) ?? false; } /** @return array */ public function getFinalData(): array { return $this->raw_data->merge($this->corrections ?? [])->all(); } public function isCreate(): bool { return $this->match_action === RowMatchAction::Create; } public function isUpdate(): bool { return $this->match_action === RowMatchAction::Update; } public function isSkip(): bool { return $this->match_action === RowMatchAction::Skip; } } ================================================ FILE: packages/ImportWizard/src/Store/ImportStore.php ================================================ path()); file_put_contents($store->sqlitePath(), ''); $store->createTableSafely(); return $store; } public static function load(string $importId): ?self { if (! Str::isUlid($importId)) { return null; } $store = new self($importId); if (! File::exists($store->sqlitePath())) { return null; } $store->connection(); return $store; } public function id(): string { return $this->id; } public function path(): string { return storage_path("app/imports/{$this->id}"); } public function sqlitePath(): string { return $this->path().'/data.sqlite'; } public function connectionName(): string { return "import_{$this->id}"; } public function connection(): Connection { return $this->connection ??= $this->createConnection(); } /** @return EloquentBuilder */ public function query(): EloquentBuilder { $this->connection(); return ImportRow::on($this->connectionName()); } public function ensureProcessedColumn(): void { $schema = $this->connection()->getSchemaBuilder(); if ($schema->hasColumn('import_rows', 'processed')) { return; } $schema->table('import_rows', function (Blueprint $table): void { $table->boolean('processed')->default(false); }); } /** * @param array $resolvedMap */ public function bulkUpdateMatches(string $jsonPath, array $resolvedMap, RowMatchAction $unmatchedAction): void { $connection = $this->connection(); $connection->statement(' CREATE TEMPORARY TABLE IF NOT EXISTS temp_match_results ( lookup_value TEXT, match_action TEXT, matched_id TEXT ) '); try { $inserts = collect($resolvedMap) ->map(fn (int|string|null $id, int|string $value): array => [ 'lookup_value' => $value, 'match_action' => $id !== null ? RowMatchAction::Update->value : $unmatchedAction->value, 'matched_id' => $id !== null ? (string) $id : null, ]) ->values() ->all(); if ($inserts === []) { return; } foreach (array_chunk($inserts, 5000) as $chunk) { $connection->table('temp_match_results')->insert($chunk); } $connection->statement(' UPDATE import_rows SET match_action = temp.match_action, matched_id = temp.matched_id FROM temp_match_results AS temp WHERE json_extract(import_rows.raw_data, ?) = temp.lookup_value AND import_rows.match_action IS NULL ', [$jsonPath]); } finally { $connection->statement('DROP TABLE IF EXISTS temp_match_results'); } } public function destroy(): void { $this->connection = null; File::deleteDirectory($this->path()); } private function createConnection(): Connection { $name = $this->connectionName(); $config = [ 'driver' => 'sqlite', 'database' => $this->sqlitePath(), 'foreign_key_constraints' => true, ]; resolve(Repository::class)->set("database.connections.{$name}", $config); return resolve(ConnectionFactory::class)->make($config, $name); } private function createTableSafely(): void { $schema = $this->connection()->getSchemaBuilder(); if ($schema->hasTable('import_rows')) { return; } $schema->create('import_rows', function (Blueprint $table): void { $table->integer('row_number')->primary(); $table->text('raw_data'); $table->text('validation')->nullable(); $table->text('corrections')->nullable(); $table->text('skipped')->nullable(); $table->string('match_action')->nullable(); $table->string('matched_id')->nullable(); $table->text('relationships')->nullable(); $table->boolean('processed')->default(false); }); $this->connection()->statement(' CREATE TRIGGER validate_raw_data_insert BEFORE INSERT ON import_rows BEGIN SELECT CASE WHEN NEW.raw_data IS NULL OR NEW.raw_data = \'\' OR NEW.raw_data = \'{}\' THEN RAISE(ABORT, \'raw_data cannot be null or empty\') END; END '); $schema->table('import_rows', function (Blueprint $table): void { $table->index('validation'); $table->index('match_action'); $table->index('skipped'); }); } } ================================================ FILE: packages/ImportWizard/src/Support/DataTypeInferencer.php ================================================ Validation rule key => field type key */ private array $validationToFieldType = []; /** @var array FieldDataType value => field type key */ private array $dataTypeToFieldType = []; private bool $initialized = false; public function __construct( private readonly ?string $entityName = null, private readonly ?string $teamId = null, ) {} /** * Analyze sample values and return inference result. * * @param array $values Sample values from CSV column */ public function infer(array $values): InferenceResult { $this->initialize(); $nonEmptyValues = array_filter($values, fn (string $v): bool => $v !== ''); if ($nonEmptyValues === []) { return new InferenceResult(type: null, confidence: 0.0, suggestedFields: []); } $allTypes = array_merge( array_values($this->validationToFieldType), array_values($this->dataTypeToFieldType), ['text'] ); $typeVotes = array_fill_keys(array_unique($allTypes), 0); foreach ($nonEmptyValues as $value) { $type = $this->detectType(trim((string) $value)); if (isset($typeVotes[$type])) { $typeVotes[$type]++; } } $totalVotes = count($nonEmptyValues); arsort($typeVotes); $topType = array_key_first($typeVotes); $topVotes = $typeVotes[$topType]; if ($topType === 'text') { return new InferenceResult(type: null, confidence: 0.0, suggestedFields: []); } $confidence = $topVotes / $totalVotes; if ($confidence < 0.5) { return new InferenceResult(type: null, confidence: $confidence, suggestedFields: []); } return new InferenceResult( type: $topType, confidence: $confidence, suggestedFields: $this->getSuggestedFieldsForType($topType), ); } /** * Build detection rules dynamically from FieldManager. */ private function initialize(): void { if ($this->initialized) { return; } $fieldManager = resolve(FieldManager::class); foreach ($fieldManager->getFieldTypes() as $fieldTypeClass) { /** @var FieldTypeDefinitionInterface $instance */ $instance = new $fieldTypeClass; $schema = $instance->configure(); $data = $schema->data(); // For multi-value fields with item validation rules $itemRules = $schema->getDefaultItemValidationRules(); if ($itemRules !== []) { // Look through all rules for a meaningful validation key foreach ($itemRules as $rule) { $validationKey = $this->extractValidationKey($rule); if ($validationKey !== null) { $this->validationToFieldType[$validationKey] = $data->key; break; } } } // Map dataType to field type key $this->dataTypeToFieldType[$data->dataType->value] = $data->key; } $this->initialized = true; } /** * Extract the validation key from a rule. * 'email' => 'email', 'phone:AUTO' => 'phone', 'regex:...' => 'link' */ private function extractValidationKey(string $rule): ?string { // Handle regex rules specially - they're for link validation if (str_starts_with($rule, 'regex:')) { return 'link'; } // Strip parameters: 'phone:AUTO' => 'phone' $key = explode(':', $rule)[0]; // Only return validation keys we can actually use return in_array($key, ['email', 'phone', 'url', 'date'], true) ? $key : null; } /** * Detect the type of a single value. */ private function detectType(string $value): string { // Check validation-based types (email, phone, url/link) foreach ($this->validationToFieldType as $validationKey => $fieldTypeKey) { if ($this->passesValidation($value, $validationKey)) { return $fieldTypeKey; } } // Check date (using Laravel's date validator) if (Validator::make(['v' => $value], ['v' => ['date']])->passes()) { return $this->dataTypeToFieldType[FieldDataType::DATE->value] ?? 'date'; } // Check currency (values with currency symbols) if ($this->isCurrency($value)) { return $this->dataTypeToFieldType[FieldDataType::FLOAT->value] ?? 'currency'; } // Check number if ($this->isNumber($value)) { return $this->dataTypeToFieldType[FieldDataType::NUMERIC->value] ?? 'number'; } return 'text'; } /** * Check if a value passes a specific validation rule. */ private function passesValidation(string $value, string $validationKey): bool { $rules = match ($validationKey) { 'email' => ['email'], 'phone' => ['phone:AUTO'], 'url', 'link' => ['url'], default => null, }; if ($rules === null) { return false; } return Validator::make(['v' => $value], ['v' => $rules])->passes(); } private function isCurrency(string $value): bool { return (bool) preg_match('/^[$\xe2\x82\xac\xc2\xa3\xc2\xa5]\s*[\d,]+(\.\d{1,2})?$|^[\d,]+(\.\d{1,2})?\s*[$\xe2\x82\xac\xc2\xa3\xc2\xa5]$/u', $value); } private function isNumber(string $value): bool { return is_numeric(str_replace([',', ' '], '', $value)); } /** * Get suggested field keys for a detected field type. * * Queries actual custom fields configured for the entity. * * @return array */ private function getSuggestedFieldsForType(string $fieldTypeKey): array { if ($this->entityName === null || $this->teamId === null) { return []; } // Query custom fields of this type for the entity return CustomField::query() ->withoutGlobalScopes() ->where('entity_type', $this->entityName) ->where('tenant_id', $this->teamId) ->where('type', $fieldTypeKey) ->active() ->pluck('code') ->map(fn (string $code): string => "custom_fields_{$code}") ->all(); } } ================================================ FILE: packages/ImportWizard/src/Support/EntityLinkResolver.php ================================================ > */ private array $cache = []; public function __construct( private readonly string $teamId, ) {} public function resolve(EntityLink $link, MatchableField $matcher, mixed $value): int|string|null { $value = $this->normalizeValue($value); if ($value === null) { return null; } $cacheKey = $this->getCacheKey($link, $matcher); if (isset($this->cache[$cacheKey][$value])) { return $this->cache[$cacheKey][$value]; } $resolved = $this->batchResolve($link, $matcher, [$value]); return $resolved[$value] ?? null; } /** * @param array $values * @return array */ public function resolveMany(EntityLink $link, MatchableField $matcher, array $values): array { $uniqueValues = $this->normalizeUniqueValues($values); if ($uniqueValues === []) { return []; } $cacheKey = $this->getCacheKey($link, $matcher); $results = []; $toFetch = []; foreach ($uniqueValues as $value) { if (! isset($this->cache[$cacheKey][$value])) { $toFetch[] = $value; continue; } $results[$value] = $this->cache[$cacheKey][$value]; } if ($toFetch !== []) { return array_merge($results, $this->batchResolve($link, $matcher, $toFetch)); } return $results; } /** * @param array $uniqueValues * @return array */ public function batchResolve(EntityLink $link, MatchableField $matcher, array $uniqueValues): array { if ($uniqueValues === []) { return []; } $field = $matcher->field; $cacheKey = $this->getCacheKey($link, $matcher); $results = match (true) { $link->targetModelClass === User::class => $this->resolveViaTeamMember($field, $uniqueValues), $this->isCustomField($field) => $this->resolveViaCustomField($link, $field, $uniqueValues), default => $this->resolveViaColumn($link, $field, $uniqueValues), }; $normalizedResults = []; foreach ($results as $dbValue => $id) { $normalizedResults[$this->normalizeForComparison((string) $dbValue)] = $id; } $resolved = []; foreach ($uniqueValues as $value) { $matchedId = $normalizedResults[$this->normalizeForComparison($value)] ?? null; $resolved[$value] = $matchedId; $this->cache[$cacheKey][$value] = $matchedId; } return $resolved; } /** * @param array $values * @return array */ private function normalizeUniqueValues(array $values): array { return collect($values) ->map(fn (mixed $v): ?string => $this->normalizeValue($v)) ->filter() ->unique() ->values() ->all(); } private function isCustomField(string $field): bool { return str_starts_with($field, self::CUSTOM_FIELD_PREFIX); } private function getCustomFieldCode(string $field): string { return substr($field, strlen(self::CUSTOM_FIELD_PREFIX)); } /** * @param array $uniqueValues * @return array */ private function resolveViaColumn(EntityLink $link, string $field, array $uniqueValues): array { $modelClass = $link->targetModelClass; return $modelClass::query() ->where('team_id', $this->teamId) ->whereIn($field, $uniqueValues) ->pluck('id', $field) ->all(); } /** * @param array $uniqueValues * @return array */ private function resolveViaTeamMember(string $field, array $uniqueValues): array { return User::query() ->whereIn($field, $uniqueValues) ->where(function (Builder $query): void { $query->whereHas('teams', fn (Builder $q) => $q->where('teams.id', $this->teamId)) ->orWhereHas('ownedTeams', fn (Builder $q) => $q->where('teams.id', $this->teamId)); }) ->pluck('id', $field) ->all(); } /** * @param array $uniqueValues * @return array */ private function resolveViaCustomField(EntityLink $link, string $field, array $uniqueValues): array { $customFieldCode = $this->getCustomFieldCode($field); $customField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->teamId) ->where('entity_type', $link->targetEntity) ->where('code', $customFieldCode) ->first(); if ($customField === null) { return []; } $valueColumn = $customField->getValueColumn(); if ($valueColumn === 'json_value') { return $this->resolveViaJsonColumn($link->targetEntity, $customField->getKey(), $uniqueValues); } return CustomFieldValue::query() ->withoutGlobalScopes() ->where('tenant_id', $this->teamId) ->where('custom_field_id', $customField->id) ->where('entity_type', $link->targetEntity) ->whereIn($valueColumn, $uniqueValues) ->pluck('entity_id', $valueColumn) ->all(); } /** * @param array $uniqueValues * @return array */ private function resolveViaJsonColumn(string $entityType, int|string $customFieldId, array $uniqueValues): array { if ($uniqueValues === []) { return []; } $model = new CustomFieldValue; $connection = $model->getConnection(); $table = $model->getTable(); $driver = $connection->getDriverName(); $tenantKey = config('custom-fields.database.column_names.tenant_foreign_key'); $results = []; foreach (array_chunk($uniqueValues, 5000) as $chunk) { $lowerChunk = array_map(mb_strtolower(...), $chunk); $placeholders = implode(',', array_fill(0, count($lowerChunk), '?')); $sql = match ($driver) { 'sqlite' => "SELECT cfv.entity_id, je.value AS matched_value FROM {$table} cfv, json_each( CASE WHEN JSON_TYPE(cfv.json_value) = 'array' THEN cfv.json_value ELSE JSON_ARRAY(cfv.json_value) END ) je WHERE cfv.{$tenantKey} = ? AND cfv.custom_field_id = ? AND cfv.entity_type = ? AND LOWER(CAST(je.value AS TEXT)) IN ({$placeholders})", 'pgsql' => "SELECT cfv.entity_id, LOWER(je.value) AS matched_value FROM {$table} cfv CROSS JOIN LATERAL jsonb_array_elements_text( CASE WHEN jsonb_typeof(cfv.json_value::jsonb) = 'array' THEN cfv.json_value::jsonb ELSE jsonb_build_array(cfv.json_value::jsonb) END ) AS je(value) WHERE cfv.{$tenantKey} = ? AND cfv.custom_field_id = ? AND cfv.entity_type = ? AND LOWER(je.value) IN ({$placeholders})", default => "SELECT cfv.entity_id, jt.val AS matched_value FROM {$table} cfv JOIN JSON_TABLE( IF(JSON_TYPE(cfv.json_value) = 'ARRAY', cfv.json_value, JSON_ARRAY(cfv.json_value)), '\$[*]' COLUMNS(val TEXT PATH '\$') ) AS jt WHERE cfv.{$tenantKey} = ? AND cfv.custom_field_id = ? AND cfv.entity_type = ? AND LOWER(jt.val) IN ({$placeholders})", }; $bindings = array_merge([$this->teamId, $customFieldId, $entityType], $lowerChunk); $rows = $connection->select($sql, $bindings); foreach ($rows as $row) { $key = mb_strtolower((string) $row->matched_value); if (! isset($results[$key])) { $results[$key] = $row->entity_id; } } } return $results; } /** @param array $values */ public function preloadCache(EntityLink $link, MatchableField $matcher, array $values): void { $uniqueValues = $this->normalizeUniqueValues($values); if ($uniqueValues === []) { return; } $this->batchResolve($link, $matcher, $uniqueValues); } public function getCachedId(EntityLink $link, MatchableField $matcher, mixed $value): int|string|null { $cacheKey = $this->getCacheKey($link, $matcher); $normalized = $this->normalizeValue($value); return $this->cache[$cacheKey][$normalized] ?? null; } public function clearCache(): void { $this->cache = []; } private function getCacheKey(EntityLink $link, MatchableField $matcher): string { return "{$link->key}:{$matcher->field}"; } private function normalizeValue(mixed $value): ?string { if ($value === null || $value === '') { return null; } $trimmed = trim((string) $value); return $trimmed === '' ? null : $trimmed; } private function normalizeForComparison(string $value): string { return mb_strtolower(trim($value)); } } ================================================ FILE: packages/ImportWizard/src/Support/EntityLinkStorage/CustomFieldValueStorage.php ================================================ customFieldCode === null) { return $data; } $attributeKey = 'custom_fields_'.$link->customFieldCode; // Record custom fields support single ID $id = $resolvedIds[0] ?? null; if ($id !== null) { $data[$attributeKey] = $id; } return $data; } } ================================================ FILE: packages/ImportWizard/src/Support/EntityLinkStorage/EntityLinkStorageInterface.php ================================================ $resolvedIds The resolved target record ID(s) * @param array $context Additional context from import */ public function store(Model $record, EntityLink $link, array $resolvedIds, array $context): void; /** * Prepare data for model fill() before save. * * Called in prepareForSave() for storage types that set model attributes. * * @param array $data Current prepared data * @param EntityLink $link The entity link configuration * @param array $resolvedIds The resolved target record ID(s) * @return array Modified data with entity link values */ public function prepareData(array $data, EntityLink $link, array $resolvedIds): array; } ================================================ FILE: packages/ImportWizard/src/Support/EntityLinkStorage/ForeignKeyStorage.php ================================================ foreignKey ?? $link->key.'_id'; // BelongsTo only supports single ID $id = $resolvedIds[0] ?? null; if ($id !== null) { $data[$foreignKey] = $id; } return $data; } } ================================================ FILE: packages/ImportWizard/src/Support/EntityLinkStorage/MorphToManyStorage.php ================================================ morphRelation ?? $link->key; if (! method_exists($record, $relationName)) { return; } // Sync without detaching - adds new links while keeping existing ones $record->{$relationName}()->syncWithoutDetaching($resolvedIds); } public function prepareData(array $data, EntityLink $link, array $resolvedIds): array { // MorphToMany relations are synced in store(), no data preparation needed return $data; } } ================================================ FILE: packages/ImportWizard/src/Support/EntityLinkValidator.php ================================================ > */ private array $formatRulesCache = []; /** @var array */ private array $lastFormatErrors = []; public function __construct(private readonly string $teamId) { $this->resolver = new EntityLinkResolver($this->teamId); } public function validate(EntityLink $link, MatchableField $matcher, mixed $value): ?string { if ($matcher->behavior === MatchBehavior::Create) { return null; } $normalized = trim((string) ($value ?? '')); if ($normalized === '') { return null; } $id = $this->resolver->resolve($link, $matcher, $normalized); return $id === null ? $this->buildErrorMessage($link, $matcher, $normalized) : null; } /** * @param array $uniqueValues * @return array */ public function batchValidate(EntityLink $link, MatchableField $matcher, array $uniqueValues): array { $this->lastFormatErrors = []; if ($matcher->behavior === MatchBehavior::Create) { return array_fill_keys($uniqueValues, null); } $results = []; $toValidate = []; $formatRules = $this->getMatchFieldFormatRules($link, $matcher); foreach ($uniqueValues as $value) { $trimmed = trim($value); if ($trimmed === '') { $results[$value] = null; continue; } if ($formatRules !== []) { $formatError = $this->validateFormat($trimmed, $matcher, $formatRules); if ($formatError !== null) { $results[$value] = $formatError; $this->lastFormatErrors[$value] = $formatError; continue; } } $toValidate[] = $trimmed; } if ($toValidate === []) { return $results; } $resolved = $this->resolver->batchResolve($link, $matcher, $toValidate); foreach ($toValidate as $value) { $results[$value] = $resolved[$value] !== null ? null : $this->buildErrorMessage($link, $matcher, $value); } return $results; } public function validateFromColumn(ColumnData $column, BaseImporter $importer, mixed $value): ?string { $context = $column->resolveEntityLinkContext($importer); return $context ? $this->validate($context['link'], $context['matcher'], $value) : null; } /** * @param array $uniqueValues * @return array */ public function batchValidateFromColumn(ColumnData $column, BaseImporter $importer, array $uniqueValues): array { $context = $column->resolveEntityLinkContext($importer); return $context ? $this->batchValidate($context['link'], $context['matcher'], $uniqueValues) : array_fill_keys($uniqueValues, null); } /** @param array $values */ public function preloadCache(EntityLink $link, MatchableField $matcher, array $values): void { $this->resolver->preloadCache($link, $matcher, $values); } public function getResolvedId(EntityLink $link, MatchableField $matcher, mixed $value): int|string|null { $normalized = trim((string) ($value ?? '')); if ($normalized === '') { return null; } return $this->resolver->getCachedId($link, $matcher, $normalized) ?? $this->resolver->resolve($link, $matcher, $normalized); } public function getResolver(): EntityLinkResolver { return $this->resolver; } /** @return array */ public function getLastFormatErrors(): array { return $this->lastFormatErrors; } /** * @return array */ private function getMatchFieldFormatRules(EntityLink $link, MatchableField $matcher): array { if (! str_starts_with($matcher->field, 'custom_fields_')) { return []; } $cacheKey = "{$link->targetEntity}:{$matcher->field}"; if (isset($this->formatRulesCache[$cacheKey])) { return $this->formatRulesCache[$cacheKey]; } $code = substr($matcher->field, strlen('custom_fields_')); $customField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->teamId) ->where('entity_type', $link->targetEntity) ->where('code', $code) ->first(); if ($customField === null) { return $this->formatRulesCache[$cacheKey] = []; } $fieldTypeInstance = CustomFieldsType::getFieldTypeInstance($customField->type); if ($fieldTypeInstance === null) { return $this->formatRulesCache[$cacheKey] = []; } return $this->formatRulesCache[$cacheKey] = $fieldTypeInstance->configure()->getDefaultItemValidationRules(); } /** * @param array $rules */ private function validateFormat(string $value, MatchableField $matcher, array $rules): ?string { $items = $matcher->multiValue ? array_map(trim(...), explode(',', $value)) : [$value]; foreach ($items as $item) { if ($item === '') { continue; } $validator = Validator::make(['value' => $item], ['value' => $rules]); if ($validator->fails()) { return "Invalid format: '{$item}'"; } } return null; } private function buildErrorMessage(EntityLink $link, MatchableField $matcher, string $value): string { return "No {$link->label} found matching '{$value}' by {$matcher->label}"; } } ================================================ FILE: packages/ImportWizard/src/Support/MatchResolver.php ================================================ resetPreviousResolutions(); $mappings = $this->import->columnMappings(); $mappedFieldKeys = $mappings->filter(fn (ColumnData $col): bool => $col->isFieldMapping()) ->pluck('target') ->all(); $matchField = $this->importer->getMatchFieldForMappedColumns($mappedFieldKeys); if ($matchField instanceof MatchableField && $matchField->behavior !== MatchBehavior::Create) { $this->resolveWithLookup($matchField, $mappings); } $this->markRemainingAs(RowMatchAction::Create); } private function resetPreviousResolutions(): void { $this->store->connection()->statement(' UPDATE import_rows SET match_action = NULL, matched_id = NULL '); } private function markRemainingAs(RowMatchAction $action): void { $this->store->connection()->statement(' UPDATE import_rows SET match_action = ? WHERE match_action IS NULL ', [$action->value]); } /** @param Collection $mappings */ private function resolveWithLookup(MatchableField $matchField, Collection $mappings): void { $sourceColumn = $this->findSourceColumn($matchField, $mappings); if (! $sourceColumn instanceof ColumnData) { return; } $jsonPath = '$.'.$sourceColumn->source; $uniqueValues = $this->extractUniqueValues($jsonPath); if ($uniqueValues === []) { return; } $resolvedMap = $this->resolveMatchIds($matchField, $uniqueValues); $unmatchedAction = $matchField->behavior === MatchBehavior::MatchOnly ? RowMatchAction::Skip : RowMatchAction::Create; $this->store->bulkUpdateMatches($jsonPath, $resolvedMap, $unmatchedAction); $this->markRemainingAs($unmatchedAction); } /** @param Collection $mappings */ private function findSourceColumn(MatchableField $matchField, Collection $mappings): ?ColumnData { return $mappings->first( fn (ColumnData $col): bool => $col->isFieldMapping() && $col->target === $matchField->field, ); } /** @return array */ private function extractUniqueValues(string $jsonPath): array { return $this->store->query() ->whereNull('match_action') ->selectRaw('DISTINCT json_extract(raw_data, ?) as value', [$jsonPath]) ->pluck('value') ->filter() ->values() ->all(); } /** * @param array $uniqueValues * @return array */ private function resolveMatchIds(MatchableField $matchField, array $uniqueValues): array { $resolver = new EntityLinkResolver($this->import->team_id); $selfLink = new EntityLink( key: 'self', source: EntityLinkSource::Relationship, targetEntity: $this->importer->entityName(), targetModelClass: $this->importer->modelClass(), ); return $matchField->multiValue ? $this->resolveMultiValueField($resolver, $selfLink, $matchField, $uniqueValues) : $resolver->batchResolve($selfLink, $matchField, $uniqueValues); } /** * @param array $csvValues * @return array */ private function resolveMultiValueField( EntityLinkResolver $resolver, EntityLink $selfLink, MatchableField $matchField, array $csvValues, ): array { $allParts = collect($csvValues) ->flatMap(fn (string $csv) => Str::of($csv)->explode(',')->map(fn (string $v): string => trim($v))->filter()) ->unique() ->values() ->all(); $batchResults = $resolver->batchResolve($selfLink, $matchField, $allParts); return collect($csvValues) ->mapWithKeys(fn (string $csv): array => [ $csv => Str::of($csv)->explode(',')->map(fn (string $v): string => trim($v))->filter() ->map(fn (string $part) => $batchResults[$part] ?? null) ->filter() ->first(), ]) ->all(); } } ================================================ FILE: packages/ImportWizard/src/Support/Validation/ColumnValidator.php ================================================ getType(); return match (true) { $type->isDateOrDateTime() => $this->validateDate($column, $value), $type->isFloat() => $this->validateNumber($column, $value), $type->isBoolean() => $this->validateBoolean($value), $column->isMultiChoiceArbitrary() => $this->validateMultiChoiceArbitrary($column, $value), $column->isMultiChoicePredefined() => $this->validateMultiChoicePredefined($column, $value), $column->isSingleChoicePredefined() => $this->validateSingleChoice($column, $value), default => $this->validateText($column, $value), }; } private function validateDate(ColumnData $column, string $value): ?ValidationError { $format = $column->dateFormat ?? DateFormat::ISO; if (! $format->parse($value, $column->getType()->isTimestamp()) instanceof Carbon) { return ValidationError::message("Invalid date format. Expected: {$format->getLabel()}"); } return null; } private function validateNumber(ColumnData $column, string $value): ?ValidationError { $format = $column->numberFormat ?? NumberFormat::POINT; if ($format->parse($value) === null) { return ValidationError::message("Invalid number format. Expected: {$format->getLabel()}"); } return null; } private function validateSingleChoice(ColumnData $column, string $value): ?ValidationError { $originalValues = $this->getChoiceValues($column); $lowercasedValues = $this->lowercaseValues($originalValues); if (in_array(mb_strtolower($value), $lowercasedValues, true)) { return null; } return ValidationError::message($this->formatInvalidChoiceMessage($originalValues)); } private function validateMultiChoicePredefined(ColumnData $column, string $value): ?ValidationError { $lowercasedValues = $this->lowercaseValues($this->getChoiceValues($column)); $errors = $this->parseCommaSeparated($value) ->reject(fn (string $item): bool => in_array(mb_strtolower($item), $lowercasedValues, true)) ->mapWithKeys(fn (string $item): array => [$item => 'Not a valid option']) ->all(); if ($errors !== []) { return ValidationError::itemErrors($errors); } return null; } private function validateMultiChoiceArbitrary(ColumnData $column, string $value): ?ValidationError { $rules = $this->getPreviewRules($column); if ($rules === []) { return null; } $errors = $this->parseCommaSeparated($value) ->mapWithKeys(fn (string $item): array => [$item => $this->runValidator($item, $rules)]) ->filter() ->all(); if ($errors !== []) { return ValidationError::itemErrors($errors); } return null; } private function validateBoolean(string $value): ?ValidationError { $normalized = strtolower(trim($value)); if (in_array($normalized, ['1', '0', 'true', 'false', 'yes', 'no', 'on', 'off'], true)) { return null; } return ValidationError::message('The value must be true or false (accepted: true, false, 1, 0, yes, no).'); } private function validateText(ColumnData $column, string $value): ?ValidationError { $rules = $this->getPreviewRules($column); if ($rules === []) { return null; } $error = $this->runValidator($value, $rules); if ($error !== null) { return ValidationError::message($error); } return null; } /** @return Collection */ private function parseCommaSeparated(string $value): Collection { return str($value) ->explode(',') ->map(fn (string $v): string => trim($v)) ->filter() ->values(); } /** @return array */ private function getChoiceValues(ColumnData $column): array { return collect($column->importField->options ?? []) ->pluck('value') ->all(); } /** * @param array $values * @return array */ private function lowercaseValues(array $values): array { return array_map(mb_strtolower(...), $values); } /** @param array $validValues */ private function formatInvalidChoiceMessage(array $validValues): string { $preview = collect($validValues)->take(5)->implode(', '); $suffix = count($validValues) > 5 ? '...' : ''; return "Invalid choice. Must be one of: {$preview}{$suffix}"; } /** @return array */ private function getPreviewRules(ColumnData $column): array { return collect($column->getRules()) ->reject(fn (string $rule): bool => in_array($rule, ['required', 'nullable'], true)) ->values() ->all(); } /** @param array $rules */ private function runValidator(string $value, array $rules): ?string { $validator = Validator::make(['value' => $value], ['value' => $rules]); if ($validator->passes()) { return null; } return $validator->errors()->first('value'); } } ================================================ FILE: packages/ImportWizard/src/Support/Validation/ValidationError.php ================================================ $itemErrors Per-item errors for multi-value fields */ private function __construct( private ?string $message = null, private array $itemErrors = [], ) {} /** * Create a simple error message. */ public static function message(string $message): self { return new self(message: $message); } /** * Create per-item errors for multi-value fields. * * @param array $errors Map of value => error message */ public static function itemErrors(array $errors): self { return new self(itemErrors: $errors); } /** * Create from database storage format. * * Handles both JSON (per-item errors) and plain strings (simple message). */ public static function fromStorageFormat(?string $stored): ?self { if ($stored === null || $stored === '') { return null; } $decoded = json_decode($stored, true); if (is_array($decoded) && json_last_error() === JSON_ERROR_NONE) { return new self(itemErrors: $decoded); } return new self(message: $stored); } /** * Convert to database storage format. * * Returns JSON for per-item errors, plain string for simple message. */ public function toStorageFormat(): string { if ($this->itemErrors !== []) { return json_encode($this->itemErrors, JSON_THROW_ON_ERROR); } return $this->message ?? ''; } public function hasItemErrors(): bool { return $this->itemErrors !== []; } public function getMessage(): ?string { return $this->message; } /** * @return array */ public function getItemErrors(): array { return $this->itemErrors; } } ================================================ FILE: packages/OnboardSeed/README.md ================================================ # OnboardSeed ## Overview OnboardSeed provides a structured way to seed demo data for new teams. It uses YAML fixtures to define entities and their relationships, with a clean API for generating consistent demo data across multiple environments. ## Features - Declarative YAML-based fixture definitions - Registry pattern for tracking entity relationships - All relationships defined directly in YAML fixtures - Consistent handling of custom fields - Extendable architecture for adding new entity types ## Fixture Format All fixtures follow a standardized format: ```yaml # Required attributes for the entity name: "Entity Name" # Required for most entities title: "Entity Title" # For tasks/notes # References to other entities (singular form) company: company_key # Reference to another entity # For notes, use noteable_type and noteable_key # Important: noteable_type should be SINGULAR (company, person) noteable_type: company # The singular entity type noteable_key: company_fixture_key # The key of the referenced entity # Many-to-many relationships assigned_people: # Use plural form as property name - person_key1 # List related entity keys - person_key2 # Custom fields custom_fields: # All custom field values under this key field_code: value # Simple value another_field: [ value1, value2 ] # Array value # Dynamic value using simple date expression date_field: '{{ +5d }}' ``` ### Relationship Types in YAML The package supports defining different types of relationships directly in YAML fixtures: 1. **Belongs-To Relationships** - References to parent entities: ```yaml # In people/tim.yaml company: apple # Person belongs to the Apple company ``` 2. **Many-to-Many Relationships** - Lists of related entities: ```yaml # In tasks/meeting.yaml assigned_people: - tim - dylan ``` 3. **Polymorphic Relationships** - Used for notes and other polymorphic relations: ```yaml # In notes/meeting_note.yaml noteable_type: company # The entity type (singular) noteable_key: apple # The entity key ``` ### Naming Conventions - **Fixture Files**: `lowercase_with_underscores.yaml` - **Entity Keys**: Same as the filename without extension - **Entity References**: Always use the singular form of the entity type - Example: In fixtures, use `company: figma` (not `companies: figma`) - For notes, use `noteable_type: company` (not `noteable_type: companies`) - **Registry Keys**: Always use the plural form of the entity type - Internally, entities are stored in the registry with plural keys - Example: `companies`, `people`, `opportunities` - **Relationship Lists**: Use plural form of the entity type - Example: `assigned_people`, `related_tasks` ## Adding New Fixture Data ### 1. Create a YAML File Create a new YAML file in the appropriate directory: ```yaml # resources/fixtures/companies/new_company.yaml name: New Company Name custom_fields: domain_name: https://example.com icp: true linkedin: https://www.linkedin.com/company/example ``` For tasks with people relationships: ```yaml # resources/fixtures/tasks/meeting.yaml title: Team Meeting assigned_people: - person_key1 - person_key2 custom_fields: description: Weekly team meeting due_date: '{{ +2d }}' status: To do priority: High ``` For notes that reference other entities: ```yaml # resources/fixtures/notes/company_note.yaml title: Meeting Notes noteable_type: company # Singular form noteable_key: new_company # The key of the company custom_fields: body:

Important meeting notes about this company.

``` ### 2. Handling Relationships in Seeders Each model seeder has handlers for its specific relationship types: ```php // In TaskSeeder.php - handling people assignments if (isset($data['assigned_people']) && is_array($data['assigned_people'])) { foreach ($data['assigned_people'] as $personKey) { $person = FixtureRegistry::get('people', $personKey); $task->people()->attach($person->id); } } // In NoteSeeder.php - handling polymorphic relationships $noteableType = $data['noteable_type'] ?? null; $noteableKey = $data['noteable_key'] ?? null; $registryKey = $this->getPluralEntityType($noteableType); $noteable = FixtureRegistry::get($registryKey, $noteableKey); ``` ## Adding a New Entity Type ### 1. Create Fixture Directory ```bash mkdir -p resources/fixtures/new_entity_type ``` ### 2. Create Fixtures Create YAML files for your new entity type: ```yaml # resources/fixtures/new_entity_type/example.yaml name: Example custom_fields: field1: value1 field2: value2 ``` ### 3. Create a Seeder Create a new seeder class that extends BaseModelSeeder: ```php loadEntityFixtures(); $entities = []; foreach ($fixtures as $key => $data) { $entity = $this->createEntityFromFixture($team, $user, $key, $data); $entities[$key] = $entity; } return [ 'new_entity_types' => $entities, // Plural form ]; } private function createEntityFromFixture(Team $team, User $user, string $key, array $data): NewEntityType { $attributes = [ 'name' => $data['name'], // other attributes ]; $customFields = $data['custom_fields'] ?? []; return $this->registerEntityFromFixture($key, $attributes, $customFields, $team, $user); } } ``` ### 4. Register the Seeder Add your seeder to the sequence in `OnboardSeedManager`: ```php private array $entitySeederSequence = [ CompanySeeder::class, // ... NewEntityTypeSeeder::class, ]; ``` ### 5. Update Type Mapping for Notes (If Needed) If the new entity type can have notes attached, update the `$entityTypeMap` in the NoteSeeder: ```php private array $entityTypeMap = [ // Existing mappings... 'new_entity_type' => 'new_entity_types', // Singular to plural mapping ]; ``` ## Template Expressions You can use dynamic date values in fixtures using simple expressions: ```yaml # Simple date keywords due_date: '{{ now }}' # Current datetime start_date: '{{ today }}' # Today's date end_date: '{{ tomorrow }}' # Tomorrow's date last_contact: '{{ yesterday }}' # Yesterday's date meeting_date: '{{ nextWeek }}' # One week from today previous_date: '{{ lastWeek }}' # One week before today payment_date: '{{ nextMonth }}' # One month from today last_payment: '{{ lastMonth }}' # One month before today # Relative dates with simple syntax followup_date: '{{ +7d }}' # 7 days from now (+Nd for N days) review_date: '{{ +2w }}' # 2 weeks from now (+Nw for N weeks) renewal_date: '{{ +3m }}' # 3 months from now (+Nm for N months) contract_date: '{{ +1y }}' # 1 year from now (+Ny for N years) deadline_date: '{{ +5b }}' # 5 business days from now (+Nb for N business days) ``` For formatting dates, you can handle that in your model's accessor/mutator or in the seeder class. ## Best Practices 1. **Keep fixtures small and focused** - One entity per file 2. **Use descriptive keys** - Keys should describe the entity's role 3. **Organize fixtures logically** - Group related fixtures together 4. **Define all relationships in YAML** - Avoid defining relationships in PHP code 5. **Use references consistently** - Always reference by fixture key 6. **Remember singular vs plural forms** - Use singular in fixture references, plural in entity types ================================================ FILE: packages/OnboardSeed/resources/fixtures/companies/airbnb.yaml ================================================ name: Airbnb custom_fields: domains: https://airbnb.com icp: true linkedin: https://www.linkedin.com/company/airbnb ================================================ FILE: packages/OnboardSeed/resources/fixtures/companies/apple.yaml ================================================ name: Apple custom_fields: domains: https://apple.com icp: true linkedin: https://www.linkedin.com/company/apple ================================================ FILE: packages/OnboardSeed/resources/fixtures/companies/figma.yaml ================================================ name: Figma custom_fields: domains: https://figma.com icp: true linkedin: https://www.linkedin.com/company/figma ================================================ FILE: packages/OnboardSeed/resources/fixtures/companies/notion.yaml ================================================ name: Notion custom_fields: domains: https://notion.com icp: true linkedin: https://www.linkedin.com/company/notion-so ================================================ FILE: packages/OnboardSeed/resources/fixtures/notes/airbnb_note.yaml ================================================ title: Hospitality platform integration noteable_type: company noteable_key: airbnb custom_fields: body:

Airbnb is looking to enhance their host tools with our analytics solution. Brian expressed interest in a custom dashboard for hosts to better understand guest preferences.

================================================ FILE: packages/OnboardSeed/resources/fixtures/notes/apple_note.yaml ================================================ title: Developer partnership discussion noteable_type: company noteable_key: apple custom_fields: body:

Apple is interested in exploring a partnership for their developer ecosystem. They need a comprehensive solution within 3 months. Tim will be our main contact.

================================================ FILE: packages/OnboardSeed/resources/fixtures/notes/dylan_note.yaml ================================================ title: Dylan contact information noteable_type: people noteable_key: dylan custom_fields: body:

Dylan is the CEO and primary decision maker. He prefers communication via email rather than phone calls. He has final budget approval for the enterprise plan.

================================================ FILE: packages/OnboardSeed/resources/fixtures/notes/figma_note.yaml ================================================ title: Initial meeting summary noteable_type: company noteable_key: figma custom_fields: body:

Initial meeting with Figma went well. They're interested in our enterprise solutions and would like a proposal by next week. Key decision maker is Dylan.

================================================ FILE: packages/OnboardSeed/resources/fixtures/notes/notion_note.yaml ================================================ title: API integration possibilities noteable_type: company noteable_key: notion custom_fields: body:

Notion team is interested in exploring integration opportunities. They're looking for ways to connect their platform with our services. Ivan will be our primary contact for technical discussions.

================================================ FILE: packages/OnboardSeed/resources/fixtures/opportunities/airbnb_analytics.yaml ================================================ name: Airbnb Host Analytics Platform company: airbnb custom_fields: amount: 20000 close_date: '{{ +4w }}' stage: Prospecting ================================================ FILE: packages/OnboardSeed/resources/fixtures/opportunities/apple_partnership.yaml ================================================ name: Apple Developer Partnership company: apple custom_fields: amount: 25000 close_date: '{{ +1m }}' stage: Needs Analysis ================================================ FILE: packages/OnboardSeed/resources/fixtures/opportunities/figma_enterprise.yaml ================================================ name: Figma Enterprise Plan company: figma custom_fields: amount: 15000 close_date: '{{ +2w }}' stage: Proposal/Price Quote ================================================ FILE: packages/OnboardSeed/resources/fixtures/opportunities/notion_integration.yaml ================================================ name: Notion API Integration company: notion custom_fields: amount: 18000 close_date: '{{ +3w }}' stage: Qualification ================================================ FILE: packages/OnboardSeed/resources/fixtures/people/brian.yaml ================================================ name: Brian Chesky company: airbnb custom_fields: emails: - brian@airbnb.com phone_number: "+14155550100" job_title: CEO & Co-founder linkedin: https://www.linkedin.com/in/brianchesky/ ================================================ FILE: packages/OnboardSeed/resources/fixtures/people/dylan.yaml ================================================ name: Dylan Field company: figma custom_fields: emails: - dylan@figma.com phone_number: "+14155550101" job_title: CEO linkedin: https://www.linkedin.com/in/dylanfield/ ================================================ FILE: packages/OnboardSeed/resources/fixtures/people/ivan.yaml ================================================ name: Ivan Zhao company: notion custom_fields: emails: - ivan@notion.com phone_number: "+14155550102" job_title: Co-founder linkedin: https://www.linkedin.com/in/ivzhao/ ================================================ FILE: packages/OnboardSeed/resources/fixtures/people/tim.yaml ================================================ name: Tim Cook company: apple custom_fields: emails: - tim@apple.com phone_number: "+14155550103" job_title: CEO linkedin: https://www.linkedin.com/in/timcook/ ================================================ FILE: packages/OnboardSeed/resources/fixtures/tasks/brian_call.yaml ================================================ title: Discovery call with Brian assigned_people: - brian custom_fields: description: Schedule a call to discuss potential partnership opportunities with Airbnb. due_date: '{{ +7d }}' status: To do priority: High ================================================ FILE: packages/OnboardSeed/resources/fixtures/tasks/dylan_followup.yaml ================================================ title: Follow up with Dylan # Add people assignment directly in the YAML assigned_people: - dylan custom_fields: description: Discuss the Figma enterprise plan proposal and address any questions he may have. due_date: '{{ +3d }}' status: To do priority: High ================================================ FILE: packages/OnboardSeed/resources/fixtures/tasks/ivan_meeting.yaml ================================================ title: Integration meeting with Ivan assigned_people: - ivan custom_fields: description: Discuss API integration possibilities with Notion and explore collaboration features. due_date: '{{ +10d }}' status: To do priority: High ================================================ FILE: packages/OnboardSeed/resources/fixtures/tasks/tim_proposal.yaml ================================================ title: Send proposal to Tim assigned_people: - tim custom_fields: description: Prepare and send the final proposal for the Apple developer partnership. due_date: '{{ +5d }}' status: To do priority: Medium ================================================ FILE: packages/OnboardSeed/resources/templates/entity_template.yaml ================================================ # Template for creating a new fixture # Replace values with your actual data # Required entity attributes # -------------------------- # Use 'name' for most entities (companies, people) name: "Entity Name" # Use 'title' for task or content entities (tasks, notes) title: "Entity Title" # Entity references # ---------------- # IMPORTANT: Always use singular form of entity type # (e.g., 'company' not 'companies') # The value should be the key of an existing fixture company: company_key # NOT 'companies: company_key' person: person_key # NOT 'people: person_key' opportunity: opportunity_key # Many-to-many relationships # -------------------------- # For entities with many-to-many relationships (e.g., tasks with people) assigned_people: # Use the plural form for the property name - person_key1 # List the keys of related entities - person_key2 # OR for many-to-many relationships in the other direction: related_tasks: # Use the plural form for the property name - task_key1 # List the keys of related entities - task_key2 # For notes, use noteable_type and noteable_key # IMPORTANT: noteable_type should be SINGULAR noteable_type: company # Singular form (NOT 'companies') noteable_key: company_key # The key of the referenced entity # Custom fields # ------------ # All custom field values go under this section custom_fields: # Simple value text_field: "Text value" # Boolean value boolean_field: true # Numeric value amount: 10000 # Array value emails: - user@example.com - another@example.com # Reference to option/dropdown value # Will be resolved to option ID using the label stage: "Option Label" status: "To do" # Dynamic value using Laravel's date functions # These will be evaluated at runtime date_field: '{{ now()->addDays(7)->format("Y-m-d") }}' due_date: '{{ now()->addWeeks(2)->format("Y-m-d H:i:s") }}' # Rich text content body:

This is a paragraph of rich text content

================================================ FILE: packages/OnboardSeed/src/Contracts/ModelSeederInterface.php ================================================ */ public function customFields(): Collection; /** * Initialize the seeder with necessary dependencies * * @return $this */ public function initialize(): self; } ================================================ FILE: packages/OnboardSeed/src/ModelSeeders/CompanySeeder.php ================================================ value, CompanyCustomField::ICP->value, CompanyCustomField::LINKEDIN->value, ]; protected function createEntitiesFromFixtures(Team $team, Authenticatable $user): void { $fixtures = $this->loadEntityFixtures(); foreach ($fixtures as $key => $data) { $this->createCompanyFromFixture($team, $user, $key, $data); } } /** * Create a company from fixture data * * @param array $data */ private function createCompanyFromFixture(Team $team, Authenticatable $user, string $key, array $data): Company { $attributes = [ 'name' => $data['name'], 'account_owner_id' => $user->getAuthIdentifier(), ]; $customFields = $data['custom_fields'] ?? []; /** @var Company */ return $this->registerEntityFromFixture($key, $attributes, $customFields, $team, $user); } } ================================================ FILE: packages/OnboardSeed/src/ModelSeeders/NoteSeeder.php ================================================ */ private array $entityTypeMap = [ 'company' => 'companies', 'person' => 'people', 'opportunity' => 'opportunities', 'task' => 'tasks', 'note' => 'notes', ]; protected array $fieldCodes = [ NoteCustomField::BODY->value, ]; protected function createEntitiesFromFixtures(Team $team, Authenticatable $user): void { $fixtures = $this->loadEntityFixtures(); foreach ($fixtures as $key => $data) { $noteableType = $data['noteable_type'] ?? null; $noteableKey = $data['noteable_key'] ?? null; if (! $noteableType || ! $noteableKey) { Log::warning("Missing noteable reference for note: {$key}"); continue; } $registryKey = $this->getPluralEntityType($noteableType); $noteable = FixtureRegistry::get($registryKey, $noteableKey); if (! $noteable instanceof Model) { Log::warning("Noteable entity not found for note: {$key}, entity type: {$noteableType} (registry key: {$registryKey}), key: {$noteableKey}"); continue; } $this->createNoteFromFixture($noteable, $user, $key, $data); } } private function getPluralEntityType(string $singularType): string { return $this->entityTypeMap[$singularType] ?? Str::plural($singularType); } /** @param array $data */ private function createNoteFromFixture( Model $noteable, Authenticatable $user, string $key, array $data ): Note { $customFields = $data['custom_fields'] ?? []; assert(method_exists($noteable, 'notes')); /** @var Note $note */ $note = $noteable->notes()->create([ 'title' => $data['title'], 'team_id' => $this->teamId, 'creator_id' => $user->getAuthIdentifier(), ...$this->getGlobalAttributes(), ]); $this->applyCustomFields($note, $customFields); FixtureRegistry::register($this->entityType, $key, $note); return $note; } } ================================================ FILE: packages/OnboardSeed/src/ModelSeeders/OpportunitySeeder.php ================================================ value, OpportunityCustomField::CLOSE_DATE->value, OpportunityCustomField::STAGE->value, ]; protected function createEntitiesFromFixtures(Team $team, Authenticatable $user): void { $fixtures = $this->loadEntityFixtures(); foreach ($fixtures as $key => $data) { $companyKey = $data['company'] ?? null; if (! $companyKey) { Log::warning("Missing company reference for opportunity: {$key}"); continue; } $company = FixtureRegistry::get('companies', $companyKey); if (! $company instanceof Company) { Log::warning("Company not found for opportunity: {$key}, company key: {$companyKey}"); continue; } $this->createOpportunityFromFixture($team, $user, $company, $key, $data); } } /** * Create an opportunity from fixture data * * @param array $data */ private function createOpportunityFromFixture( Team $team, Authenticatable $user, Company $company, string $key, array $data ): Opportunity { $attributes = [ 'name' => $data['name'], 'company_id' => $company->id, ]; $customFields = $data['custom_fields'] ?? []; // Define field mappings for custom processing $fieldMappings = [ OpportunityCustomField::CLOSE_DATE->value => fn (mixed $value): mixed => is_string($value) ? $this->evaluateTemplateExpression($value) : $value, OpportunityCustomField::STAGE->value => 'option', ]; // Process custom fields using utility method $processedFields = $this->processCustomFieldValues($customFields, $fieldMappings); /** @var Opportunity */ return $this->registerEntityFromFixture($key, $attributes, $processedFields, $team, $user); } } ================================================ FILE: packages/OnboardSeed/src/ModelSeeders/PeopleSeeder.php ================================================ value, PeopleCustomField::PHONE_NUMBER->value, PeopleCustomField::JOB_TITLE->value, PeopleCustomField::LINKEDIN->value, ]; protected function createEntitiesFromFixtures(Team $team, Authenticatable $user): void { $fixtures = $this->loadEntityFixtures(); foreach ($fixtures as $key => $data) { $companyKey = $data['company'] ?? null; if (! $companyKey) { Log::warning("Missing company reference for person: {$key}"); continue; } $company = FixtureRegistry::get('companies', $companyKey); if (! $company instanceof Company) { Log::warning("Company not found for person: {$key}, company key: {$companyKey}"); continue; } $this->createPersonFromFixture($company, $team, $user, $key, $data); } } /** @param array $data */ private function createPersonFromFixture(Company $company, Team $team, Authenticatable $user, string $key, array $data): People { $attributes = [ 'name' => $data['name'], 'company_id' => $company->id, ]; $customFields = $data['custom_fields'] ?? []; /** @var People */ return $this->registerEntityFromFixture($key, $attributes, $customFields, $team, $user); } } ================================================ FILE: packages/OnboardSeed/src/ModelSeeders/TaskSeeder.php ================================================ value, TaskCustomField::DUE_DATE->value, TaskCustomField::STATUS->value, TaskCustomField::PRIORITY->value, ]; protected function createEntitiesFromFixtures(Team $team, Authenticatable $user): void { $fixtures = $this->loadEntityFixtures(); foreach ($fixtures as $key => $data) { $task = $this->createTaskFromFixture($team, $user, $key, $data); if (isset($data['assigned_people']) && is_array($data['assigned_people'])) { $this->assignPeopleToTask($task, $data['assigned_people']); } } } /** * Assign people to a task based on people keys * * @param array $peopleKeys */ private function assignPeopleToTask(Task $task, array $peopleKeys): void { foreach ($peopleKeys as $personKey) { $person = FixtureRegistry::get('people', $personKey); if (! $person instanceof Model) { Log::warning("Person not found for task assignment: {$personKey}"); continue; } try { $task->people()->attach($person->getKey()); } catch (Exception $e) { report($e); } } } /** * Create a task from fixture data * * @param array $data */ private function createTaskFromFixture( Team $team, Authenticatable $user, string $key, array $data ): Task { $attributes = [ 'title' => $data['title'], 'team_id' => $team->id, ]; $customFields = $data['custom_fields'] ?? []; // Define field mappings for custom processing $fieldMappings = [ TaskCustomField::DUE_DATE->value => fn (mixed $value): mixed => is_string($value) ? $this->formatDate($this->evaluateTemplateExpression($value)) : $value, TaskCustomField::STATUS->value => 'option', TaskCustomField::PRIORITY->value => 'option', ]; // Process custom fields using utility method $processedFields = $this->processCustomFieldValues($customFields, $fieldMappings); /** @var Task */ return $this->registerEntityFromFixture($key, $attributes, $processedFields, $team, $user); } /** * Format a date value for the task due date * * @param mixed $dateValue The date value returned from template expression * @return string The formatted date string */ private function formatDate(mixed $dateValue): string { if ($dateValue instanceof Carbon) { return $dateValue->format('Y-m-d H:i:s'); } return (string) $dateValue; } } ================================================ FILE: packages/OnboardSeed/src/OnboardSeedManager.php ================================================ > */ private array $entitySeederSequence = [ CompanySeeder::class, PeopleSeeder::class, OpportunitySeeder::class, TaskSeeder::class, NoteSeeder::class, ]; /** @var array */ private array $seeders = []; public function generateFor(Authenticatable $user, ?Team $team = null): bool { if (! $team instanceof Team) { /** @var User $user */ $user->loadMissing('ownedTeams'); $team = $user->personalTeam(); } try { FixtureRegistry::clear(); $this->initializeSeeders(); Model::withoutEvents(function () use ($user, $team): void { foreach ($this->seeders as $seeder) { $seeder->seed($team, $user); } }); return true; } catch (Throwable $e) { report($e); return false; } } private function initializeSeeders(): void { foreach ($this->entitySeederSequence as $seederClass) { $this->seeders[$seederClass] = resolve($seederClass)->initialize(); } } } ================================================ FILE: packages/OnboardSeed/src/OnboardSeeder.php ================================================ manager->generateFor($user, $team); } } ================================================ FILE: packages/OnboardSeed/src/Support/BaseModelSeeder.php ================================================ */ protected Collection $customFieldDefinitions; protected string $modelClass; protected string $entityType; /** @var array */ protected array $fieldCodes = []; protected ?string $teamId = null; private ?BulkCustomFieldValueWriter $bulkWriter = null; private int $positionCounter = 0; public function initialize(): self { if (! isset($this->entityType) && isset($this->modelClass)) { $className = class_basename($this->modelClass); $this->entityType = Str::plural(Str::snake($className)); } return $this; } protected function setTeamId(string $teamId): void { $this->teamId = $teamId; } /** @return Collection */ public function customFields(): Collection { if ($this->teamId === null) { return collect(); } return CustomField::query() ->with('options') ->whereTenantId($this->teamId) ->forEntity($this->modelClass) ->whereIn('code', $this->fieldCodes) ->get() ->keyBy('code'); } protected function prepareForSeed(Team $team): void { $this->setTeamId($team->id); $this->customFieldDefinitions = $this->customFields(); $this->positionCounter = 0; } public function seed(Team $team, Authenticatable $user): void { $this->prepareForSeed($team); $this->createEntitiesFromFixtures($team, $user); $this->flushCustomFieldValues(); } abstract protected function createEntitiesFromFixtures(Team $team, Authenticatable $user): void; /** @param array $data */ protected function applyCustomFields(HasCustomFields&Model $model, array $data): void { if ($this->teamId === null) { return; } foreach ($data as $code => $value) { if (isset($this->customFieldDefinitions[$code])) { $this->getBulkWriter()->queue( customField: $this->customFieldDefinitions[$code], value: $value, entityId: $model->getKey(), entityType: $model->getMorphClass(), tenantId: $this->teamId, ); } } } protected function getBulkWriter(): BulkCustomFieldValueWriter { return $this->bulkWriter ??= new BulkCustomFieldValueWriter; } protected function flushCustomFieldValues(): int { return $this->getBulkWriter()->flush(); } protected function getOptionId(string $fieldCode, string $optionLabel): mixed { $field = $this->customFieldDefinitions[$fieldCode] ?? null; if (! $field || ! $field->options || $field->options->isEmpty()) { return null; } $option = $field->options->firstWhere('name', $optionLabel); if (! $option) { Log::warning("Option '{$optionLabel}' not found for field '{$fieldCode}'"); return null; } return $option->id; } /** @return array */ protected function getGlobalAttributes(): array { return [ 'creation_source' => CreationSource::SYSTEM, ]; } /** @return array> */ protected function loadEntityFixtures(): array { return FixtureLoader::load($this->entityType); } protected function evaluateTemplateExpression(string $template): mixed { if (! str_starts_with($template, '{{') || ! str_ends_with($template, '}}')) { return $template; } $expression = trim(substr($template, 2, -2)); if (preg_match('/^([+])(\d+)([dwmyb])$/', $expression, $matches)) { $value = (int) $matches[2]; $unit = $matches[3]; return match ($unit) { 'd' => now()->addDays($value), 'w' => now()->addWeeks($value), 'm' => now()->addMonths($value), 'y' => now()->addYears($value), 'b' => now()->addWeekdays($value), }; } return match ($expression) { 'now' => now(), 'today' => today(), 'tomorrow' => today()->addDay(), 'yesterday' => today()->subDay(), 'nextWeek' => today()->addWeek(), 'lastWeek' => today()->subWeek(), 'nextMonth' => today()->addMonth(), 'lastMonth' => today()->subMonth(), default => $template }; } /** * @param array $customFields * @param array $fieldMappings * @return array */ protected function processCustomFieldValues(array $customFields, array $fieldMappings = []): array { $processed = []; foreach ($customFields as $code => $value) { if (is_string($value) && str_starts_with($value, '{{') && str_ends_with($value, '}}')) { $value = $this->evaluateTemplateExpression($value); } if (isset($fieldMappings[$code])) { $processor = $fieldMappings[$code]; if ($processor === 'option' && is_string($value)) { $value = $this->getOptionId($code, $value); } elseif (is_callable($processor)) { $value = $processor($value); } } $processed[$code] = $value; } return $processed; } /** * @param array $attributes * @param array $customFields */ protected function registerEntityFromFixture(string $key, array $attributes, array $customFields, Team $team, Authenticatable $user): Model { $attributes = array_merge($attributes, [ 'team_id' => $team->id, 'creator_id' => $user->getAuthIdentifier(), ...$this->getGlobalAttributes(), ]); // SortableTrait's creating event is suppressed by withoutEvents(), // so we manually assign sequential order_column values. if (in_array(SortableTrait::class, class_uses_recursive($this->modelClass), true)) { $this->positionCounter++; $attributes['order_column'] = bcmul((string) $this->positionCounter, DecimalPosition::DEFAULT_GAP, DecimalPosition::SCALE); } $entity = resolve($this->modelClass)->create($attributes); $this->applyCustomFields($entity, $customFields); FixtureRegistry::register($this->entityType, $key, $entity); return $entity; } } ================================================ FILE: packages/OnboardSeed/src/Support/BulkCustomFieldValueWriter.php ================================================ > */ private array $pendingInserts = []; public function queue( CustomField $customField, mixed $value, string $entityId, string $entityType, string $tenantId, ): void { $valueColumn = CustomFieldValue::getValueColumn($customField->type); $safeValue = SafeValueConverter::toDbSafe($value, $customField->type); if (is_array($safeValue)) { $safeValue = json_encode($safeValue); } $this->pendingInserts[] = [ 'id' => Str::ulid()->toBase32(), 'custom_field_id' => $customField->getKey(), 'entity_id' => $entityId, 'entity_type' => $entityType, 'tenant_id' => $tenantId, $valueColumn => $safeValue, ]; } public function flush(): int { if ($this->pendingInserts === []) { return 0; } $nullDefaults = array_fill_keys([ 'id', 'custom_field_id', 'entity_id', 'entity_type', 'tenant_id', 'string_value', 'text_value', 'boolean_value', 'integer_value', 'float_value', 'date_value', 'datetime_value', 'json_value', ], null); $normalized = array_map( fn (array $row): array => array_merge($nullDefaults, $row), $this->pendingInserts, ); $count = count($normalized); $tableName = config('custom-fields.database.table_names.custom_field_values', 'custom_field_values'); foreach (array_chunk($normalized, 500) as $chunk) { DB::table($tableName)->insert($chunk); } $this->pendingInserts = []; return $count; } public function pending(): int { return count($this->pendingInserts); } } ================================================ FILE: packages/OnboardSeed/src/Support/FixtureLoader.php ================================================ > The loaded fixtures * * @throws FileNotFoundException */ public static function load(string $type): array { $path = self::getBasePath().'/'.$type; if (! File::isDirectory($path)) { return []; } $fixtures = []; $files = File::files($path); foreach ($files as $file) { if ($file->getExtension() !== 'yaml' && $file->getExtension() !== 'yml') { continue; } $key = $file->getFilenameWithoutExtension(); $content = Yaml::parse(File::get($file->getPathname())); $fixtures[$key] = $content; } return $fixtures; } } ================================================ FILE: packages/OnboardSeed/src/Support/FixtureRegistry.php ================================================ > */ private static array $registry = []; /** * Register an entity in the registry * * @param string $type The entity type (e.g., 'companies', 'people') * @param string $key The entity key * @param Model $entity The entity model */ public static function register(string $type, string $key, Model $entity): void { if (! isset(self::$registry[$type])) { self::$registry[$type] = []; } self::$registry[$type][$key] = $entity; } /** * Get an entity from the registry * * @param string $type The entity type * @param string $key The entity key * @return Model|null The entity or null if not found */ public static function get(string $type, string $key): ?Model { return self::$registry[$type][$key] ?? null; } public static function clear(): void { self::$registry = []; } } ================================================ FILE: packages/SystemAdmin/src/Enums/SystemAdministratorRole.php ================================================ 'Super Administrator', }; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Exports/CompanyExporter.php ================================================ label('ID'), ExportColumn::make('team.name'), ExportColumn::make('creator.name'), ExportColumn::make('accountOwner.name'), ExportColumn::make('name'), ExportColumn::make('created_at'), ExportColumn::make('updated_at'), ExportColumn::make('deleted_at'), ExportColumn::make('creation_source'), // Add all custom fields automatically ...CustomFields::exporter()->forModel(self::getModel())->columns(), ]; } public static function getCompletedNotificationBody(Export $export): string { $body = 'Your company export has completed and '.number_format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.'; if (($failedRowsCount = $export->getFailedRowsCount()) !== 0) { $body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.'; } return $body; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Pages/Dashboard.php ================================================ */ public function getWidgets(): array { return [ PlatformGrowthStatsWidget::class, SignupTrendChartWidget::class, RecordDistributionChartWidget::class, TopTeamsTableWidget::class, ]; } public function getColumns(): array { return [ 'default' => 1, 'lg' => 3, ]; } protected function getHeaderActions(): array { return [ FilterAction::make() ->schema([ Select::make('period') ->label('Time Period') ->options([ '7' => 'Last 7 days', '30' => 'Last 30 days', '90' => 'Last 90 days', '365' => 'Last 12 months', ]) ->default('30'), ]) ->slideOver(false), Action::make('view-site') ->label('View Website') ->url(config('app.url')) ->icon('heroicon-o-globe-alt') ->color('gray') ->openUrlInNewTab(), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Pages/EngagementDashboard.php ================================================ */ public function getWidgets(): array { return [ ActivationRateWidget::class, UserRetentionChartWidget::class, ]; } public function getColumns(): array { return [ 'default' => 1, 'lg' => 3, ]; } protected function getHeaderActions(): array { return [ FilterAction::make() ->schema([ Select::make('period') ->label('Time Period') ->options([ '7' => 'Last 7 days', '30' => 'Last 30 days', '90' => 'Last 90 days', '365' => 'Last 12 months', ]) ->default('30'), ]) ->slideOver(false), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/CompanyResource/Pages/CreateCompany.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ Select::make('team_id') ->relationship('team', 'name') ->searchable() ->required(), TextInput::make('name') ->required() ->maxLength(255), Select::make('account_owner_id') ->relationship('accountOwner', 'name') ->searchable(), Select::make('creation_source') ->options(CreationSource::class) ->default(CreationSource::WEB), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('team.name') ->label('Team') ->sortable() ->searchable(), TextColumn::make('creator.name') ->label('Created by') ->sortable() ->toggleable(), TextColumn::make('accountOwner.name') ->label('Account Owner') ->sortable() ->toggleable(), TextColumn::make('creation_source') ->badge() ->label('Source') ->toggleable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ TrashedFilter::make(), SelectFilter::make('team') ->relationship('team', 'name') ->searchable() ->preload(), SelectFilter::make('creation_source') ->label('Source') ->options(CreationSource::class) ->multiple(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } #[Override] public static function getRelations(): array { return []; } #[Override] public static function getPages(): array { return [ 'index' => ListCompanies::route('/'), 'create' => CreateCompany::route('/create'), 'view' => ViewCompany::route('/{record}'), 'edit' => EditCompany::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/ImportResource/Pages/ListImports.php ================================================ failedRows()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('id') ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('data') ->label('Row Data') ->formatStateUsing(fn (array $state): string => json_encode($state, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)) ->wrap() ->limit(100), TextColumn::make('validation_error') ->label('Validation Error') ->wrap(), TextColumn::make('created_at') ->dateTime() ->sortable(), ]); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/ImportResource.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function infolist(Schema $schema): Schema { return $schema ->components([ TextEntry::make('file_name') ->label('File Name'), TextEntry::make('entity_type') ->badge(), TextEntry::make('status') ->badge() ->color(self::statusColor(...)), TextEntry::make('team.name') ->label('Team'), TextEntry::make('user.name') ->label('User'), TextEntry::make('total_rows'), TextEntry::make('created_rows'), TextEntry::make('updated_rows'), TextEntry::make('skipped_rows'), TextEntry::make('failed_rows'), TextEntry::make('created_at') ->dateTime(), TextEntry::make('completed_at') ->dateTime(), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('file_name') ->searchable() ->sortable(), TextColumn::make('entity_type') ->badge() ->sortable(), TextColumn::make('status') ->badge() ->color(self::statusColor(...)) ->sortable(), TextColumn::make('team.name') ->label('Team') ->sortable() ->searchable(), TextColumn::make('user.name') ->label('User') ->sortable() ->searchable(), TextColumn::make('total_rows') ->numeric() ->toggleable(), TextColumn::make('created_rows') ->numeric() ->toggleable(), TextColumn::make('failed_rows') ->numeric() ->toggleable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('completed_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ SelectFilter::make('entity_type') ->options(ImportEntityType::class) ->multiple(), SelectFilter::make('status') ->options(ImportStatus::class) ->multiple(), SelectFilter::make('team') ->relationship('team', 'name') ->searchable() ->preload(), ]) ->recordActions([ ViewAction::make(), ]); } #[Override] public static function getRelations(): array { return [ FailedRowsRelationManager::class, ]; } #[Override] public static function getPages(): array { return [ 'index' => ListImports::route('/'), 'view' => ViewImport::route('/{record}'), ]; } private static function statusColor(ImportStatus $state): string { return match ($state) { ImportStatus::Completed => 'success', ImportStatus::Failed => 'danger', ImportStatus::Importing => 'warning', default => 'gray', }; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/NoteResource/Pages/CreateNote.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ Select::make('team_id') ->relationship('team', 'name') ->searchable() ->required(), TextInput::make('title') ->maxLength(255), Select::make('creation_source') ->options(CreationSource::class) ->default(CreationSource::WEB), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('title') ->searchable() ->sortable() ->limit(50), TextColumn::make('team.name') ->label('Team') ->sortable() ->searchable(), TextColumn::make('creator.name') ->label('Created by') ->sortable() ->toggleable(), TextColumn::make('creation_source') ->badge() ->label('Source') ->toggleable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ TrashedFilter::make(), SelectFilter::make('team') ->relationship('team', 'name') ->searchable() ->preload(), SelectFilter::make('creation_source') ->label('Source') ->options(CreationSource::class) ->multiple(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } #[Override] public static function getRelations(): array { return []; } #[Override] public static function getPages(): array { return [ 'index' => ListNotes::route('/'), 'create' => CreateNote::route('/create'), 'view' => ViewNote::route('/{record}'), 'edit' => EditNote::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/OpportunityResource/Pages/CreateOpportunity.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ Select::make('team_id') ->relationship('team', 'name') ->searchable() ->required(), TextInput::make('name') ->required() ->maxLength(255), Select::make('company_id') ->relationship('company', 'name') ->searchable(), Select::make('contact_id') ->relationship('contact', 'name') ->searchable(), Select::make('creation_source') ->options(CreationSource::class) ->default(CreationSource::WEB), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('company.name') ->label('Company') ->searchable() ->sortable(), TextColumn::make('contact.name') ->label('Contact') ->sortable(), TextColumn::make('team.name') ->label('Team') ->sortable() ->searchable(), TextColumn::make('creator.name') ->label('Created by') ->sortable() ->toggleable(), TextColumn::make('creation_source') ->badge() ->label('Source') ->toggleable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ TrashedFilter::make(), SelectFilter::make('team') ->relationship('team', 'name') ->searchable() ->preload(), SelectFilter::make('company') ->relationship('company', 'name') ->searchable() ->preload(), SelectFilter::make('creation_source') ->label('Source') ->options(CreationSource::class) ->multiple(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } #[Override] public static function getRelations(): array { return []; } #[Override] public static function getPages(): array { return [ 'index' => ListOpportunities::route('/'), 'create' => CreateOpportunity::route('/create'), 'view' => ViewOpportunity::route('/{record}'), 'edit' => EditOpportunity::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/PeopleResource/Pages/CreatePeople.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ Select::make('team_id') ->relationship('team', 'name') ->searchable() ->required(), TextInput::make('name') ->required() ->maxLength(255), Select::make('company_id') ->relationship('company', 'name') ->searchable(), Select::make('creation_source') ->options(CreationSource::class) ->default(CreationSource::WEB), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('company.name') ->label('Company') ->searchable() ->sortable(), TextColumn::make('team.name') ->label('Team') ->sortable() ->searchable(), TextColumn::make('creator.name') ->label('Created by') ->sortable() ->toggleable(), TextColumn::make('creation_source') ->badge() ->label('Source') ->toggleable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ TrashedFilter::make(), SelectFilter::make('team') ->relationship('team', 'name') ->searchable() ->preload(), SelectFilter::make('company') ->relationship('company', 'name') ->searchable() ->preload(), SelectFilter::make('creation_source') ->label('Source') ->options(CreationSource::class) ->multiple(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } #[Override] public static function getRelations(): array { return []; } #[Override] public static function getPages(): array { return [ 'index' => ListPeople::route('/'), 'create' => CreatePeople::route('/create'), 'view' => ViewPeople::route('/{record}'), 'edit' => EditPeople::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/SystemAdministrators/Pages/CreateSystemAdministrator.php ================================================ getCreateAction(), $this->getCancelAction(), ]; } private function getCancelAction(): Action { return Action::make('cancel') ->label('Cancel') ->url($this->getResource()::getUrl('index')) ->color('gray'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/SystemAdministrators/Pages/EditSystemAdministrator.php ================================================ components([ Section::make('Administrator Details') ->schema([ TextInput::make('name') ->required() ->maxLength(255), TextInput::make('email') ->label('Email address') ->email() ->required() ->maxLength(255) ->unique(ignoreRecord: true), Select::make('role') ->options( collect(SystemAdministratorRole::cases()) ->mapWithKeys(fn (SystemAdministratorRole $role): array => [ $role->value => $role->getLabel(), ]) ) ->default(SystemAdministratorRole::SuperAdministrator->value) ->required(), DateTimePicker::make('email_verified_at') ->label('Email Verified At') ->displayFormat('M j, Y \a\t g:i A') ->nullable(), TextInput::make('password') ->password() ->dehydrateStateUsing(fn (?string $state): ?string => in_array($state, [null, '', '0'], true) ? null : Hash::make($state)) ->dehydrated(filled(...)) ->required(fn (Get $get): bool => ! $get('id')) ->maxLength(255) ->confirmed() ->helperText(fn (Get $get): ?string => $get('id') ? 'Leave blank to keep current password' : null), TextInput::make('password_confirmation') ->password() ->dehydrated(false) ->required(fn (Get $get): bool => ! $get('id') && filled($get('password'))) ->maxLength(255), ]) ->columns(2), ]); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/SystemAdministrators/Schemas/SystemAdministratorInfolist.php ================================================ components([ TextEntry::make('name'), TextEntry::make('email') ->label('Email address'), TextEntry::make('email_verified_at') ->dateTime(), TextEntry::make('role'), TextEntry::make('created_at') ->dateTime(), TextEntry::make('updated_at') ->dateTime(), ]); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/SystemAdministrators/SystemAdministratorResource.php ================================================ ListSystemAdministrators::route('/'), 'create' => CreateSystemAdministrator::route('/create'), 'view' => ViewSystemAdministrator::route('/{record}'), 'edit' => EditSystemAdministrator::route('/{record}/edit'), ]; } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->withoutGlobalScopes(); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/SystemAdministrators/Tables/SystemAdministratorsTable.php ================================================ defaultSort('created_at', 'desc') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('email') ->label('Email address') ->searchable() ->sortable() ->copyable(), TextColumn::make('role') ->badge() ->formatStateUsing(fn (SystemAdministratorRole $state): string => $state->getLabel()) ->color(fn (SystemAdministratorRole $state): string => match ($state) { SystemAdministratorRole::SuperAdministrator => 'danger', }), IconColumn::make('email_verified_at') ->label('Verified') ->boolean() ->trueIcon('heroicon-o-check-badge') ->falseIcon('heroicon-o-x-mark'), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), ]) ->filters([ SelectFilter::make('role') ->options( collect(SystemAdministratorRole::cases()) ->mapWithKeys(fn (SystemAdministratorRole $role): array => [ $role->value => $role->getLabel(), ]) ), TernaryFilter::make('email_verified_at') ->label('Email Verified') ->nullable(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TaskResource/Pages/CreateTask.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ Select::make('team_id') ->relationship('team', 'name') ->searchable() ->required(), TextInput::make('title') ->required() ->maxLength(255), Select::make('creation_source') ->options(CreationSource::class) ->default(CreationSource::WEB), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('title') ->searchable() ->sortable(), TextColumn::make('team.name') ->label('Team') ->sortable() ->searchable(), TextColumn::make('creator.name') ->label('Created by') ->sortable() ->toggleable(), TextColumn::make('creation_source') ->badge() ->label('Source') ->toggleable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), TextColumn::make('deleted_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ TrashedFilter::make(), SelectFilter::make('team') ->relationship('team', 'name') ->searchable() ->preload(), SelectFilter::make('creation_source') ->label('Source') ->options(CreationSource::class) ->multiple(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } #[Override] public static function getRelations(): array { return []; } #[Override] public static function getPages(): array { return [ 'index' => ListTasks::route('/'), 'create' => CreateTask::route('/create'), 'view' => ViewTask::route('/{record}'), 'edit' => EditTask::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource/Pages/CreateTeam.php ================================================ companies()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('creator.name') ->label('Created by') ->sortable(), TextColumn::make('creation_source') ->badge() ->label('Source'), TextColumn::make('created_at') ->dateTime() ->sortable(), ]) ->defaultSort('created_at', 'desc'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource/RelationManagers/MembersRelationManager.php ================================================ users()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('email') ->searchable() ->sortable(), TextColumn::make('membership.created_at') ->label('Joined') ->dateTime() ->sortable(), ]) ->defaultSort('name'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource/RelationManagers/NotesRelationManager.php ================================================ notes()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('title') ->columns([ TextColumn::make('title') ->searchable() ->sortable() ->limit(50), TextColumn::make('creator.name') ->label('Created by') ->sortable(), TextColumn::make('creation_source') ->badge() ->label('Source'), TextColumn::make('created_at') ->dateTime() ->sortable(), ]) ->defaultSort('created_at', 'desc'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource/RelationManagers/OpportunitiesRelationManager.php ================================================ opportunities()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('company.name') ->label('Company') ->searchable() ->sortable(), TextColumn::make('contact.name') ->label('Contact') ->sortable(), TextColumn::make('creator.name') ->label('Created by') ->sortable(), TextColumn::make('creation_source') ->badge() ->label('Source'), TextColumn::make('created_at') ->dateTime() ->sortable(), ]) ->defaultSort('created_at', 'desc'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource/RelationManagers/PeopleRelationManager.php ================================================ people()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('company.name') ->label('Company') ->searchable() ->sortable(), TextColumn::make('creator.name') ->label('Created by') ->sortable(), TextColumn::make('creation_source') ->badge() ->label('Source'), TextColumn::make('created_at') ->dateTime() ->sortable(), ]) ->defaultSort('created_at', 'desc'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource/RelationManagers/TasksRelationManager.php ================================================ tasks()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('title') ->columns([ TextColumn::make('title') ->searchable() ->sortable(), TextColumn::make('creator.name') ->label('Created by') ->sortable(), TextColumn::make('creation_source') ->badge() ->label('Source'), TextColumn::make('created_at') ->dateTime() ->sortable(), ]) ->defaultSort('created_at', 'desc'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/TeamResource.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ Select::make('user_id') ->relationship('owner', 'name') ->label('Owner') ->searchable() ->required(), TextInput::make('name') ->required() ->maxLength(255), TextInput::make('slug') ->required() ->rules([fn (?Team $record): ValidTeamSlug => new ValidTeamSlug(ignoreValue: $record?->slug)]) ->unique(ignoreRecord: true) ->maxLength(255), Toggle::make('personal_team') ->required(), ]); } #[Override] public static function infolist(Schema $schema): Schema { return $schema ->components([ Section::make([ TextEntry::make('name'), TextEntry::make('slug'), TextEntry::make('owner.name') ->label('Owner'), IconEntry::make('personal_team') ->label('Personal') ->boolean(), TextEntry::make('created_at') ->dateTime(), TextEntry::make('updated_at') ->dateTime(), ])->columnSpanFull()->columns(), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('slug') ->searchable() ->sortable() ->toggleable(), TextColumn::make('owner.name') ->label('Owner') ->searchable() ->sortable(), IconColumn::make('personal_team') ->label('Personal') ->boolean(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), ]) ->filters([ TernaryFilter::make('personal_team') ->label('Personal Team'), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } #[Override] public static function getRelations(): array { return [ MembersRelationManager::class, CompaniesRelationManager::class, PeopleRelationManager::class, TasksRelationManager::class, OpportunitiesRelationManager::class, NotesRelationManager::class, ]; } #[Override] public static function getPages(): array { return [ 'index' => ListTeams::route('/'), 'create' => CreateTeam::route('/create'), 'view' => ViewTeam::route('/{record}'), 'edit' => EditTeam::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/UserResource/Pages/CreateUser.php ================================================ ownedTeams()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->searchable() ->sortable() ->url(fn (Team $record): string => TeamResource::getUrl('view', ['record' => $record])), IconColumn::make('personal_team') ->label('Personal') ->boolean(), TextColumn::make('created_at') ->dateTime() ->sortable(), ]) ->defaultSort('name'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/UserResource/RelationManagers/TeamsRelationManager.php ================================================ teams()->count(); return $count > 0 ? (string) $count : null; } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name') ->searchable() ->sortable() ->url(fn (Team $record): string => TeamResource::getUrl('view', ['record' => $record])), TextColumn::make('membership.role') ->label('Role') ->badge() ->sortable(), TextColumn::make('membership.created_at') ->label('Joined') ->dateTime() ->sortable(), ]) ->defaultSort('name'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Resources/UserResource.php ================================================ count(); return $count > 0 ? (string) $count : null; } #[Override] public static function form(Schema $schema): Schema { return $schema ->components([ TextInput::make('name') ->required() ->maxLength(255), TextInput::make('email') ->email() ->required() ->maxLength(255) ->unique(ignoreRecord: true), DateTimePicker::make('email_verified_at'), TextInput::make('password') ->password() ->maxLength(255) ->dehydrated(filled(...)) ->required(fn (string $operation): bool => $operation === 'create'), Select::make('current_team_id') ->searchable() ->relationship('currentTeam', 'name'), ]); } #[Override] public static function infolist(Schema $schema): Schema { return $schema ->components([ Section::make([ TextEntry::make('name'), TextEntry::make('email'), IconEntry::make('email_verified_at') ->label('Verified') ->boolean(), TextEntry::make('currentTeam.name') ->label('Current Team'), TextEntry::make('created_at') ->dateTime(), TextEntry::make('updated_at') ->dateTime(), ])->columnSpanFull()->columns(), ]); } #[Override] public static function table(Table $table): Table { return $table ->defaultSort('created_at', 'desc') ->columns([ TextColumn::make('name') ->searchable() ->sortable(), TextColumn::make('email') ->searchable() ->sortable() ->copyable(), IconColumn::make('email_verified_at') ->label('Verified') ->boolean() ->trueIcon('heroicon-o-check-badge') ->falseIcon('heroicon-o-x-mark'), TextColumn::make('currentTeam.name') ->label('Current Team') ->sortable(), TextColumn::make('created_at') ->dateTime() ->sortable(), TextColumn::make('updated_at') ->dateTime() ->sortable(), ]) ->filters([ TernaryFilter::make('email_verified_at') ->label('Email Verified') ->nullable(), ]) ->recordActions([ ViewAction::make(), EditAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), ]), ]); } /** * @return Builder */ public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with(['currentTeam', 'ownedTeams']); } #[Override] public static function getRelations(): array { return [ OwnedTeamsRelationManager::class, TeamsRelationManager::class, ]; } #[Override] public static function getPages(): array { return [ 'index' => ListUsers::route('/'), 'create' => CreateUser::route('/create'), 'view' => ViewUser::route('/{record}'), 'edit' => EditUser::route('/{record}/edit'), ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/ActivationRateWidget.php ================================================ getPeriodDates(); $currentSignups = $this->countSignups($currentStart, $currentEnd); $previousSignups = $this->countSignups($previousStart, $previousEnd); $currentActivated = $this->countActivatedUsers($currentStart, $currentEnd); $previousActivated = $this->countActivatedUsers($previousStart, $previousEnd); $currentRate = $currentSignups > 0 ? round($currentActivated / $currentSignups * 100, 1) : 0.0; $previousRate = $previousSignups > 0 ? round($previousActivated / $previousSignups * 100, 1) : 0.0; return [ $this->buildCountStat('Sign-ups', 'this period', $currentSignups, $previousSignups, $this->buildSignupsSparkline($currentStart, $currentEnd)), $this->buildCountStat('Activated Users', 'created a record', $currentActivated, $previousActivated, $this->buildActivatedSparkline($currentStart, $currentEnd)), $this->buildActivationRateStat($currentRate, $previousRate), ]; } private function countSignups(CarbonImmutable $start, CarbonImmutable $end): int { return User::query() ->whereBetween('created_at', [$start, $end]) ->count(); } private function countActivatedUsers(CarbonImmutable $start, CarbonImmutable $end): int { $activeCreatorIds = $this->getActiveCreatorIds($start, $end); if ($activeCreatorIds->isEmpty()) { return 0; } return User::query() ->whereIn('id', $activeCreatorIds) ->whereBetween('created_at', [$start, $end]) ->count(); } /** @param array|null $chart */ private function buildCountStat( string $label, string $description, int $current, int $previous, ?array $chart = null, ): Stat { $change = $this->calculateChange($current, $previous); $stat = Stat::make($label, number_format($current)) ->description("{$description}{$this->formatChange($change)}") ->descriptionIcon($change >= 0 ? 'heroicon-o-arrow-trending-up' : 'heroicon-o-arrow-trending-down') ->color($change >= 0 ? 'success' : 'danger'); if ($chart !== null) { $stat->chart($chart); } return $stat; } private function buildActivationRateStat(float $currentRate, float $previousRate): Stat { $rateChange = round($currentRate - $previousRate, 1); $changeText = $rateChange !== 0.0 ? ' ('.($rateChange > 0 ? '+' : '')."{$rateChange}pp)" : ''; return Stat::make('Activation Rate', "{$currentRate}%") ->description("vs {$previousRate}% previous{$changeText}") ->descriptionIcon($rateChange >= 0 ? 'heroicon-o-arrow-trending-up' : 'heroicon-o-arrow-trending-down') ->color($rateChange >= 0 ? 'success' : 'danger'); } /** * @return array */ private function buildSignupsSparkline(CarbonImmutable $start, CarbonImmutable $end): array { $days = (int) $start->diffInDays($end); $points = min($days, 7); if ($points <= 0) { return [0]; } $segmentSeconds = ($days / $points) * 86400; $bucketExpr = $this->bucketExpression(); $rows = User::query() ->selectRaw("{$bucketExpr} AS bucket, COUNT(*) AS cnt", [ $start->toDateTimeString(), $segmentSeconds, ]) ->whereBetween('created_at', [$start, $end]) ->groupByRaw('1') ->orderByRaw('1') ->get(); return $this->fillBuckets($rows, $points); } /** * @return array */ private function buildActivatedSparkline(CarbonImmutable $start, CarbonImmutable $end): array { $days = (int) $start->diffInDays($end); $points = min($days, 7); if ($points <= 0) { return [0]; } $segmentSeconds = ($days / $points) * 86400; $unionParts = []; $bindings = []; foreach (self::ENTITY_TABLES as $table) { $unionParts[] = "SELECT DISTINCT \"creator_id\", \"created_at\" FROM \"{$table}\" WHERE \"creator_id\" IS NOT NULL AND \"creation_source\" != ? AND \"created_at\" BETWEEN ? AND ? AND \"deleted_at\" IS NULL"; $bindings[] = CreationSource::SYSTEM->value; $bindings[] = $start->toDateTimeString(); $bindings[] = $end->toDateTimeString(); } $unionSql = implode(' UNION ', $unionParts); $bucketExpr = $this->bucketExpression(); $sql = "SELECT {$bucketExpr} AS bucket, COUNT(DISTINCT creator_id) AS cnt FROM ({$unionSql}) AS all_creators GROUP BY 1 ORDER BY 1"; $rows = DB::select($sql, [$start->toDateTimeString(), $segmentSeconds, ...$bindings]); return $this->fillBuckets(collect($rows), $points); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/Concerns/HasPeriodComparison.php ================================================ pageFilters['period'] ?? 30); $currentEnd = CarbonImmutable::now(); $currentStart = $currentEnd->subDays($days); $previousEnd = $currentStart->subSecond(); $previousStart = $currentStart->subDays($days); return [$currentStart, $currentEnd, $previousStart, $previousEnd]; } private function calculateChange(int $current, int $previous): float { if ($previous === 0) { return $current > 0 ? 100.0 : 0.0; } return round((($current - $previous) / $previous) * 100, 1); } private function formatChange(float $change): string { if ($change === 0.0) { return ''; } $sign = $change > 0 ? '+' : ''; return " ({$sign}{$change}%)"; } /** * PostgreSQL expression that assigns rows to time-based buckets. * * Expects two bindings: the period start timestamp and the segment duration in seconds. */ private function bucketExpression(): string { return 'FLOOR(EXTRACT(EPOCH FROM ("created_at" - ?::timestamp)) / ?)'; } /** * @return array */ private function fillBuckets(Collection $rows, int $points): array { $buckets = array_fill(0, $points, 0); foreach ($rows as $row) { $idx = min((int) $row->bucket, $points - 1); if ($idx >= 0) { $buckets[$idx] += (int) $row->cnt; } } return $buckets; } /** * @return Collection */ private function getActiveCreatorIds(CarbonImmutable $start, CarbonImmutable $end): Collection { $unionParts = []; $bindings = []; foreach (self::ENTITY_TABLES as $table) { $unionParts[] = "SELECT DISTINCT \"creator_id\" FROM \"{$table}\" WHERE \"creator_id\" IS NOT NULL AND \"creation_source\" != ? AND \"created_at\" BETWEEN ? AND ? AND \"deleted_at\" IS NULL"; $bindings[] = CreationSource::SYSTEM->value; $bindings[] = $start->toDateTimeString(); $bindings[] = $end->toDateTimeString(); } $sql = 'SELECT DISTINCT creator_id FROM ('.implode(' UNION ', $unionParts).') AS all_creators'; return collect(DB::select($sql, $bindings))->pluck('creator_id'); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/PlatformGrowthStatsWidget.php ================================================ */ private const array ENTITY_CLASSES = [Company::class, People::class, Task::class, Note::class, Opportunity::class]; protected function getStats(): array { [$currentStart, $currentEnd, $previousStart, $previousEnd] = $this->getPeriodDates(); return [ $this->buildUsersStat($currentStart, $currentEnd, $previousStart, $previousEnd), $this->buildTeamsStat($currentStart, $currentEnd, $previousStart, $previousEnd), $this->buildRecordsStat($currentStart, $currentEnd, $previousStart, $previousEnd), $this->buildActiveUsersStat($currentStart, $currentEnd, $previousStart, $previousEnd), ]; } private function buildUsersStat( CarbonImmutable $currentStart, CarbonImmutable $currentEnd, CarbonImmutable $previousStart, CarbonImmutable $previousEnd, ): Stat { $total = User::query()->count(); $newCurrent = User::query()->whereBetween('created_at', [$currentStart, $currentEnd])->count(); $newPrevious = User::query()->whereBetween('created_at', [$previousStart, $previousEnd])->count(); $change = $this->calculateChange($newCurrent, $newPrevious); return Stat::make('Total Users', number_format($total)) ->description("{$newCurrent} new this period".$this->formatChange($change)) ->descriptionIcon($change >= 0 ? 'heroicon-o-arrow-trending-up' : 'heroicon-o-arrow-trending-down') ->color($change >= 0 ? 'success' : 'danger') ->chart($this->buildModelSparkline(User::class, $currentStart, $currentEnd)); } private function buildTeamsStat( CarbonImmutable $currentStart, CarbonImmutable $currentEnd, CarbonImmutable $previousStart, CarbonImmutable $previousEnd, ): Stat { $nonPersonalScope = fn (Builder $query): Builder => $query->where('personal_team', false); $total = Team::query()->where('personal_team', false)->count(); $newCurrent = Team::query()->where('personal_team', false)->whereBetween('created_at', [$currentStart, $currentEnd])->count(); $newPrevious = Team::query()->where('personal_team', false)->whereBetween('created_at', [$previousStart, $previousEnd])->count(); $change = $this->calculateChange($newCurrent, $newPrevious); return Stat::make('Total Teams', number_format($total)) ->description("{$newCurrent} new this period".$this->formatChange($change)) ->descriptionIcon($change >= 0 ? 'heroicon-o-arrow-trending-up' : 'heroicon-o-arrow-trending-down') ->color($change >= 0 ? 'success' : 'danger') ->chart($this->buildModelSparkline(Team::class, $currentStart, $currentEnd, $nonPersonalScope)); } private function buildRecordsStat( CarbonImmutable $currentStart, CarbonImmutable $currentEnd, CarbonImmutable $previousStart, CarbonImmutable $previousEnd, ): Stat { $currentRecords = $this->countRecordsInPeriod($currentStart, $currentEnd); $previousRecords = $this->countRecordsInPeriod($previousStart, $previousEnd); $change = $this->calculateChange($currentRecords, $previousRecords); return Stat::make('New Records', number_format($currentRecords)) ->description("{$currentRecords} this period".$this->formatChange($change)) ->descriptionIcon($change >= 0 ? 'heroicon-o-arrow-trending-up' : 'heroicon-o-arrow-trending-down') ->color($change >= 0 ? 'success' : 'danger') ->chart($this->buildRecordsSparkline($currentStart, $currentEnd)); } private function buildActiveUsersStat( CarbonImmutable $currentStart, CarbonImmutable $currentEnd, CarbonImmutable $previousStart, CarbonImmutable $previousEnd, ): Stat { $currentActive = $this->countActiveUsers($currentStart, $currentEnd); $previousActive = $this->countActiveUsers($previousStart, $previousEnd); $change = $this->calculateChange($currentActive, $previousActive); return Stat::make('Active Users', number_format($currentActive)) ->description('sessions in this period'.$this->formatChange($change)) ->descriptionIcon($change >= 0 ? 'heroicon-o-arrow-trending-up' : 'heroicon-o-arrow-trending-down') ->color($change >= 0 ? 'success' : 'danger'); } private function countRecordsInPeriod(CarbonImmutable $start, CarbonImmutable $end): int { $unionParts = []; $bindings = []; foreach (self::ENTITY_CLASSES as $class) { $table = (new $class)->getTable(); $unionParts[] = "SELECT COUNT(*) as cnt FROM \"{$table}\" WHERE \"creation_source\" != ? AND \"created_at\" BETWEEN ? AND ? AND \"deleted_at\" IS NULL"; $bindings[] = CreationSource::SYSTEM->value; $bindings[] = $start->toDateTimeString(); $bindings[] = $end->toDateTimeString(); } $sql = implode(' UNION ALL ', $unionParts); $result = DB::selectOne("SELECT SUM(cnt) as total FROM ({$sql}) as counts", $bindings); return (int) ($result->total ?? 0); } private function countActiveUsers(CarbonImmutable $start, CarbonImmutable $end): int { return DB::table('sessions') ->whereNotNull('user_id') ->whereBetween('last_activity', [$start->timestamp, $end->timestamp]) ->distinct('user_id') ->count('user_id'); } /** * @return array */ private function buildModelSparkline(string $modelClass, CarbonImmutable $start, CarbonImmutable $end, ?\Closure $scope = null): array { $days = (int) $start->diffInDays($end); $points = min($days, 7); if ($points <= 0) { return [0]; } $segmentSeconds = ($days / $points) * 86400; $bucketExpr = $this->bucketExpression(); $query = $modelClass::query() ->selectRaw("{$bucketExpr} AS bucket, COUNT(*) AS cnt", [ $start->toDateTimeString(), $segmentSeconds, ]) ->whereBetween('created_at', [$start, $end]) ->groupByRaw('1') ->orderByRaw('1'); if ($scope instanceof \Closure) { $scope($query); } return $this->fillBuckets($query->get(), $points); } /** * @return array */ private function buildRecordsSparkline(CarbonImmutable $start, CarbonImmutable $end): array { $days = (int) $start->diffInDays($end); $points = min($days, 7); if ($points <= 0) { return [0]; } $segmentSeconds = ($days / $points) * 86400; $unionParts = []; $bindings = []; foreach (self::ENTITY_CLASSES as $class) { $table = (new $class)->getTable(); $unionParts[] = "SELECT \"created_at\" FROM \"{$table}\" WHERE \"creation_source\" != ? AND \"created_at\" BETWEEN ? AND ? AND \"deleted_at\" IS NULL"; $bindings[] = CreationSource::SYSTEM->value; $bindings[] = $start->toDateTimeString(); $bindings[] = $end->toDateTimeString(); } $unionSql = implode(' UNION ALL ', $unionParts); $bucketExpr = $this->bucketExpression(); $sql = "SELECT {$bucketExpr} AS bucket, COUNT(*) AS cnt FROM ({$unionSql}) AS all_records GROUP BY 1 ORDER BY 1"; $rows = DB::select($sql, [$start->toDateTimeString(), $segmentSeconds, ...$bindings]); return $this->fillBuckets(collect($rows), $points); } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/RecordDistributionChartWidget.php ================================================ */ public function getColumnSpan(): array { return [ 'default' => 'full', 'lg' => 1, ]; } public function getHeading(): string { return 'Records by Type'; } public function getDescription(): string { return 'Distribution of new records in this period.'; } protected function getType(): string { return 'doughnut'; } protected function getData(): array { $days = (int) ($this->pageFilters['period'] ?? 30); $end = CarbonImmutable::now(); $start = $end->subDays($days); $entities = [ 'Companies' => Company::class, 'People' => People::class, 'Tasks' => Task::class, 'Notes' => Note::class, 'Opportunities' => Opportunity::class, ]; $counts = []; $labels = []; foreach ($entities as $label => $class) { $count = $class::query() ->where('creation_source', '!=', CreationSource::SYSTEM) ->whereBetween('created_at', [$start, $end]) ->count(); $labels[] = $label; $counts[] = $count; } return [ 'datasets' => [ [ 'data' => $counts, 'backgroundColor' => [ '#6366f1', '#8b5cf6', '#10b981', '#f59e0b', '#3b82f6', ], 'borderWidth' => 0, ], ], 'labels' => $labels, ]; } protected function getOptions(): array { return [ 'plugins' => [ 'legend' => [ 'position' => 'bottom', ], ], ]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/SignupTrendChartWidget.php ================================================ */ public function getColumnSpan(): array { return [ 'default' => 'full', 'lg' => 2, ]; } public function getHeading(): string { return 'Signup Trends'; } public function getDescription(): string { return 'New users and teams over time.'; } protected function getType(): string { return 'line'; } protected function getData(): array { $days = (int) ($this->pageFilters['period'] ?? 30); $end = CarbonImmutable::now(); $start = $end->subDays($days); $intervals = $this->buildIntervals($start, $end, $days); $labels = $intervals->pluck('label')->toArray(); $groupFormat = $this->getGroupFormat($days); $userCountsByBucket = $this->getCountsByBucket(User::query(), $start, $end, $groupFormat); $teamCountsByBucket = $this->getCountsByBucket( Team::query()->where('personal_team', false), $start, $end, $groupFormat, ); $userCounts = $intervals->map( fn (array $interval): int => $userCountsByBucket->get($interval['bucket'], 0) )->all(); $teamCounts = $intervals->map( fn (array $interval): int => $teamCountsByBucket->get($interval['bucket'], 0) )->all(); return [ 'datasets' => [ [ 'label' => 'New Users', 'data' => $userCounts, 'borderColor' => '#6366f1', 'backgroundColor' => 'rgba(99, 102, 241, 0.1)', 'borderWidth' => 2, 'fill' => true, 'tension' => 0.3, 'pointRadius' => 3, ], [ 'label' => 'New Teams', 'data' => $teamCounts, 'borderColor' => '#10b981', 'backgroundColor' => 'rgba(16, 185, 129, 0.1)', 'borderWidth' => 2, 'fill' => true, 'tension' => 0.3, 'pointRadius' => 3, ], ], 'labels' => $labels, ]; } /** * @return Collection */ private function getCountsByBucket( Builder $query, CarbonImmutable $start, CarbonImmutable $end, string $groupFormat, ): Collection { $bucketExpression = "to_char(created_at, '{$groupFormat}')"; return $query ->selectRaw("{$bucketExpression} as bucket, COUNT(*) as cnt") ->whereBetween('created_at', [$start->toDateTimeString(), $end->toDateTimeString()]) ->groupByRaw($bucketExpression) ->pluck('cnt', 'bucket') ->map(fn (mixed $value): int => (int) $value); } private function getGroupFormat(int $days): string { if ($days <= 30) { return 'YYYY-MM-DD'; } if ($days <= 90) { return 'IYYY-IW'; } return 'YYYY-MM'; } /** * @return Collection */ private function buildIntervals(CarbonImmutable $start, CarbonImmutable $end, int $days): Collection { if ($days <= 30) { return $this->buildDailyIntervals($start, $days); } if ($days <= 90) { return $this->buildWeeklyIntervals($start, $end); } return $this->buildMonthlyIntervals($start, $end); } /** * @return Collection */ private function buildDailyIntervals(CarbonImmutable $start, int $days): Collection { return collect(range(0, $days - 1))->map(function (int $i) use ($start): array { $day = $start->addDays($i); return [ 'label' => $day->format('M j'), 'start' => $day->startOfDay(), 'end' => $day->endOfDay(), 'bucket' => $day->format('Y-m-d'), ]; }); } /** * @return Collection */ private function buildWeeklyIntervals(CarbonImmutable $start, CarbonImmutable $end): Collection { $intervals = collect(); $current = $start->startOfWeek(); while ($current->lt($end)) { $weekEnd = $current->endOfWeek()->min($end); $intervals->push([ 'label' => $current->format('M j'), 'start' => $current, 'end' => $weekEnd, 'bucket' => $current->format('o-W'), ]); $current = $current->addWeek(); } return $intervals; } /** * @return Collection */ private function buildMonthlyIntervals(CarbonImmutable $start, CarbonImmutable $end): Collection { $intervals = collect(); $current = $start->startOfMonth(); while ($current->lt($end)) { $monthEnd = $current->endOfMonth()->min($end); $intervals->push([ 'label' => $current->format('M Y'), 'start' => $current, 'end' => $monthEnd, 'bucket' => $current->format('Y-m'), ]); $current = $current->addMonth(); } return $intervals; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/TopTeamsTableWidget.php ================================================ */ private const array ENTITY_TABLES = ['companies', 'people', 'tasks', 'notes', 'opportunities']; public function table(Table $table): Table { return $table ->query(fn (): Builder => $this->buildQuery()) ->columns([ TextColumn::make('name') ->label('Team') ->searchable() ->sortable() ->weight('semibold') ->url(fn (Team $record): string => TeamResource::getUrl('view', ['record' => $record])), TextColumn::make('owner.name') ->label('Owner') ->sortable() ->url(fn (Team $record): string => UserResource::getUrl('view', ['record' => $record->owner])), TextColumn::make('members_count') ->label('Members') ->numeric() ->sortable() ->alignCenter() ->badge() ->color('gray'), TextColumn::make('records_count') ->label('Records') ->numeric() ->sortable(query: fn (Builder $query, string $direction): Builder => $query->orderBy('records_count', $direction)) ->alignCenter() ->badge() ->color('info'), TextColumn::make('custom_fields_count') ->label('Custom Fields') ->numeric() ->sortable() ->alignCenter() ->badge() ->color('warning'), TextColumn::make('last_activity') ->label('Last Activity') ->since() ->sortable(), TextColumn::make('created_at') ->label('Created') ->date('M j, Y') ->sortable(), ]) ->defaultSort('records_count', 'desc') ->paginated([10, 25]) ->defaultPaginationPageOption(10) ->striped() ->emptyStateHeading('No Active Teams') ->emptyStateDescription('Team activity will appear here once teams start creating records.') ->emptyStateIcon('heroicon-o-user-group'); } /** * @return array{string, string} */ private function getDateRange(): array { return once(function (): array { $days = (int) ($this->pageFilters['period'] ?? 30); $end = CarbonImmutable::now(); $start = $end->subDays($days); return [$start->toDateTimeString(), $end->toDateTimeString()]; }); } /** * @return array{string, array} */ private function getRecordsCountExpression(): array { return once(function (): array { [$startStr, $endStr] = $this->getDateRange(); return $this->buildRecordsCountExpression(CreationSource::SYSTEM->value, $startStr, $endStr); }); } private function buildQuery(): Builder { [$recordsCountSql, $recordsBindings] = $this->getRecordsCountExpression(); [$lastActivitySql, $lastActivityBindings] = $this->buildLastActivityExpression(CreationSource::SYSTEM->value); [$startStr, $endStr] = $this->getDateRange(); $systemSource = CreationSource::SYSTEM->value; return Team::query() ->select(['teams.*']) ->selectRaw("({$recordsCountSql}) as records_count", $recordsBindings) ->selectRaw('(SELECT COUNT(*) FROM team_user WHERE team_user.team_id = teams.id) as members_count') ->selectRaw('(SELECT COUNT(*) FROM custom_fields WHERE custom_fields.tenant_id = teams.id) as custom_fields_count') ->selectRaw("{$lastActivitySql} as last_activity", $lastActivityBindings) ->where(function (Builder $query) use ($startStr, $endStr, $systemSource): void { foreach (self::ENTITY_TABLES as $table) { $query->orWhereExists(function (QueryBuilder $sub) use ($table, $startStr, $endStr, $systemSource): void { $sub->selectRaw('1') ->from($table) ->whereColumn("{$table}.team_id", 'teams.id') ->whereNull("{$table}.deleted_at") ->where("{$table}.creation_source", '!=', $systemSource) ->whereBetween("{$table}.created_at", [$startStr, $endStr]); }); } }); } /** * @return array{string, array} */ private function buildRecordsCountExpression(string $systemSource, string $startStr, string $endStr): array { $subqueries = collect(self::ENTITY_TABLES)->map( fn (string $table): string => "(SELECT COUNT(*) FROM {$table} WHERE {$table}.team_id = teams.id AND {$table}.deleted_at IS NULL AND {$table}.creation_source != ? AND {$table}.created_at BETWEEN ? AND ?)" ); $bindings = collect(self::ENTITY_TABLES) ->flatMap(fn (): array => [$systemSource, $startStr, $endStr]) ->all(); return [$subqueries->implode(' + '), $bindings]; } /** * @return array{string, array} */ private function buildLastActivityExpression(string $systemSource): array { $coalesces = collect(self::ENTITY_TABLES)->map( fn (string $table): string => "COALESCE((SELECT MAX(created_at) FROM {$table} WHERE {$table}.team_id = teams.id AND {$table}.deleted_at IS NULL AND {$table}.creation_source != ?), TIMESTAMP '1970-01-01')" ); $bindings = array_fill(0, count(self::ENTITY_TABLES), $systemSource); return ["GREATEST({$coalesces->implode(', ')})", $bindings]; } } ================================================ FILE: packages/SystemAdmin/src/Filament/Widgets/UserRetentionChartWidget.php ================================================ pageFilters['period'] ?? 30); $end = CarbonImmutable::now(); $start = $end->subDays($days); $intervals = $this->buildWeeklyIntervals($start, $end); $newActive = []; $returning = []; $labels = []; foreach ($intervals as $interval) { $labels[] = $interval['label']; $activeCreatorIds = $this->getActiveCreatorIds($interval['start'], $interval['end']); if ($activeCreatorIds->isEmpty()) { $newActive[] = 0; $returning[] = 0; continue; } $counts = DB::table('users') ->selectRaw('COUNT(*) FILTER (WHERE created_at >= ? AND created_at <= ?) AS new_count', [$interval['start'], $interval['end']]) ->selectRaw('COUNT(*) FILTER (WHERE created_at < ?) AS returning_count', [$interval['start']]) ->whereIn('id', $activeCreatorIds) ->first(); $newActive[] = (int) $counts->new_count; $returning[] = (int) $counts->returning_count; } return [ 'datasets' => [ [ 'label' => 'New Active', 'data' => $newActive, 'backgroundColor' => 'rgba(99, 102, 241, 0.8)', 'borderColor' => '#6366f1', 'borderWidth' => 1, ], [ 'label' => 'Returning', 'data' => $returning, 'backgroundColor' => 'rgba(16, 185, 129, 0.8)', 'borderColor' => '#10b981', 'borderWidth' => 1, ], ], 'labels' => $labels, ]; } protected function getOptions(): array { return [ 'scales' => [ 'x' => ['stacked' => true], 'y' => ['stacked' => true], ], 'plugins' => [ 'legend' => ['position' => 'bottom'], ], ]; } /** * @return Collection */ private function buildWeeklyIntervals(CarbonImmutable $start, CarbonImmutable $end): Collection { $intervals = collect(); $current = $start->startOfWeek(); while ($current->lt($end)) { $weekEnd = $current->endOfWeek()->min($end); $intervals->push([ 'label' => $current->format('M j'), 'start' => $current, 'end' => $weekEnd, ]); $current = $current->addWeek(); } return $intervals; } } ================================================ FILE: packages/SystemAdmin/src/Models/SystemAdministrator.php ================================================ */ use HasFactory; use HasUlids; use Notifiable; protected $table = 'system_administrators'; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'name', 'email', 'password', 'role', ]; /** * The attributes that should be hidden for serialization. * * @var list */ protected $hidden = [ 'password', 'remember_token', ]; /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', 'role' => SystemAdministratorRole::class, ]; } /** * @throws Exception */ public function canAccessPanel(Panel $panel): bool { return $panel->getId() === 'sysadmin' && $this->hasVerifiedEmail(); } public function getFilamentAvatarUrl(): ?string { return null; } /** * Create a new factory instance for the model. */ protected static function newFactory(): SystemAdministratorFactory { return SystemAdministratorFactory::new(); } } ================================================ FILE: packages/SystemAdmin/src/Policies/CompanyPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/FailedImportRowPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/OpportunityPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function reorder(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/PeoplePolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/SystemAdministratorPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator ? Response::allow() : Response::deny('Only Super Administrators can create new system administrators.'); } public function update(SystemAdministrator $admin, SystemAdministrator $systemAdmin): Response { if ($admin->role === SystemAdministratorRole::SuperAdministrator) { return Response::allow(); } if ($admin->id === $systemAdmin->id) { return Response::allow(); } return Response::deny('You can only edit your own account.'); } public function delete(SystemAdministrator $admin, SystemAdministrator $systemAdmin): Response { if ($admin->id === $systemAdmin->id) { return Response::deny('You cannot delete your own account.'); } if ($admin->role === SystemAdministratorRole::SuperAdministrator) { return Response::allow(); } return Response::deny('Only Super Administrators can delete system administrators.'); } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin, SystemAdministrator $systemAdmin): Response { if ($admin->id === $systemAdmin->id) { return Response::deny('You cannot permanently delete your own account.'); } return $admin->role === SystemAdministratorRole::SuperAdministrator ? Response::allow() : Response::deny('Only Super Administrators can permanently delete system administrators.'); } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/TaskPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function reorder(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/TeamPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/Policies/UserPolicy.php ================================================ role === SystemAdministratorRole::SuperAdministrator; } public function update(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function delete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function deleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restore(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDelete(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function forceDeleteAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } public function restoreAny(SystemAdministrator $admin): bool { return $admin->role === SystemAdministratorRole::SuperAdministrator; } } ================================================ FILE: packages/SystemAdmin/src/SystemAdminPanelProvider.php ================================================ id('sysadmin'); // Configure domain or path based on environment if ($domain = config('app.sysadmin_domain')) { $panel->domain($domain); } else { $panel->path(config('app.sysadmin_path', 'sysadmin')); } return $panel ->login() ->emailVerification() ->authGuard('sysadmin') ->authPasswordBroker('system_administrators') ->strictAuthorization() ->spa() ->colors([ 'primary' => Color::Indigo, ]) ->brandName('Relaticle System Admin') ->discoverResources(in: base_path('packages/SystemAdmin/src/Filament/Resources'), for: 'Relaticle\\SystemAdmin\\Filament\\Resources') ->discoverPages(in: base_path('packages/SystemAdmin/src/Filament/Pages'), for: 'Relaticle\\SystemAdmin\\Filament\\Pages') ->discoverWidgets(in: base_path('packages/SystemAdmin/src/Filament/Widgets'), for: 'Relaticle\\SystemAdmin\\Filament\\Widgets') ->navigationGroups([ NavigationGroup::make() ->label('Dashboards'), NavigationGroup::make() ->label('User Management'), NavigationGroup::make() ->label('CRM'), NavigationGroup::make() ->label('Task Management'), NavigationGroup::make() ->label('Content'), ]) ->globalSearch() ->darkMode() ->maxContentWidth('full') ->sidebarCollapsibleOnDesktop() ->pages([ Dashboard::class, ]) ->widgets([]) ->plugins([]) ->databaseNotifications() ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) ->authMiddleware([ Authenticate::class, ]) ->viteTheme('resources/css/filament/admin/theme.css'); } } ================================================ FILE: phpstan.neon ================================================ includes: - vendor/larastan/larastan/extension.neon parameters: level: 7 ignoreErrors: # Custom field model type covariance - App\Models\CustomField* extends Relaticle\CustomFields\Models\CustomField* # Runtime model swapping is configured in AppServiceProvider but PHPStan doesn't know about it - identifier: argument.type message: '#(Closure\(App\\Models\\CustomField|Relaticle\\CustomFields\\Models\\CustomField)(Option|Value|Section)?#' # Base ValidateSignature has untyped variadic ...$args that PHPStan infers as array|null - identifier: argument.type path: app/Http/Middleware/ValidateSignature.php stubFiles: - stubs/Mailcoach.stub paths: - app - packages - config - bootstrap - database/factories - routes excludePaths: - packages/SystemAdmin configDirectories: - config - packages/ImportWizard/config - packages/Documentation/config ================================================ FILE: phpunit.ci.xml ================================================ tests/Arch tests/Smoke tests/Feature tests/Browser app packages config routes app/Http/Middleware app/Providers/AppServiceProvider.php ================================================ FILE: phpunit.xml ================================================ tests/Arch tests/Smoke tests/Feature tests/Browser app packages config routes app/Http/Middleware app/Providers/AppServiceProvider.php ================================================ FILE: pint.json ================================================ { "preset": "laravel", "notPath": [ "app/Models/PersonalAccessToken.php" ], "rules": { "declare_strict_types": true, "final_class": true, "final_internal_class": true, "strict_comparison": true } } ================================================ FILE: public/.htaccess ================================================ Options -MultiViews -Indexes RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] ================================================ FILE: public/css/asmit/resized-column/resized-column.css ================================================ /* Resized Column Styles */ .column-resize-handle-bar { position: absolute; top: 50%; height: 66.666667%; transform: translateY(-50%); width: 1rem; cursor: col-resize; user-select: none; touch-action: none; right: -0.5rem; z-index: 10; display: flex; justify-content: center; } .column-resize-handle-bar::before { content: ""; position: absolute; top: 0; bottom: 0; width: 1px; background-color: rgb(209 213 219); transform: translateX(1px); transition-property: all; transition-duration: 300ms; } .dark .column-resize-handle-bar::before { background-color: rgba(255, 255, 255, 0.05); } .column-resize-handle-bar:hover::before, .column-resize-handle-bar.active::before { width: 2px; background-color: rgb(var(--primary-500)); } /* Active resize handle */ .column-resize-handle-bar.active::before { width: 4px !important; } /* Table header cell styles */ .fi-ta-header-cell { position: relative; } ================================================ FILE: public/css/filament/filament/app.css ================================================ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-tracking:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-ease:initial;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-content:"";--tw-outline-style:solid;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-mono:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-sky-400:oklch(74.6% .16 232.661);--color-gray-100:var(--gray-100);--color-gray-200:var(--gray-200);--color-gray-300:var(--gray-300);--color-gray-400:var(--gray-400);--color-gray-500:var(--gray-500);--color-gray-600:var(--gray-600);--color-gray-700:var(--gray-700);--color-gray-900:var(--gray-900);--color-gray-950:var(--gray-950);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--leading-loose:2;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--default-mono-font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-primary-400:var(--primary-400)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}:root.dark{color-scheme:dark}[data-field-wrapper]{scroll-margin-top:8rem}}@layer components{.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{color:#fff;white-space:normal;background-color:#333;border-radius:4px;outline:0;font-size:14px;line-height:1.4;transition-property:transform,visibility,opacity;position:relative}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-width:8px 8px 0;border-top-color:initial;transform-origin:top;bottom:-7px;left:0}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-width:0 8px 8px;border-bottom-color:initial;transform-origin:bottom;top:-7px;left:0}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;transform-origin:0;right:-7px}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:100%;left:-7px}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;width:16px;height:16px}.tippy-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.tippy-content{z-index:1;padding:5px 9px;position:relative}.tippy-box[data-theme~=light]{color:#26323d;background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fi-avatar{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8);border-radius:var(--radius-md);object-fit:cover;object-position:center}.fi-avatar.fi-circular{border-radius:3.40282e38px}.fi-avatar.fi-size-sm{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.fi-avatar.fi-size-lg{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.fi-badge{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*1);border-radius:var(--radius-md);background-color:var(--gray-50);min-width:1.5rem;padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.fi-badge{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.fi-badge{--tw-ring-inset:inset}.fi-badge:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.fi-badge:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.fi-badge:not(.fi-wrapped){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-badge.fi-disabled:not(.fi-force-enabled),.fi-badge[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-badge.fi-disabled:not(.fi-force-enabled),.fi-badge[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-badge .fi-badge-label-ctn{display:grid}.fi-badge .fi-badge-label.fi-wrapped{text-wrap:wrap;word-break:break-word}.fi-badge .fi-badge-label:not(.fi-wrapped){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-badge .fi-icon{flex-shrink:0}.fi-badge.fi-size-xs{min-width:1rem;padding-inline:calc(var(--spacing)*.5);padding-block:calc(var(--spacing)*0);--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.fi-badge.fi-size-sm{min-width:1.25rem;padding-inline:calc(var(--spacing)*1.5);padding-block:calc(var(--spacing)*.5);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.fi-badge.fi-color{background-color:var(--color-50);color:var(--text);--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)10%,transparent)}}.fi-badge.fi-color:where(.dark,.dark *){background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-badge.fi-color:where(.dark,.dark *){color:var(--dark-text);--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon{color:var(--color-700)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon{color:color-mix(in oklab,var(--color-700)50%,transparent)}}.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:var(--color-300)}@supports (color:color-mix(in lab, red, red)){.fi-badge.fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:color-mix(in oklab,var(--color-300)50%,transparent)}}.fi-badge:not(.fi-color) .fi-icon{color:var(--gray-400)}.fi-badge:not(.fi-color) .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-badge .fi-icon.fi-color{color:var(--color-500)}.fi-badge .fi-badge-delete-btn{margin-block:calc(var(--spacing)*-1);padding:calc(var(--spacing)*1);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;justify-content:center;align-items:center;margin-inline-start:calc(var(--spacing)*-1);margin-inline-end:calc(var(--spacing)*-2);transition-duration:75ms;display:flex}.fi-badge .fi-badge-delete-btn>.fi-icon{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-badge .fi-badge-delete-btn>.fi-icon{color:color-mix(in oklab,var(--gray-700)50%,transparent)}}.fi-badge .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-badge .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)50%,transparent)}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:focus-visible{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:focus-visible{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}@media (hover:hover){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:color-mix(in oklab,var(--gray-300)75%,transparent)}}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:color-mix(in oklab,var(--gray-300)75%,transparent)}}@media (hover:hover){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:hover{color:var(--color-700)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:hover{color:color-mix(in oklab,var(--color-700)75%,transparent)}}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:focus-visible{color:var(--color-700)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:focus-visible{color:color-mix(in oklab,var(--color-700)75%,transparent)}}@media (hover:hover){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:var(--color-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:color-mix(in oklab,var(--color-300)75%,transparent)}}}:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:var(--color-300)}@supports (color:color-mix(in lab, red, red)){:is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:color-mix(in oklab,var(--color-300)75%,transparent)}}.fi-breadcrumbs ol{align-items:center;column-gap:calc(var(--spacing)*2);flex-wrap:wrap;display:flex}.fi-breadcrumbs ol li{align-items:center;column-gap:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);display:flex}.fi-breadcrumbs ol li:where(.dark,.dark *){color:var(--gray-400)}.fi-breadcrumbs ol li a{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-breadcrumbs ol li a:hover{color:var(--gray-700)}.fi-breadcrumbs ol li a:where(.dark,.dark *):hover{color:var(--gray-200)}}.fi-breadcrumbs ol li .fi-icon{color:var(--gray-400);display:flex}.fi-breadcrumbs ol li .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-breadcrumbs ol li .fi-icon.fi-ltr:where(:dir(rtl),[dir=rtl],[dir=rtl] *),.fi-breadcrumbs ol li .fi-icon.fi-rtl:where(:dir(ltr),[dir=ltr],[dir=ltr] *){display:none}.fi-btn{justify-content:center;align-items:center;gap:calc(var(--spacing)*1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;grid-auto-flow:column;transition-duration:75ms;display:inline-grid;position:relative}:is(.fi-btn.fi-force-enabled,.fi-btn:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn.fi-disabled:not(.fi-force-enabled),.fi-btn[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-btn.fi-disabled:not(.fi-force-enabled),.fi-btn[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-btn>.fi-icon{color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-btn.fi-size-xs{gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-btn.fi-size-sm{gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-btn.fi-size-lg{gap:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3.5);padding-block:calc(var(--spacing)*2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-btn.fi-size-xl{gap:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-btn.fi-outlined{color:var(--gray-950);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-300)}.fi-btn.fi-outlined:where(.dark,.dark *){color:var(--color-white);--tw-ring-color:var(--gray-700)}@media (hover:hover){:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):hover{background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}}:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--gray-400)40%,transparent)}}.fi-btn.fi-outlined.fi-color{color:var(--text);--tw-ring-color:var(--color-600)}.fi-btn.fi-outlined.fi-color:where(.dark,.dark *){color:var(--dark-text);--tw-ring-color:var(--color-500)}@media (hover:hover){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):hover{background-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):hover{background-color:color-mix(in oklab,var(--color-500)10%,transparent)}}}:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-500)40%,transparent)}}@media (hover:hover){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-600)10%,transparent)}}}:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-400)40%,transparent)}}.fi-btn.fi-outlined.fi-color>.fi-icon{color:var(--color-600)}.fi-btn.fi-outlined.fi-color>.fi-icon:where(.dark,.dark *){color:var(--color-400)}.fi-btn:not(.fi-outlined){background-color:var(--color-white);color:var(--gray-950)}.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-btn:not(.fi-outlined):where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){:is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-50)}:is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}}input:checked+label.fi-btn:not(.fi-outlined){background-color:var(--gray-400);color:var(--color-white);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:checked+label.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:var(--gray-600)}@media (hover:hover){:is(input:checked+label.fi-btn:not(.fi-outlined).fi-force-enabled,input:checked+label.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-300)}:is(input:checked+label.fi-btn:not(.fi-outlined).fi-force-enabled,input:checked+label.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--gray-500)}}.fi-btn:not(.fi-outlined).fi-color:not(label){background-color:var(--bg);color:var(--text)}.fi-btn:not(.fi-outlined).fi-color:not(label):where(.dark,.dark *){background-color:var(--dark-bg);color:var(--dark-text)}@media (hover:hover){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):hover{background-color:var(--hover-bg);color:var(--hover-text)}}:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-500)50%,transparent)}}@media (hover:hover){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--dark-hover-bg);color:var(--dark-hover-text)}}:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-400)50%,transparent)}}.fi-btn:not(.fi-outlined).fi-color:not(label)>.fi-icon{color:var(--text)}.fi-btn:not(.fi-outlined).fi-color:not(label)>.fi-icon:where(.dark,.dark *){color:var(--dark-text)}input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color){background-color:var(--bg);color:var(--text);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color):where(.dark,.dark *){background-color:var(--dark-bg);color:var(--dark-text)}@media (hover:hover){input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):hover{background-color:var(--hover-bg);color:var(--hover-text)}input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--dark-hover-bg);color:var(--dark-hover-text)}}input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){z-index:10;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:color-mix(in oklab,var(--color-500)50%,transparent)}}input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)50%,transparent)}}label.fi-btn{cursor:pointer}label.fi-btn>.fi-icon:is(:checked+label>.fi-icon){color:var(--text)}label.fi-btn>.fi-icon:is(:checked+label>.fi-icon):where(.dark,.dark *){color:var(--dark-text)}.fi-btn:not(.fi-color),label.fi-btn{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-btn:not(.fi-color),label.fi-btn{--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}:is(.fi-btn:not(.fi-color),label.fi-btn):where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){:is(.fi-btn:not(.fi-color),label.fi-btn):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-btn.fi-labeled-from-sm,.fi-btn.fi-labeled-from-md,.fi-btn.fi-labeled-from-lg,.fi-btn.fi-labeled-from-xl,.fi-btn.fi-labeled-from-2xl{display:none}@media (min-width:40rem){.fi-btn.fi-labeled-from-sm{display:inline-grid}}@media (min-width:48rem){.fi-btn.fi-labeled-from-md{display:inline-grid}}@media (min-width:64rem){.fi-btn.fi-labeled-from-lg{display:inline-grid}}@media (min-width:80rem){.fi-btn.fi-labeled-from-xl{display:inline-grid}}@media (min-width:96rem){.fi-btn.fi-labeled-from-2xl{display:inline-grid}}.fi-btn .fi-btn-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*0);z-index:1;--tw-translate-x:calc(calc(1/2*100%)*-1);--tw-translate-y:calc(calc(1/2*100%)*-1);width:max-content;translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-md);background-color:var(--color-white);display:flex;position:absolute}.fi-btn .fi-btn-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-btn .fi-btn-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.fi-btn-group{border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);grid-auto-flow:column;display:grid}.fi-btn-group:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-btn-group:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-btn-group>.fi-btn{border-radius:0;flex:1}.fi-btn-group>.fi-btn:nth-child(1 of .fi-btn){border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.fi-btn-group>.fi-btn:nth-last-child(1 of .fi-btn){border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)){--tw-shadow:-1px 0 0 0 var(--tw-shadow-color,var(--color-gray-200));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-shadow:1px 0 0 0 var(--tw-shadow-color,var(--color-gray-200));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)):where(.dark,.dark *){--tw-shadow:-1px 0 0 0 var(--tw-shadow-color,#fff3);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)):where(:dir(rtl),[dir=rtl],[dir=rtl] *):where(.dark,.dark *){--tw-shadow:1px 0 0 0 var(--tw-shadow-color,#fff3);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(:nth-last-child(1 of .fi-btn)){margin-inline-end:1px}.fi-btn-group>.fi-btn.fi-processing:enabled{cursor:wait;opacity:.7}.fi-btn-group>.fi-btn:not(.fi-outlined){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-btn-group>.fi-btn:not(.fi-color),label:is(.fi-btn-group>.fi-btn){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-callout{gap:calc(var(--spacing)*3);border-radius:var(--radius-xl);background-color:var(--color-white);width:100%;padding:calc(var(--spacing)*4);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950);display:flex}@supports (color:color-mix(in lab, red, red)){.fi-callout{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-callout:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-callout:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-callout .fi-callout-icon{color:var(--gray-400)}.fi-callout .fi-callout-icon.fi-color{color:var(--color-400)}.fi-callout .fi-callout-main{margin-top:calc(var(--spacing)*.5);gap:calc(var(--spacing)*3);flex:1;display:grid}.fi-callout .fi-callout-text{gap:calc(var(--spacing)*1);display:grid}.fi-callout .fi-callout-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-callout .fi-callout-heading:where(.dark,.dark *){color:var(--color-white)}.fi-callout .fi-callout-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-wrap:pretty;overflow-wrap:break-word;color:var(--gray-500);overflow:hidden}.fi-callout .fi-callout-description:where(.dark,.dark *){color:var(--gray-400)}.fi-callout .fi-callout-description>p:not(:first-of-type){margin-top:calc(var(--spacing)*1)}.fi-callout .fi-callout-footer{gap:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}.fi-callout .fi-callout-controls{align-self:flex-start}.fi-callout.fi-color{--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)20%,transparent)}}.fi-callout.fi-color:where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.fi-callout.fi-color{background-color:#fff}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color{background-color:color-mix(in oklab,white 90%,var(--color-400))}}.fi-callout.fi-color:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)90%,var(--color-400))}}.fi-callout.fi-color .fi-callout-description{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color .fi-callout-description{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}.fi-callout.fi-color .fi-callout-description:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-callout.fi-color .fi-callout-description:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)75%,transparent)}}.fi-dropdown-header{gap:calc(var(--spacing)*2);width:100%;padding:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);display:flex}.fi-dropdown-header .fi-icon{color:var(--gray-400)}.fi-dropdown-header .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-dropdown-header span{text-overflow:ellipsis;white-space:nowrap;text-align:start;color:var(--gray-700);flex:1;overflow:hidden}.fi-dropdown-header span:where(.dark,.dark *){color:var(--gray-200)}.fi-dropdown-header.fi-color .fi-icon{color:var(--color-500)}.fi-dropdown-header.fi-color .fi-icon:where(.dark,.dark *){color:var(--color-400)}.fi-dropdown-header.fi-color span{color:var(--text)}.fi-dropdown-header.fi-color span:where(.dark,.dark *){color:var(--dark-text)}:scope .fi-dropdown-trigger{cursor:pointer;display:flex}:scope .fi-dropdown-panel{z-index:20;border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100vw;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;max-width:14rem!important}:scope .fi-dropdown-panel:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:scope .fi-dropdown-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:where(:scope .fi-dropdown-panel:not(.fi-dropdown-list)>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100)}:where(:scope .fi-dropdown-panel:not(.fi-dropdown-list):where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(:scope .fi-dropdown-panel:not(.fi-dropdown-list):where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:scope .fi-dropdown-panel.fi-opacity-0{opacity:0}:scope .fi-dropdown-panel.fi-width-xs{max-width:var(--container-xs)!important}:scope .fi-dropdown-panel.fi-width-sm{max-width:var(--container-sm)!important}:scope .fi-dropdown-panel.fi-width-md{max-width:var(--container-md)!important}:scope .fi-dropdown-panel.fi-width-lg{max-width:var(--container-lg)!important}:scope .fi-dropdown-panel.fi-width-xl{max-width:var(--container-xl)!important}:scope .fi-dropdown-panel.fi-width-2xl{max-width:var(--container-2xl)!important}:scope .fi-dropdown-panel.fi-width-3xl{max-width:var(--container-3xl)!important}:scope .fi-dropdown-panel.fi-width-4xl{max-width:var(--container-4xl)!important}:scope .fi-dropdown-panel.fi-width-5xl{max-width:var(--container-5xl)!important}:scope .fi-dropdown-panel.fi-width-6xl{max-width:var(--container-6xl)!important}:scope .fi-dropdown-panel.fi-width-7xl{max-width:var(--container-7xl)!important}:scope .fi-dropdown-panel.fi-scrollable{overflow-y:auto}.fi-dropdown-list{padding:calc(var(--spacing)*1);gap:1px;display:grid}.fi-dropdown-list>.fi-grid{overflow-x:hidden}.fi-dropdown-list-item{align-items:center;gap:calc(var(--spacing)*2);border-radius:var(--radius-md);width:100%;padding:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;-webkit-user-select:none;user-select:none;outline-style:none;transition-duration:75ms;display:flex;overflow:hidden}@media (hover:hover){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):hover{background-color:var(--gray-50)}}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected{background-color:var(--gray-50)}.fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-dropdown-list-item.fi-disabled,.fi-dropdown-list-item[disabled]{cursor:default;opacity:.7}:is(.fi-dropdown-list-item.fi-disabled,.fi-dropdown-list-item[disabled]):not([x-tooltip]){pointer-events:none}.fi-dropdown-list-item .fi-icon{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-dropdown-list-item .fi-dropdown-list-item-image{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);background-position:50%;background-size:cover;border-radius:3.40282e38px}.fi-dropdown-list-item>.fi-icon{color:var(--gray-400)}.fi-dropdown-list-item>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-dropdown-list-item>.fi-icon.fi-color{color:var(--color-500)}.fi-dropdown-list-item>.fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}@media (hover:hover){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):hover{background-color:var(--color-50)}}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):focus-visible{background-color:var(--color-50)}@media (hover:hover){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected{background-color:var(--color-50)}.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label{color:var(--text)}@media (hover:hover){.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:hover{color:var(--hover-text)}}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:where(.dark,.dark *){color:var(--dark-text)}@media (hover:hover){.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:where(.dark,.dark *):hover{color:var(--dark-hover-text)}}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label.fi-selected{color:var(--hover-text)}.fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label.fi-selected:where(.dark,.dark *){color:var(--dark-hover-text)}.fi-dropdown-list-item .fi-badge{min-width:1.25rem;padding-inline:calc(var(--spacing)*1.5);padding-block:calc(var(--spacing)*.5);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.fi-dropdown-list-item-label{text-overflow:ellipsis;white-space:nowrap;text-align:start;color:var(--gray-700);flex:1;overflow:hidden}.fi-dropdown-list-item-label:where(.dark,.dark *){color:var(--gray-200)}.fi-dropdown-list-item-badge-placeholder{color:var(--gray-400);align-items:center;display:flex}.fi-dropdown-list-item-badge-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-empty-state{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*12)}.fi-empty-state:not(.fi-empty-state-not-contained){border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-empty-state:not(.fi-empty-state-not-contained):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-empty-state:not(.fi-empty-state-not-contained):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-empty-state .fi-empty-state-content{max-width:var(--container-lg);text-align:center;justify-items:center;margin-inline:auto;display:grid}.fi-empty-state .fi-empty-state-text-ctn{text-align:center;justify-items:center;display:grid}.fi-empty-state .fi-empty-state-icon-bg{margin-bottom:calc(var(--spacing)*4);background-color:var(--gray-100);padding:calc(var(--spacing)*3);border-radius:3.40282e38px}.fi-empty-state .fi-empty-state-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab, red, red)){.fi-empty-state .fi-empty-state-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.fi-empty-state .fi-empty-state-icon-bg.fi-color{background-color:var(--color-100)}.fi-empty-state .fi-empty-state-icon-bg.fi-color:where(.dark,.dark *){background-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){.fi-empty-state .fi-empty-state-icon-bg.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-500)20%,transparent)}}.fi-empty-state .fi-empty-state-icon-bg .fi-icon{color:var(--gray-500)}.fi-empty-state .fi-empty-state-icon-bg .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-empty-state .fi-empty-state-icon-bg .fi-icon.fi-color{color:var(--color-500)}.fi-empty-state .fi-empty-state-icon-bg .fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.fi-empty-state .fi-empty-state-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-empty-state .fi-empty-state-heading:where(.dark,.dark *){color:var(--color-white)}.fi-empty-state .fi-empty-state-description{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-empty-state .fi-empty-state-description:where(.dark,.dark *){color:var(--gray-400)}.fi-empty-state .fi-empty-state-footer{margin-top:calc(var(--spacing)*6)}.fi-empty-state.fi-compact{padding-block:calc(var(--spacing)*6)}.fi-empty-state.fi-compact .fi-empty-state-content{margin-inline:calc(var(--spacing)*0);align-items:flex-start;gap:calc(var(--spacing)*4);text-align:start;max-width:none;display:flex}.fi-empty-state.fi-compact .fi-empty-state-icon-bg{margin-bottom:calc(var(--spacing)*0);flex-shrink:0}.fi-empty-state.fi-compact .fi-empty-state-text-ctn{text-align:start;flex:1;justify-items:start}.fi-empty-state.fi-compact .fi-empty-state-description{margin-top:calc(var(--spacing)*1)}.fi-empty-state.fi-compact .fi-empty-state-footer{margin-top:calc(var(--spacing)*4)}.fi-fieldset>legend{padding-inline:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);margin-inline-start:calc(var(--spacing)*-2)}.fi-fieldset>legend:where(.dark,.dark *){color:var(--color-white)}.fi-fieldset>legend .fi-fieldset-label-required-mark{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-600)}.fi-fieldset>legend .fi-fieldset-label-required-mark:where(.dark,.dark *){color:var(--danger-400)}.fi-fieldset.fi-fieldset-label-hidden>legend{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.fi-fieldset:not(.fi-fieldset-not-contained){border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);padding:calc(var(--spacing)*6)}.fi-fieldset:not(.fi-fieldset-not-contained):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fieldset:not(.fi-fieldset-not-contained):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fieldset.fi-fieldset-not-contained{padding-top:calc(var(--spacing)*6)}.fi-grid:not(.fi-grid-direction-col){grid-template-columns:var(--cols-default);display:grid}@media (min-width:40rem){.fi-grid:not(.fi-grid-direction-col).sm\:fi-grid-cols{grid-template-columns:var(--cols-sm)}}@media (min-width:48rem){.fi-grid:not(.fi-grid-direction-col).md\:fi-grid-cols{grid-template-columns:var(--cols-md)}}@media (min-width:64rem){.fi-grid:not(.fi-grid-direction-col).lg\:fi-grid-cols{grid-template-columns:var(--cols-lg)}}@media (min-width:80rem){.fi-grid:not(.fi-grid-direction-col).xl\:fi-grid-cols{grid-template-columns:var(--cols-xl)}}@media (min-width:96rem){.fi-grid:not(.fi-grid-direction-col).\32 xl\:fi-grid-cols{grid-template-columns:var(--cols-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid:not(.fi-grid-direction-col).\@3xs\:fi-grid-cols{grid-template-columns:var(--cols-c3xs)}}@container (min-width:18rem){.fi-grid:not(.fi-grid-direction-col).\@2xs\:fi-grid-cols{grid-template-columns:var(--cols-c2xs)}}@container (min-width:20rem){.fi-grid:not(.fi-grid-direction-col).\@xs\:fi-grid-cols{grid-template-columns:var(--cols-cxs)}}@container (min-width:24rem){.fi-grid:not(.fi-grid-direction-col).\@sm\:fi-grid-cols{grid-template-columns:var(--cols-csm)}}@container (min-width:28rem){.fi-grid:not(.fi-grid-direction-col).\@md\:fi-grid-cols{grid-template-columns:var(--cols-cmd)}}@container (min-width:32rem){.fi-grid:not(.fi-grid-direction-col).\@lg\:fi-grid-cols{grid-template-columns:var(--cols-clg)}}@container (min-width:36rem){.fi-grid:not(.fi-grid-direction-col).\@xl\:fi-grid-cols{grid-template-columns:var(--cols-cxl)}}@container (min-width:42rem){.fi-grid:not(.fi-grid-direction-col).\@2xl\:fi-grid-cols{grid-template-columns:var(--cols-c2xl)}}@container (min-width:48rem){.fi-grid:not(.fi-grid-direction-col).\@3xl\:fi-grid-cols{grid-template-columns:var(--cols-c3xl)}}@container (min-width:56rem){.fi-grid:not(.fi-grid-direction-col).\@4xl\:fi-grid-cols{grid-template-columns:var(--cols-c4xl)}}@container (min-width:64rem){.fi-grid:not(.fi-grid-direction-col).\@5xl\:fi-grid-cols{grid-template-columns:var(--cols-c5xl)}}@container (min-width:72rem){.fi-grid:not(.fi-grid-direction-col).\@6xl\:fi-grid-cols{grid-template-columns:var(--cols-c6xl)}}@container (min-width:80rem){.fi-grid:not(.fi-grid-direction-col).\@7xl\:fi-grid-cols{grid-template-columns:var(--cols-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid:not(.fi-grid-direction-col).\!\@sm\:fi-grid-cols{grid-template-columns:var(--cols-ncsm)}}@media (min-width:48rem){.fi-grid:not(.fi-grid-direction-col).\!\@md\:fi-grid-cols{grid-template-columns:var(--cols-ncmd)}}@media (min-width:64rem){.fi-grid:not(.fi-grid-direction-col).\!\@lg\:fi-grid-cols{grid-template-columns:var(--cols-nclg)}}@media (min-width:80rem){.fi-grid:not(.fi-grid-direction-col).\!\@xl\:fi-grid-cols{grid-template-columns:var(--cols-ncxl)}}@media (min-width:96rem){.fi-grid:not(.fi-grid-direction-col).\!\@2xl\:fi-grid-cols{grid-template-columns:var(--cols-nc2xl)}}}.fi-grid.fi-grid-direction-col{columns:var(--cols-default)}@media (min-width:40rem){.fi-grid.fi-grid-direction-col.sm\:fi-grid-cols{columns:var(--cols-sm)}}@media (min-width:48rem){.fi-grid.fi-grid-direction-col.md\:fi-grid-cols{columns:var(--cols-md)}}@media (min-width:64rem){.fi-grid.fi-grid-direction-col.lg\:fi-grid-cols{columns:var(--cols-lg)}}@media (min-width:80rem){.fi-grid.fi-grid-direction-col.xl\:fi-grid-cols{columns:var(--cols-xl)}}@media (min-width:96rem){.fi-grid.fi-grid-direction-col.\32 xl\:fi-grid-cols{columns:var(--cols-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid.fi-grid-direction-col.\@3xs\:fi-grid-cols{columns:var(--cols-c3xs)}}@container (min-width:18rem){.fi-grid.fi-grid-direction-col.\@2xs\:fi-grid-cols{columns:var(--cols-c2xs)}}@container (min-width:20rem){.fi-grid.fi-grid-direction-col.\@xs\:fi-grid-cols{columns:var(--cols-cxs)}}@container (min-width:24rem){.fi-grid.fi-grid-direction-col.\@sm\:fi-grid-cols{columns:var(--cols-csm)}}@container (min-width:28rem){.fi-grid.fi-grid-direction-col.\@md\:fi-grid-cols{columns:var(--cols-cmd)}}@container (min-width:32rem){.fi-grid.fi-grid-direction-col.\@lg\:fi-grid-cols{columns:var(--cols-clg)}}@container (min-width:36rem){.fi-grid.fi-grid-direction-col.\@xl\:fi-grid-cols{columns:var(--cols-cxl)}}@container (min-width:42rem){.fi-grid.fi-grid-direction-col.\@2xl\:fi-grid-cols{columns:var(--cols-c2xl)}}@container (min-width:48rem){.fi-grid.fi-grid-direction-col.\@3xl\:fi-grid-cols{columns:var(--cols-c3xl)}}@container (min-width:56rem){.fi-grid.fi-grid-direction-col.\@4xl\:fi-grid-cols{columns:var(--cols-c4xl)}}@container (min-width:64rem){.fi-grid.fi-grid-direction-col.\@5xl\:fi-grid-cols{columns:var(--cols-c5xl)}}@container (min-width:72rem){.fi-grid.fi-grid-direction-col.\@6xl\:fi-grid-cols{columns:var(--cols-c6xl)}}@container (min-width:80rem){.fi-grid.fi-grid-direction-col.\@7xl\:fi-grid-cols{columns:var(--cols-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid.fi-grid-direction-col.\!\@sm\:fi-grid-cols{columns:var(--cols-ncsm)}}@media (min-width:48rem){.fi-grid.fi-grid-direction-col.\!\@md\:fi-grid-cols{columns:var(--cols-ncmd)}}@media (min-width:64rem){.fi-grid.fi-grid-direction-col.\!\@lg\:fi-grid-cols{columns:var(--cols-nclg)}}@media (min-width:80rem){.fi-grid.fi-grid-direction-col.\!\@xl\:fi-grid-cols{columns:var(--cols-ncxl)}}@media (min-width:96rem){.fi-grid.fi-grid-direction-col.\!\@2xl\:fi-grid-cols{columns:var(--cols-nc2xl)}}}@supports (container-type:inline-size){.fi-grid-ctn{container-type:inline-size}}.fi-grid-col{grid-column:var(--col-span-default)}@media (min-width:40rem){.fi-grid-col.sm\:fi-grid-col-span{grid-column:var(--col-span-sm)}}@media (min-width:48rem){.fi-grid-col.md\:fi-grid-col-span{grid-column:var(--col-span-md)}}@media (min-width:64rem){.fi-grid-col.lg\:fi-grid-col-span{grid-column:var(--col-span-lg)}}@media (min-width:80rem){.fi-grid-col.xl\:fi-grid-col-span{grid-column:var(--col-span-xl)}}@media (min-width:96rem){.fi-grid-col.\32 xl\:fi-grid-col-span{grid-column:var(--col-span-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid-col.\@3xs\:fi-grid-col-span{grid-column:var(--col-span-c3xs)}}@container (min-width:18rem){.fi-grid-col.\@2xs\:fi-grid-col-span{grid-column:var(--col-span-c2xs)}}@container (min-width:20rem){.fi-grid-col.\@xs\:fi-grid-col-span{grid-column:var(--col-span-cxs)}}@container (min-width:24rem){.fi-grid-col.\@sm\:fi-grid-col-span{grid-column:var(--col-span-csm)}}@container (min-width:28rem){.fi-grid-col.\@md\:fi-grid-col-span{grid-column:var(--col-span-cmd)}}@container (min-width:32rem){.fi-grid-col.\@lg\:fi-grid-col-span{grid-column:var(--col-span-clg)}}@container (min-width:36rem){.fi-grid-col.\@xl\:fi-grid-col-span{grid-column:var(--col-span-cxl)}}@container (min-width:42rem){.fi-grid-col.\@2xl\:fi-grid-col-span{grid-column:var(--col-span-c2xl)}}@container (min-width:48rem){.fi-grid-col.\@3xl\:fi-grid-col-span{grid-column:var(--col-span-c3xl)}}@container (min-width:56rem){.fi-grid-col.\@4xl\:fi-grid-col-span{grid-column:var(--col-span-c4xl)}}@container (min-width:64rem){.fi-grid-col.\@5xl\:fi-grid-col-span{grid-column:var(--col-span-c5xl)}}@container (min-width:72rem){.fi-grid-col.\@6xl\:fi-grid-col-span{grid-column:var(--col-span-c6xl)}}@container (min-width:80rem){.fi-grid-col.\@7xl\:fi-grid-col-span{grid-column:var(--col-span-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid-col.\!\@sm\:fi-grid-col-span{grid-column:var(--col-span-ncsm)}}@media (min-width:48rem){.fi-grid-col.\!\@md\:fi-grid-col-span{grid-column:var(--col-span-ncmd)}}@media (min-width:64rem){.fi-grid-col.\!\@lg\:fi-grid-col-span{grid-column:var(--col-span-nclg)}}@media (min-width:80rem){.fi-grid-col.\!\@xl\:fi-grid-col-span{grid-column:var(--col-span-ncxl)}}@media (min-width:96rem){.fi-grid-col.\!\@2xl\:fi-grid-col-span{grid-column:var(--col-span-nc2xl)}}}.fi-grid-col.fi-grid-col-start{grid-column-start:var(--col-start-default)}@media (min-width:40rem){.fi-grid-col.sm\:fi-grid-col-start{grid-column-start:var(--col-start-sm)}}@media (min-width:48rem){.fi-grid-col.md\:fi-grid-col-start{grid-column-start:var(--col-start-md)}}@media (min-width:64rem){.fi-grid-col.lg\:fi-grid-col-start{grid-column-start:var(--col-start-lg)}}@media (min-width:80rem){.fi-grid-col.xl\:fi-grid-col-start{grid-column-start:var(--col-start-xl)}}@media (min-width:96rem){.fi-grid-col.\32 xl\:fi-grid-col-start{grid-column-start:var(--col-start-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid-col.\@3xs\:fi-grid-col-start{grid-column-start:var(--col-start-c3xs)}}@container (min-width:18rem){.fi-grid-col.\@2xs\:fi-grid-col-start{grid-column-start:var(--col-start-c2xs)}}@container (min-width:20rem){.fi-grid-col.\@xs\:fi-grid-col-start{grid-column-start:var(--col-start-cxs)}}@container (min-width:24rem){.fi-grid-col.\@sm\:fi-grid-col-start{grid-column-start:var(--col-start-csm)}}@container (min-width:28rem){.fi-grid-col.\@md\:fi-grid-col-start{grid-column-start:var(--col-start-cmd)}}@container (min-width:32rem){.fi-grid-col.\@lg\:fi-grid-col-start{grid-column-start:var(--col-start-clg)}}@container (min-width:36rem){.fi-grid-col.\@xl\:fi-grid-col-start{grid-column-start:var(--col-start-cxl)}}@container (min-width:42rem){.fi-grid-col.\@2xl\:fi-grid-col-start{grid-column-start:var(--col-start-c2xl)}}@container (min-width:48rem){.fi-grid-col.\@3xl\:fi-grid-col-start{grid-column-start:var(--col-start-c3xl)}}@container (min-width:56rem){.fi-grid-col.\@4xl\:fi-grid-col-start{grid-column-start:var(--col-start-c4xl)}}@container (min-width:64rem){.fi-grid-col.\@5xl\:fi-grid-col-start{grid-column-start:var(--col-start-c5xl)}}@container (min-width:72rem){.fi-grid-col.\@6xl\:fi-grid-col-start{grid-column-start:var(--col-start-c6xl)}}@container (min-width:80rem){.fi-grid-col.\@7xl\:fi-grid-col-start{grid-column-start:var(--col-start-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid-col.\!\@sm\:fi-grid-col-start{grid-column-start:var(--col-start-ncsm)}}@media (min-width:48rem){.fi-grid-col.\!\@md\:fi-grid-col-start{grid-column-start:var(--col-start-ncmd)}}@media (min-width:64rem){.fi-grid-col.\!\@lg\:fi-grid-col-start{grid-column-start:var(--col-start-nclg)}}@media (min-width:80rem){.fi-grid-col.\!\@xl\:fi-grid-col-start{grid-column-start:var(--col-start-ncxl)}}@media (min-width:96rem){.fi-grid-col.\!\@2xl\:fi-grid-col-start{grid-column-start:var(--col-start-nc2xl)}}}.fi-grid-col.fi-grid-col-order{order:var(--col-order-default)}@media (min-width:40rem){.fi-grid-col.sm\:fi-grid-col-order{order:var(--col-order-sm)}}@media (min-width:48rem){.fi-grid-col.md\:fi-grid-col-order{order:var(--col-order-md)}}@media (min-width:64rem){.fi-grid-col.lg\:fi-grid-col-order{order:var(--col-order-lg)}}@media (min-width:80rem){.fi-grid-col.xl\:fi-grid-col-order{order:var(--col-order-xl)}}@media (min-width:96rem){.fi-grid-col.\32 xl\:fi-grid-col-order{order:var(--col-order-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.fi-grid-col.\@3xs\:fi-grid-col-order{order:var(--col-order-c3xs)}}@container (min-width:18rem){.fi-grid-col.\@2xs\:fi-grid-col-order{order:var(--col-order-c2xs)}}@container (min-width:20rem){.fi-grid-col.\@xs\:fi-grid-col-order{order:var(--col-order-cxs)}}@container (min-width:24rem){.fi-grid-col.\@sm\:fi-grid-col-order{order:var(--col-order-csm)}}@container (min-width:28rem){.fi-grid-col.\@md\:fi-grid-col-order{order:var(--col-order-cmd)}}@container (min-width:32rem){.fi-grid-col.\@lg\:fi-grid-col-order{order:var(--col-order-clg)}}@container (min-width:36rem){.fi-grid-col.\@xl\:fi-grid-col-order{order:var(--col-order-cxl)}}@container (min-width:42rem){.fi-grid-col.\@2xl\:fi-grid-col-order{order:var(--col-order-c2xl)}}@container (min-width:48rem){.fi-grid-col.\@3xl\:fi-grid-col-order{order:var(--col-order-c3xl)}}@container (min-width:56rem){.fi-grid-col.\@4xl\:fi-grid-col-order{order:var(--col-order-c4xl)}}@container (min-width:64rem){.fi-grid-col.\@5xl\:fi-grid-col-order{order:var(--col-order-c5xl)}}@container (min-width:72rem){.fi-grid-col.\@6xl\:fi-grid-col-order{order:var(--col-order-c6xl)}}@container (min-width:80rem){.fi-grid-col.\@7xl\:fi-grid-col-order{order:var(--col-order-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-grid-col.\!\@sm\:fi-grid-col-order{order:var(--col-order-ncsm)}}@media (min-width:48rem){.fi-grid-col.\!\@md\:fi-grid-col-order{order:var(--col-order-ncmd)}}@media (min-width:64rem){.fi-grid-col.\!\@lg\:fi-grid-col-order{order:var(--col-order-nclg)}}@media (min-width:80rem){.fi-grid-col.\!\@xl\:fi-grid-col-order{order:var(--col-order-ncxl)}}@media (min-width:96rem){.fi-grid-col.\!\@2xl\:fi-grid-col-order{order:var(--col-order-nc2xl)}}}.fi-grid-col.fi-hidden{display:none}.fi-icon{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.fi-icon.fi-size-xs{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.fi-icon.fi-size-sm{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.fi-icon.fi-size-md{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.fi-icon.fi-size-lg{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.fi-icon.fi-size-xl{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.fi-icon.fi-size-2xl{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.fi-icon>svg{height:inherit;width:inherit}.fi-icon-btn{margin:calc(var(--spacing)*-2);width:calc(var(--spacing)*9);height:calc(var(--spacing)*9);border-radius:var(--radius-lg);color:var(--gray-500);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;justify-content:center;align-items:center;transition-duration:75ms;display:flex;position:relative}.fi-icon-btn:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):hover{color:var(--gray-600)}}:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}@media (hover:hover){:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{color:var(--gray-400)}}:is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500)}.fi-icon-btn.fi-disabled:not(.fi-force-enabled),.fi-icon-btn[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-icon-btn.fi-disabled:not(.fi-force-enabled),.fi-icon-btn[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-icon-btn.fi-size-xs{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-1.5)}.fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-1)}.fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-.5)}.fi-icon-btn.fi-size-sm{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-2)}.fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-1.5)}.fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-1)}.fi-icon-btn.fi-size-md:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-2.5)}.fi-icon-btn.fi-size-md:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-1.5)}.fi-icon-btn.fi-size-lg{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-3)}.fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-2.5)}.fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-2)}.fi-icon-btn.fi-size-xl{width:calc(var(--spacing)*11);height:calc(var(--spacing)*11)}.fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-3.5)}.fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-3)}.fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-2.5)}.fi-icon-btn.fi-color{color:var(--text)}.fi-icon-btn.fi-color:where(.dark,.dark *){color:var(--dark-text)}@media (hover:hover){:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):hover{color:var(--hover-text)}}:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-600)}@media (hover:hover){:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{color:var(--dark-hover-text)}}:is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-500)}.fi-icon-btn>.fi-icon-btn-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*1);z-index:1;--tw-translate-x:calc(calc(1/2*100%)*-1);--tw-translate-y:calc(calc(1/2*100%)*-1);width:max-content;translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-md);background-color:var(--color-white);display:flex;position:absolute}.fi-icon-btn>.fi-icon-btn-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-icon-btn>.fi-icon-btn-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}@media (min-width:40rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-sm){display:none}}@media (min-width:48rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-md){display:none}}@media (min-width:64rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-lg){display:none}}@media (min-width:80rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-xl){display:none}}@media (min-width:96rem){.fi-icon-btn:has(+.fi-btn.fi-labeled-from-2xl){display:none}}input[type=checkbox].fi-checkbox-input{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);appearance:none;--tw-border-style:none;background-color:var(--color-white);vertical-align:middle;color:var(--primary-600);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-style:none;border-radius:.25rem}input[type=checkbox].fi-checkbox-input:checked{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input[type=checkbox].fi-checkbox-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}input[type=checkbox].fi-checkbox-input:checked:focus{--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input:disabled{pointer-events:none;background-color:var(--gray-50);color:var(--gray-50)}input[type=checkbox].fi-checkbox-input:disabled:checked{background-color:var(--gray-400);color:var(--gray-400)}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){color:var(--primary-500);--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked{background-color:var(--primary-500)}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):focus{--tw-ring-color:var(--primary-500)}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled{--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled:checked{background-color:var(--gray-600)}input[type=checkbox].fi-checkbox-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}input[type=checkbox].fi-checkbox-input:indeterminate{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input[type=checkbox].fi-checkbox-input:indeterminate:where(.dark,.dark *){background-color:var(--primary-500)}input[type=checkbox].fi-checkbox-input:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.5 6.75a1.25 1.25 0 0 0 0 2.5h7a1.25 1.25 0 0 0 0-2.5h-7z'/%3E%3C/svg%3E")}input[type=checkbox].fi-checkbox-input:indeterminate:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:indeterminate:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}input[type=checkbox].fi-checkbox-input:indeterminate:disabled{background-color:var(--gray-400)}input[type=checkbox].fi-checkbox-input:indeterminate:disabled:where(.dark,.dark *){background-color:var(--gray-600)}input[type=checkbox].fi-checkbox-input.fi-invalid{color:var(--danger-600);--tw-ring-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:checked{background-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:focus{--tw-ring-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:checked:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *){color:var(--danger-500);--tw-ring-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked{background-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):focus{--tw-ring-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate{background-color:var(--danger-600)}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:where(.dark,.dark *){background-color:var(--danger-500)}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab, red, red)){input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}input.fi-input{appearance:none;--tw-border-style:none;width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;background-color:#0000;border-style:none;transition-duration:75ms;display:block}input.fi-input::placeholder{color:var(--gray-400)}input.fi-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}input.fi-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}input.fi-input:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}input.fi-input:where(.dark,.dark *){color:var(--color-white)}input.fi-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}input.fi-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}input.fi-input:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}@supports (-webkit-touch-callout:none){input.fi-input{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}input.fi-input.fi-input-has-inline-prefix{padding-inline-start:calc(var(--spacing)*0)}input.fi-input.fi-input-has-inline-suffix{padding-inline-end:calc(var(--spacing)*0)}input.fi-input.fi-align-center{text-align:center}input.fi-input.fi-align-end{text-align:end}input.fi-input.fi-align-left{text-align:left}input.fi-input.fi-align-right{text-align:end}input.fi-input.fi-align-justify,input.fi-input.fi-align-between{text-align:justify}input[type=date].fi-input,input[type=datetime-local].fi-input,input[type=time].fi-input{background-color:#ffffff03}@supports (color:color-mix(in lab, red, red)){input[type=date].fi-input,input[type=datetime-local].fi-input,input[type=time].fi-input{background-color:color-mix(in oklab,var(--color-white)1%,transparent)}}input[type=range].fi-input{appearance:auto;width:calc(100% - 1.5rem);margin-inline:auto}input[type=text].fi-one-time-code-input{inset-block:calc(var(--spacing)*0);right:calc(var(--spacing)*-8);left:calc(var(--spacing)*0);--tw-border-style:none;padding-inline:calc(var(--spacing)*3);font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--tw-tracking:1.72rem;letter-spacing:1.72rem;color:var(--gray-950);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;background-color:#0000;border-style:none;transition-duration:75ms;display:block;position:absolute}input[type=text].fi-one-time-code-input::placeholder{color:var(--gray-400)}input[type=text].fi-one-time-code-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}input[type=text].fi-one-time-code-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}input[type=text].fi-one-time-code-input:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}input[type=text].fi-one-time-code-input:where(.dark,.dark *){color:var(--color-white)}input[type=text].fi-one-time-code-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}input[type=text].fi-one-time-code-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}input[type=text].fi-one-time-code-input:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}input[type=text].fi-one-time-code-input.fi-valid{caret-color:#0000}.fi-one-time-code-input-ctn{height:calc(var(--spacing)*12);position:relative}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{height:100%;width:calc(var(--spacing)*8);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950);display:inline-block}@supports (color:color-mix(in lab, red, red)){.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{background-color:var(--color-white)}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field.fi-active{border-style:var(--tw-border-style);border-width:2px;border-color:var(--primary-600)}.fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field.fi-active:where(.dark,.dark *){border-color:var(--primary-500)}input[type=radio].fi-radio-input{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);appearance:none;--tw-border-style:none;background-color:var(--color-white);color:var(--primary-600);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-style:none;border-radius:3.40282e38px}input[type=radio].fi-radio-input:checked{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input[type=radio].fi-radio-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}input[type=radio].fi-radio-input:checked:focus{--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}input[type=radio].fi-radio-input:disabled{background-color:var(--gray-50);color:var(--gray-50)}input[type=radio].fi-radio-input:disabled:checked{background-color:var(--gray-400);color:var(--gray-400)}input[type=radio].fi-radio-input:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *){color:var(--primary-500);--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *):checked{background-color:var(--primary-500)}input[type=radio].fi-radio-input:where(.dark,.dark *):focus{--tw-ring-color:var(--primary-500)}input[type=radio].fi-radio-input:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *):disabled{--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input:where(.dark,.dark *):disabled{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}input[type=radio].fi-radio-input:where(.dark,.dark *):disabled:checked{background-color:var(--gray-600)}input[type=radio].fi-radio-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}input[type=radio].fi-radio-input.fi-invalid{color:var(--danger-600);--tw-ring-color:var(--danger-600)}input[type=radio].fi-radio-input.fi-invalid:checked{background-color:var(--danger-600)}input[type=radio].fi-radio-input.fi-invalid:focus{--tw-ring-color:var(--danger-600)}input[type=radio].fi-radio-input.fi-invalid:checked:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input.fi-invalid:checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *){color:var(--danger-500);--tw-ring-color:var(--danger-500)}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked{background-color:var(--danger-500)}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):focus{--tw-ring-color:var(--danger-500)}input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab, red, red)){input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}select.fi-select-input{appearance:none;--tw-border-style:none;width:100%;padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;background-color:#0000;border-style:none;padding-inline-start:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*8);transition-duration:75ms;display:block}select.fi-select-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}select.fi-select-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}select.fi-select-input:where(.dark,.dark *){color:var(--color-white)}select.fi-select-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}select.fi-select-input optgroup{background-color:var(--color-white)}select.fi-select-input optgroup:where(.dark,.dark *){background-color:var(--gray-900)}select.fi-select-input option{background-color:var(--color-white)}select.fi-select-input option:where(.dark,.dark *){background-color:var(--gray-900)}@supports (-webkit-touch-callout:none){select.fi-select-input{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}select.fi-select-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}select.fi-select-input:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.5rem}select.fi-select-input.fi-select-input-has-inline-prefix{padding-inline-start:calc(var(--spacing)*0)}.fi-select-input .fi-select-input-ctn{position:relative}.fi-select-input div[x-ref=select]{min-height:calc(var(--spacing)*9)}.fi-select-input .fi-select-input-btn{min-height:calc(var(--spacing)*9);border-radius:var(--radius-lg);width:100%;padding-block:calc(var(--spacing)*1.5);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);padding-inline-start:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*8);display:flex}.fi-select-input .fi-select-input-btn:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.fi-select-input .fi-select-input-btn:where(.dark,.dark *){color:var(--color-white)}.fi-select-input .fi-select-input-btn{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}.fi-select-input .fi-select-input-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.5rem}.fi-select-input .fi-select-input-value-ctn{text-wrap:wrap;word-break:break-word;align-items:center;width:100%;display:flex}.fi-select-input .fi-select-input-value-badges-ctn{gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.fi-select-input .fi-select-input-value-label{flex:1}.fi-select-input .fi-select-input-value-remove-btn{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y);color:var(--gray-500);inset-inline-end:calc(var(--spacing)*8);position:absolute;top:50%}@media (hover:hover){.fi-select-input .fi-select-input-value-remove-btn:hover{color:var(--gray-600)}}.fi-select-input .fi-select-input-value-remove-btn:focus-visible{color:var(--gray-600);--tw-outline-style:none;outline-style:none}@media (hover:hover){.fi-select-input .fi-select-input-value-remove-btn:where(.dark,.dark *):hover{color:var(--gray-300)}}.fi-select-input .fi-select-input-value-remove-btn:where(.dark,.dark *):focus-visible{color:var(--gray-300)}.fi-select-input .fi-select-input-ctn-clearable .fi-select-input-btn{padding-inline-end:calc(var(--spacing)*14)}.fi-select-input .fi-dropdown-panel{max-height:calc(var(--spacing)*60);max-width:100%!important}:where(.fi-select-input .fi-select-input-options-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100)}:where(.fi-select-input .fi-select-input-options-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-select-input .fi-select-input-options-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:where(.fi-select-input .fi-select-input-option-group>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100)}:where(.fi-select-input .fi-select-input-option-group:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-select-input .fi-select-input-option-group:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-select-input .fi-select-input-option-group .fi-dropdown-header{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-select-input .fi-select-input-option-group .fi-dropdown-header:where(.dark,.dark *){color:var(--gray-400)}.fi-select-input .fi-select-input-search-ctn{top:calc(var(--spacing)*0);z-index:10;background-color:var(--color-white);position:sticky}.fi-select-input .fi-select-input-search-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.fi-select-input .fi-select-input-option{text-wrap:wrap;word-break:break-word;min-width:1px}.fi-select-input .fi-select-input-placeholder{color:var(--gray-400)}.fi-select-input .fi-select-input-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-select-input .fi-disabled{cursor:not-allowed;opacity:.7}.fi-select-input .fi-disabled .fi-select-input-placeholder{color:var(--gray-400)}.fi-select-input .fi-disabled .fi-select-input-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-select-input .fi-select-input-message{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-select-input .fi-select-input-message:where(.dark,.dark *){color:var(--gray-400)}.fi-select-input .fi-select-input-ctn.fi-select-input-ctn-option-labels-not-wrapped .fi-select-input-value-ctn>span{text-overflow:ellipsis;white-space:nowrap;text-wrap:nowrap;overflow-wrap:normal;word-break:normal;overflow:hidden}.fi-select-input .fi-select-input-ctn.fi-select-input-ctn-option-labels-not-wrapped .fi-select-input-option>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-input-wrp{border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms;display:flex}.fi-input-wrp:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-input-wrp:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):where(.dark,.dark *):focus-within{--tw-ring-color:var(--primary-500)}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:focus-within{--tw-ring-color:var(--danger-600)}.fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:where(.dark,.dark *):focus-within{--tw-ring-color:var(--danger-500)}.fi-input-wrp.fi-disabled{background-color:var(--gray-50)}.fi-input-wrp.fi-disabled:where(.dark,.dark *){background-color:#0000}.fi-input-wrp.fi-disabled:not(.fi-invalid):where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp.fi-disabled:not(.fi-invalid):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-input-wrp.fi-invalid{--tw-ring-color:var(--danger-600)}.fi-input-wrp.fi-invalid:where(.dark,.dark *){--tw-ring-color:var(--danger-500)}.fi-input-wrp .fi-input-wrp-prefix{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline-start:calc(var(--spacing)*3);display:none}.fi-input-wrp .fi-input-wrp-prefix.fi-input-wrp-prefix-has-content{display:flex}.fi-input-wrp .fi-input-wrp-prefix.fi-inline{padding-inline-end:calc(var(--spacing)*2)}.fi-input-wrp .fi-input-wrp-prefix.fi-inline.fi-input-wrp-prefix-has-label{padding-inline-end:calc(var(--spacing)*1)}.fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--gray-200);padding-inline-start:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*3)}.fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-input-wrp .fi-input-wrp-content-ctn,.fi-input-wrp:not(:has(.fi-input-wrp-content-ctn))>*{min-width:calc(var(--spacing)*0);flex:1}:is(.fi-input-wrp .fi-input-wrp-content-ctn,.fi-input-wrp:not(:has(.fi-input-wrp-content-ctn))>*).fi-input-wrp-content-ctn-ps{padding-inline-start:calc(var(--spacing)*3)}.fi-input-wrp .fi-input-wrp-suffix{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*3);display:flex}.fi-input-wrp .fi-input-wrp-suffix.fi-inline{padding-inline-start:calc(var(--spacing)*2)}.fi-input-wrp .fi-input-wrp-suffix.fi-inline.fi-input-wrp-suffix-has-label{padding-inline-start:calc(var(--spacing)*1)}.fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:var(--gray-200);padding-inline-start:calc(var(--spacing)*3)}.fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-input-wrp .fi-input-wrp-actions{align-items:center;gap:calc(var(--spacing)*3);display:flex}.fi-input-wrp .fi-input-wrp-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:var(--gray-500)}.fi-input-wrp .fi-input-wrp-label:where(.dark,.dark *),:is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon{color:var(--gray-400)}:is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}:is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon.fi-color{color:var(--color-500)}.fi-link{justify-content:center;align-items:center;gap:calc(var(--spacing)*1.5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);--tw-outline-style:none;outline-style:none;display:inline-flex;position:relative}.fi-link:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){:is(.fi-link.fi-force-enabled,.fi-link:not(.fi-disabled):not([disabled])):hover{text-decoration-line:underline}}:is(.fi-link.fi-force-enabled,.fi-link:not(.fi-disabled):not([disabled])):focus-visible{text-decoration-line:underline}.fi-link.fi-disabled:not(.fi-force-enabled),.fi-link[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}:is(.fi-link.fi-disabled:not(.fi-force-enabled),.fi-link[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.fi-link.fi-size-xs{gap:calc(var(--spacing)*1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-link.fi-size-sm{gap:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-link.fi-size-md,.fi-link.fi-size-lg,.fi-link.fi-size-xl{gap:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-link.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-link.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-link.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-link.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-link.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-link.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-link.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-link.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-link.fi-color{color:var(--text)}.fi-link.fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-link:not(.fi-color)>.fi-icon{color:var(--gray-400)}.fi-link:not(.fi-color)>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-link .fi-link-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*0);z-index:1;--tw-translate-x:calc(calc(1/4*100%)*-1);--tw-translate-y:calc(calc(3/4*100%)*-1);width:max-content;translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-md);background-color:var(--color-white);--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);display:flex;position:absolute}@media (hover:hover){.fi-link .fi-link-badge-ctn:hover{text-decoration-line:none}}.fi-link .fi-link-badge-ctn:focus-visible{text-decoration-line:none}.fi-link .fi-link-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1/4*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-link .fi-link-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}p>.fi-link,span>.fi-link{vertical-align:middle;text-align:inherit;padding-bottom:2px}.fi-loading-indicator{animation:var(--animate-spin)}.fi-loading-section{animation:var(--animate-pulse)}:is(.fi-modal.fi-modal-slide-over,.fi-modal.fi-width-screen)>.fi-modal-window-ctn>.fi-modal-window{height:100dvh}:is(.fi-modal.fi-modal-slide-over,.fi-modal.fi-width-screen)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content{flex:1}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window{margin-inline-start:auto;overflow-y:auto}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}:is(.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-end,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-start{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header{column-gap:calc(var(--spacing)*3)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg{margin-block:calc(var(--spacing)*-2);padding:calc(var(--spacing)*2);margin-inline-start:calc(var(--spacing)*-2)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{inset-inline-end:calc(var(--spacing)*6);top:calc(var(--spacing)*6)}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen):not(.fi-modal-has-sticky-header):not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn{overflow-y:auto}:is(.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-header,.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window{max-height:calc(100dvh - 2rem);overflow-y:auto}.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:0}.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-end,.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-start{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:1}.fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{inset-inline-end:calc(var(--spacing)*4);top:calc(var(--spacing)*4)}.fi-modal.fi-align-start:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window-has-icon .fi-modal-content,.fi-modal.fi-align-start:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window-has-icon .fi-modal-footer:not(.fi-align-center){padding-inline-start:5.25rem;padding-inline-end:calc(var(--spacing)*6)}.fi-modal:not(.fi-align-start)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content,.fi-modal:not(.fi-align-start)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.fi-modal>.fi-modal-close-overlay{inset:calc(var(--spacing)*0);z-index:40;background-color:var(--gray-950);position:fixed}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-close-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.fi-modal>.fi-modal-close-overlay{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}.fi-modal>.fi-modal-close-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-close-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}.fi-modal.fi-modal-open:has(~.fi-modal.fi-modal-open)>.fi-modal-close-overlay{opacity:0}.fi-modal.fi-modal-open~.fi-modal.fi-modal-open>.fi-modal-close-overlay,.fi-modal.fi-modal-open~.fi-modal.fi-modal-open>.fi-modal-window-ctn{z-index:50}.fi-modal>.fi-modal-window-ctn{inset:calc(var(--spacing)*0);z-index:40;grid-template-rows:1fr auto 1fr;justify-items:center;min-height:100%;display:grid;position:fixed}@media (min-width:40rem){.fi-modal>.fi-modal-window-ctn{grid-template-rows:1fr auto 3fr}}.fi-modal>.fi-modal-window-ctn.fi-clickable{cursor:pointer}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)>.fi-modal-window-ctn{padding:calc(var(--spacing)*4)}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)>.fi-modal-window-ctn .fi-modal-window{border-radius:var(--radius-xl);margin-inline:auto}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window{pointer-events:auto;cursor:default;background-color:var(--color-white);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);flex-direction:column;grid-row-start:2;display:flex;position:relative}.fi-modal>.fi-modal-window-ctn>.fi-modal-window:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-window-ctn>.fi-modal-window:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header{padding-inline:calc(var(--spacing)*6);padding-top:calc(var(--spacing)*6);display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header.fi-vertical-align-center{align-items:center}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-heading:where(.dark,.dark *){color:var(--color-white)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-description{margin-top:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-description:where(.dark,.dark *){color:var(--gray-400)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content{row-gap:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*6);flex-direction:column;display:flex}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-left) .fi-modal-header{column-gap:calc(var(--spacing)*5)}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-left) .fi-modal-icon-bg{padding:calc(var(--spacing)*2)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-header{text-align:center;flex-direction:column}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-icon-ctn{margin-bottom:calc(var(--spacing)*5);justify-content:center;align-items:center;display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-icon-bg{padding:calc(var(--spacing)*3)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-hidden{display:none}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-xs{max-width:var(--container-xs)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-sm{max-width:var(--container-sm)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-md{max-width:var(--container-md)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-lg{max-width:var(--container-lg)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-xl{max-width:var(--container-xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-2xl{max-width:var(--container-2xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-3xl{max-width:var(--container-3xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-4xl{max-width:var(--container-4xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-5xl{max-width:var(--container-5xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-6xl{max-width:var(--container-6xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-7xl{max-width:var(--container-7xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-full{max-width:100%}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-min{max-width:min-content}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-max{max-width:max-content}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-fit{max-width:fit-content}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-prose{max-width:65ch}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-sm{max-width:var(--breakpoint-sm)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-md{max-width:var(--breakpoint-md)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-lg{max-width:var(--breakpoint-lg)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-xl{max-width:var(--breakpoint-xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-2xl{max-width:var(--breakpoint-2xl)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen{inset:calc(var(--spacing)*0);position:fixed}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave{--tw-duration:.3s;transition-duration:.3s}.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-center:not(.fi-modal-window-has-icon) .fi-modal-heading{margin-inline-start:calc(var(--spacing)*6)}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn:not(.fi-modal-window-has-icon),.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-left) .fi-modal-heading{margin-inline-end:calc(var(--spacing)*6)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{position:absolute}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{width:100%}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer .fi-modal-footer-actions{gap:calc(var(--spacing)*3)}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-left) .fi-modal-footer-actions{flex-wrap:wrap;align-items:center;display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center{padding-inline:calc(var(--spacing)*6)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{flex-direction:column-reverse;display:flex}:is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-end,.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-right) .fi-modal-footer-actions{flex-flow:row-reverse wrap;align-items:center;display:flex}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg{background-color:var(--gray-100);border-radius:3.40282e38px}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg>.fi-icon{color:var(--gray-500)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg>.fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color{background-color:var(--color-100)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color:where(.dark,.dark *){background-color:var(--color-500)}@supports (color:color-mix(in lab, red, red)){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-500)20%,transparent)}}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color>.fi-icon{color:var(--color-600)}.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color>.fi-icon:where(.dark,.dark *){color:var(--color-400)}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header{top:calc(var(--spacing)*0);z-index:10;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--color-white);padding-bottom:calc(var(--spacing)*6);position:sticky}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){background-color:var(--gray-900)}.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content,.fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{bottom:calc(var(--spacing)*0);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);background-color:var(--color-white);padding-block:calc(var(--spacing)*5);position:sticky}.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){background-color:var(--gray-900)}.fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-content) .fi-modal-footer{margin-top:calc(var(--spacing)*6)}.fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-content):not(.fi-modal-window-has-footer) .fi-modal-header,.fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-bottom:calc(var(--spacing)*6)}.fi-modal:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-icon) .fi-modal-content,.fi-modal:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-icon) .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{margin-top:auto}@supports (container-type:inline-size){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center{container-type:inline-size}@container (min-width:24rem){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{grid-template-columns:repeat(auto-fit,minmax(0,1fr));display:grid}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{grid-template-columns:repeat(auto-fit,minmax(0,1fr));display:grid}}}:scope .fi-modal-trigger{display:flex}.fi-pagination{align-items:center;column-gap:calc(var(--spacing)*3);grid-template-columns:1fr auto 1fr;display:grid}.fi-pagination:empty{display:none}.fi-pagination .fi-pagination-previous-btn{justify-self:flex-start}.fi-pagination .fi-pagination-overview{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);display:none}.fi-pagination .fi-pagination-overview:where(.dark,.dark *){color:var(--gray-200)}.fi-pagination .fi-pagination-records-per-page-select-ctn{grid-column-start:2;justify-self:center}.fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:none}.fi-pagination .fi-pagination-next-btn{grid-column-start:3;justify-self:flex-end}.fi-pagination .fi-pagination-items{border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);justify-self:flex-end;display:none}.fi-pagination .fi-pagination-items:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-items:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-pagination .fi-pagination-items:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-items:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-pagination .fi-pagination-item{border-inline-style:var(--tw-border-style);border-inline-width:.5px;border-color:var(--gray-200)}.fi-pagination .fi-pagination-item:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.fi-pagination .fi-pagination-item:last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.fi-pagination .fi-pagination-item:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-item:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn{background-color:var(--gray-50)}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-label{color:var(--primary-700)}.fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-label:where(.dark,.dark *){color:var(--primary-400)}.fi-pagination .fi-pagination-item:first-of-type .fi-pagination-item-btn{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.fi-pagination .fi-pagination-item:last-of-type .fi-pagination-item-btn{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.fi-pagination .fi-pagination-item.fi-disabled .fi-pagination-item-label{color:var(--gray-500)}.fi-pagination .fi-pagination-item.fi-disabled .fi-pagination-item-label:where(.dark,.dark *){color:var(--gray-400)}.fi-pagination .fi-pagination-item-btn{padding:calc(var(--spacing)*2);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;transition-duration:75ms;display:flex;position:relative;overflow:hidden}@media (hover:hover){.fi-pagination .fi-pagination-item-btn:enabled:hover{background-color:var(--gray-50)}}.fi-pagination .fi-pagination-item-btn:enabled:focus-visible{z-index:10;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}@media (hover:hover){.fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500)}.fi-pagination .fi-pagination-item-btn:hover .fi-icon{color:var(--gray-500)}.fi-pagination .fi-pagination-item-btn:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-pagination .fi-pagination-item-btn .fi-icon{color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-pagination .fi-pagination-item-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-pagination .fi-pagination-item-btn .fi-pagination-item-label{padding-inline:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-700)}.fi-pagination .fi-pagination-item-btn .fi-pagination-item-label:where(.dark,.dark *){color:var(--gray-200)}@supports (container-type:inline-size){.fi-pagination{container-type:inline-size}@container (min-width:28rem){.fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:inline}.fi-pagination .fi-pagination-records-per-page-select.fi-compact{display:none}}@container (min-width:56rem){.fi-pagination:not(.fi-simple) .fi-pagination-previous-btn,.fi-pagination:not(.fi-simple) .fi-pagination-next-btn{display:none}.fi-pagination .fi-pagination-overview{display:inline}.fi-pagination .fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:inline}.fi-pagination .fi-pagination-records-per-page-select.fi-compact{display:none}}@media (min-width:48rem){.fi-pagination:not(.fi-simple) .fi-pagination-previous-btn,.fi-pagination:not(.fi-simple) .fi-pagination-next-btn{display:none}.fi-pagination .fi-pagination-overview{display:inline}.fi-pagination .fi-pagination-items{display:flex}}}.fi-section:not(.fi-section-not-contained):not(.fi-divided)>.fi-section-content-ctn>.fi-section-content,.fi-section:not(.fi-section-not-contained).fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding:calc(var(--spacing)*6)}.fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*4)}.fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained):not(.fi-aside){border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-section:not(.fi-section-not-contained):not(.fi-aside):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained):not(.fi-aside):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-compact{border-radius:var(--radius-lg)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary{background-color:var(--gray-50)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-section:not(.fi-section-not-contained):not(.fi-aside)>.fi-section-header{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*4)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200)}.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:48rem){.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn{grid-column:span 2/span 2}}.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section:not(.fi-section-not-contained).fi-aside.fi-compact>.fi-section-content-ctn{border-radius:var(--radius-lg)}.fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn{background-color:var(--gray-50)}.fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-section:not(.fi-section-not-contained).fi-compact:not(.fi-aside)>.fi-section-header{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2.5)}.fi-section:not(.fi-section-not-contained).fi-compact:not(.fi-divided)>.fi-section-content-ctn>.fi-section-content,.fi-section:not(.fi-section-not-contained).fi-compact.fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding:calc(var(--spacing)*4)}.fi-section:not(.fi-section-not-contained).fi-compact>.fi-section-footer{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2.5)}@media (min-width:48rem){.fi-section.fi-section-not-contained.fi-aside>.fi-section-content-ctn{grid-column:span 2/span 2}}.fi-section.fi-section-not-contained:not(.fi-aside),.fi-section.fi-section-not-contained:not(.fi-aside)>.fi-section-content-ctn{row-gap:calc(var(--spacing)*4);display:grid}.fi-section.fi-section-not-contained:not(.fi-aside).fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding-block:calc(var(--spacing)*6)}.fi-section.fi-section-not-contained:not(.fi-aside).fi-compact,.fi-section.fi-section-not-contained:not(.fi-aside).fi-compact>.fi-section-content-ctn{row-gap:calc(var(--spacing)*2.5)}.fi-section.fi-section-not-contained:not(.fi-aside).fi-compact.fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding-block:calc(var(--spacing)*4)}.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content{gap:calc(var(--spacing)*0)}:where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-section.fi-aside{align-items:flex-start;column-gap:calc(var(--spacing)*6);row-gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}@media (min-width:48rem){.fi-section.fi-aside{grid-template-columns:repeat(3,minmax(0,1fr))}}.fi-section.fi-collapsible>.fi-section-header{cursor:pointer}.fi-section.fi-collapsed>.fi-section-header>.fi-section-collapse-btn{rotate:180deg}.fi-section.fi-collapsed>.fi-section-content-ctn{visibility:hidden;height:calc(var(--spacing)*0);--tw-border-style:none;border-style:none;position:absolute;overflow:hidden}@media (min-width:48rem){.fi-section.fi-section-has-content-before>.fi-section-content-ctn{order:-9999}}.fi-section>.fi-section-header{align-items:flex-start;gap:calc(var(--spacing)*3);display:flex}.fi-section>.fi-section-header>.fi-icon{color:var(--gray-400);flex-shrink:0}.fi-section>.fi-section-header>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-section>.fi-section-header>.fi-icon.fi-color{color:var(--color-500)}.fi-section>.fi-section-header>.fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.fi-section>.fi-section-header>.fi-icon.fi-size-sm{margin-top:calc(var(--spacing)*1)}.fi-section>.fi-section-header>.fi-icon.fi-size-md{margin-top:calc(var(--spacing)*.5)}.fi-section>.fi-section-header>.fi-section-header-after-ctn{align-self:center}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-sc-text:not(.fi-section-header-after-ctn .fi-dropdown-panel *),.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-link:not(.fi-section-header-after-ctn .fi-dropdown-panel *){--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-xs{margin-block:calc(var(--spacing)*-.5)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-sm{margin-block:calc(var(--spacing)*-1)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-md{margin-block:calc(var(--spacing)*-1.5)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-lg{margin-block:calc(var(--spacing)*-2)}.fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn:not(.fi-section-header-after-ctn .fi-dropdown-panel *).fi-size-xl{margin-block:calc(var(--spacing)*-2.5)}.fi-section>.fi-section-header>.fi-section-collapse-btn{margin-block:calc(var(--spacing)*-1.5);flex-shrink:0}.fi-section .fi-section-header-text-ctn{row-gap:calc(var(--spacing)*1);flex:1;display:grid}.fi-section .fi-section-header-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-section .fi-section-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-section .fi-section-header-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word;color:var(--gray-500);overflow:hidden}.fi-section .fi-section-header-description:where(.dark,.dark *){color:var(--gray-400)}.fi-tabs{column-gap:calc(var(--spacing)*1);max-width:100%;display:flex;overflow-x:auto}.fi-tabs.fi-contained{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2.5)}.fi-tabs.fi-contained:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-tabs.fi-contained:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-tabs:not(.fi-contained){border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing)*2);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);margin-inline:auto}.fi-tabs:not(.fi-contained):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-tabs:not(.fi-contained):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-tabs.fi-vertical{column-gap:calc(var(--spacing)*0);row-gap:calc(var(--spacing)*1);flex-direction:column;overflow:hidden auto}.fi-tabs.fi-vertical.fi-contained{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0}.fi-tabs.fi-vertical:not(.fi-contained){margin-inline:calc(var(--spacing)*0)}.fi-tabs.fi-vertical .fi-tabs-item{justify-content:flex-start}.fi-tabs-item{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*2);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;outline-style:none;transition-duration:75ms;display:flex}@media (hover:hover){.fi-tabs-item:hover{background-color:var(--gray-50)}}.fi-tabs-item:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-tabs-item:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tabs-item:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-tabs-item:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tabs-item:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-tabs-item.fi-active{background-color:var(--gray-50)}.fi-tabs-item.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tabs-item.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-tabs-item.fi-active .fi-tabs-item-label,.fi-tabs-item.fi-active>.fi-icon{color:var(--primary-700)}:is(.fi-tabs-item.fi-active .fi-tabs-item-label,.fi-tabs-item.fi-active>.fi-icon):where(.dark,.dark *){color:var(--primary-400)}.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label,.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:is(:where(.group):focus-visible *){color:var(--gray-700)}.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:where(.dark,.dark *),.fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-200)}.fi-tabs-item :not(.fi-active):focus-visible .fi-tabs-item-label{color:var(--gray-700)}.fi-tabs-item :not(.fi-active):focus-visible .fi-tabs-item-label:where(.dark,.dark *){color:var(--gray-200)}.fi-tabs-item .fi-tabs-item-label{color:var(--gray-500);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-tabs-item .fi-tabs-item-label:where(.dark,.dark *){color:var(--gray-400)}.fi-tabs-item>.fi-icon{color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;transition-duration:75ms}.fi-tabs-item>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-tabs-item .fi-badge{width:max-content}.fi-tabs-item .fi-tabs-item-badge-placeholder{color:var(--gray-400);align-items:center;display:flex}.fi-tabs-item .fi-tabs-item-badge-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-toggle{height:calc(var(--spacing)*6);width:calc(var(--spacing)*11);cursor:pointer;border-style:var(--tw-border-style);background-color:var(--gray-200);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out);--tw-outline-style:none;border-width:2px;border-color:#0000;border-radius:3.40282e38px;outline-style:none;flex-shrink:0;display:inline-flex;position:relative}.fi-toggle:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.fi-toggle:disabled{pointer-events:none;opacity:.7}.fi-toggle:where(.dark,.dark *){background-color:var(--gray-700)}.fi-toggle:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500);--tw-ring-offset-color:var(--gray-900)}.fi-toggle:disabled,.fi-toggle[disabled]{pointer-events:none;opacity:.7}.fi-toggle.fi-color{background-color:var(--bg)}.fi-toggle.fi-color:where(.dark,.dark *){background-color:var(--dark-bg)}.fi-toggle.fi-color .fi-icon{color:var(--text)}.fi-toggle.fi-hidden{display:none}.fi-toggle>:first-child{pointer-events:none;width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out);border-radius:3.40282e38px;display:inline-block;position:relative}.fi-toggle>:first-child>*{inset:calc(var(--spacing)*0);width:100%;height:100%;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));justify-content:center;align-items:center;display:flex;position:absolute}.fi-toggle .fi-icon{color:var(--gray-400)}.fi-toggle .fi-icon:where(.dark,.dark *){color:var(--gray-700)}.fi-toggle.fi-toggle-on>:first-child{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-toggle.fi-toggle-on>:first-child:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-5);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-toggle.fi-toggle-on>:first-child>:first-child{opacity:0;--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.fi-toggle.fi-toggle-on>:first-child>:last-child{opacity:1;--tw-duration:.2s;--tw-ease:var(--ease-in);transition-duration:.2s;transition-timing-function:var(--ease-in)}.fi-toggle.fi-toggle-off>:first-child{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-toggle.fi-toggle-off>:first-child>:first-child{opacity:1;--tw-duration:.2s;--tw-ease:var(--ease-in);transition-duration:.2s;transition-timing-function:var(--ease-in)}.fi-toggle.fi-toggle-off>:first-child>:last-child{opacity:0;--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.fi-sortable-ghost{opacity:.3}.fi-ac{gap:calc(var(--spacing)*3)}.fi-ac:not(.fi-width-full){flex-wrap:wrap;align-items:center;display:flex}.fi-ac:not(.fi-width-full).fi-align-start,.fi-ac:not(.fi-width-full).fi-align-left{justify-content:flex-start}.fi-ac:not(.fi-width-full).fi-align-center{justify-content:center}.fi-ac:not(.fi-width-full).fi-align-end,.fi-ac:not(.fi-width-full).fi-align-right{flex-direction:row-reverse}.fi-ac:not(.fi-width-full).fi-align-between,.fi-ac:not(.fi-width-full).fi-align-justify{justify-content:space-between}.fi-ac.fi-width-full{grid-template-columns:repeat(auto-fit,minmax(0,1fr));display:grid}.CodeMirror{color:#000;direction:ltr;height:300px;font-family:monospace}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{white-space:nowrap;background-color:#f7f7f7;border-right:1px solid #ddd}.CodeMirror-linenumber{text-align:right;color:#999;white-space:nowrap;min-width:20px;padding:0 3px 0 5px}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;width:auto;border:0!important}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span::-moz-selection{background:0 0}.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:#0000}@keyframes blink{50%{background-color:#0000}}.cm-tab{-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;display:inline-block}.CodeMirror-rulers{position:absolute;inset:-50px 0 0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute;top:0;bottom:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error,.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:#ff96004d}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;position:relative;overflow:hidden}.CodeMirror-scroll{z-index:0;outline:0;height:100%;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;position:relative;overflow:scroll!important}.CodeMirror-sizer{border-right:50px solid #0000;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{z-index:6;outline:0;display:none;position:absolute}.CodeMirror-vscrollbar{top:0;right:0;overflow:hidden scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow:scroll hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{z-index:3;min-height:100%;position:absolute;top:0;left:0}.CodeMirror-gutter{white-space:normal;vertical-align:top;height:100%;margin-bottom:-50px;display:inline-block}.CodeMirror-gutter-wrapper{z-index:4;position:absolute;background:0 0!important;border:none!important}.CodeMirror-gutter-background{z-index:4;position:absolute;top:0;bottom:0}.CodeMirror-gutter-elt{cursor:default;z-index:4;position:absolute}.CodeMirror-gutter-wrapper ::selection{background-color:#0000}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{font-family:inherit;font-size:inherit;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual;background:0 0;border-width:0;border-radius:0;margin:0;position:relative;overflow:visible}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{z-index:0;position:absolute;inset:0}.CodeMirror-linewidget{z-index:2;padding:.1px;position:relative}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{visibility:hidden;width:100%;height:0;position:absolute;overflow:hidden}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;z-index:3;position:relative}div.CodeMirror-dragcursors,.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection{background:#d7d4f0}.CodeMirror-line>span::selection{background:#d7d4f0}.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection{background:#d7d4f0}.CodeMirror-line>span::-moz-selection{background:#d7d4f0}.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{flex-flow:wrap;display:flex}.EasyMDEContainer .CodeMirror{box-sizing:border-box;height:auto;font:inherit;z-index:0;word-wrap:break-word;border:1px solid #ced4da;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:10px}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{z-index:8;background:#fff;height:auto;inset:50px 0 0;border-right:none!important;border-bottom-right-radius:0!important;position:fixed!important}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;flex:auto;position:relative;border-right:none!important}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{-webkit-user-select:none;user-select:none;-o-user-select:none;border-top:1px solid #ced4da;border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative}.editor-toolbar.fullscreen{box-sizing:border-box;opacity:1;z-index:9;background:#fff;border:0;width:100%;height:50px;padding-top:10px;padding-bottom:10px;position:fixed;top:0;left:0}.editor-toolbar.fullscreen:before{background:-o-linear-gradient(270deg,#fff 0,#fff0 100%);background:-ms-linear-gradient(left,#fff 0,#fff0 100%);background:linear-gradient(90deg,#fff 0,#fff0);width:20px;height:50px;margin:0;padding:0;position:fixed;top:0;left:0}.editor-toolbar.fullscreen:after{background:-o-linear-gradient(270deg,#fff0 0,#fff 100%);background:-ms-linear-gradient(left,#fff0 0,#fff 100%);background:linear-gradient(90deg,#fff0 0,#fff);width:20px;height:50px;margin:0;padding:0;position:fixed;top:0;right:0}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{text-align:center;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:3px;height:30px;margin:0;padding:0;display:inline-block;text-decoration:none!important}.editor-toolbar button{white-space:nowrap;min-width:30px;padding:0 6px;font-weight:700}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{color:#0000;text-indent:-10px;border-left:1px solid #d9d9d9;border-right:1px solid #fff;width:0;margin:0 6px;display:inline-block}.editor-toolbar button:after{vertical-align:text-bottom;font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"▲"}.editor-toolbar button.heading-smaller:after{content:"▼"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;text-align:right;padding:8px 10px;font-size:12px}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{min-width:4em;margin-left:1em;display:inline-block}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{z-index:7;box-sizing:border-box;width:100%;height:100%;display:none;position:absolute;top:0;left:0;overflow:auto}.editor-preview-side{z-index:9;box-sizing:border-box;word-wrap:break-word;border:1px solid #ddd;width:50%;display:none;position:fixed;top:50px;bottom:0;right:0;overflow:auto}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{margin-bottom:.5rem;line-height:1.2}.cm-s-easymde .cm-comment{background:#0000000d;border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%);border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%)}.easymde-dropdown-content{visibility:hidden;z-index:2;background-color:#f9f9f9;padding:8px;display:block;position:absolute;top:30px;box-shadow:0 8px 16px #0003}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{content:"";background-image:var(--bg-image);max-width:100%;height:0;max-height:100%;padding-top:var(--height);width:var(--width);background-repeat:no-repeat;background-size:contain;display:block}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:#ff000026}.cropper-container{-webkit-touch-callout:none;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr;font-size:0;line-height:0;position:relative}.cropper-container img{backface-visibility:hidden;image-orientation:0deg;width:100%;height:100%;display:block;min-width:0!important;max-width:none!important;min-height:0!important;max-height:none!important}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{position:absolute;inset:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{opacity:0;background-color:#fff}.cropper-modal{opacity:.5;background-color:#000}.cropper-view-box{outline:1px solid #3399ffbf;width:100%;height:100%;display:block;overflow:hidden}.cropper-dashed{opacity:.5;border:0 dashed #eee;display:block;position:absolute}.cropper-dashed.dashed-h{border-top-width:1px;border-bottom-width:1px;width:100%;height:33.3333%;top:33.3333%;left:0}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;width:33.3333%;height:100%;top:0;left:33.3333%}.cropper-center{opacity:.75;width:0;height:0;display:block;position:absolute;top:50%;left:50%}.cropper-center:after,.cropper-center:before{content:" ";background-color:#eee;display:block;position:absolute}.cropper-center:before{width:7px;height:1px;top:0;left:-3px}.cropper-center:after{width:1px;height:7px;top:-3px;left:0}.cropper-face,.cropper-line,.cropper-point{opacity:.1;width:100%;height:100%;display:block;position:absolute}.cropper-face{background-color:#fff;top:0;left:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;width:5px;top:0;right:-3px}.cropper-line.line-n{cursor:ns-resize;height:5px;top:-3px;left:0}.cropper-line.line-w{cursor:ew-resize;width:5px;top:0;left:-3px}.cropper-line.line-s{cursor:ns-resize;height:5px;bottom:-3px;left:0}.cropper-point{opacity:.75;background-color:#39f;width:5px;height:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;top:50%;right:-3px}.cropper-point.point-n{cursor:ns-resize;margin-left:-3px;top:-3px;left:50%}.cropper-point.point-w{cursor:ew-resize;margin-top:-3px;top:50%;left:-3px}.cropper-point.point-s{cursor:s-resize;margin-left:-3px;bottom:-3px;left:50%}.cropper-point.point-ne{cursor:nesw-resize;top:-3px;right:-3px}.cropper-point.point-nw{cursor:nwse-resize;top:-3px;left:-3px}.cropper-point.point-sw{cursor:nesw-resize;bottom:-3px;left:-3px}.cropper-point.point-se{cursor:nwse-resize;opacity:1;width:20px;height:20px;bottom:-3px;right:-3px}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{opacity:.75;width:5px;height:5px}}.cropper-point.point-se:before{content:" ";opacity:0;background-color:#39f;width:200%;height:200%;display:block;position:absolute;bottom:-50%;right:-50%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{width:0;height:0;display:block;position:absolute}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.filepond--browser.filepond--browser{opacity:0;width:calc(100% - 2em);margin:0;padding:0;font-size:0;position:absolute;top:1.75em;left:1em}.filepond--data{visibility:hidden;pointer-events:none;contain:strict;border:none;width:0;height:0;margin:0;padding:0;position:absolute}.filepond--drip{opacity:.1;pointer-events:none;background:#00000003;border-radius:.5em;position:absolute;inset:0;overflow:hidden}.filepond--drip-blob{transform-origin:50%;background:#292625;border-radius:50%;width:8em;height:8em;margin-top:-4em;margin-left:-4em}.filepond--drip-blob,.filepond--drop-label{will-change:transform,opacity;position:absolute;top:0;left:0}.filepond--drop-label{color:#4f4f4f;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;height:0;margin:0;display:flex;right:0}.filepond--drop-label.filepond--drop-label label{margin:0;padding:.5em;display:block}.filepond--drop-label label{cursor:default;text-align:center;font-size:.875em;font-weight:400;line-height:1.5}.filepond--label-action{-webkit-text-decoration-skip:ink;-webkit-text-decoration-skip-ink:auto;text-decoration-skip-ink:auto;cursor:pointer;-webkit-text-decoration:underline #a7a4a4;text-decoration:underline #a7a4a4}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{width:1.625em;height:1.625em;font-family:inherit;font-size:1em;line-height:inherit;will-change:transform,opacity;border:none;outline:none;margin:0;padding:0}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.filepond--file-action-button.filepond--file-action-button svg{width:100%;height:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";position:absolute;inset:-.75em}.filepond--file-action-button{cursor:auto;color:#fff;background-color:#00000080;background-image:none;border-radius:50%;transition:box-shadow .25s ease-in;box-shadow:0 0 #fff0}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{color:#ffffff80;background-color:#00000040}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{will-change:transform,opacity;pointer-events:none;-webkit-user-select:none;user-select:none;flex-direction:column;flex:1;align-items:flex-start;min-width:0;margin:0 .5em 0 0;display:flex;position:static}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.75em;line-height:1.2;overflow:hidden}.filepond--file-info .filepond--file-info-sub{opacity:.5;white-space:nowrap;font-size:.625em;transition:opacity .25s ease-in-out}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{text-align:right;will-change:transform,opacity;pointer-events:none;-webkit-user-select:none;user-select:none;flex-direction:column;flex-grow:0;flex-shrink:0;align-items:flex-end;min-width:2.25em;margin:0;display:flex;position:static}.filepond--file-status *{white-space:nowrap;margin:0}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{opacity:.5;font-size:.625em;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;min-width:0;height:100%;margin:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.filepond--file{color:#fff;border-radius:.5em;align-items:flex-start;height:100%;padding:.5625em;display:flex;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:.5s linear .125s both fall}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:.65s linear both shake}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:1s linear infinite spin}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{opacity:0;animation-timing-function:ease-out;transform:scale(.5)}70%{opacity:1;animation-timing-function:ease-in-out;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";z-index:100;position:absolute;inset:0}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{z-index:1;will-change:transform,opacity;touch-action:auto;margin:.25em;padding:0;position:absolute;top:0;left:0;right:0}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:-webkit-grab;cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{transition:box-shadow .125s ease-in-out;box-shadow:0 0 #0000}.filepond--item[data-drag-state=drag]{cursor:-webkit-grabbing;cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{will-change:transform;margin:0;position:absolute;top:0;left:0;right:0}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;overflow:hidden scroll;-webkit-mask:linear-gradient(#000 calc(100% - .5em),#0000);mask:linear-gradient(#000 calc(100% - .5em),#0000)}.filepond--list-scroller::-webkit-scrollbar{background:0 0}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-color:#0000004d;background-clip:content-box;border:.3125em solid #0000;border-radius:99999px}.filepond--list.filepond--list{will-change:transform;margin:0;padding:0;list-style-type:none;position:absolute;top:0}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{width:100%;max-width:none;height:100%;margin:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7;justify-content:center;align-items:center;height:auto;display:flex;bottom:0}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-top:0;margin-bottom:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*,.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status{display:none}@media not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{pointer-events:none;margin:0;position:absolute;top:0;left:0;right:0;height:100%!important}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{-webkit-transform-style:preserve-3d;transform-style:preserve-3d;background-color:#0000!important;border:none!important}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{margin:0;padding:0;position:absolute;top:0;left:0;right:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.filepond--panel-top:after{content:"";background-color:inherit;height:2px;position:absolute;bottom:-1px;left:0;right:0}.filepond--panel-bottom,.filepond--panel-center{will-change:transform;backface-visibility:hidden;transform-origin:0 0;transform:translateY(.5em)}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{content:"";background-color:inherit;height:2px;position:absolute;top:-1px;left:0;right:0}.filepond--panel-center{border-top:none!important;border-bottom:none!important;border-radius:0!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;pointer-events:none;will-change:transform,opacity;width:1.25em;height:1.25em;margin:0;position:static}.filepond--progress-indicator svg{vertical-align:top;transform-box:fill-box;width:100%;height:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;text-align:left;text-rendering:optimizeLegibility;contain:layout style size;direction:ltr;margin-bottom:1em;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;position:relative}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-top:1em;margin-bottom:1em}.filepond--root .filepond--credits{opacity:.4;color:inherit;z-index:3;font-size:11px;line-height:.85;text-decoration:none;position:absolute;bottom:-14px;right:0}.filepond--root .filepond--credits[style]{margin-top:14px;top:0;bottom:auto}.filepond--action-edit-item.filepond--action-edit-item{width:2em;height:2em;padding:.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{line-height:inherit;color:inherit;pointer-events:all;background:0 0;border:none;outline:none;margin:0 0 0 .25em;padding:0;font-family:inherit;position:absolute}.filepond--action-edit-item-alt svg{width:1.3125em;height:1.3125em}.filepond--action-edit-item-alt span{opacity:0;font-size:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{position:absolute;top:0;left:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{opacity:0;z-index:2;pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;min-height:5rem;max-height:7rem;margin:0;display:block;position:absolute;top:0;left:0}.filepond--image-preview-overlay svg{width:100%;height:auto;color:inherit;max-height:inherit}.filepond--image-preview-overlay-idle{mix-blend-mode:multiply;color:#282828d9}.filepond--image-preview-overlay-success{mix-blend-mode:normal;color:#369763}.filepond--image-preview-overlay-failure{mix-blend-mode:normal;color:#c44e47}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{-webkit-user-select:none;user-select:none;background:#00000003;border-radius:.45em;height:100%;margin:0;position:absolute;top:0;left:0;right:0;overflow:hidden}.filepond--image-preview{z-index:1;pointer-events:none;will-change:transform,opacity;background:#222;align-items:center;width:100%;height:100%;display:flex;position:absolute;top:0;left:0}.filepond--image-clip{margin:0 auto;position:relative;overflow:hidden}.filepond--image-clip[data-transparency-indicator=grid] img,.filepond--image-clip[data-transparency-indicator=grid] canvas{background-color:#fff;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0 H50 V50 H0'/%3E%3Cpath d='M50 50 H100 V100 H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{will-change:transform;position:absolute;top:0;left:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{justify-content:center;align-items:center;height:100%;display:flex}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{top:auto;bottom:0;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-top:0;margin-bottom:.1875em;margin-left:.1875em}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{width:calc(100% - 1.4em);margin:2.3em auto auto}.filepond--media-preview .playpausebtn{float:left;cursor:pointer;background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;outline:none;width:25px;height:25px;margin-top:.3em;margin-right:.3em}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{float:left;background:#ffffff4d;border-radius:15px;width:calc(100% - 2.5em);height:3px;margin-top:1em}.filepond--media-preview .playhead{background:#fff;border-radius:50%;width:13px;height:13px;margin-top:-5px}.filepond--media-preview-wrapper{pointer-events:auto;background:#00000003;border-radius:.45em;height:100%;margin:0;position:absolute;top:0;left:0;right:0;overflow:hidden}.filepond--media-preview-wrapper:before{content:" ";width:100%;height:2em;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);z-index:3;background:linear-gradient(#000,#0000);position:absolute}.filepond--media-preview{z-index:1;transform-origin:50%;will-change:transform,opacity;width:100%;height:100%;display:block;position:relative}.filepond--media-preview video,.filepond--media-preview audio{will-change:transform;width:100%}.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:#0000;-webkit-user-select:none;user-select:none;-ms-touch-action:none;touch-action:none;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{z-index:1;width:100%;height:100%;position:relative}.noUi-connects{z-index:0;overflow:hidden}.noUi-connect,.noUi-origin{will-change:transform;z-index:1;transform-origin:0 0;width:100%;height:100%;-webkit-transform-style:preserve-3d;transform-style:flat;position:absolute;top:0;right:0}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{width:0;top:-100%}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{backface-visibility:hidden;position:absolute}.noUi-touch-area{width:100%;height:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;top:-6px;right:-17px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;bottom:-17px;right:-6px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#fafafa;border:1px solid #d3d3d3;border-radius:4px;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.noUi-connects{border-radius:3px}.noUi-connect{background:#3fb8af}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{cursor:default;background:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noUi-handle:before,.noUi-handle:after{content:"";background:#e8e7e6;width:1px;height:14px;display:block;position:absolute;top:6px;left:14px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:before,.noUi-vertical .noUi-handle:after{width:14px;height:1px;top:14px;left:6px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#b8b8b8}[disabled].noUi-target,[disabled].noUi-handle,[disabled] .noUi-handle{cursor:not-allowed}.noUi-pips,.noUi-pips *{box-sizing:border-box}.noUi-pips{color:#999;position:absolute}.noUi-value{white-space:nowrap;text-align:center;position:absolute}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{background:#ccc;position:absolute}.noUi-marker-sub,.noUi-marker-large{background:#aaa}.noUi-pips-horizontal{width:100%;height:80px;padding:10px 0;top:100%;left:0}.noUi-value-horizontal{transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{width:2px;height:5px;margin-left:-1px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{height:100%;padding:0 10px;top:0;left:100%}.noUi-value-vertical{padding-left:25px;transform:translateY(-50%)}.noUi-rtl .noUi-value-vertical{transform:translateY(50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{color:#000;text-align:center;white-space:nowrap;background:#fff;border:1px solid #d9d9d9;border-radius:3px;padding:5px;display:block;position:absolute}.noUi-horizontal .noUi-tooltip{bottom:120%;left:50%;transform:translate(-50%)}.noUi-vertical .noUi-tooltip{top:50%;right:120%;transform:translateY(-50%)}.noUi-horizontal .noUi-origin>.noUi-tooltip{bottom:10px;left:auto;transform:translate(50%)}.noUi-vertical .noUi-origin>.noUi-tooltip{top:auto;right:28px;transform:translateY(-18px)}.fi-fo-builder{row-gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}.fi-fo-builder .fi-fo-builder-actions{column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-builder .fi-fo-builder-actions.fi-hidden{display:none}.fi-fo-builder .fi-fo-builder-items{grid-template-columns:repeat(1,minmax(0,1fr));display:grid}.fi-fo-builder .fi-fo-builder-items>*+*{margin-top:calc(var(--spacing)*4)}.fi-fo-builder .fi-fo-builder-item{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-item.fi-collapsed .fi-fo-builder-item-header-collapsible-actions{rotate:-180deg}.fi-fo-builder .fi-fo-builder-item.fi-collapsed .fi-fo-builder-item-header-collapse-action,.fi-fo-builder .fi-fo-builder-item:not(.fi-collapsed) .fi-fo-builder-item-header-expand-action{pointer-events:none;opacity:0}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-item{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#0000;border-radius:0}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-item>.fi-fo-builder-item-content{padding:calc(var(--spacing)*0)}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-label-between-items-ctn>.fi-fo-builder-label-between-items-divider-before{width:calc(var(--spacing)*0)}.fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-label-between-items-ctn>.fi-fo-builder-label-between-items{padding-inline-start:calc(var(--spacing)*0)}.fi-fo-builder .fi-fo-builder-item-header{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex;overflow:hidden}.fi-fo-builder.fi-collapsible .fi-fo-builder-item-header{cursor:pointer;-webkit-user-select:none;user-select:none}.fi-fo-builder .fi-fo-builder-item-header-start-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-builder .fi-fo-builder-item-header-icon{color:var(--gray-400);flex-shrink:0}.fi-fo-builder .fi-fo-builder-item-header-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-builder .fi-fo-builder-item-header-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-fo-builder .fi-fo-builder-item-header-label:where(.dark,.dark *){color:var(--color-white)}.fi-fo-builder .fi-fo-builder-item-header-label.fi-truncated{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-fo-builder .fi-fo-builder-item-header-end-actions{align-items:center;column-gap:calc(var(--spacing)*3);margin-inline-start:auto;display:flex}.fi-fo-builder .fi-fo-builder-item-header-collapsible-actions{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:relative}.fi-fo-builder .fi-fo-builder-item-header-collapse-action{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fi-fo-builder .fi-fo-builder-item-header-expand-action{inset:calc(var(--spacing)*0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;rotate:180deg}.fi-fo-builder .fi-fo-builder-item-content:not(.fi-fo-builder-item-content-has-preview){padding:calc(var(--spacing)*4)}.fi-fo-builder .fi-fo-builder-item-content.fi-fo-builder-item-content-has-preview{position:relative}.fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-100)}.fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-item-preview:not(.fi-interactive){pointer-events:none}.fi-fo-builder .fi-fo-builder-item-preview-edit-overlay{inset:calc(var(--spacing)*0);z-index:1;cursor:pointer;position:absolute}.fi-fo-builder .fi-fo-builder-block-picker-ctn{border-radius:var(--radius-lg);background-color:var(--color-white)}.fi-fo-builder .fi-fo-builder-block-picker-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.fi-fo-builder .fi-fo-builder-add-between-items-ctn{pointer-events:none;visibility:hidden;margin-top:calc(var(--spacing)*0);height:calc(var(--spacing)*0);opacity:0;width:100%;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));justify-content:center;display:flex;position:relative;overflow:visible}.fi-fo-builder .fi-fo-builder-item:hover+.fi-fo-builder-add-between-items-ctn,.fi-fo-builder .fi-fo-builder-add-between-items-ctn:has(+.fi-fo-builder-item:hover),.fi-fo-builder .fi-fo-builder-add-between-items-ctn:hover,.fi-fo-builder .fi-fo-builder-add-between-items-ctn:focus-within{pointer-events:auto;visibility:visible;opacity:1}.fi-fo-builder .fi-fo-builder-add-between-items{z-index:10;--tw-translate-y:calc(-50% + .5rem);translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--radius-lg);background-color:var(--color-white);position:absolute;top:50%}.fi-fo-builder .fi-fo-builder-add-between-items:where(.dark,.dark *){background-color:var(--gray-900)}.fi-fo-builder .fi-fo-builder-label-between-items-ctn{margin-top:calc(var(--spacing)*1);margin-bottom:calc(var(--spacing)*-3);align-items:center;display:flex;position:relative}.fi-fo-builder .fi-fo-builder-label-between-items-divider-before{width:calc(var(--spacing)*3);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex-shrink:0}.fi-fo-builder .fi-fo-builder-label-between-items-divider-before:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-label-between-items-divider-before:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-label-between-items{padding-inline:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);flex-shrink:0}.fi-fo-builder .fi-fo-builder-label-between-items:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-builder .fi-fo-builder-label-between-items-divider-after{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex:1}.fi-fo-builder .fi-fo-builder-label-between-items-divider-after:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-builder .fi-fo-builder-label-between-items-divider-after:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-builder .fi-fo-builder-block-picker{justify-content:center;display:flex}.fi-fo-builder .fi-fo-builder-block-picker.fi-align-start,.fi-fo-builder .fi-fo-builder-block-picker.fi-align-left{justify-content:flex-start}.fi-fo-builder .fi-fo-builder-block-picker.fi-align-end,.fi-fo-builder .fi-fo-builder-block-picker.fi-align-right{justify-content:flex-end}.fi-fo-checkbox-list .fi-fo-checkbox-list-search-input-wrp{margin-bottom:calc(var(--spacing)*4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-actions{margin-bottom:calc(var(--spacing)*2)}.fi-fo-checkbox-list .fi-fo-checkbox-list-options{gap:calc(var(--spacing)*4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-options.fi-grid-direction-col{margin-top:calc(var(--spacing)*-4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-options.fi-grid-direction-col .fi-fo-checkbox-list-option-ctn{break-inside:avoid;padding-top:calc(var(--spacing)*4)}.fi-fo-checkbox-list .fi-fo-checkbox-list-option{column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-checkbox-input{margin-top:calc(var(--spacing)*1);flex-shrink:0}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);display:grid}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);overflow-wrap:break-word;color:var(--gray-950);overflow:hidden}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-label:where(.dark,.dark *){color:var(--color-white)}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-description{color:var(--gray-500)}.fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-description:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-checkbox-list .fi-fo-checkbox-list-no-search-results-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-fo-checkbox-list .fi-fo-checkbox-list-no-search-results-message:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-code-editor{overflow:hidden}.fi-fo-code-editor .cm-editor.cm-focused{--tw-outline-style:none!important;outline-style:none!important}.fi-fo-code-editor .cm-editor .cm-gutters{min-height:calc(var(--spacing)*48)!important;border-inline-end-color:var(--gray-300)!important;background-color:var(--gray-100)!important}.fi-fo-code-editor .cm-editor .cm-gutters:where(.dark,.dark *){border-inline-end-color:var(--gray-800)!important;background-color:var(--gray-950)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement{border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md);margin-inline-start:calc(var(--spacing)*1)}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter{background-color:var(--gray-200)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter:where(.dark,.dark *){background-color:var(--gray-800)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter{background-color:var(--gray-200)!important}.fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter:where(.dark,.dark *){background-color:var(--gray-800)!important}.fi-fo-code-editor .cm-editor .cm-scroller{min-height:calc(var(--spacing)*48)!important}.fi-fo-code-editor .cm-editor .cm-line{border-start-end-radius:var(--radius-md);border-end-end-radius:var(--radius-md);margin-inline-end:calc(var(--spacing)*1)}.fi-fo-code-editor.fi-disabled .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter,.fi-fo-code-editor.fi-disabled .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter,.fi-fo-code-editor.fi-disabled .cm-editor .cm-line.cm-activeLine{background-color:#0000!important}.fi-fo-color-picker .fi-input-wrp-content{display:flex}.fi-fo-color-picker .fi-fo-color-picker-preview{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);-webkit-user-select:none;user-select:none;border-radius:3.40282e38px;flex-shrink:0;margin-block:auto;margin-inline-end:calc(var(--spacing)*3)}.fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-200);--tw-ring-inset:inset}.fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-color-picker .fi-fo-color-picker-panel{z-index:10;border-radius:var(--radius-lg);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:none;position:absolute}.fi-fo-date-time-picker input::-webkit-datetime-edit{padding:0;display:block}.fi-fo-date-time-picker .fi-fo-date-time-picker-trigger{width:100%}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{--tw-border-style:none;width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);--tw-outline-style:none;background-color:#0000;border-style:none;outline-style:none}@media (forced-colors:active){.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{outline-offset:2px;outline:2px solid #0000}}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input::placeholder{color:var(--gray-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel{z-index:10;position:absolute}:where(.fi-fo-date-time-picker .fi-fo-date-time-picker-panel>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel{border-radius:var(--radius-lg);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-date-time-picker .fi-fo-date-time-picker-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-date-time-picker .fi-fo-date-time-picker-panel .fi-fo-date-time-picker-panel-header{justify-content:space-between;align-items:center;display:flex}.fi-fo-date-time-picker .fi-fo-date-time-picker-month-select{cursor:pointer;--tw-border-style:none;padding:calc(var(--spacing)*0);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);background-color:#0000;border-style:none;flex-grow:1}.fi-fo-date-time-picker .fi-fo-date-time-picker-month-select:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-month-select:where(.dark,.dark *){background-color:var(--gray-900);color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-year-input{width:calc(var(--spacing)*16);--tw-border-style:none;padding:calc(var(--spacing)*0);text-align:right;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-950);background-color:#0000;border-style:none}.fi-fo-date-time-picker .fi-fo-date-time-picker-year-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-year-input:where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header{gap:calc(var(--spacing)*1);grid-template-columns:repeat(7,minmax(0,1fr));display:grid}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header .fi-fo-date-time-picker-calendar-header-day{text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header .fi-fo-date-time-picker-calendar-header-day:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar{grid-template-columns:repeat(7,minmax(calc(var(--spacing)*7),1fr));gap:calc(var(--spacing)*1);display:grid}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day{text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:var(--leading-loose);line-height:var(--leading-loose);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;border-radius:3.40282e38px;transition-duration:75ms}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-disabled{pointer-events:none;opacity:.5}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-disabled){cursor:pointer}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected{background-color:var(--gray-50);color:var(--primary-600)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled){background-color:var(--gray-100)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-fo-date-time-picker-calendar-day-today:not(.fi-focused):not(.fi-selected):not(.fi-disabled){color:var(--primary-600)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-fo-date-time-picker-calendar-day-today:not(.fi-focused):not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){color:var(--primary-400)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-fo-date-time-picker-calendar-day-today):not(.fi-selected){color:var(--gray-950)}.fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-fo-date-time-picker-calendar-day-today):not(.fi-selected):where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs{justify-content:center;align-items:center;display:flex}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input{width:calc(var(--spacing)*10);--tw-border-style:none;padding:calc(var(--spacing)*0);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-950);background-color:#0000;border-style:none;margin-inline-end:calc(var(--spacing)*1)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input:where(.dark,.dark *){color:var(--color-white)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs .fi-fo-date-time-picker-time-input-separator{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs .fi-fo-date-time-picker-time-input-separator:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-field{row-gap:calc(var(--spacing)*2);display:grid}@media (min-width:40rem){.fi-fo-field.fi-fo-field-has-inline-label{align-items:flex-start;column-gap:calc(var(--spacing)*4);grid-template-columns:repeat(3,minmax(0,1fr))}.fi-fo-field.fi-fo-field-has-inline-label .fi-fo-field-content-col{grid-column:span 2/span 2}}.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label{align-items:flex-start;column-gap:calc(var(--spacing)*3);display:flex}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-checkbox-input{margin-top:calc(var(--spacing)*.5);flex-shrink:0}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-toggle{margin-block:calc(var(--spacing)*-.5)}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-sc:first-child{flex-grow:0}:is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label).fi-hidden{display:none}.fi-fo-field .fi-fo-field-label-content{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-fo-field .fi-fo-field-label-content:where(.dark,.dark *){color:var(--color-white)}.fi-fo-field .fi-fo-field-label-content .fi-fo-field-label-required-mark{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-600)}.fi-fo-field .fi-fo-field-label-content .fi-fo-field-label-required-mark:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-field .fi-fo-field-label-col{row-gap:calc(var(--spacing)*2);grid-auto-columns:minmax(0,1fr);height:100%;display:grid}@media (min-width:40rem){.fi-fo-field .fi-fo-field-label-col.fi-vertical-align-start{align-items:flex-start}.fi-fo-field .fi-fo-field-label-col.fi-vertical-align-center{align-items:center}.fi-fo-field .fi-fo-field-label-col.fi-vertical-align-end{align-items:flex-end}}.fi-fo-field .fi-fo-field-content-col{row-gap:calc(var(--spacing)*2);grid-auto-columns:minmax(0,1fr);display:grid}.fi-fo-field .fi-fo-field-content-ctn{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;display:flex}.fi-fo-field .fi-fo-field-content{width:100%}.fi-fo-field .fi-fo-field-wrp-error-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--danger-600)}.fi-fo-field .fi-fo-field-wrp-error-message:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-field .fi-fo-field-wrp-error-list{list-style-type:disc;list-style-position:inside}:where(.fi-fo-field .fi-fo-field-wrp-error-list>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}.fi-fo-file-upload{row-gap:calc(var(--spacing)*2);flex-direction:column;display:flex}.fi-fo-file-upload.fi-align-start,.fi-fo-file-upload.fi-align-left{align-items:flex-start}.fi-fo-file-upload.fi-align-center{align-items:center}.fi-fo-file-upload.fi-align-end,.fi-fo-file-upload.fi-align-right{align-items:flex-end}.fi-fo-file-upload .fi-fo-file-upload-input-ctn{width:100%;height:100%}.fi-fo-file-upload.fi-fo-file-upload-avatar .fi-fo-file-upload-input-ctn{height:100%;width:calc(var(--spacing)*32)}.fi-fo-file-upload .fi-fo-file-upload-error-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--danger-600)}.fi-fo-file-upload .fi-fo-file-upload-error-message:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-file-upload .filepond--root{margin-bottom:calc(var(--spacing)*0);border-radius:var(--radius-lg);background-color:var(--color-white);font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow:hidden}.fi-fo-file-upload .filepond--root:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--root:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-file-upload .filepond--root:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--root:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-file-upload .filepond--root[data-disabled=disabled]{background-color:var(--gray-50)}.fi-fo-file-upload .filepond--root[data-disabled=disabled]:where(.dark,.dark *){--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--root[data-disabled=disabled]:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-file-upload .filepond--root[data-style-panel-layout=compact\ circle]{border-radius:3.40282e38px}.fi-fo-file-upload .filepond--panel-root{background-color:#0000}.fi-fo-file-upload .filepond--drop-label label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600);padding:calc(var(--spacing)*3)!important}.fi-fo-file-upload .filepond--drop-label label:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-file-upload .filepond--label-action{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--primary-600);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;text-decoration-line:none;transition-duration:75ms}@media (hover:hover){.fi-fo-file-upload .filepond--label-action:hover{color:var(--primary-500)}}.fi-fo-file-upload .filepond--label-action:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.fi-fo-file-upload .filepond--label-action:where(.dark,.dark *):hover{color:var(--primary-500)}}.fi-fo-file-upload .filepond--drip-blob{background-color:var(--gray-400)}.fi-fo-file-upload .filepond--drip-blob:where(.dark,.dark *){background-color:var(--gray-500)}.fi-fo-file-upload .filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(50% - .5rem);display:inline}@media (min-width:64rem){.fi-fo-file-upload .filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.fi-fo-file-upload .filepond--download-icon{pointer-events:auto;width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);background-color:var(--color-white);vertical-align:bottom;margin-inline-end:calc(var(--spacing)*1);display:inline-block}@media (hover:hover){.fi-fo-file-upload .filepond--download-icon:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--download-icon:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}}.fi-fo-file-upload .filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItZG93bmxvYWQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iNyAxMCAxMiAxNSAxNyAxMCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIxNSIgeDI9IjEyIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItZG93bmxvYWQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iNyAxMCAxMiAxNSAxNyAxMCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIxNSIgeDI9IjEyIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPg==);-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.fi-fo-file-upload .filepond--open-icon{pointer-events:auto;width:calc(var(--spacing)*4);height:calc(var(--spacing)*4);background-color:var(--color-white);vertical-align:bottom;margin-inline-end:calc(var(--spacing)*1);display:inline-block}@media (hover:hover){.fi-fo-file-upload .filepond--open-icon:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--open-icon:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}}.fi-fo-file-upload .filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogIDxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwMC0yIDJ2MTBhMiAyIDAgMDAyIDJoMTBhMiAyIDAgMDAyLTJ2LTRNMTQgNGg2bTAgMHY2bTAtNkwxMCAxNCIgLz4KPC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogIDxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwMC0yIDJ2MTBhMiAyIDAgMDAyIDJoMTBhMiAyIDAgMDAyLTJ2LTRNMTQgNGg2bTAgMHY2bTAtNkwxMCAxNCIgLz4KPC9zdmc+Cg==);-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.fi-fo-file-upload .filepond--file-action-button.filepond--action-edit-item{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .filepond--file-action-button.filepond--action-edit-item{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor{inset:calc(var(--spacing)*0);isolation:isolate;z-index:50;width:100vw;height:100dvh;padding:calc(var(--spacing)*2);position:fixed}@media (min-width:40rem){.fi-fo-file-upload .fi-fo-file-upload-editor{padding:calc(var(--spacing)*10)}}@media (min-width:48rem){.fi-fo-file-upload .fi-fo-file-upload-editor{padding:calc(var(--spacing)*20)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{inset:calc(var(--spacing)*0);cursor:pointer;background-color:var(--gray-950);width:100%;height:100%;position:fixed}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{will-change:transform}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{isolation:isolate;border-radius:var(--radius-xl);background-color:var(--color-white);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100%;height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-900);flex-direction:column;margin-inline:auto;display:flex;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{--tw-ring-color:color-mix(in oklab,var(--gray-900)10%,transparent)}}@media (min-width:64rem){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{flex-direction:row}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window:where(.dark,.dark *){background-color:var(--gray-800);--tw-ring-color:var(--gray-50)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-50)10%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-image-ctn{margin:calc(var(--spacing)*4);flex:1;max-width:100%;max-height:100%}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-image{width:auto;height:100%}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel{background-color:var(--gray-50);flex-direction:column;flex:1;width:100%;height:100%;display:flex;overflow-y:auto}@media (min-width:64rem){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel{max-width:var(--container-xs)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main{flex:1}:where(.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main{padding:calc(var(--spacing)*4);overflow:auto}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group{gap:calc(var(--spacing)*3);display:grid}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn-group{width:100%}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn.fi-active{background-color:var(--gray-50)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn.fi-active:where(.dark,.dark *){background-color:var(--gray-700)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-fo-file-upload-editor-control-panel-group-title{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-950)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-fo-file-upload-editor-control-panel-group-title:where(.dark,.dark *){color:var(--color-white)}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-footer{align-items:center;gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex}.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-reset-action{margin-left:auto}.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{background-color:var(--gray-100)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{background-color:color-mix(in oklab,var(--gray-100)50%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{opacity:1}.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)80%,transparent)}}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-circle-cropper .cropper-view-box,.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-circle-cropper .cropper-face{border-radius:50%}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-window{max-width:var(--container-3xl);flex-direction:column}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-image-ctn{min-height:calc(var(--spacing)*0);flex:1;overflow:hidden}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel{flex:none;height:auto}@media (min-width:64rem){.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel{max-width:none}}.fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel-footer{justify-content:flex-start}:where(.fi-fo-key-value .fi-fo-key-value-table-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-key-value .fi-fo-key-value-table{table-layout:auto;width:100%}:where(.fi-fo-key-value .fi-fo-key-value-table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-key-value .fi-fo-key-value-table>thead>tr>th{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-fo-key-value .fi-fo-key-value-table>thead>tr>th:where(.dark,.dark *){color:var(--gray-200)}.fi-fo-key-value .fi-fo-key-value-table>thead>tr>th.fi-has-action{width:calc(var(--spacing)*9);padding:calc(var(--spacing)*0)}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));border-color:var(--gray-200)}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-divide-x-reverse:1}:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td{width:50%;padding:calc(var(--spacing)*0)}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td.fi-has-action{width:auto;padding:calc(var(--spacing)*.5)}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td.fi-has-action .fi-fo-key-value-table-row-sortable-handle{display:flex}.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td .fi-input{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-fo-key-value .fi-fo-key-value-add-action-ctn{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);justify-content:center;display:flex}@media (min-width:40rem){.fi-fo-key-value-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-markdown-editor{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.fi-fo-markdown-editor:not(.fi-disabled){max-width:100%;font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-950);overflow:hidden}.fi-fo-markdown-editor:not(.fi-disabled):where(.dark,.dark *){color:var(--color-white)}.fi-fo-markdown-editor.fi-disabled{border-radius:var(--radius-lg);background-color:var(--gray-50);width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);display:block}.fi-fo-markdown-editor.fi-disabled:where(.dark,.dark *){color:var(--gray-400);--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor.fi-disabled:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror{padding-inline:calc(var(--spacing)*4)!important;padding-block:calc(var(--spacing)*3)!important}.fi-fo-markdown-editor .cm-s-easymde .cm-comment{color:var(--color-cm-gray-muted);background-color:#0000}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-property,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-operator{color:var(--color-cm-gray)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-string,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-bracket,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-quote~.cm-quote{color:var(--color-cm-gray-muted)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list~.cm-variable-2,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list~.cm-variable-3,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list~.cm-keyword,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab~.cm-variable-2,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab~.cm-variable-3,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab~.cm-keyword{color:var(--color-cm-gray)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab~.cm-comment{color:inherit;background-color:#0000}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror{--tw-border-style:none;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);color:inherit;background-color:#0000;border-style:none}.fi-fo-markdown-editor .EasyMDEContainer .CodeMirror-scroll{height:auto}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar{gap:calc(var(--spacing)*1);border-style:var(--tw-border-style);border-width:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*2);border-radius:0;flex-wrap:wrap;display:flex}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8);border-radius:var(--radius-lg);--tw-border-style:none;padding:calc(var(--spacing)*0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;border-style:none;place-content:center;transition-duration:75ms;display:grid}@media (hover:hover){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:hover{background-color:var(--gray-50)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active{background-color:var(--gray-50)}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:before{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);background-color:var(--gray-700);content:"";display:block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:before{background-color:var(--primary-600)}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .separator{width:calc(var(--spacing)*1);--tw-border-style:none;border-style:none;margin:calc(var(--spacing)*0)!important}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z' /%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z' /%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 12h10' /%3E%3Cpath d='M7 5v14' /%3E%3Cpath d='M17 5v14' /%3E%3Cpath d='M15 19h4' /%3E%3Cpath d='M15 5h4' /%3E%3Cpath d='M5 19h4' /%3E%3Cpath d='M5 5h4' /%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 12h10' /%3E%3Cpath d='M7 5v14' /%3E%3Cpath d='M17 5v14' /%3E%3Cpath d='M15 19h4' /%3E%3Cpath d='M15 5h4' /%3E%3Cpath d='M5 19h4' /%3E%3Cpath d='M5 5h4' /%3E%3C/svg%3E")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 15.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 10a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 15.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01ZM1.99 10a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3ZM2.97 8.654a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 9.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 15.5a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM2.625 13.875a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3ZM2.97 8.654a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 9.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM7.75 15.5a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5ZM2.625 13.875a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")}.fi-fo-markdown-editor .EasyMDEContainer .editor-statusbar{display:none}.fi-fo-markdown-editor:where(.dark,.dark *){--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert()}.fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .editor-toolbar button:before{background-color:var(--gray-300)}.fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .editor-toolbar button.active:before{background-color:var(--primary-400)}[x-sortable]:has(.fi-sortable-ghost) .fi-fo-markdown-editor{pointer-events:none}.fi-fo-modal-table-select:not(.fi-fo-modal-table-select-multiple){align-items:flex-start;column-gap:calc(var(--spacing)*3);--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5);display:flex}.fi-fo-modal-table-select.fi-fo-modal-table-select-multiple{gap:calc(var(--spacing)*2);display:grid}.fi-fo-modal-table-select.fi-fo-modal-table-select-multiple .fi-fo-modal-table-select-badges-ctn{gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.fi-fo-modal-table-select .fi-fo-modal-table-select-placeholder{color:var(--gray-400)}.fi-fo-modal-table-select .fi-fo-modal-table-select-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-radio{gap:calc(var(--spacing)*4)}.fi-fo-radio.fi-inline{flex-wrap:wrap;display:flex}.fi-fo-radio:not(.fi-inline).fi-grid-direction-col{margin-top:calc(var(--spacing)*-4)}.fi-fo-radio:not(.fi-inline).fi-grid-direction-col>.fi-fo-radio-label{break-inside:avoid;padding-top:calc(var(--spacing)*4)}.fi-fo-radio>.fi-fo-radio-label{column-gap:calc(var(--spacing)*3);align-self:flex-start;display:flex}.fi-fo-radio>.fi-fo-radio-label>.fi-radio-input{margin-top:calc(var(--spacing)*1);flex-shrink:0}.fi-fo-radio>.fi-fo-radio-label>.fi-fo-radio-label-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);display:grid}.fi-fo-radio>.fi-fo-radio-label>.fi-fo-radio-label-text:where(.dark,.dark *){color:var(--color-white)}.fi-fo-radio>.fi-fo-radio-label .fi-fo-radio-label-description{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:var(--gray-500)}.fi-fo-radio>.fi-fo-radio-label .fi-fo-radio-label-description:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-repeater{row-gap:calc(var(--spacing)*4);display:grid}.fi-fo-repeater .fi-fo-repeater-actions{column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-repeater .fi-fo-repeater-actions.fi-hidden{display:none}.fi-fo-repeater .fi-fo-repeater-items{align-items:flex-start;gap:calc(var(--spacing)*4)}.fi-fo-repeater .fi-fo-repeater-item{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-item.fi-collapsed .fi-fo-repeater-item-header-collapsible-actions{rotate:-180deg}.fi-fo-repeater .fi-fo-repeater-item.fi-collapsed .fi-fo-repeater-item-header-collapse-action,.fi-fo-repeater .fi-fo-repeater-item:not(.fi-collapsed) .fi-fo-repeater-item-header-expand-action{pointer-events:none;opacity:0}.fi-fo-repeater .fi-fo-repeater-item-header{align-items:center;column-gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex;overflow:hidden}.fi-fo-repeater.fi-collapsible .fi-fo-repeater-item-header{cursor:pointer;-webkit-user-select:none;user-select:none}.fi-fo-repeater .fi-fo-repeater-item-header-start-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-repeater .fi-fo-repeater-item-header-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-fo-repeater .fi-fo-repeater-item-header-label:where(.dark,.dark *){color:var(--color-white)}.fi-fo-repeater .fi-fo-repeater-item-header-label.fi-truncated{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fi-fo-repeater .fi-fo-repeater-item-header-end-actions{align-items:center;column-gap:calc(var(--spacing)*3);margin-inline-start:auto;display:flex}.fi-fo-repeater .fi-fo-repeater-item-header-collapsible-actions{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:relative}.fi-fo-repeater .fi-fo-repeater-item-header-collapse-action{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fi-fo-repeater .fi-fo-repeater-item-header-expand-action{inset:calc(var(--spacing)*0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;rotate:180deg}.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-100)}.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-item-content{padding:calc(var(--spacing)*4)}.fi-fo-repeater .fi-fo-repeater-add-between-items-ctn{justify-content:center;width:100%;display:flex}.fi-fo-repeater .fi-fo-repeater-add-between-items{border-radius:var(--radius-lg);background-color:var(--color-white)}.fi-fo-repeater .fi-fo-repeater-add-between-items:where(.dark,.dark *){background-color:var(--gray-900)}.fi-fo-repeater .fi-fo-repeater-label-between-items-ctn{margin-block:calc(var(--spacing)*-2);align-items:center;display:flex;position:relative}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before{width:calc(var(--spacing)*3);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex-shrink:0}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-label-between-items{padding-inline:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);flex-shrink:0}.fi-fo-repeater .fi-fo-repeater-label-between-items:where(.dark,.dark *){color:var(--gray-400)}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);flex:1}.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-repeater .fi-fo-repeater-add{justify-content:center;width:100%;display:flex}.fi-fo-repeater .fi-fo-repeater-add.fi-align-start,.fi-fo-repeater .fi-fo-repeater-add.fi-align-left{justify-content:flex-start}.fi-fo-repeater .fi-fo-repeater-add.fi-align-end,.fi-fo-repeater .fi-fo-repeater-add.fi-align-right{justify-content:flex-end}.fi-fo-simple-repeater{row-gap:calc(var(--spacing)*4);display:grid}.fi-fo-simple-repeater .fi-fo-simple-repeater-items{gap:calc(var(--spacing)*4)}.fi-fo-simple-repeater .fi-fo-simple-repeater-item{justify-content:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.fi-fo-simple-repeater .fi-fo-simple-repeater-item-content{flex:1}.fi-fo-simple-repeater .fi-fo-simple-repeater-item-actions{align-items:center;column-gap:calc(var(--spacing)*1);display:flex}.fi-fo-simple-repeater .fi-fo-simple-repeater-add{justify-content:center;width:100%;display:flex}.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-start,.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-left{justify-content:flex-start}.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-end,.fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-right{justify-content:flex-end}.fi-fo-table-repeater{gap:calc(var(--spacing)*3);display:grid}.fi-fo-table-repeater>table{width:100%;display:block}:where(.fi-fo-table-repeater>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-fo-table-repeater>table{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}:where(.fi-fo-table-repeater>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-table-repeater>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-table-repeater>table:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater>table:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-table-repeater>table>thead{white-space:nowrap;display:none}.fi-fo-table-repeater>table>thead>tr>th{border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-fo-table-repeater>table>thead>tr>th:first-of-type{border-start-start-radius:var(--radius-xl)}.fi-fo-table-repeater>table>thead>tr>th:last-of-type{border-start-end-radius:var(--radius-xl)}.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){color:var(--color-white)}.fi-fo-table-repeater>table>thead>tr>th:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-fo-table-repeater>table>thead>tr>th:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-fo-table-repeater>table>thead>tr>th.fi-align-start,.fi-fo-table-repeater>table>thead>tr>th.fi-align-left{text-align:start}.fi-fo-table-repeater>table>thead>tr>th.fi-align-end,.fi-fo-table-repeater>table>thead>tr>th.fi-align-right{text-align:end}.fi-fo-table-repeater>table>thead>tr>th.fi-wrapped{white-space:normal}.fi-fo-table-repeater>table>thead>tr>th:not(.fi-wrapped){white-space:nowrap}.fi-fo-table-repeater>table>thead>tr>th.fi-fo-table-repeater-empty-header-cell{width:calc(var(--spacing)*1)}.fi-fo-table-repeater>table>tbody{display:block}:where(.fi-fo-table-repeater>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-table-repeater>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-table-repeater>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater>table>tbody>tr{gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6);display:grid}.fi-fo-table-repeater>table>tbody>tr>td{display:block}.fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:none}.fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-start{vertical-align:top}.fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-center{vertical-align:middle}.fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-end{vertical-align:bottom}.fi-fo-table-repeater>table .fi-fo-table-repeater-header-required-mark{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-600)}.fi-fo-table-repeater>table .fi-fo-table-repeater-header-required-mark:where(.dark,.dark *){color:var(--danger-400)}.fi-fo-table-repeater>table .fi-fo-table-repeater-actions{align-items:center;column-gap:calc(var(--spacing)*3);height:100%;display:flex}@supports (container-type:inline-size){.fi-fo-table-repeater{container-type:inline-size}@container (min-width:36rem){.fi-fo-table-repeater>table{display:table}.fi-fo-table-repeater>table>thead{display:table-header-group}.fi-fo-table-repeater>table>tbody{display:table-row-group}.fi-fo-table-repeater>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-fo-table-repeater>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field-label-content,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry-label{display:none}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-toggle-buttons-wrp .fi-fo-field-content-col{grid-auto-columns:1fr}.fi-fo-table-repeater>table .fi-fo-table-repeater-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td{border-color:var(--gray-200);padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*1)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-fo-table-repeater.fi-compact .fi-input-wrp{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;background-color:#0000!important}.fi-fo-table-repeater.fi-compact .fi-fo-field-wrp-error-message{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact .fi-in-entry-content,.fi-fo-table-repeater.fi-compact .fi-fo-radio{padding-inline:calc(var(--spacing)*3)}}}@supports not (container-type:inline-size){@media (min-width:64rem){.fi-fo-table-repeater>table{display:table}.fi-fo-table-repeater>table>thead{display:table-header-group}.fi-fo-table-repeater>table>tbody{display:table-row-group}.fi-fo-table-repeater>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-fo-table-repeater>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field-label-content,.fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry-label{display:none}.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-toggle-buttons-wrp .fi-fo-field-content-col{grid-auto-columns:1fr}.fi-fo-table-repeater>table .fi-fo-table-repeater-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td{border-color:var(--gray-200);padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*1)}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-fo-table-repeater.fi-compact .fi-input-wrp{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important;background-color:#0000!important}.fi-fo-table-repeater.fi-compact .fi-fo-field-wrp-error-message{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2)}.fi-fo-table-repeater.fi-compact .fi-in-entry-content,.fi-fo-table-repeater.fi-compact .fi-fo-radio{padding-inline:calc(var(--spacing)*3)}}}.fi-fo-table-repeater .fi-fo-table-repeater-add{justify-content:center;width:100%;display:flex}.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-start,.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-left{justify-content:flex-start}.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-end,.fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-right{justify-content:flex-end}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file{pointer-events:none;cursor:wait;opacity:.5}.fi-fo-rich-editor .fi-fo-rich-editor-toolbar{column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*2);flex-wrap:wrap;display:flex;position:relative}.fi-fo-rich-editor .fi-fo-rich-editor-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-floating-toolbar{visibility:hidden;z-index:20;margin-top:calc(var(--spacing)*-1);column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300);background-color:var(--color-white);max-width:100%;padding:calc(var(--spacing)*1);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);flex-wrap:wrap;display:flex;position:absolute}.fi-fo-rich-editor .fi-fo-rich-editor-floating-toolbar:where(.dark,.dark *){border-color:var(--gray-600);background-color:var(--gray-800)}.fi-fo-rich-editor .fi-fo-rich-editor-toolbar-group{column-gap:calc(var(--spacing)*1);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool{display:inline-flex;position:relative}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger{height:calc(var(--spacing)*8);cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing)*.5);border-radius:var(--radius-lg);--tw-border-style:none;padding-inline:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-700);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;background-color:#0000;border-style:none;outline-style:none;transition-duration:75ms;display:flex}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:hover{background-color:var(--gray-50)}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:focus-visible{background-color:var(--gray-50)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger.fi-active{background-color:var(--gray-50);color:var(--primary-600)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-trigger.fi-active:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-chevron{height:calc(var(--spacing)*3);width:calc(var(--spacing)*3);color:var(--gray-400)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-chevron:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-menu{z-index:30;gap:calc(var(--spacing)*1);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300);background-color:var(--color-white);padding:calc(var(--spacing)*1);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);inset-inline-start:calc(var(--spacing)*0);display:flex;position:absolute;top:calc(100% + .25rem)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-menu:where(.dark,.dark *){border-color:var(--gray-600);background-color:var(--gray-800)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option{height:calc(var(--spacing)*8);min-width:calc(var(--spacing)*8);cursor:pointer;border-radius:var(--radius-lg);--tw-border-style:none;padding:calc(var(--spacing)*0);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-700);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;--tw-outline-style:none;background-color:#0000;border-style:none;outline-style:none;justify-content:center;align-items:center;transition-duration:75ms;display:flex}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:hover{background-color:var(--gray-50)}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:focus-visible{background-color:var(--gray-50)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option.fi-active{background-color:var(--gray-50);color:var(--primary-600)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-option.fi-active:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-textual .fi-fo-rich-editor-dropdown-tool-menu{min-width:calc(var(--spacing)*32);flex-direction:column}.fi-fo-rich-editor .fi-fo-rich-editor-dropdown-tool-textual .fi-fo-rich-editor-dropdown-tool-option{min-width:calc(var(--spacing)*0);justify-content:flex-start;gap:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-normal);font-size:.8125rem;font-weight:var(--font-weight-normal);white-space:nowrap}.fi-fo-rich-editor .fi-fo-rich-editor-tool{height:calc(var(--spacing)*8);min-width:calc(var(--spacing)*8);border-radius:var(--radius-lg);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-700);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;justify-content:center;align-items:center;transition-duration:75ms;display:flex}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-tool:hover{background-color:var(--gray-50)}}.fi-fo-rich-editor .fi-fo-rich-editor-tool:focus-visible{background-color:var(--gray-50)}.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-tool[disabled]{pointer-events:none;cursor:default;opacity:.7}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active{background-color:var(--gray-50);color:var(--primary-600)}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-fo-rich-editor-tool-with-label{align-items:center;column-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*1.5)}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message{align-items:center;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){color:var(--gray-200)}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message .fi-loading-indicator{color:var(--gray-400)}.fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message{align-items:center;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--danger-200);background-color:var(--danger-50);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--danger-700);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){color:var(--danger-200)}.fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:column-reverse;display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-content{min-height:calc(var(--spacing)*12);width:100%;padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*3);flex:1;position:relative}.fi-fo-rich-editor span[data-type=mergeTag]{margin-block:calc(var(--spacing)*0);white-space:nowrap;display:inline-block}.fi-fo-rich-editor span[data-type=mergeTag]:before{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);opacity:.6;content:"{{";margin-inline-end:calc(var(--spacing)*1)}.fi-fo-rich-editor span[data-type=mergeTag]:after{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);opacity:.6;content:"}}";margin-inline-start:calc(var(--spacing)*1)}.fi-fo-rich-editor span[data-type=mention]{margin-block:calc(var(--spacing)*0);background-color:var(--primary-50);padding-inline:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--primary-600);border-radius:.25rem;display:inline-block}.fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){background-color:var(--primary-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--primary-400)10%,transparent)}}.fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){color:var(--primary-400)}.fi-fo-rich-editor .fi-fo-rich-editor-panels{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);width:100%}.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-panel-header{align-items:flex-start;gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-panel-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1}.fi-fo-rich-editor .fi-fo-rich-editor-panel-heading:where(.dark,.dark *){color:var(--color-white)}.fi-fo-rich-editor .fi-fo-rich-editor-panel-close-btn-ctn{flex-shrink:0}.fi-fo-rich-editor .fi-fo-rich-editor-panel{display:grid}:where(.fi-fo-rich-editor .fi-fo-rich-editor-panel>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-fo-rich-editor .fi-fo-rich-editor-panel:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-rich-editor .fi-fo-rich-editor-panel:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tags-list{gap:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn{cursor:move;border-radius:var(--radius-lg);background-color:var(--color-white);padding:calc(var(--spacing)*1);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-blocks-list{gap:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn{cursor:move;gap:calc(var(--spacing)*1.5);border-radius:var(--radius-lg);background-color:var(--color-white);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*1);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600);display:flex}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.fi-fo-rich-editor .tiptap{height:100%}.fi-fo-rich-editor .tiptap:focus{--tw-outline-style:none;outline-style:none}div:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)[data-type=customBlock],img:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}:is(div:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)[data-type=customBlock],img:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)):where(.dark,.dark *){--tw-ring-color:var(--primary-500)}.fi-fo-rich-editor .tiptap p.is-editor-empty:first-child:before{pointer-events:none;float:inline-start;height:calc(var(--spacing)*0);color:var(--gray-400);content:attr(data-placeholder)}.fi-fo-rich-editor .tiptap p.is-editor-empty:first-child:where(.dark,.dark *):before{color:var(--gray-500)}.fi-fo-rich-editor .tiptap [data-type=details]{margin-block:calc(var(--spacing)*6);gap:calc(var(--spacing)*1);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950);display:flex}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]{border-color:color-mix(in oklab,var(--gray-950)20%,transparent)}}.fi-fo-rich-editor .tiptap [data-type=details]{padding:calc(var(--spacing)*4)}.fi-fo-rich-editor .tiptap [data-type=details]:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-rich-editor .tiptap [data-type=details]>div:first-of-type{margin-top:calc(var(--spacing)*0)!important}.fi-fo-rich-editor .tiptap [data-type=details] summary{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);list-style-type:none}.fi-fo-rich-editor .tiptap [data-type=details]>button{margin-top:1px;margin-right:calc(var(--spacing)*2);width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);border-radius:var(--radius-md);padding:calc(var(--spacing)*1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:1;background-color:#0000;justify-content:center;align-items:center;line-height:1;display:flex}@media (hover:hover){.fi-fo-rich-editor .tiptap [data-type=details]>button:hover{background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]>button:hover{background-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-fo-rich-editor .tiptap [data-type=details]>button:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap [data-type=details]>button:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-fo-rich-editor .tiptap [data-type=details]>button:before{content:"▶"}.fi-fo-rich-editor .tiptap [data-type=details].is-open>button:before{transform:rotate(90deg)}.fi-fo-rich-editor .tiptap [data-type=details]>div{gap:calc(var(--spacing)*4);flex-direction:column;width:100%;display:flex}.fi-fo-rich-editor .tiptap [data-type=details]>div>[data-type=detailsContent]{margin-top:calc(var(--spacing)*0)!important}.fi-fo-rich-editor .tiptap [data-type=details]>div>[data-type=detailsContent]>:last-child{margin-bottom:calc(var(--spacing)*4)}.fi-fo-rich-editor .tiptap table{margin:calc(var(--spacing)*0);table-layout:fixed;border-collapse:collapse;width:100%;overflow:hidden}.fi-fo-rich-editor .tiptap table:first-child{margin-top:calc(var(--spacing)*0)}.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th{border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300);vertical-align:top;min-width:1em;position:relative;padding:calc(var(--spacing)*2)!important}:is(.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th):where(.dark,.dark *){border-color:var(--gray-600)}:is(.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th)>*{margin-bottom:calc(var(--spacing)*0)}.fi-fo-rich-editor .tiptap table th{background-color:var(--gray-100);text-align:start;--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-fo-rich-editor .tiptap table th:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white)}.fi-fo-rich-editor .tiptap table .selectedCell:after{pointer-events:none;inset-inline-start:calc(var(--spacing)*0);inset-inline-end:calc(var(--spacing)*0);top:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);z-index:2;background-color:var(--gray-200);position:absolute}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap table .selectedCell:after{background-color:color-mix(in oklab,var(--gray-200)80%,transparent)}}.fi-fo-rich-editor .tiptap table .selectedCell:after{--tw-content:"";content:var(--tw-content)}.fi-fo-rich-editor .tiptap table .selectedCell:where(.dark,.dark *):after{background-color:var(--gray-800)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap table .selectedCell:where(.dark,.dark *):after{background-color:color-mix(in oklab,var(--gray-800)80%,transparent)}}.fi-fo-rich-editor .tiptap table .column-resize-handle{pointer-events:none;inset-inline-end:calc(var(--spacing)*0);top:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);width:calc(var(--spacing)*1);background-color:var(--primary-600);position:absolute;margin:calc(var(--spacing)*0)!important}.fi-fo-rich-editor .tiptap .tableWrapper{overflow-x:auto}.fi-fo-rich-editor .tiptap.resize-cursor{cursor:col-resize;cursor:ew-resize}.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{border-color:color-mix(in oklab,var(--gray-950)20%,transparent)}}.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{padding:calc(var(--spacing)*4)}.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-rich-editor .tiptap [data-resize-handle]{z-index:10;background:#00000080;border:1px solid #fffc;border-radius:2px;position:absolute}.fi-fo-rich-editor .tiptap [data-resize-handle]:hover{background:#000c}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle]{margin:0!important}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-left],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-right],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-left],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-right]{width:8px;height:8px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-left]{cursor:nwse-resize;top:-4px;left:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-right]{cursor:nesw-resize;top:-4px;right:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-left]{cursor:nesw-resize;bottom:-4px;left:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-right]{cursor:nwse-resize;bottom:-4px;right:-4px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom]{height:6px;left:8px;right:8px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top]{cursor:ns-resize;top:-3px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom]{cursor:ns-resize;bottom:-3px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=left],.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=right]{width:6px;top:8px;bottom:8px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=left]{cursor:ew-resize;left:-3px}.fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=right]{cursor:ew-resize;right:-3px}.fi-fo-rich-editor .tiptap [data-resize-state=true] [data-resize-wrapper]{border-radius:.125rem;outline:1px solid #00000040;position:relative}.fi-fo-rich-editor .tiptap [data-resize-container]{display:inline-block!important}@supports (-webkit-touch-callout:none){.fi-fo-rich-editor .tiptap.ProseMirror{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.fi-fo-rich-editor img{display:inline-block}.fi-fo-rich-editor div[data-type=customBlock]{display:grid}:where(.fi-fo-rich-editor div[data-type=customBlock]>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-fo-rich-editor div[data-type=customBlock]{border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow:hidden}:where(.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header{align-items:flex-start;gap:calc(var(--spacing)*3);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);display:flex}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-heading:where(.dark,.dark *){color:var(--color-white)}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-edit-btn-ctn,.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-delete-btn-ctn{flex-shrink:0}.fi-fo-rich-editor .fi-fo-rich-editor-custom-block-preview{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3)}@supports (container-type:inline-size){.fi-fo-rich-editor{container-type:inline-size}@container (min-width:42rem){.fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:row}.fi-fo-rich-editor .fi-fo-rich-editor-panels{max-width:var(--container-3xs);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-end-end-radius:var(--radius-lg)}}}@supports not (container-type:inline-size){@media (min-width:48rem){.fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:row}.fi-fo-rich-editor .fi-fo-rich-editor-panels{max-width:var(--container-3xs);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-end-end-radius:var(--radius-lg)}}}:scope .fi-fo-rich-editor-text-color-select-option{align-items:center;gap:calc(var(--spacing)*2);display:flex}:scope .fi-fo-rich-editor-text-color-select-option .fi-fo-rich-editor-text-color-select-option-preview{height:calc(var(--spacing)*5);width:calc(var(--spacing)*5);background-color:var(--color);border-radius:3.40282e38px;flex-shrink:0}:scope .fi-fo-rich-editor-text-color-select-option .fi-fo-rich-editor-text-color-select-option-preview:where(.dark,.dark *){background-color:var(--dark-color)}[x-sortable]:has(.fi-sortable-ghost) .fi-fo-rich-editor{pointer-events:none}.fi-fo-select .fi-hidden{display:none}@media (min-width:40rem){.fi-fo-select-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-slider{gap:calc(var(--spacing)*4);border-radius:var(--radius-lg);border-style:var(--tw-border-style);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);background-color:#0000;border-width:0}.fi-fo-slider:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-slider .noUi-connect{background-color:var(--primary-500)}.fi-fo-slider .noUi-connect:where(.dark,.dark *){background-color:var(--primary-600)}.fi-fo-slider .noUi-connects{border-radius:var(--radius-lg);background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-connects{background-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-fo-slider .noUi-connects:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-connects:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-fo-slider .noUi-handle{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-950);position:absolute}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-handle{border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.fi-fo-slider .noUi-handle{background-color:var(--color-white);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);backface-visibility:hidden}.fi-fo-slider .noUi-handle:focus{outline-style:var(--tw-outline-style);outline-width:2px;outline-color:var(--primary-600)}.fi-fo-slider .noUi-handle:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-handle:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-slider .noUi-handle:where(.dark,.dark *){background-color:var(--gray-700)}.fi-fo-slider .noUi-handle:where(.dark,.dark *):focus{outline-color:var(--primary-500)}.fi-fo-slider .noUi-handle:before,.fi-fo-slider .noUi-handle:after{border-style:var(--tw-border-style);background-color:var(--gray-400);border-width:0}.fi-fo-slider .noUi-tooltip{border-radius:var(--radius-md);border-style:var(--tw-border-style);background-color:var(--color-white);color:var(--gray-950);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-width:0}.fi-fo-slider .noUi-tooltip:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white);--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-fo-slider .noUi-tooltip:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-fo-slider .noUi-pips .noUi-value{color:var(--gray-950)}.fi-fo-slider .noUi-pips .noUi-value:where(.dark,.dark *){color:var(--color-white)}.fi-fo-slider.fi-fo-slider-vertical{margin-top:calc(var(--spacing)*4);height:calc(var(--spacing)*40)}.fi-fo-slider.fi-fo-slider-vertical.fi-fo-slider-has-tooltips{margin-inline-start:calc(var(--spacing)*10)}.fi-fo-slider:not(.fi-fo-slider-vertical).fi-fo-slider-has-pips{margin-bottom:calc(var(--spacing)*8)}.fi-fo-slider:not(.fi-fo-slider-vertical).fi-fo-slider-has-tooltips{margin-top:calc(var(--spacing)*10)}.fi-fo-slider:not(.fi-fo-slider-vertical) .noUi-pips .noUi-value{margin-top:calc(var(--spacing)*1)}.fi-fo-tags-input.fi-disabled .fi-badge-delete-btn{display:none}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn{gap:calc(var(--spacing)*1.5);border-top-style:var(--tw-border-style);border-top-width:1px;border-top-color:var(--gray-200);width:100%;padding:calc(var(--spacing)*2);flex-wrap:wrap;display:flex}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn:where(.dark,.dark *){border-top-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-fo-tags-input .fi-fo-tags-input-tags-ctn:where(.dark,.dark *){border-top-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn>template{display:none}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn>.fi-badge.fi-reorderable{cursor:move}.fi-fo-tags-input .fi-fo-tags-input-tags-ctn>.fi-badge .fi-badge-label-ctn{text-align:start;-webkit-user-select:none;user-select:none}@media (min-width:40rem){.fi-fo-tags-input-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-text-input{overflow:hidden}.fi-fo-text-input input.fi-revealable::-ms-reveal{display:none}.fi-fo-textarea{overflow:hidden}.fi-fo-textarea textarea{--tw-border-style:none;width:100%;height:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-950);background-color:#0000;border-style:none;display:block}.fi-fo-textarea textarea::placeholder{color:var(--gray-400)}.fi-fo-textarea textarea:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.fi-fo-textarea textarea:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.fi-fo-textarea textarea:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}.fi-fo-textarea textarea:where(.dark,.dark *){color:var(--color-white)}.fi-fo-textarea textarea:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.fi-fo-textarea textarea:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.fi-fo-textarea textarea:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}@supports (-webkit-touch-callout:none){.fi-fo-textarea textarea{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.fi-fo-textarea.fi-autosizable textarea{resize:none}@media (min-width:40rem){.fi-fo-textarea-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-fo-toggle-buttons.fi-btn-group{width:max-content}.fi-fo-toggle-buttons:not(.fi-btn-group){gap:calc(var(--spacing)*3)}.fi-fo-toggle-buttons:not(.fi-btn-group).fi-inline{flex-wrap:wrap;display:flex}.fi-fo-toggle-buttons:not(.fi-btn-group):not(.fi-inline).fi-grid-direction-col{margin-top:calc(var(--spacing)*-3)}.fi-fo-toggle-buttons:not(.fi-btn-group):not(.fi-inline).fi-grid-direction-col .fi-fo-toggle-buttons-btn-ctn{break-inside:avoid;padding-top:calc(var(--spacing)*3)}.fi-fo-toggle-buttons .fi-fo-toggle-buttons-input{pointer-events:none;opacity:0;position:absolute}@media (min-width:40rem){.fi-fo-toggle-buttons-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.fi-in-code .phiki{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow-x:auto}.fi-in-code .phiki:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-in-code .phiki:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-in-code:where(.dark,.dark *) .phiki,.fi-in-code:where(.dark,.dark *) .phiki span{color:var(--phiki-dark-color)!important;background-color:var(--phiki-dark-background-color)!important;font-style:var(--phiki-dark-font-style)!important;font-weight:var(--phiki-dark-font-weight)!important;-webkit-text-decoration:var(--phiki-dark-text-decoration)!important;-webkit-text-decoration:var(--phiki-dark-text-decoration)!important;text-decoration:var(--phiki-dark-text-decoration)!important}.fi-in-code.fi-copyable{cursor:pointer}.fi-in-color{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-in-color.fi-wrapped{flex-wrap:wrap}.fi-in-color.fi-align-start,.fi-in-color.fi-align-left{justify-content:flex-start}.fi-in-color.fi-align-center{justify-content:center}.fi-in-color.fi-align-end,.fi-in-color.fi-align-right{justify-content:flex-end}.fi-in-color.fi-align-justify,.fi-in-color.fi-align-between{justify-content:space-between}.fi-in-color>.fi-in-color-item{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6);border-radius:var(--radius-md)}.fi-in-color>.fi-in-color-item.fi-copyable{cursor:pointer}.fi-in-entry{row-gap:calc(var(--spacing)*2);display:grid}@media (min-width:40rem){.fi-in-entry.fi-in-entry-has-inline-label{align-items:flex-start;column-gap:calc(var(--spacing)*4);grid-template-columns:repeat(3,minmax(0,1fr))}.fi-in-entry.fi-in-entry-has-inline-label .fi-in-entry-content-col{grid-column:span 2/span 2}}.fi-in-entry .fi-in-entry-label-ctn{align-items:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.fi-in-entry .fi-in-entry-label-ctn>.fi-sc:first-child{flex-grow:0}.fi-in-entry .fi-in-entry-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-in-entry .fi-in-entry-label:where(.dark,.dark *){color:var(--color-white)}.fi-in-entry .fi-in-entry-label.fi-hidden{display:none}.fi-in-entry .fi-in-entry-label-col,.fi-in-entry .fi-in-entry-content-col{row-gap:calc(var(--spacing)*2);grid-auto-columns:minmax(0,1fr);display:grid}.fi-in-entry .fi-in-entry-content-ctn{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;display:flex}.fi-in-entry .fi-in-entry-content{text-align:start;width:100%;display:block}.fi-in-entry .fi-in-entry-content.fi-align-center{text-align:center}.fi-in-entry .fi-in-entry-content.fi-align-end{text-align:end}.fi-in-entry .fi-in-entry-content.fi-align-left{text-align:left}.fi-in-entry .fi-in-entry-content.fi-align-right{text-align:right}.fi-in-entry .fi-in-entry-content.fi-align-justify,.fi-in-entry .fi-in-entry-content.fi-align-between{text-align:justify}.fi-in-entry .fi-in-placeholder{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-400)}.fi-in-entry .fi-in-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-in-key-value{table-layout:auto;width:100%}:where(.fi-in-key-value>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-in-key-value{border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}:where(.fi-in-key-value:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-key-value:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-key-value:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-key-value:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-key-value:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-in-key-value:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-key-value th{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-in-key-value th:where(.dark,.dark *){color:var(--gray-200)}:where(.fi-in-key-value tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-in-key-value tbody{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media (min-width:40rem){.fi-in-key-value tbody{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}}:where(.fi-in-key-value tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-key-value tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}:where(.fi-in-key-value tr>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));border-color:var(--gray-200)}:where(.fi-in-key-value tr:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-divide-x-reverse:1}:where(.fi-in-key-value tr:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-key-value tr:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-key-value td{width:50%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);overflow-wrap:anywhere}.fi-in-key-value td.fi-in-placeholder{width:100%;padding-block:calc(var(--spacing)*2);text-align:center;font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-in-icon{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-in-icon.fi-wrapped{flex-wrap:wrap}.fi-in-icon.fi-in-icon-has-line-breaks{flex-direction:column}.fi-in-icon.fi-align-start,.fi-in-icon.fi-align-left{justify-content:flex-start}.fi-in-icon.fi-align-center{justify-content:center}.fi-in-icon.fi-align-end,.fi-in-icon.fi-align-right{justify-content:flex-end}.fi-in-icon.fi-align-justify,.fi-in-icon.fi-align-between{justify-content:space-between}.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon{color:var(--gray-400)}:is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon).fi-color{color:var(--text)}:is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon).fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-in-image{align-items:center;gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-in-image img{object-fit:cover;object-position:center;max-width:none}.fi-in-image.fi-circular img{border-radius:3.40282e38px}.fi-in-image.fi-in-image-ring img,.fi-in-image.fi-in-image-ring .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-white)}:is(.fi-in-image.fi-in-image-ring img,.fi-in-image.fi-in-image-ring .fi-in-image-limited-remaining-text):where(.dark,.dark *){--tw-ring-color:var(--gray-900)}.fi-in-image.fi-in-image-ring.fi-in-image-ring-1 img,.fi-in-image.fi-in-image-ring.fi-in-image-ring-1 .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-in-image.fi-in-image-ring.fi-in-image-ring-2 img,.fi-in-image.fi-in-image-ring.fi-in-image-ring-2 .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-in-image.fi-in-image-ring.fi-in-image-ring-4 img,.fi-in-image.fi-in-image-ring.fi-in-image-ring-4 .fi-in-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-in-image.fi-in-image-overlap-1{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-2{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-3{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-3)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-4{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-4)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-5{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-5)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-6{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-6)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-7{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-7>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-7)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-7)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-in-image-overlap-8{column-gap:calc(var(--spacing)*0)}:where(.fi-in-image.fi-in-image-overlap-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-8)*calc(1 - var(--tw-space-x-reverse)))}.fi-in-image.fi-wrapped{flex-wrap:wrap}.fi-in-image.fi-align-start,.fi-in-image.fi-align-left{justify-content:flex-start}.fi-in-image.fi-align-center{justify-content:center}.fi-in-image.fi-align-end,.fi-in-image.fi-align-right{justify-content:flex-end}.fi-in-image.fi-align-justify,.fi-in-image.fi-align-between{justify-content:space-between}.fi-in-image.fi-stacked .fi-in-image-limited-remaining-text{background-color:var(--gray-100);border-radius:3.40282e38px}.fi-in-image.fi-stacked .fi-in-image-limited-remaining-text:where(.dark,.dark *){background-color:var(--gray-800)}.fi-in-image .fi-in-image-limited-remaining-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);justify-content:center;align-items:center;display:flex}.fi-in-image .fi-in-image-limited-remaining-text:where(.dark,.dark *){color:var(--gray-400)}.fi-in-image .fi-in-image-limited-remaining-text.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-in-image .fi-in-image-limited-remaining-text.fi-size-base,.fi-in-image .fi-in-image-limited-remaining-text.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-in-image .fi-in-image-limited-remaining-text.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}ul.fi-in-repeatable{gap:calc(var(--spacing)*4)}.fi-in-repeatable>.fi-in-repeatable-item{display:block}.fi-in-repeatable.fi-contained>.fi-in-repeatable-item{border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-in-repeatable.fi-contained>.fi-in-repeatable-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-repeatable.fi-contained>.fi-in-repeatable-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-repeatable.fi-contained>.fi-in-repeatable-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-in-repeatable.fi-contained>.fi-in-repeatable-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-table-repeatable{gap:calc(var(--spacing)*3);display:grid}.fi-in-table-repeatable>table{width:100%;display:block}:where(.fi-in-table-repeatable>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-in-table-repeatable>table{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}:where(.fi-in-table-repeatable>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-table-repeatable>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-table-repeatable>table:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-in-table-repeatable>table:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-in-table-repeatable>table>thead{white-space:nowrap;display:none}.fi-in-table-repeatable>table>thead>tr>th{border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-in-table-repeatable>table>thead>tr>th:first-of-type{border-start-start-radius:var(--radius-xl)}.fi-in-table-repeatable>table>thead>tr>th:last-of-type{border-start-end-radius:var(--radius-xl)}.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){color:var(--color-white)}.fi-in-table-repeatable>table>thead>tr>th:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-in-table-repeatable>table>thead>tr>th:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-in-table-repeatable>table>thead>tr>th.fi-align-center{text-align:center}.fi-in-table-repeatable>table>thead>tr>th.fi-align-end,.fi-in-table-repeatable>table>thead>tr>th.fi-align-right{text-align:end}.fi-in-table-repeatable>table>thead>tr>th.fi-wrapped{white-space:normal}.fi-in-table-repeatable>table>thead>tr>th:not(.fi-wrapped){white-space:nowrap}.fi-in-table-repeatable>table>thead>tr>th.fi-in-table-repeatable-empty-header-cell{width:calc(var(--spacing)*1)}.fi-in-table-repeatable>table>tbody{display:block}:where(.fi-in-table-repeatable>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-in-table-repeatable>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-in-table-repeatable>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-in-table-repeatable>table>tbody>tr{gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6);display:grid}.fi-in-table-repeatable>table>tbody>tr>td{display:block}.fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:none}@supports (container-type:inline-size){.fi-in-table-repeatable{container-type:inline-size}@container (min-width:36rem){.fi-in-table-repeatable>table{display:table}.fi-in-table-repeatable>table>thead{display:table-header-group}.fi-in-table-repeatable>table>tbody{display:table-row-group}.fi-in-table-repeatable>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-in-table-repeatable>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry-label{display:none}.fi-in-table-repeatable>table .fi-in-table-repeatable-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}}}@supports not (container-type:inline-size){@media (min-width:64rem){.fi-in-table-repeatable>table{display:table}.fi-in-table-repeatable>table>thead{display:table-header-group}.fi-in-table-repeatable>table>tbody{display:table-row-group}.fi-in-table-repeatable>table>tbody>tr{padding:calc(var(--spacing)*0);display:table-row}.fi-in-table-repeatable>table>tbody>tr>td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:table-cell}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry-label{display:none}}}.fi-in-text{width:100%}.fi-in-text.fi-in-text-affixed{gap:calc(var(--spacing)*3);display:flex}.fi-in-text .fi-in-text-affixed-content{min-width:calc(var(--spacing)*0);flex:1}.fi-in-text .fi-in-text-affix{align-items:center;gap:calc(var(--spacing)*3);align-self:stretch;display:flex}.fi-in-text.fi-in-text-list-limited{flex-direction:column;display:flex}.fi-in-text.fi-in-text-list-limited.fi-in-text-has-badges{row-gap:calc(var(--spacing)*2)}.fi-in-text.fi-in-text-list-limited:not(.fi-in-text-has-badges){row-gap:calc(var(--spacing)*1)}ul.fi-in-text.fi-bulleted,.fi-in-text.fi-bulleted ul{list-style-type:disc;list-style-position:inside}ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul{column-gap:calc(var(--spacing)*1.5);display:flex}:is(ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul).fi-wrapped,:is(ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul).fi-in-text-has-line-breaks,:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):is(.fi-in-text-has-line-breaks ul){row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul){column-gap:calc(var(--spacing)*1.5);display:flex}:is(:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul)).fi-wrapped,:is(:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul)):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}.fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks){white-space:normal;overflow-wrap:break-word}.fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks) .fi-badge,.fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks) .fi-in-text-list-limited-message{white-space:nowrap}.fi-in-text>.fi-in-text-list-limited-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-in-text>.fi-in-text-list-limited-message:where(.dark,.dark *){color:var(--gray-400)}.fi-in-text.fi-align-center{text-align:center}ul.fi-in-text.fi-align-center,.fi-in-text.fi-align-center ul{justify-content:center}.fi-in-text.fi-align-end,.fi-in-text.fi-align-right{text-align:end}ul:is(.fi-in-text.fi-align-end,.fi-in-text.fi-align-right),:is(.fi-in-text.fi-align-end,.fi-in-text.fi-align-right) ul{justify-content:flex-end}.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between{text-align:justify}ul:is(.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between),:is(.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between) ul{justify-content:space-between}.fi-in-text-item{color:var(--gray-950)}.fi-in-text-item:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.fi-in-text-item a:hover{text-decoration-line:underline}}.fi-in-text-item a:focus-visible{text-decoration-line:underline}.fi-in-text-item:not(.fi-bulleted li.fi-in-text-item){-webkit-line-clamp:var(--line-clamp,none);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.fi-in-text-item>.fi-copyable{cursor:pointer}.fi-in-text-item.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-in-text-item.fi-size-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-in-text-item.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-in-text-item.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-in-text-item.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-in-text-item.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-in-text-item.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-in-text-item.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-in-text-item.fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-in-text-item.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-in-text-item.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-in-text-item.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-in-text-item.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-in-text-item.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-in-text-item.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.fi-in-text-item.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-in-text-item.fi-color{color:var(--text)}.fi-in-text-item.fi-color:where(.dark,.dark *){color:var(--dark-text)}li.fi-in-text-item.fi-color::marker{color:var(--gray-950)}li.fi-in-text-item.fi-color:where(.dark,.dark *)::marker{color:var(--color-white)}.fi-in-text-item.fi-color-gray{color:var(--gray-500)}.fi-in-text-item.fi-color-gray:where(.dark,.dark *){color:var(--gray-400)}li.fi-in-text-item.fi-color-gray::marker{color:var(--gray-950)}.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon{color:var(--gray-400);flex-shrink:0;display:inline-block}:is(.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon).fi-color{color:var(--color-500)}.fi-no-database{display:flex}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-heading{display:inline-block;position:relative}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-heading .fi-badge{inset-inline-start:100%;top:calc(var(--spacing)*-1);width:max-content;margin-inline-start:calc(var(--spacing)*1);position:absolute}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-header .fi-ac{margin-top:calc(var(--spacing)*2)}.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content{margin-inline:calc(var(--spacing)*-6);margin-top:calc(var(--spacing)*-6);row-gap:calc(var(--spacing)*0)}:where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-no-database .fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-footer) .fi-modal-content{margin-bottom:calc(var(--spacing)*-6)}.fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200)}.fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-no-database .fi-no-notification-unread-ctn{position:relative}.fi-no-database .fi-no-notification-unread-ctn:before{content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);height:100%;width:calc(var(--spacing)*.5);content:var(--tw-content);background-color:var(--primary-600);position:absolute;inset-inline-start:calc(var(--spacing)*0)}.fi-no-database .fi-no-notification-unread-ctn:where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--primary-500)}.fi-no-notification{pointer-events:auto;visibility:hidden;gap:calc(var(--spacing)*3);width:100%;padding:calc(var(--spacing)*4);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;flex-shrink:0;transition-duration:.3s;display:flex;overflow:hidden}.fi-no-notification .fi-no-notification-icon{color:var(--gray-400)}.fi-no-notification .fi-no-notification-icon.fi-color{color:var(--color-400)}.fi-no-notification .fi-no-notification-main{margin-top:calc(var(--spacing)*.5);gap:calc(var(--spacing)*3);flex:1;display:grid}.fi-no-notification .fi-no-notification-text{gap:calc(var(--spacing)*1);display:grid}.fi-no-notification .fi-no-notification-title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-no-notification .fi-no-notification-title:where(.dark,.dark *){color:var(--color-white)}.fi-no-notification .fi-no-notification-date{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-no-notification .fi-no-notification-date:where(.dark,.dark *){color:var(--gray-400)}.fi-no-notification .fi-no-notification-body{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-wrap:pretty;overflow-wrap:break-word;color:var(--gray-500);overflow:hidden}.fi-no-notification .fi-no-notification-body:where(.dark,.dark *){color:var(--gray-400)}.fi-no-notification .fi-no-notification-body>p:not(:first-of-type){margin-top:calc(var(--spacing)*1)}.fi-no-notification:not(.fi-inline){max-width:var(--container-sm);gap:calc(var(--spacing)*3);border-radius:var(--radius-xl);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex}.fi-no-notification:not(.fi-inline):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-no-notification:not(.fi-inline):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-no-notification:not(.fi-inline).fi-color{--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification:not(.fi-inline).fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)20%,transparent)}}.fi-no-notification:not(.fi-inline).fi-color:where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification:not(.fi-inline).fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.fi-no-notification:not(.fi-inline).fi-transition-leave-end{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.fi-no-notification.fi-color{background-color:#fff}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color{background-color:color-mix(in oklab,white 90%,var(--color-400))}}.fi-no-notification.fi-color:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)90%,var(--color-400))}}.fi-no-notification.fi-color .fi-no-notification-body{color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color .fi-no-notification-body{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}.fi-no-notification.fi-color .fi-no-notification-body:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-no-notification.fi-color .fi-no-notification-body:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)75%,transparent)}}.fi-no-notification.fi-transition-enter-start,.fi-no-notification.fi-transition-leave-end{opacity:0}:is(.fi-no.fi-align-start,.fi-no.fi-align-left) .fi-no-notification.fi-transition-enter-start{--tw-translate-x:calc(var(--spacing)*-12);translate:var(--tw-translate-x)var(--tw-translate-y)}:is(.fi-no.fi-align-end,.fi-no.fi-align-right) .fi-no-notification.fi-transition-enter-start{--tw-translate-x:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-no.fi-align-center.fi-vertical-align-start .fi-no-notification.fi-transition-enter-start{--tw-translate-y:calc(var(--spacing)*-12);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-no.fi-align-center.fi-vertical-align-end .fi-no-notification.fi-transition-enter-start{--tw-translate-y:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-no{pointer-events:none;inset:calc(var(--spacing)*4);z-index:50;gap:calc(var(--spacing)*3);margin-inline:auto;display:flex;position:fixed}.fi-no.fi-align-start,.fi-no.fi-align-left{align-items:flex-start}.fi-no.fi-align-center{align-items:center}.fi-no.fi-align-end,.fi-no.fi-align-right{align-items:flex-end}.fi-no.fi-vertical-align-start{flex-direction:column-reverse;justify-content:flex-end}.fi-no.fi-vertical-align-center{flex-direction:column;justify-content:center}.fi-no.fi-vertical-align-end{flex-direction:column;justify-content:flex-end}.fi-sc-actions{gap:calc(var(--spacing)*2);flex-direction:column;height:100%;display:flex}.fi-sc-actions .fi-sc-actions-label-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-sc-actions .fi-sc-actions-label-ctn .fi-sc-actions-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-sc-actions .fi-sc-actions-label-ctn .fi-sc-actions-label:where(.dark,.dark *){color:var(--color-white)}.fi-sc-actions.fi-sticky .fi-ac{bottom:calc(var(--spacing)*0);margin-inline:calc(var(--spacing)*-4);width:100%;transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,);background-color:var(--color-white);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:fixed}@media (min-width:48rem){.fi-sc-actions.fi-sticky .fi-ac{bottom:calc(var(--spacing)*4);border-radius:var(--radius-xl)}}.fi-sc-actions.fi-sticky .fi-ac:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-actions.fi-sticky .fi-ac:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-actions.fi-vertical-align-start{justify-content:flex-start}.fi-sc-actions.fi-vertical-align-center{justify-content:center}.fi-sc-actions.fi-vertical-align-end{justify-content:flex-end}.fi-sc-flex{gap:calc(var(--spacing)*6);display:flex}.fi-sc-flex.fi-align-start,.fi-sc-flex.fi-align-left{justify-content:flex-start}.fi-sc-flex.fi-align-center{justify-content:center}.fi-sc-flex.fi-align-end,.fi-sc-flex.fi-align-right{justify-content:flex-end}.fi-sc-flex.fi-align-between,.fi-sc-flex.fi-align-justify{justify-content:space-between}.fi-sc-flex.fi-dense{gap:calc(var(--spacing)*3)}.fi-sc-flex>.fi-hidden{display:none}.fi-sc-flex>.fi-growable{flex:1;width:100%}.fi-sc-flex.fi-from-default{align-items:flex-start}.fi-sc-flex.fi-from-default.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-default.fi-vertical-align-end{align-items:flex-end}.fi-sc-flex.fi-from-sm{flex-direction:column}@media (min-width:40rem){.fi-sc-flex.fi-from-sm{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-sm.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-sm.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-md{flex-direction:column}@media (min-width:48rem){.fi-sc-flex.fi-from-md{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-md.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-md.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-lg{flex-direction:column}@media (min-width:64rem){.fi-sc-flex.fi-from-lg{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-lg.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-lg.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-xl{flex-direction:column}@media (min-width:80rem){.fi-sc-flex.fi-from-xl{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-xl.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-xl.fi-vertical-align-end{align-items:flex-end}}.fi-sc-flex.fi-from-2xl{flex-direction:column}@media (min-width:96rem){.fi-sc-flex.fi-from-2xl{flex-direction:row;align-items:flex-start}.fi-sc-flex.fi-from-2xl.fi-vertical-align-center{align-items:center}.fi-sc-flex.fi-from-2xl.fi-vertical-align-end{align-items:flex-end}}.fi-sc-form{gap:calc(var(--spacing)*6);flex-direction:column;display:flex}.fi-sc-form.fi-dense{gap:calc(var(--spacing)*3)}.fi-sc-fused-group>.fi-sc{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}.fi-sc-fused-group>.fi-sc:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.fi-sc-fused-group>.fi-sc:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-sc-fused-group>.fi-sc:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-sc-fused-group>.fi-sc:where(.dark,.dark *):focus-within{--tw-ring-color:var(--primary-500)}:where(.fi-sc-fused-group .fi-sc>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){:where(.fi-sc-fused-group .fi-sc>:not(:last-child)){border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.fi-sc-fused-group .fi-sc{border-radius:var(--radius-lg)}:where(.fi-sc-fused-group .fi-sc:where(.dark,.dark *)>:not(:last-child)){border-color:#fff3}@supports (color:color-mix(in lab, red, red)){:where(.fi-sc-fused-group .fi-sc:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-sc-fused-group .fi-sc .fi-sc-component,.fi-sc-fused-group .fi-sc .fi-sc-component .fi-fo-field,.fi-sc-fused-group .fi-sc .fi-sc-component .fi-input{min-height:100%}.fi-sc-fused-group .fi-sc .fi-sc-component .fi-sc-actions{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-sc-fused-group .fi-sc>:first-child .fi-input-wrp{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc>:last-child .fi-input-wrp{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}:where(.fi-sc-fused-group .fi-sc.fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}@media (min-width:40rem){:where(.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:48rem){:where(.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:64rem){:where(.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:80rem){:where(.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:96rem){:where(.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@supports (container-type:inline-size){@container (min-width:16rem){:where(.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:18rem){:where(.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:20rem){:where(.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:24rem){:where(.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:28rem){:where(.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:32rem){:where(.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:36rem){:where(.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:42rem){:where(.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:48rem){:where(.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:56rem){:where(.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:64rem){:where(.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:72rem){:where(.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@container (min-width:80rem){:where(.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}}@supports not (container-type:inline-size){@media (min-width:40rem){:where(.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:48rem){:where(.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:64rem){:where(.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:80rem){:where(.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}@media (min-width:96rem){:where(.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:first-child .fi-input-wrp{border-start-end-radius:0;border-end-start-radius:var(--radius-lg)}.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:last-child .fi-input-wrp{border-start-end-radius:var(--radius-lg);border-end-start-radius:0}}}.fi-sc-fused-group .fi-input-wrp{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:0}.fi-sc-fused-group .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):focus-within,.fi-sc-fused-group .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-sc-icon{color:var(--gray-400)}.fi-sc-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sc-icon.fi-color{color:var(--color-500)}.fi-sc-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.fi-sc-image{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-300)}.fi-sc-image:where(.dark,.dark *){border-color:#0000}.fi-sc-image.fi-align-center{margin-inline:auto}.fi-sc-image.fi-align-end,.fi-sc-image.fi-align-right{margin-inline-start:auto}.fi-sc-section{gap:calc(var(--spacing)*2);flex-direction:column;display:flex}.fi-sc-section .fi-sc-section-label-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-sc-section .fi-sc-section-label-ctn .fi-sc-section-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-sc-section .fi-sc-section-label-ctn .fi-sc-section-label:where(.dark,.dark *){color:var(--color-white)}.fi-sc-tabs{flex-direction:column;display:flex}.fi-sc-tabs .fi-tabs.fi-invisible{visibility:hidden}.fi-sc-tabs .fi-sc-tabs-tab{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.fi-sc-tabs .fi-sc-tabs-tab{outline-offset:2px;outline:2px solid #0000}}.fi-sc-tabs .fi-sc-tabs-tab.fi-active{margin-top:calc(var(--spacing)*6)}.fi-sc-tabs .fi-sc-tabs-tab:not(.fi-active){visibility:hidden;height:calc(var(--spacing)*0);padding:calc(var(--spacing)*0);position:absolute;overflow:hidden}.fi-sc-tabs.fi-contained{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-sc-tabs.fi-contained:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-tabs.fi-contained:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-tabs.fi-contained .fi-sc-tabs-tab.fi-active{margin-top:calc(var(--spacing)*0);padding:calc(var(--spacing)*6)}.fi-sc-tabs.fi-vertical{flex-direction:row}.fi-sc-tabs.fi-vertical .fi-sc-tabs-tab.fi-active{margin-inline-start:calc(var(--spacing)*6);margin-top:calc(var(--spacing)*0);flex:1}.fi-sc-text.fi-copyable{cursor:pointer}.fi-sc-text.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-sc-text.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.fi-sc-text.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-sc-text:not(.fi-badge){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word;color:var(--gray-600);display:inline-block}.fi-sc-text:not(.fi-badge):where(.dark,.dark *){color:var(--gray-400)}.fi-sc-text:not(.fi-badge).fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-sc-text:not(.fi-badge).fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-sc-text:not(.fi-badge).fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-sc-text:not(.fi-badge).fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-sc-text:not(.fi-badge).fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-sc-text:not(.fi-badge).fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-sc-text:not(.fi-badge).fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-sc-text:not(.fi-badge).fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-sc-text:not(.fi-badge).fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-sc-text:not(.fi-badge).fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-sc-text:not(.fi-badge).fi-color-neutral{color:var(--gray-950)}.fi-sc-text:not(.fi-badge).fi-color-neutral:where(.dark,.dark *){color:var(--color-white)}.fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral){color:var(--text)}.fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral):where(.dark,.dark *){color:var(--dark-text)}.fi-sc-text:not(.fi-badge).fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-sc-text:not(.fi-badge).fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-sc-unordered-list{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-inline-start:calc(var(--spacing)*3);list-style-type:disc}.fi-sc-unordered-list.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-sc-unordered-list.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-sc-unordered-list.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-sc-wizard{flex-direction:column;display:flex}.fi-sc-wizard .fi-sc-wizard-header{display:grid}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header{grid-auto-flow:column;overflow-x:auto}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step{display:flex;position:relative}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active){display:none}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active){display:flex}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn{align-items:center;column-gap:calc(var(--spacing)*4);height:100%;padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*4);text-align:start;display:flex}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10);border-radius:3.40282e38px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text{justify-items:start;display:grid}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text{width:max-content;max-width:calc(var(--spacing)*60)}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-description{text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-description:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator{height:100%;width:calc(var(--spacing)*5);color:var(--gray-200);display:none;position:absolute;inset-inline-end:calc(var(--spacing)*0)}@media (min-width:48rem){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator{display:block}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(.dark,.dark *){color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{background-color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){background-color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--color-white)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--gray-950)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--color-white)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-style:var(--tw-border-style);border-width:2px}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed).fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed).fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon:where(.dark,.dark *){color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed):not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed):not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){border-color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{color:var(--primary-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number:where(.dark,.dark *){color:var(--primary-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--primary-700)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--primary-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-color:var(--gray-300)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){border-color:var(--gray-600)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--gray-500)}.fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--gray-400)}.fi-sc-wizard .fi-sc-wizard-step{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.fi-sc-wizard .fi-sc-wizard-step{outline-offset:2px;outline:2px solid #0000}}.fi-sc-wizard .fi-sc-wizard-step:not(.fi-active){visibility:hidden;height:calc(var(--spacing)*0);padding:calc(var(--spacing)*0);position:absolute;overflow:hidden}.fi-sc-wizard:not(.fi-sc-wizard-header-hidden) .fi-sc-wizard-step.fi-active{margin-top:calc(var(--spacing)*6)}.fi-sc-wizard .fi-sc-wizard-footer{justify-content:space-between;align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-sc-wizard .fi-sc-wizard-footer>.fi-hidden{display:none}.fi-sc-wizard .fi-sc-wizard-footer>.fi-disabled{pointer-events:none;opacity:.7}.fi-sc-wizard.fi-contained{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-sc-wizard.fi-contained:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard.fi-contained:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-wizard.fi-contained .fi-sc-wizard-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200)}.fi-sc-wizard.fi-contained .fi-sc-wizard-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard.fi-contained .fi-sc-wizard-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-wizard.fi-contained .fi-sc-wizard-step.fi-active{margin-top:calc(var(--spacing)*0);padding:calc(var(--spacing)*6)}.fi-sc-wizard.fi-contained .fi-sc-wizard-footer{padding-inline:calc(var(--spacing)*6);padding-bottom:calc(var(--spacing)*6)}.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-footer{margin-top:calc(var(--spacing)*6)}.fi-sc{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.fi-sc.fi-inline{flex-wrap:wrap;flex-grow:1;align-items:center;display:flex}.fi-sc.fi-inline>.fi-sc-action:not(.fi-hidden){display:contents}.fi-sc.fi-sc-has-gap{gap:calc(var(--spacing)*6)}.fi-sc.fi-sc-has-gap.fi-sc-dense{gap:calc(var(--spacing)*3)}.fi-sc.fi-align-start,.fi-sc.fi-align-left{justify-content:flex-start}.fi-sc.fi-align-center{justify-content:center}.fi-sc.fi-align-end,.fi-sc.fi-align-right{justify-content:flex-end}.fi-sc.fi-align-between,.fi-sc.fi-align-justify{justify-content:space-between}.fi-sc>.fi-hidden{display:none}.fi-sc>.fi-grid-col.fi-width-xs{max-width:var(--container-xs)}.fi-sc>.fi-grid-col.fi-width-sm{max-width:var(--container-sm)}.fi-sc>.fi-grid-col.fi-width-md{max-width:var(--container-md)}.fi-sc>.fi-grid-col.fi-width-lg{max-width:var(--container-lg)}.fi-sc>.fi-grid-col.fi-width-xl{max-width:var(--container-xl)}.fi-sc>.fi-grid-col.fi-width-2xl{max-width:var(--container-2xl)}.fi-sc>.fi-grid-col.fi-width-3xl{max-width:var(--container-3xl)}.fi-sc>.fi-grid-col.fi-width-4xl{max-width:var(--container-4xl)}.fi-sc>.fi-grid-col.fi-width-5xl{max-width:var(--container-5xl)}.fi-sc>.fi-grid-col.fi-width-6xl{max-width:var(--container-6xl)}.fi-sc>.fi-grid-col.fi-width-7xl{max-width:var(--container-7xl)}.fi-sc>.fi-grid-col>.fi-sc-component{height:100%}.fi-ta-actions{justify-content:flex-end;align-items:center;gap:calc(var(--spacing)*3);flex-shrink:0;max-width:100%;display:flex}.fi-ta-actions>*{flex-shrink:0}.fi-ta-actions.fi-wrapped{flex-wrap:wrap}@media (min-width:40rem){.fi-ta-actions.sm\:fi-not-wrapped{flex-wrap:nowrap}}.fi-ta-actions.fi-align-center{justify-content:center}.fi-ta-actions.fi-align-start{justify-content:flex-start}.fi-ta-actions.fi-align-between{justify-content:space-between}@media (min-width:48rem){.fi-ta-actions.md\:fi-align-end{justify-content:flex-end}}.fi-ta-cell{padding:calc(var(--spacing)*0)}.fi-ta-cell:first-of-type{padding-inline-start:calc(var(--spacing)*1)}.fi-ta-cell:last-of-type{padding-inline-end:calc(var(--spacing)*1)}@media (min-width:40rem){.fi-ta-cell:first-of-type{padding-inline-start:calc(var(--spacing)*3)}.fi-ta-cell:last-of-type{padding-inline-end:calc(var(--spacing)*3)}}.fi-ta-cell.fi-vertical-align-start{vertical-align:top}.fi-ta-cell.fi-vertical-align-end{vertical-align:bottom}@media (min-width:40rem){.fi-ta-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-cell.\32 xl\:fi-hidden{display:none}}.fi-ta-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-cell.sm\:fi-visible{display:table-cell}}.fi-ta-cell.md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-cell.md\:fi-visible{display:table-cell}}.fi-ta-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-cell.lg\:fi-visible{display:table-cell}}.fi-ta-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-cell.xl\:fi-visible{display:table-cell}}.fi-ta-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-cell.\32 xl\:fi-visible{display:table-cell}}.fi-ta-cell .fi-ta-col{text-align:start;justify-content:flex-start;width:100%;display:flex}.fi-ta-cell .fi-ta-col:disabled{pointer-events:none}.fi-ta-cell:has(.fi-ta-reorder-handle){width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3)}.fi-ta-cell:has(.fi-ta-reorder-handle):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-reorder-handle):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell:has(.fi-ta-reorder-handle):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell:has(.fi-ta-reorder-handle):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell:has(.fi-ta-actions){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);white-space:nowrap}.fi-ta-cell:has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell:has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell:has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell:has(.fi-ta-record-checkbox){width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-record-checkbox):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell:has(.fi-ta-record-checkbox):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell:has(.fi-ta-record-checkbox):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell:has(.fi-ta-record-checkbox):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell .fi-ta-placeholder{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);color:var(--gray-400)}.fi-ta-cell .fi-ta-placeholder:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-cell.fi-ta-summary-row-heading-cell{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-cell.fi-ta-summary-row-heading-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell.fi-ta-summary-row-heading-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell.fi-ta-summary-row-heading-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-cell.fi-align-start{text-align:start}.fi-ta-cell.fi-align-center{text-align:center}.fi-ta-cell.fi-align-end{text-align:end}.fi-ta-cell.fi-align-left{text-align:left}.fi-ta-cell.fi-align-right{text-align:right}.fi-ta-cell.fi-align-justify,.fi-ta-cell.fi-align-between{text-align:justify}.fi-ta-cell.fi-ta-summary-header-cell{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-cell.fi-ta-summary-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}}.fi-ta-cell.fi-ta-summary-header-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-cell.fi-ta-summary-header-cell.fi-wrapped,.fi-ta-cell.fi-ta-summary-header-cell:not(.fi-wrapped){white-space:nowrap}.fi-ta-cell.fi-ta-individual-search-cell{min-width:calc(var(--spacing)*48);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2)}.fi-ta-cell .fi-ta-reorder-handle{cursor:move}.fi-ta-cell.fi-ta-selection-cell{width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-cell.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-cell.fi-ta-group-selection-cell{width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3)}.fi-ta-cell.fi-ta-group-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-cell.fi-ta-group-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-cell.fi-ta-group-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-cell.fi-ta-group-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-checkbox{width:100%}.fi-ta-checkbox:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-checkbox{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-checkbox{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-checkbox.fi-align-center{text-align:center}.fi-ta-checkbox.fi-align-end,.fi-ta-checkbox.fi-align-right{text-align:end}.fi-ta-color{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-ta-color.fi-wrapped{flex-wrap:wrap}.fi-ta-color:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-color{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-color{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-color.fi-align-start,.fi-ta-color.fi-align-left{justify-content:flex-start}.fi-ta-color.fi-align-center{justify-content:center}.fi-ta-color.fi-align-end,.fi-ta-color.fi-align-right{justify-content:flex-end}.fi-ta-color.fi-align-justify,.fi-ta-color.fi-align-between{justify-content:space-between}.fi-ta-color>.fi-ta-color-item{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6);border-radius:var(--radius-md)}.fi-ta-color>.fi-ta-color-item.fi-copyable{cursor:pointer}.fi-ta-icon{gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-ta-icon.fi-wrapped{flex-wrap:wrap}.fi-ta-icon.fi-ta-icon-has-line-breaks{flex-direction:column}.fi-ta-icon:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-icon{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-icon{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-icon.fi-align-start,.fi-ta-icon.fi-align-left{justify-content:flex-start}.fi-ta-icon.fi-align-center{justify-content:center}.fi-ta-icon.fi-align-end,.fi-ta-icon.fi-align-right{justify-content:flex-end}.fi-ta-icon.fi-align-justify,.fi-ta-icon.fi-align-between{justify-content:space-between}.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon{color:var(--gray-400)}:is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon).fi-color{color:var(--text)}:is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon).fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-ta-image{align-items:center;gap:calc(var(--spacing)*1.5);width:100%;display:flex}.fi-ta-image img{object-fit:cover;object-position:center;max-width:none}.fi-ta-image.fi-circular img{border-radius:3.40282e38px}.fi-ta-image.fi-ta-image-ring img,.fi-ta-image.fi-ta-image-ring .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-white)}:is(.fi-ta-image.fi-ta-image-ring img,.fi-ta-image.fi-ta-image-ring .fi-ta-image-limited-remaining-text):where(.dark,.dark *){--tw-ring-color:var(--gray-900)}.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-1 img,.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-1 .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-2 img,.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-2 .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-4 img,.fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-4 .fi-ta-image-limited-remaining-text{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.fi-ta-image.fi-ta-image-overlap-1{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-2{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-3{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-3)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-4{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-4)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-5{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-5)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-6{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-6)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-7{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-7>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-7)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-7)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-ta-image-overlap-8{column-gap:calc(var(--spacing)*0)}:where(.fi-ta-image.fi-ta-image-overlap-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-8)*calc(1 - var(--tw-space-x-reverse)))}.fi-ta-image.fi-wrapped{flex-wrap:wrap}.fi-ta-image:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-image{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-image{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-image.fi-align-start,.fi-ta-image.fi-align-left{justify-content:flex-start}.fi-ta-image.fi-align-center{justify-content:center}.fi-ta-image.fi-align-end,.fi-ta-image.fi-align-right{justify-content:flex-end}.fi-ta-image.fi-align-justify,.fi-ta-image.fi-align-between{justify-content:space-between}.fi-ta-image.fi-stacked .fi-ta-image-limited-remaining-text{background-color:var(--gray-100);border-radius:3.40282e38px}.fi-ta-image.fi-stacked .fi-ta-image-limited-remaining-text:where(.dark,.dark *){background-color:var(--gray-800)}.fi-ta-image .fi-ta-image-limited-remaining-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);justify-content:center;align-items:center;display:flex}.fi-ta-image .fi-ta-image-limited-remaining-text:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-base,.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-ta-select{width:100%;min-width:calc(var(--spacing)*48)}.fi-ta-select:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-select{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-select{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-text{width:100%}.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited{flex-direction:column;display:flex}:is(.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited).fi-ta-text-has-badges{row-gap:calc(var(--spacing)*2)}:is(.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited):not(.fi-ta-text-has-badges){row-gap:calc(var(--spacing)*1)}.fi-ta-text:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-text{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-text{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}ul.fi-ta-text.fi-bulleted,.fi-ta-text.fi-bulleted ul{list-style-type:disc;list-style-position:inside}ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul{column-gap:calc(var(--spacing)*1.5);display:flex}:is(ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul).fi-wrapped,:is(ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul).fi-ta-text-has-line-breaks,:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):is(.fi-ta-text-has-line-breaks ul){row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul){column-gap:calc(var(--spacing)*1.5);display:flex}:is(:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul)).fi-wrapped,:is(:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul)):is(.fi-wrapped ul){row-gap:calc(var(--spacing)*1);flex-wrap:wrap}.fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks){white-space:normal}.fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks) .fi-badge,.fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks) .fi-ta-text-list-limited-message{white-space:nowrap}.fi-ta-text>.fi-ta-text-description,.fi-ta-text>.fi-ta-text-list-limited-message{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}:is(.fi-ta-text>.fi-ta-text-description,.fi-ta-text>.fi-ta-text-list-limited-message):where(.dark,.dark *){color:var(--gray-400)}.fi-ta-text.fi-align-center{text-align:center}ul.fi-ta-text.fi-align-center,.fi-ta-text.fi-align-center ul{justify-content:center}.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right{text-align:end}ul:is(.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right),:is(.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right) ul{justify-content:flex-end}.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between{text-align:justify}ul:is(.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between),:is(.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between) ul{justify-content:space-between}.fi-ta-text-item{color:var(--gray-950)}.fi-ta-text-item:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.fi-ta-text-item a:hover{text-decoration-line:underline}}.fi-ta-text-item a:focus-visible{text-decoration-line:underline}.fi-ta-text-item:not(.fi-bulleted li.fi-ta-text-item){-webkit-line-clamp:var(--line-clamp,none);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.fi-ta-text-item>.fi-copyable{cursor:pointer}.fi-ta-text-item.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.fi-ta-text-item.fi-size-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.fi-ta-text-item.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.fi-ta-text-item.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.fi-ta-text-item.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.fi-ta-text-item.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.fi-ta-text-item.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.fi-ta-text-item.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.fi-ta-text-item.fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.fi-ta-text-item.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.fi-ta-text-item.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.fi-ta-text-item.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.fi-ta-text-item.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.fi-ta-text-item.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.fi-ta-text-item.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.fi-ta-text-item.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.fi-ta-text-item.fi-color{color:var(--text)}.fi-ta-text-item.fi-color:where(.dark,.dark *){color:var(--dark-text)}li.fi-ta-text-item.fi-color::marker{color:var(--gray-950)}li.fi-ta-text-item.fi-color:where(.dark,.dark *)::marker{color:var(--color-white)}.fi-ta-text-item.fi-color-gray{color:var(--gray-500)}.fi-ta-text-item.fi-color-gray:where(.dark,.dark *){color:var(--gray-400)}li.fi-ta-text-item.fi-color-gray::marker{color:var(--gray-950)}li.fi-ta-text-item.fi-color-gray:where(.dark,.dark *)::marker{color:var(--color-white)}.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon{color:var(--gray-400);flex-shrink:0;display:inline-block}:is(.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}:is(.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon).fi-color{color:var(--color-500)}.fi-ta-text-item.fi-ta-text-has-badges>.fi-badge{vertical-align:middle}@media (hover:hover){.fi-ta-col-has-column-url .fi-ta-text-item:hover{text-decoration-line:underline}}.fi-ta-col-has-column-url .fi-ta-text-item:focus-visible{text-decoration-line:underline}@media (hover:hover){.fi-ta-col-has-column-url .fi-ta-text-item .fi-icon:hover{text-decoration-line:none}}.fi-ta-col-has-column-url .fi-ta-text-item .fi-icon:focus-visible{text-decoration-line:none}@media (hover:hover){.fi-ta-col-has-column-url .fi-ta-text-item>.fi-badge:hover{text-decoration-line:none}}.fi-ta-col-has-column-url .fi-ta-text-item>.fi-badge:focus-visible{text-decoration-line:none}.fi-ta-text-input{width:100%;min-width:calc(var(--spacing)*48)}.fi-ta-text-input:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-text-input{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-text-input{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-toggle{width:100%}.fi-ta-toggle:not(.fi-inline){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table-stacked-on-mobile .fi-ta-toggle{padding:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-toggle{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-toggle.fi-align-center{text-align:center}.fi-ta-toggle.fi-align-end,.fi-ta-toggle.fi-align-right{text-align:end}.fi-ta-grid.fi-gap-sm{gap:calc(var(--spacing)*1)}@media (min-width:40rem){.fi-ta-grid.sm\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:48rem){.fi-ta-grid.md\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:64rem){.fi-ta-grid.lg\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:80rem){.fi-ta-grid.xl\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:96rem){.fi-ta-grid.\32 xl\:fi-gap-sm{gap:calc(var(--spacing)*1)}}.fi-ta-grid.fi-gap-lg{gap:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-grid.sm\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:48rem){.fi-ta-grid.md\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:64rem){.fi-ta-grid.lg\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:80rem){.fi-ta-grid.xl\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:96rem){.fi-ta-grid.\32 xl\:fi-gap-lg{gap:calc(var(--spacing)*3)}}.fi-ta-panel{border-radius:var(--radius-lg);background-color:var(--gray-50);padding:calc(var(--spacing)*4);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-ta-panel{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.fi-ta-panel{--tw-ring-inset:inset}.fi-ta-panel:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-panel:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-panel:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-split{display:flex}.fi-ta-split.default\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3)}.fi-ta-split.sm\:fi-ta-split,.fi-ta-split.md\:fi-ta-split,.fi-ta-split.lg\:fi-ta-split,.fi-ta-split.xl\:fi-ta-split,.fi-ta-split.\32 xl\:fi-ta-split{gap:calc(var(--spacing)*2);flex-direction:column}@media (min-width:40rem){.fi-ta-split.sm\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:48rem){.fi-ta-split.md\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:64rem){.fi-ta-split.lg\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:80rem){.fi-ta-split.xl\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}@media (min-width:96rem){.fi-ta-split.\32 xl\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3);flex-direction:row}}.fi-ta-stack{flex-direction:column;display:flex}.fi-ta-stack.fi-align-start,.fi-ta-stack.fi-align-left{align-items:flex-start}.fi-ta-stack.fi-align-center{align-items:center}.fi-ta-stack.fi-align-end,.fi-ta-stack.fi-align-right{align-items:flex-end}:where(.fi-ta-stack.fi-gap-sm>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.fi-ta-stack.fi-gap-md>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.fi-ta-stack.fi-gap-lg>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.fi-ta-icon-count-summary{row-gap:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-icon-count-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-table-stacked-on-mobile .fi-ta-icon-count-summary{padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*2)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-icon-count-summary{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-icon-count-summary>.fi-ta-icon-count-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-icon-count-summary>.fi-ta-icon-count-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-icon-count-summary>ul{row-gap:calc(var(--spacing)*1.5);display:grid}.fi-ta-icon-count-summary>ul>li{justify-content:flex-end;align-items:center;column-gap:calc(var(--spacing)*1.5);display:flex}.fi-ta-icon-count-summary>ul>li>.fi-icon{color:var(--gray-400)}.fi-ta-icon-count-summary>ul>li>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-icon-count-summary>ul>li>.fi-icon.fi-color{color:var(--text)}.fi-ta-icon-count-summary>ul>li>.fi-icon.fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-ta-range-summary{row-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-range-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-table-stacked-on-mobile .fi-ta-range-summary{padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*2)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-range-summary{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-range-summary>.fi-ta-range-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-range-summary>.fi-ta-range-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-text-summary{row-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-text-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-table-stacked-on-mobile .fi-ta-text-summary{padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*2)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-text-summary{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-text-summary>.fi-ta-text-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-text-summary>.fi-ta-text-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-values-summary{row-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:grid}.fi-ta-values-summary:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-table-stacked-on-mobile .fi-ta-values-summary{padding-inline:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*2)}@media (min-width:40rem){.fi-ta-table-stacked-on-mobile .fi-ta-values-summary{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}}.fi-ta-values-summary>.fi-ta-values-summary-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-values-summary>.fi-ta-values-summary-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-values-summary>ul.fi-bulleted{list-style-type:disc;list-style-position:inside}.fi-ta-ctn{border-radius:var(--radius-xl);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex;position:relative}.fi-ta-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn:not(.fi-ta-ctn-with-header){overflow:hidden}.fi-ta-ctn.fi-loading{animation:var(--animate-pulse)}.fi-ta-ctn .fi-ta-header-ctn{margin-top:-1px}.fi-ta-ctn .fi-ta-header{gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding:calc(var(--spacing)*4);flex-direction:column;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position{flex-direction:row;align-items:center}.fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position .fi-ta-actions{margin-inline-start:auto}}.fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position:not(:has(.fi-ta-header-heading)):not(:has(.fi-ta-header-description)) .fi-ta-actions{margin-inline-start:auto}.fi-ta-ctn .fi-ta-header .fi-ta-header-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-ctn .fi-ta-header .fi-ta-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-ctn .fi-ta-header .fi-ta-header-description{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-600)}.fi-ta-ctn .fi-ta-header .fi-ta-header-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-ctn .fi-ta-header-toolbar{justify-content:space-between;align-items:center;gap:calc(var(--spacing)*4);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);flex-wrap:wrap;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header-toolbar{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-header-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-header-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-header-toolbar>*{align-items:center;column-gap:calc(var(--spacing)*4);display:flex}.fi-ta-ctn .fi-ta-header-toolbar>:first-child{flex-shrink:0}.fi-ta-ctn .fi-ta-header-toolbar>:nth-child(2){margin-inline-start:auto}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown.sm\:fi-hidden{display:none}}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields{row-gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6);display:grid}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields label{row-gap:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);display:grid}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings>.fi-ta-grouping-settings-fields{align-items:center;column-gap:calc(var(--spacing)*3);display:none}@media (min-width:40rem){.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings>.fi-ta-grouping-settings-fields{display:flex}}.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-filters-dropdown .fi-ta-filters,.fi-ta-ctn .fi-ta-header-toolbar .fi-ta-col-manager-dropdown .fi-ta-col-manager{padding:calc(var(--spacing)*6)}.fi-ta-ctn .fi-ta-filters{row-gap:calc(var(--spacing)*4);display:grid}.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);padding:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header{justify-content:space-between;align-items:center;display:flex}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-ta-filters-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-ta-filters-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-loading-indicator{color:var(--gray-400)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-ctn .fi-ta-filters .fi-ta-filters-actions-ctn{gap:calc(var(--spacing)*3);display:flex}.fi-ta-ctn .fi-ta-filters-above-content-ctn{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*4);display:grid}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filters-above-content-ctn{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-filters-above-content-ctn:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filters-above-content-ctn:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-filters-above-content-ctn .fi-ta-filters-trigger-action-ctn{margin-inline-start:auto}.fi-ta-ctn .fi-ta-filters-above-content-ctn.fi-open .fi-ta-filters-trigger-action-ctn{margin-top:calc(var(--spacing)*3)}.fi-ta-ctn .fi-ta-filters-above-content-ctn.fi-open:has(.fi-ta-filters-actions-ctn) .fi-ta-filters-trigger-action-ctn{margin-top:calc(var(--spacing)*-7)}.fi-ta-ctn .fi-ta-reorder-indicator{align-items:center;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-reorder-indicator{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-ctn .fi-ta-reorder-indicator .fi-loading-indicator{color:var(--gray-400)}.fi-ta-ctn .fi-ta-reorder-indicator .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-ctn .fi-ta-selection-indicator{justify-content:space-between;row-gap:calc(var(--spacing)*1);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);flex-direction:column;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-selection-indicator{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*1.5);flex-direction:row;align-items:center}}.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-ctn .fi-ta-selection-indicator .fi-loading-indicator{color:var(--gray-400)}.fi-ta-ctn .fi-ta-selection-indicator .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-ctn .fi-ta-selection-indicator .fi-ta-selection-indicator-actions-ctn,.fi-ta-ctn .fi-ta-selection-indicator>*{column-gap:calc(var(--spacing)*3);display:flex}.fi-ta-ctn .fi-ta-selection-indicator>:first-child{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-ta-ctn .fi-ta-selection-indicator>:first-child:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-ctn .fi-ta-selection-indicator>:nth-child(2){margin-inline-start:auto}.fi-ta-ctn .fi-ta-filter-indicators{justify-content:space-between;align-items:flex-start;column-gap:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filter-indicators{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-ctn .fi-ta-filter-indicators>:first-child{column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}@media (min-width:40rem){.fi-ta-ctn .fi-ta-filter-indicators>:first-child{flex-direction:row}}.fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--gray-700)}.fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-label:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-badges-ctn{gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.fi-ta-ctn .fi-ta-filter-indicators>:nth-child(2).fi-icon-btn{margin-top:calc(var(--spacing)*-1)}.fi-ta-ctn .fi-pagination{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-ctn .fi-pagination{padding-inline:calc(var(--spacing)*6)}}.fi-ta-ctn .fi-pagination:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-ctn .fi-pagination:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-ctn .fi-ta-table-loading-ctn{height:calc(var(--spacing)*32);justify-content:center;align-items:center;display:flex}.fi-ta-ctn .fi-ta-main{min-width:calc(var(--spacing)*0);flex:1}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-trigger-action-ctn.lg\:fi-hidden{display:none}}.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn{z-index:20;border-radius:var(--radius-lg);border-color:var(--gray-200);background-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);width:100vw;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-shrink:0;display:none;position:absolute;max-width:14rem!important}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn{z-index:auto;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:static}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn) .fi-ta-filters{padding:calc(var(--spacing)*6)}@media (min-width:64rem){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn) .fi-ta-filters{padding-block:calc(var(--spacing)*4)}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-open{display:block}@media (min-width:64rem){:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).lg\:fi-open{display:block}}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-opacity-0{opacity:0}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-xs{max-width:var(--container-xs)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-sm{max-width:var(--container-sm)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-md{max-width:var(--container-md)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-lg{max-width:var(--container-lg)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-xl{max-width:var(--container-xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-2xl{max-width:var(--container-2xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-3xl{max-width:var(--container-3xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-4xl{max-width:var(--container-4xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-5xl{max-width:var(--container-5xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-6xl{max-width:var(--container-6xl)!important}:is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-7xl{max-width:var(--container-7xl)!important}.fi-ta-ctn .fi-ta-filters-before-content-ctn{inset-inline-start:calc(var(--spacing)*0)}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-before-content-ctn{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-start-start-radius:var(--radius-xl);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-xl)}}.fi-ta-ctn .fi-ta-filters-after-content-ctn{inset-inline-end:calc(var(--spacing)*0)}@media (min-width:64rem){.fi-ta-ctn .fi-ta-filters-after-content-ctn{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-start-start-radius:0;border-start-end-radius:var(--radius-xl);border-end-end-radius:var(--radius-xl);border-end-start-radius:0}}.fi-ta-content-ctn{position:relative}:where(.fi-ta-content-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-ta-content-ctn{overflow-x:auto}:where(.fi-ta-content-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-content-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn:where(.dark,.dark *){border-top-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn:where(.dark,.dark *){border-top-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content-header{align-items:center;gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*6);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*4);display:flex}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content-header{padding-inline:calc(var(--spacing)*6)}}.fi-ta-content-ctn .fi-ta-content-header:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content-header .fi-ta-page-checkbox{margin-block:calc(var(--spacing)*4);flex-shrink:0}.fi-ta-content-ctn .fi-ta-content-header .fi-ta-sorting-settings{column-gap:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);display:flex}.fi-ta-content-ctn:not(.fi-ta-ctn-with-footer .fi-ta-content-ctn){border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.fi-ta-content-ctn:not(.fi-ta-ctn-with-header .fi-ta-content-ctn){border-top-style:var(--tw-border-style);border-top-width:0}.fi-ta-content-ctn .fi-ta-content{display:grid}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid{gap:calc(var(--spacing)*4);padding:calc(var(--spacing)*4)}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid{padding-inline:calc(var(--spacing)*6)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid.fi-ta-content-grouped{padding-top:calc(var(--spacing)*0)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{margin-inline:calc(var(--spacing)*-4);border-block-style:var(--tw-border-style);border-block-width:1px;border-color:var(--gray-200)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:first-child{border-top-style:var(--tw-border-style);border-top-width:0}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{margin-inline:calc(var(--spacing)*-6)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{width:calc(100% + 2rem)}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{width:calc(100% + 3rem)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record{border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (hover:hover){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected){background-color:var(--color-white)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-actions{padding-inline-start:calc(var(--spacing)*2)}.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-actions{padding-inline-end:calc(var(--spacing)*2)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid){background-color:var(--gray-200);row-gap:1px}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}@media (hover:hover){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:before{content:var(--tw-content);content:var(--tw-content);inset-block:calc(var(--spacing)*0);content:var(--tw-content);content:var(--tw-content);width:calc(var(--spacing)*.5);content:var(--tw-content);background-color:var(--primary-600);position:absolute;inset-inline-start:calc(var(--spacing)*0)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--primary-500)}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record .fi-ta-record-content-ctn{flex-direction:row;align-items:center}}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-actions{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-actions{padding-inline-end:calc(var(--spacing)*6)}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix{padding-inline-start:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-actions{padding-inline-start:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix{padding-inline-end:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-actions{padding-inline-end:calc(var(--spacing)*3)}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record .fi-ta-actions{padding-inline-start:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header{align-items:center;column-gap:calc(var(--spacing)*3);background-color:var(--gray-50);width:100%;padding-inline:calc(var(--spacing)*1);padding-block:calc(var(--spacing)*2);grid-column:1/-1;display:flex}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header{padding-inline:calc(var(--spacing)*3)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header.fi-collapsible{cursor:pointer}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header.fi-collapsible.fi-collapsed .fi-icon-btn{rotate:-180deg}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-checkbox{margin-inline:calc(var(--spacing)*3)}.fi-ta-content-ctn .fi-ta-content .fi-ta-table{grid-column:1/-1}.fi-ta-content-ctn .fi-ta-content .fi-ta-record{background-color:var(--color-white);height:100%;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;align-items:center;transition-duration:75ms;display:flex;position:relative}.fi-ta-content-ctn .fi-ta-content .fi-ta-record:where(.dark,.dark *){background-color:var(--gray-900)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-with-content-prefix{padding-inline-start:calc(var(--spacing)*1)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-with-content-suffix{padding-inline-end:calc(var(--spacing)*1)}@media (hover:hover){.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-clickable:hover{background-color:var(--gray-50)}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-collapsed{display:none}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-selected{background-color:var(--gray-50)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-reorder-handle{margin-inline:calc(var(--spacing)*1);margin-block:calc(var(--spacing)*2)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-checkbox{margin-inline:calc(var(--spacing)*3);margin-block:calc(var(--spacing)*4);flex-shrink:0}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn{row-gap:calc(var(--spacing)*3);width:100%;height:100%;padding-block:calc(var(--spacing)*4);flex-direction:column;display:flex}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn>:first-child{flex:1}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content{width:100%;display:block}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col{text-align:start;justify-content:flex-start;display:flex}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col:disabled{pointer-events:none}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-growable{width:100%}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-center{text-align:center;justify-content:center}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-end{text-align:end;justify-content:flex-end}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-left{text-align:left;justify-content:flex-start}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-right{text-align:right;justify-content:flex-end}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-justify,.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-between{text-align:justify;justify-content:space-between}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content.fi-collapsible{margin-top:calc(var(--spacing)*3)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-growable{flex:1;width:100%}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-hidden{display:none}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-visible{display:block}}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-collapse-btn{margin-inline:calc(var(--spacing)*1);margin-block:calc(var(--spacing)*2);flex-shrink:0}.fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-actions.fi-ta-actions-before-columns-position{order:-9999}.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-actions{padding-inline-start:calc(var(--spacing)*4)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-record-content,.fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-actions{padding-inline-end:calc(var(--spacing)*4)}.fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-collapsed .fi-ta-record-collapse-btn{rotate:180deg}.fi-ta-empty-state{padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*12)}.fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state){border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--gray-200)}.fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-ta-empty-state .fi-ta-empty-state-content{max-width:var(--container-lg);text-align:center;justify-items:center;margin-inline:auto;display:grid}.fi-ta-empty-state .fi-ta-empty-state-icon-bg{margin-bottom:calc(var(--spacing)*4);background-color:var(--gray-100);padding:calc(var(--spacing)*3);border-radius:3.40282e38px}.fi-ta-empty-state .fi-ta-empty-state-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab, red, red)){.fi-ta-empty-state .fi-ta-empty-state-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.fi-ta-empty-state .fi-ta-empty-state-icon-bg .fi-icon{color:var(--gray-500)}.fi-ta-empty-state .fi-ta-empty-state-icon-bg .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-empty-state .fi-ta-empty-state-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-empty-state .fi-ta-empty-state-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-empty-state .fi-ta-empty-state-description{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-ta-empty-state .fi-ta-empty-state-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-empty-state .fi-ta-actions{margin-top:calc(var(--spacing)*6)}.fi-ta-header-cell{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3.5);text-align:start;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-header-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-header-cell.fi-growable{width:100%}.fi-ta-header-cell.fi-grouped{border-color:var(--gray-200)}.fi-ta-header-cell.fi-grouped:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-header-cell.fi-grouped:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-header-cell.fi-grouped:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-ta-header-cell.fi-grouped:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-ta-header-cell.fi-align-center{text-align:center}.fi-ta-header-cell.fi-align-center .fi-ta-header-cell-sort-btn{justify-content:center}.fi-ta-header-cell.fi-align-end{text-align:end}.fi-ta-header-cell.fi-align-end .fi-ta-header-cell-sort-btn{justify-content:flex-end}.fi-ta-header-cell.fi-align-left{text-align:left}.fi-ta-header-cell.fi-align-left .fi-ta-header-cell-sort-btn{justify-content:flex-start}.fi-ta-header-cell.fi-align-left .fi-ta-header-cell-sort-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.fi-ta-header-cell.fi-align-right{text-align:right}.fi-ta-header-cell.fi-align-right .fi-ta-header-cell-sort-btn{justify-content:flex-end}.fi-ta-header-cell.fi-align-right .fi-ta-header-cell-sort-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.fi-ta-header-cell.fi-align-justify,.fi-ta-header-cell.fi-align-between{text-align:justify}:is(.fi-ta-header-cell.fi-align-justify,.fi-ta-header-cell.fi-align-between) .fi-ta-header-cell-sort-btn{justify-content:space-between}.fi-ta-header-cell.fi-ta-header-cell-sorted .fi-icon{color:var(--gray-950)}.fi-ta-header-cell.fi-ta-header-cell-sorted .fi-icon:where(.dark,.dark *){color:var(--color-white)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-icon{color:var(--gray-400)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-icon:where(.dark,.dark *),.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:hover .fi-icon{color:var(--gray-500)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:focus-visible .fi-icon{color:var(--gray-500)}.fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}@media (min-width:40rem){.fi-ta-header-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-header-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-header-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-header-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-header-cell.\32 xl\:fi-hidden{display:none}}.fi-ta-header-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-header-cell.sm\:fi-visible{display:table-cell}}.fi-ta-header-cell.md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-header-cell.md\:fi-visible{display:table-cell}}.fi-ta-header-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-header-cell.lg\:fi-visible{display:table-cell}}.fi-ta-header-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-header-cell.xl\:fi-visible{display:table-cell}}.fi-ta-header-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-header-cell.\32 xl\:fi-visible{display:table-cell}}.fi-ta-header-cell.fi-wrapped{white-space:normal}.fi-ta-header-cell:not(.fi-wrapped){white-space:nowrap}.fi-ta-header-cell .fi-ta-header-cell-sort-btn{cursor:pointer;justify-content:flex-start;align-items:center;column-gap:calc(var(--spacing)*1);width:100%;display:flex}.fi-ta-header-cell .fi-icon{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;transition-duration:75ms}.fi-ta-header-cell .fi-loading-indicator{color:var(--gray-400)}.fi-ta-header-cell .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.fi-ta-header-group-cell{border-color:var(--gray-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}@media (min-width:40rem){.fi-ta-header-group-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-header-group-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-header-group-cell:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-header-group-cell:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-header-group-cell:where(.dark,.dark *){color:var(--color-white)}.fi-ta-header-group-cell:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.fi-ta-header-group-cell:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.fi-ta-header-group-cell.fi-align-start{text-align:start}.fi-ta-header-group-cell.fi-align-center{text-align:center}.fi-ta-header-group-cell.fi-align-end{text-align:end}.fi-ta-header-group-cell.fi-align-left{text-align:left}.fi-ta-header-group-cell.fi-align-right{text-align:right}.fi-ta-header-group-cell.fi-align-justify,.fi-ta-header-group-cell.fi-align-between{text-align:justify}@media (min-width:40rem){.fi-ta-header-group-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-header-group-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-header-group-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-header-group-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-header-group-cell.\32 xl\:fi-hidden{display:none}}.fi-ta-header-group-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-header-group-cell.sm\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-header-group-cell.md\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-header-group-cell.lg\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-header-group-cell.xl\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-header-group-cell.\32 xl\:fi-visible{display:table-cell}}.fi-ta-header-group-cell.fi-wrapped{white-space:normal}.fi-ta-header-group-cell:not(.fi-wrapped){white-space:nowrap}.fi-ta-empty-header-cell{width:calc(var(--spacing)*1)}@media (hover:hover){.fi-ta-row{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-ta-row.fi-clickable:hover{background-color:var(--gray-50)}.fi-ta-row.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-ta-row.fi-striped{background-color:var(--gray-50)}.fi-ta-row.fi-striped:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-striped:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-row.fi-collapsed{display:none}.fi-ta-row.fi-ta-group-header-row>td{background-color:var(--gray-50)}.fi-ta-row.fi-ta-group-header-row>td:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-ta-group-header-row>td:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-row .fi-ta-group-header-cell{padding-inline:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-ta-row .fi-ta-group-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-row .fi-ta-group-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-row .fi-ta-group-header{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;padding-block:calc(var(--spacing)*2);display:flex}.fi-ta-row .fi-ta-group-header.fi-collapsible{cursor:pointer}.fi-ta-row .fi-ta-group-header.fi-collapsible.fi-collapsed .fi-icon-btn{rotate:-180deg}.fi-ta-row .fi-ta-group-header .fi-ta-group-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-ta-row .fi-ta-group-header .fi-ta-group-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-row .fi-ta-group-header .fi-ta-group-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-ta-row .fi-ta-group-header .fi-ta-group-description:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-row.fi-selected:not(.fi-striped){background-color:var(--gray-50)}.fi-ta-row.fi-selected:not(.fi-striped):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-row.fi-selected:not(.fi-striped):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-row.fi-selected>:first-child{position:relative}.fi-ta-row.fi-selected>:first-child:before{inset-block:calc(var(--spacing)*0);width:calc(var(--spacing)*.5);background-color:var(--primary-600);content:"";position:absolute;inset-inline-start:calc(var(--spacing)*0)}.fi-ta-row.fi-selected>:first-child:where(.dark,.dark *):before{background-color:var(--primary-500)}.fi-ta-reordering .fi-ta-row:not(.fi-ta-row-not-reorderable){cursor:move}.fi-ta-table{table-layout:auto;width:100%}:where(.fi-ta-table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-ta-table{text-align:start}:where(.fi-ta-table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table.fi-ta-table-stacked-on-mobile{display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile{table-layout:auto;display:table}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead{display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead{display:table-header-group}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead:not(:has(.fi-ta-table-stacked-header-row)){display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead:not(:has(.fi-ta-table-stacked-header-row)){display:table-header-group}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr:not(.fi-ta-table-stacked-header-row){display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr:not(.fi-ta-table-stacked-header-row){display:table-row}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-header-cell{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-header-cell{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-selection-cell{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>thead>tr>.fi-ta-selection-cell{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody{white-space:normal;display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody{white-space:nowrap;display:table-row-group}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr{padding-block:calc(var(--spacing)*2);display:block;position:relative}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr{padding-block:calc(var(--spacing)*0);display:table-row;position:static}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-collapsed{display:none}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:before{inset-block:calc(var(--spacing)*0);width:calc(var(--spacing)*.5);background-color:var(--primary-600);position:absolute;inset-inline-start:calc(var(--spacing)*0)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:before{display:none}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:before{content:""}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected:where(.dark,.dark *):before{background-color:var(--primary-500)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected>:first-child:before{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-selected>:first-child:before{display:block}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-ta-group-header-row{padding-block:calc(var(--spacing)*0)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-ta-group-header-row>td{width:100%;display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-ta-group-header-row>td{width:auto;display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr.fi-ta-summary-row{padding-block:calc(var(--spacing)*0)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell{inset-inline-end:calc(var(--spacing)*5);top:calc(var(--spacing)*0);position:absolute}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell{width:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4);display:table-cell;position:static}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell){padding-inline:calc(var(--spacing)*4);display:block}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell){padding-inline:calc(var(--spacing)*0);display:table-cell}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):first-of-type{padding-inline-start:calc(var(--spacing)*3)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):last-of-type{padding-inline-end:calc(var(--spacing)*3)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).fi-ta-summary-row-heading-cell{padding-inline:calc(var(--spacing)*3)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).fi-ta-summary-row-heading-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).fi-ta-summary-row-heading-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).fi-ta-summary-header-cell{padding-inline:calc(var(--spacing)*3)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).fi-ta-summary-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).sm\:fi-hidden{display:none}}@media (min-width:48rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).md\:fi-hidden{display:none}}@media (min-width:64rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).lg\:fi-hidden{display:none}}@media (min-width:80rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).xl\:fi-hidden{display:none}}@media (min-width:96rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).\32 xl\:fi-hidden{display:none}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).sm\:fi-visible{display:none}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).sm\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).md\:fi-visible{display:none}@media (min-width:48rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).md\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).lg\:fi-visible{display:none}@media (min-width:64rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).lg\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).xl\:fi-visible{display:none}@media (min-width:80rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).xl\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).\32 xl\:fi-visible{display:none}@media (min-width:96rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell).\32 xl\:fi-visible{display:table-cell}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-label{padding-top:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-500)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-label{display:none}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-label:where(.dark,.dark *){color:var(--gray-400)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-content{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word;color:var(--gray-800)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-content{display:block}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell)>.fi-ta-cell-content:where(.dark,.dark *){color:var(--gray-200)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions){padding-block:calc(var(--spacing)*2)}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions){padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions)>.fi-ta-actions{justify-content:flex-start;column-gap:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*2);flex-wrap:wrap;width:100%}@media (min-width:40rem){.fi-ta-table.fi-ta-table-stacked-on-mobile>tbody>tr>.fi-ta-cell:not(.fi-ta-selection-cell):has(.fi-ta-actions)>.fi-ta-actions{justify-content:flex-end;gap:calc(var(--spacing)*3);flex-wrap:nowrap;width:auto}}:where(.fi-ta-table>thead>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-ta-table>thead:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-table>thead:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table>thead>tr{background-color:var(--gray-50)}.fi-ta-table>thead>tr:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-table>thead>tr:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table>thead>tr.fi-ta-table-head-groups-row{background-color:var(--gray-100)}.fi-ta-table>thead>tr.fi-ta-table-head-groups-row:where(.dark,.dark *){background-color:#0000}:where(.fi-ta-table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}.fi-ta-table>tbody{white-space:nowrap}:where(.fi-ta-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.fi-ta-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table>tfoot{background-color:var(--gray-50)}.fi-ta-table>tfoot:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-table>tfoot:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table-stacked-header-row{border-block-style:var(--tw-border-style);border-block-width:0;width:100%;display:block}@media (min-width:40rem){.fi-ta-table-stacked-header-row{display:none}}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell{align-items:center;gap:calc(var(--spacing)*4);background-color:var(--gray-50);width:100%;padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);display:flex}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell .fi-ta-page-checkbox{flex-shrink:0;margin-inline-start:auto}.fi-ta-table-stacked-header-row .fi-ta-table-stacked-header-cell .fi-ta-table-stacked-sorting{column-gap:calc(var(--spacing)*3);flex:1;display:flex}.fi-ta-col-manager{gap:calc(var(--spacing)*4);display:grid}.fi-ta-col-manager .fi-ta-col-manager-header{justify-content:space-between;align-items:center;display:flex}.fi-ta-col-manager .fi-ta-col-manager-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950)}.fi-ta-col-manager .fi-ta-col-manager-heading:where(.dark,.dark *){color:var(--color-white)}.fi-ta-col-manager .fi-ta-col-manager-items{margin-top:calc(var(--spacing)*-6);column-gap:calc(var(--spacing)*6)}.fi-ta-col-manager .fi-ta-col-manager-item{break-inside:avoid;align-items:center;gap:calc(var(--spacing)*3);padding-top:calc(var(--spacing)*6);display:flex}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label{align-items:center;column-gap:calc(var(--spacing)*3);width:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950);flex:1;display:flex}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label:where(.dark,.dark *){color:var(--color-white)}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label .fi-checkbox-input{flex-shrink:0}.fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-reorder-handle{cursor:move}.fi-ta-col-manager .fi-ta-col-manager-group{break-inside:avoid}.fi-ta-col-manager .fi-ta-col-manager-group .fi-ta-col-manager-group-items{padding-inline-start:calc(var(--spacing)*8)}.fi-ta-col-manager .fi-ta-col-manager-actions-ctn{gap:calc(var(--spacing)*3);display:flex}.fi-wi-chart .fi-wi-chart-canvas-ctn{margin-inline:auto}.fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1}@supports (container-type:inline-size){.fi-wi-chart .fi-section-content{container-type:inline-size}@container (min-width:24rem){.fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1.5}}}@supports not (container-type:inline-size){@media (min-width:40rem){.fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1.5}}}.fi-wi-chart .fi-wi-chart-filter.fi-input-wrp{width:max-content}@media (min-width:40rem){.fi-wi-chart .fi-wi-chart-filter.fi-input-wrp{margin-block:calc(var(--spacing)*-2)}}.fi-wi-chart .fi-wi-chart-filter.fi-dropdown .fi-wi-chart-filter-content{row-gap:calc(var(--spacing)*4);padding:calc(var(--spacing)*6);display:grid}.fi-wi-chart .fi-wi-chart-filter.fi-dropdown .fi-wi-chart-filter-content-actions-ctn{gap:calc(var(--spacing)*3);display:flex}.fi-wi-chart .fi-color .fi-wi-chart-bg-color{color:var(--color-50)}.fi-wi-chart .fi-color .fi-wi-chart-bg-color:where(.dark,.dark *){color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-wi-chart .fi-color .fi-wi-chart-bg-color:where(.dark,.dark *){color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-wi-chart .fi-color .fi-wi-chart-border-color{color:var(--color-500)}.fi-wi-chart .fi-color .fi-wi-chart-border-color:where(.dark,.dark *){color:var(--color-400)}.fi-wi-chart .fi-wi-chart-bg-color{color:var(--gray-100)}.fi-wi-chart .fi-wi-chart-bg-color:where(.dark,.dark *){color:var(--gray-800)}.fi-wi-chart .fi-wi-chart-border-color{color:var(--gray-400)}.fi-wi-chart .fi-wi-chart-grid-color{color:var(--gray-200)}.fi-wi-chart .fi-wi-chart-grid-color:where(.dark,.dark *){color:var(--gray-800)}.fi-wi-chart .fi-wi-chart-text-color{color:var(--gray-500)}.fi-wi-chart .fi-wi-chart-text-color:where(.dark,.dark *){color:var(--gray-400)}.fi-wi-stats-overview-stat{border-radius:var(--radius-xl);background-color:var(--color-white);height:100%;padding:calc(var(--spacing)*6);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:block;position:relative}.fi-wi-stats-overview-stat:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-wi-stats-overview-stat:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-wi-stats-overview-stat .fi-icon{color:var(--gray-400);flex-shrink:0}.fi-wi-stats-overview-stat .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-content{row-gap:calc(var(--spacing)*2);display:grid}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label-ctn{align-items:center;column-gap:calc(var(--spacing)*2);display:flex}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label:where(.dark,.dark *){color:var(--gray-400)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value:where(.dark,.dark *){color:var(--color-white)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description{align-items:center;column-gap:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500);display:flex}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description:where(.dark,.dark *){color:var(--gray-400)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color{color:var(--text)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color:where(.dark,.dark *){color:var(--dark-text)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color .fi-icon{color:var(--color-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart{inset-inline:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl);position:absolute;overflow:hidden}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart>canvas{height:calc(var(--spacing)*6)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-bg-color{color:var(--gray-100)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:var(--gray-800)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-border-color{color:var(--gray-400)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color{color:var(--color-50)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:var(--color-400)}@supports (color:color-mix(in lab, red, red)){.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:color-mix(in oklab,var(--color-400)10%,transparent)}}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-border-color{color:var(--color-500)}.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-border-color:where(.dark,.dark *){color:var(--color-400)}.fi-wi{gap:calc(var(--spacing)*6)}.fi-global-search-ctn{align-items:center;display:flex}.fi-global-search{flex:1}@media (min-width:40rem){.fi-global-search{position:relative}}.fi-global-search-results-ctn{inset-inline:calc(var(--spacing)*4);z-index:10;margin-top:calc(var(--spacing)*2);max-height:calc(var(--spacing)*96);border-radius:var(--radius-lg);background-color:var(--color-white);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:absolute;overflow:auto}@media (min-width:40rem){.fi-global-search-results-ctn{inset-inline:auto}}.fi-global-search-results-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-global-search-results-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-results-ctn{transform:translateZ(0)}.fi-global-search-results-ctn.fi-transition-enter-start,.fi-global-search-results-ctn.fi-transition-leave-end{opacity:0}@media (min-width:40rem){.fi-topbar .fi-global-search-results-ctn{width:100vw;max-width:var(--container-sm);inset-inline-end:calc(var(--spacing)*0)}}.fi-sidebar .fi-global-search-ctn{margin-inline:calc(var(--spacing)*3);margin-top:calc(var(--spacing)*3)}@media (min-width:40rem){.fi-sidebar .fi-global-search-results-ctn{inset-inline-start:calc(var(--spacing)*0)}}.fi-global-search-no-results-message{padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-global-search-no-results-message:where(.dark,.dark *){color:var(--gray-400)}:where(.fi-global-search-results>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-global-search-results:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-global-search-results:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-result-group-header{top:calc(var(--spacing)*0);z-index:10;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);background-color:var(--gray-50);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);text-transform:capitalize;position:sticky}.fi-global-search-result-group-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-global-search-result-group-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-result-group-header:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white)}:where(.fi-global-search-result-group-results>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200)}:where(.fi-global-search-result-group-results:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.fi-global-search-result-group-results:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-global-search-result{scroll-margin-top:calc(var(--spacing)*9);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-global-search-result:focus-within{background-color:var(--gray-50)}@media (hover:hover){.fi-global-search-result:hover{background-color:var(--gray-50)}}.fi-global-search-result:where(.dark,.dark *):focus-within{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-global-search-result:where(.dark,.dark *):focus-within{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}@media (hover:hover){.fi-global-search-result:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-global-search-result:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-global-search-result.fi-global-search-result-has-actions .fi-global-search-result-link{padding-bottom:calc(var(--spacing)*0)}.fi-global-search-result-link{padding:calc(var(--spacing)*4);--tw-outline-style:none;outline-style:none;display:block}@media (forced-colors:active){.fi-global-search-result-link{outline-offset:2px;outline:2px solid #0000}}.fi-global-search-result-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-950)}.fi-global-search-result-heading:where(.dark,.dark *){color:var(--color-white)}.fi-global-search-result-details{margin-top:calc(var(--spacing)*1)}.fi-global-search-result-detail{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-global-search-result-detail:where(.dark,.dark *){color:var(--gray-400)}.fi-global-search-result-detail-label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);display:inline}.fi-global-search-result-detail-value{display:inline}.fi-global-search-result-actions{margin-top:calc(var(--spacing)*3);column-gap:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*4);display:flex}.fi-header{gap:calc(var(--spacing)*4);flex-direction:column;display:flex}@media (min-width:40rem){.fi-header{flex-direction:row;justify-content:space-between;align-items:center}}.fi-header .fi-breadcrumbs{margin-bottom:calc(var(--spacing)*2);display:none}@media (min-width:40rem){.fi-header .fi-breadcrumbs{display:block}.fi-header.fi-header-has-breadcrumbs .fi-header-actions-ctn{margin-top:calc(var(--spacing)*7)}}.fi-header-heading{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950)}@media (min-width:40rem){.fi-header-heading{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}.fi-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-header-subheading{margin-top:calc(var(--spacing)*2);max-width:var(--container-2xl);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));color:var(--gray-600)}.fi-header-subheading:where(.dark,.dark *){color:var(--gray-400)}.fi-header-actions-ctn{align-items:center;gap:calc(var(--spacing)*3);flex-shrink:0;display:flex}.fi-header-actions-ctn>.fi-ac{flex:1}.fi-header-actions-ctn>.fi-ac:not(.fi-width-full).fi-align-end,.fi-header-actions-ctn>.fi-ac:not(.fi-width-full).fi-align-right{flex-direction:row;justify-content:flex-end}.fi-simple-header{flex-direction:column;align-items:center;display:flex}.fi-simple-header .fi-logo{margin-bottom:calc(var(--spacing)*4)}.fi-simple-header-heading{text-align:center;font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950)}.fi-simple-header-heading:where(.dark,.dark *){color:var(--color-white)}.fi-simple-header-subheading{margin-top:calc(var(--spacing)*2);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-simple-header-subheading:where(.dark,.dark *){color:var(--gray-400)}html.fi{min-height:100dvh}.fi-body{background-color:var(--gray-50);--tw-font-weight:var(--font-weight-normal);min-height:100dvh;font-weight:var(--font-weight-normal);color:var(--gray-950);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fi-body:where(.dark,.dark *){background-color:var(--gray-950);color:var(--color-white)}:is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-main-ctn{opacity:0;min-height:calc(100dvh - 4rem);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fi-body>.fi-layout-sidebar-toggle-btn-ctn{padding-inline-start:calc(var(--spacing)*5);padding-top:calc(var(--spacing)*5)}@media (min-width:64rem){.fi-body>.fi-layout-sidebar-toggle-btn-ctn.lg\:fi-hidden{display:none}}.fi-body.fi-body-has-navigation:not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop):not(.fi-body-has-top-navigation) .fi-main-ctn{opacity:0}:is(.fi-body.fi-body-has-top-navigation,.fi-body:not(.fi-body-has-navigation)) .fi-main-ctn{min-height:calc(100dvh - 4rem);display:flex}.fi-body:not(.fi-body-has-topbar) .fi-main-ctn{min-height:100dvh;display:flex}.fi-layout{width:100%;height:100%;display:flex;overflow-x:clip}.fi-main-ctn{flex-direction:column;flex:1;width:100vw}.fi-main{width:100%;height:100%;padding-inline:calc(var(--spacing)*4);margin-inline:auto}@media (min-width:48rem){.fi-main{padding-inline:calc(var(--spacing)*6)}}@media (min-width:64rem){.fi-main{padding-inline:calc(var(--spacing)*8)}}:is(.fi-main,.fi-simple-main).fi-width-xs{max-width:var(--container-xs)}:is(.fi-main,.fi-simple-main).fi-width-sm{max-width:var(--container-sm)}:is(.fi-main,.fi-simple-main).fi-width-md{max-width:var(--container-md)}:is(.fi-main,.fi-simple-main).fi-width-lg{max-width:var(--container-lg)}:is(.fi-main,.fi-simple-main).fi-width-xl{max-width:var(--container-xl)}:is(.fi-main,.fi-simple-main).fi-width-2xl{max-width:var(--container-2xl)}:is(.fi-main,.fi-simple-main).fi-width-3xl{max-width:var(--container-3xl)}:is(.fi-main,.fi-simple-main).fi-width-4xl{max-width:var(--container-4xl)}:is(.fi-main,.fi-simple-main).fi-width-5xl{max-width:var(--container-5xl)}:is(.fi-main,.fi-simple-main).fi-width-6xl{max-width:var(--container-6xl)}:is(.fi-main,.fi-simple-main).fi-width-7xl{max-width:var(--container-7xl)}:is(.fi-main,.fi-simple-main).fi-width-full{max-width:100%}:is(.fi-main,.fi-simple-main).fi-width-min{max-width:min-content}:is(.fi-main,.fi-simple-main).fi-width-max{max-width:max-content}:is(.fi-main,.fi-simple-main).fi-width-fit{max-width:fit-content}:is(.fi-main,.fi-simple-main).fi-width-prose{max-width:65ch}:is(.fi-main,.fi-simple-main).fi-width-screen-sm{max-width:var(--breakpoint-sm)}:is(.fi-main,.fi-simple-main).fi-width-screen-md{max-width:var(--breakpoint-md)}:is(.fi-main,.fi-simple-main).fi-width-screen-lg{max-width:var(--breakpoint-lg)}:is(.fi-main,.fi-simple-main).fi-width-screen-xl{max-width:var(--breakpoint-xl)}:is(.fi-main,.fi-simple-main).fi-width-screen-2xl{max-width:var(--breakpoint-2xl)}:is(.fi-main,.fi-simple-main).fi-width-screen{inset:calc(var(--spacing)*0);position:fixed}.fi-simple-layout{flex-direction:column;align-items:center;min-height:100dvh;display:flex}.fi-simple-layout-header{inset-inline-end:calc(var(--spacing)*0);top:calc(var(--spacing)*0);height:calc(var(--spacing)*16);align-items:center;column-gap:calc(var(--spacing)*4);padding-inline-end:calc(var(--spacing)*4);display:flex;position:absolute}@media (min-width:48rem){.fi-simple-layout-header{padding-inline-end:calc(var(--spacing)*6)}}@media (min-width:64rem){.fi-simple-layout-header{padding-inline-end:calc(var(--spacing)*8)}}.fi-simple-main-ctn{flex-grow:1;justify-content:center;align-items:center;width:100%;display:flex}.fi-simple-main{margin-block:calc(var(--spacing)*16);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*12);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:40rem){.fi-simple-main{border-radius:var(--radius-xl);padding-inline:calc(var(--spacing)*12)}}.fi-simple-main:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-simple-main:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-logo{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--gray-950);display:flex}.fi-logo:where(.dark,.dark *){color:var(--color-white)}.fi-logo.fi-logo-light:where(.dark,.dark *),.fi-logo.fi-logo-dark{display:none}.fi-logo.fi-logo-dark:where(.dark,.dark *){display:flex}@media (min-width:48rem){.fi-page-sub-navigation-dropdown{display:none}}.fi-page-sub-navigation-dropdown>.fi-dropdown-trigger>.fi-btn{justify-content:space-between;width:100%}.fi-page-sub-navigation-sidebar-ctn{width:calc(var(--spacing)*72);flex-direction:column;display:none}@media (min-width:48rem){.fi-page-sub-navigation-sidebar-ctn{display:flex}}.fi-page-sub-navigation-sidebar{row-gap:calc(var(--spacing)*7);flex-direction:column;display:flex}.fi-page-sub-navigation-tabs{display:none}@media (min-width:48rem){.fi-page-sub-navigation-tabs{display:flex}}.fi-page.fi-height-full,.fi-page.fi-height-full .fi-page-main,.fi-page.fi-height-full .fi-page-header-main-ctn,.fi-page.fi-height-full .fi-page-content{height:100%}.fi-page.fi-page-has-sub-navigation .fi-page-main{gap:calc(var(--spacing)*8);flex-direction:column;display:flex}@media (min-width:48rem){:is(.fi-page.fi-page-has-sub-navigation.fi-page-has-sub-navigation-start,.fi-page.fi-page-has-sub-navigation.fi-page-has-sub-navigation-end) .fi-page-main{flex-direction:row;align-items:flex-start}}.fi-page-header-main-ctn{row-gap:calc(var(--spacing)*8);padding-block:calc(var(--spacing)*8);flex-direction:column;display:flex}.fi-page-main-sub-navigation-mobile-menu-render-hook-ctn{display:contents}@media (min-width:48rem){.fi-page-main-sub-navigation-mobile-menu-render-hook-ctn{display:none}}.fi-page-content{row-gap:calc(var(--spacing)*8);flex:1;grid-auto-columns:minmax(0,1fr);display:grid}.fi-simple-page-content{row-gap:calc(var(--spacing)*6);grid-auto-columns:minmax(0,1fr);display:grid}.fi-sidebar-group{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}.fi-sidebar-group.fi-collapsed .fi-sidebar-group-collapse-btn{rotate:-180deg}.fi-sidebar-group.fi-collapsible>.fi-sidebar-group-btn{cursor:pointer}.fi-sidebar-group.fi-active .fi-sidebar-group-dropdown-trigger-btn .fi-icon{color:var(--primary-600)}.fi-sidebar-group.fi-active .fi-sidebar-group-dropdown-trigger-btn .fi-icon:where(.dark,.dark *){color:var(--primary-400)}.fi-sidebar-group-btn{align-items:center;column-gap:calc(var(--spacing)*3);padding:calc(var(--spacing)*2);display:flex}.fi-sidebar-group-btn .fi-icon{color:var(--gray-400)}.fi-sidebar-group-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-group-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-500);flex:1}.fi-sidebar-group-label:where(.dark,.dark *){color:var(--gray-400)}.fi-sidebar-group-dropdown-trigger-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);padding:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;flex:1;display:flex;position:relative}@media (forced-colors:active){.fi-sidebar-group-dropdown-trigger-btn{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar-group-dropdown-trigger-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-sidebar-group-dropdown-trigger-btn:hover{background-color:var(--gray-100)}}.fi-sidebar-group-dropdown-trigger-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-group-dropdown-trigger-btn .fi-icon{color:var(--gray-400)}.fi-sidebar-group-dropdown-trigger-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-group-items{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter{transition-delay:.1s}@media (min-width:64rem){:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter-start{opacity:0}:is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter-end{opacity:1}.fi-sidebar{inset-block:calc(var(--spacing)*0);z-index:30;background-color:var(--color-white);height:100dvh;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-direction:column;align-content:flex-start;display:flex;position:fixed;inset-inline-start:calc(var(--spacing)*0)}@media (min-width:64rem){.fi-sidebar{z-index:20;background-color:#0000;transition-property:none}}.fi-sidebar:where(.dark,.dark *){background-color:var(--gray-900)}@media (min-width:64rem){.fi-sidebar:where(.dark,.dark *){background-color:#0000}}.fi-sidebar.fi-sidebar-open{width:var(--sidebar-width);--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:64rem){.fi-sidebar.fi-sidebar-open{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.fi-sidebar.fi-sidebar-open:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-sidebar.fi-sidebar-open:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-sidebar.fi-sidebar-open:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-sidebar:not(.fi-sidebar-open){--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-sidebar:not(.fi-sidebar-open):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}@media (min-width:64rem){.fi-body-has-topbar .fi-sidebar{height:calc(100dvh - 4rem);top:4rem}}.fi-sidebar-close-overlay{inset:calc(var(--spacing)*0);z-index:30;background-color:var(--gray-950);position:fixed}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-close-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.fi-sidebar-close-overlay{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.5s;transition-duration:.5s}@media (min-width:64rem){.fi-sidebar-close-overlay{display:none}}.fi-sidebar-close-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-close-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}@media (min-width:64rem){.fi-body.fi-body-has-top-navigation .fi-sidebar{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-body.fi-body-has-top-navigation .fi-sidebar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.fi-body:not(.fi-body-has-top-navigation) .fi-sidebar.fi-sidebar-open,.fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open){position:sticky}.fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open),.fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open):where(:dir(rtl),[dir=rtl],[dir=rtl] *),.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar,.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}}.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:not(.fi-sidebar-open){width:var(--sidebar-width)}@media (min-width:64rem){.fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:not(.fi-sidebar-open){position:sticky}}.fi-sidebar-header-ctn{overflow-x:clip}.fi-sidebar-header{height:calc(var(--spacing)*16);justify-content:center;align-items:center;display:flex}.fi-sidebar-header-logo-ctn{flex:1}.fi-body-has-topbar .fi-sidebar-header{background-color:var(--color-white);padding-inline:calc(var(--spacing)*6);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-body-has-topbar .fi-sidebar-header{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}@media (min-width:64rem){.fi-body-has-topbar .fi-sidebar-header{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:none}}.fi-body-has-topbar .fi-sidebar-header:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-body-has-topbar .fi-sidebar-header:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}:not(.fi-body-has-topbar) .fi-sidebar-header{padding-inline:calc(var(--spacing)*4);--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#0000}:not(.fi-body-has-topbar) .fi-sidebar-header .fi-logo{margin-inline-start:calc(var(--spacing)*3)}.fi-sidebar-nav{row-gap:calc(var(--spacing)*7);padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*8);scrollbar-gutter:stable;flex-direction:column;flex-grow:1;display:flex;overflow:hidden auto}.fi-sidebar-nav-groups{margin-inline:calc(var(--spacing)*-2);row-gap:calc(var(--spacing)*7);flex-direction:column;display:flex}.fi-sidebar-item.fi-active,.fi-sidebar-item.fi-sidebar-item-has-active-child-items{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn{background-color:var(--gray-100)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-item.fi-active>.fi-sidebar-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-icon{color:var(--primary-700)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--primary-400)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-grouped-border>.fi-sidebar-item-grouped-border-part{background-color:var(--primary-700)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-grouped-border>.fi-sidebar-item-grouped-border-part:where(.dark,.dark *){background-color:var(--primary-400)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-label{color:var(--primary-700)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-label:where(.dark,.dark *){color:var(--primary-400)}.fi-sidebar-item.fi-active>.fi-sidebar-item-btn .fi-sidebar-item-grouped-border-part{height:calc(var(--spacing)*1.5);width:calc(var(--spacing)*1.5);border-radius:3.40282e38px;position:relative}@media (hover:hover){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:hover{background-color:var(--gray-100)}}.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-item-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);padding:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;display:flex;position:relative}@media (forced-colors:active){.fi-sidebar-item-btn{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar-item-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-sidebar-item-btn>.fi-icon{color:var(--gray-400)}.fi-sidebar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-item-grouped-border{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6);justify-content:center;align-items:center;display:flex;position:relative}.fi-sidebar-item-grouped-border-part-not-first{background-color:var(--gray-300);width:1px;position:absolute;top:-50%;bottom:50%}.fi-sidebar-item-grouped-border-part-not-first:where(.dark,.dark *){background-color:var(--gray-600)}.fi-sidebar-item-grouped-border-part-not-last{background-color:var(--gray-300);width:1px;position:absolute;top:50%;bottom:-50%}.fi-sidebar-item-grouped-border-part-not-last:where(.dark,.dark *){background-color:var(--gray-600)}.fi-sidebar-item-grouped-border-part{height:calc(var(--spacing)*1.5);width:calc(var(--spacing)*1.5);background-color:var(--gray-400);border-radius:3.40282e38px;position:relative}.fi-sidebar-item-grouped-border-part:where(.dark,.dark *){background-color:var(--gray-500)}.fi-sidebar-item-label{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);flex:1;overflow:hidden}.fi-sidebar-item-label:where(.dark,.dark *){color:var(--gray-200)}@media (min-width:64rem){:is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));transition-delay:.1s}}:is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter-start{opacity:0}:is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter-end{opacity:1}.fi-sidebar-footer{margin-inline:calc(var(--spacing)*4);margin-block:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*3);display:grid}.fi-sidebar-footer>.fi-no-database{display:block}.fi-sidebar-sub-group-items{row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}.fi-sidebar-database-notifications-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);width:100%;padding:calc(var(--spacing)*2);text-align:start;--tw-outline-style:none;outline-style:none;display:flex;position:relative}@media (forced-colors:active){.fi-sidebar-database-notifications-btn{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar-database-notifications-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-sidebar-database-notifications-btn:hover{background-color:var(--gray-100)}}.fi-sidebar-database-notifications-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-sidebar-database-notifications-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-database-notifications-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-sidebar-database-notifications-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-sidebar-database-notifications-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-sidebar-database-notifications-btn>.fi-icon{color:var(--gray-400)}.fi-sidebar-database-notifications-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700);flex:1;overflow:hidden}.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label:where(.dark,.dark *){color:var(--gray-200)}@media (min-width:64rem){:is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));transition-delay:.1s}}:is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter-start{opacity:0}:is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter-end{opacity:1}.fi-sidebar-open-sidebar-btn,.fi-sidebar-open-collapse-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}.fi-sidebar-close-collapse-sidebar-btn{display:none;margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-sidebar-close-collapse-sidebar-btn{display:flex}:is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body:not(.fi-body-has-sidebar-fully-collapsible-on-desktop)) .fi-sidebar-open-sidebar-btn{display:none}}.fi-sidebar-close-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-sidebar-close-sidebar-btn{display:none}}.fi-tenant-menu-trigger{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);width:100%;padding:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;outline-style:none;display:flex}@media (forced-colors:active){.fi-tenant-menu-trigger{outline-offset:2px;outline:2px solid #0000}}.fi-tenant-menu-trigger{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-tenant-menu-trigger:hover{background-color:var(--gray-100)}}.fi-tenant-menu-trigger:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.fi-tenant-menu-trigger:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tenant-menu-trigger:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-tenant-menu-trigger:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-tenant-menu-trigger:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-tenant-menu-trigger .fi-tenant-avatar{flex-shrink:0}.fi-tenant-menu-trigger .fi-icon{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;margin-inline-start:auto;transition-duration:75ms}@media (hover:hover){.fi-tenant-menu-trigger .fi-icon:is(:where(.group):hover *){color:var(--gray-500)}}.fi-tenant-menu-trigger .fi-icon:is(:where(.group):focus-visible *),.fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):hover *){color:var(--gray-400)}}.fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-400)}.fi-tenant-menu-trigger:hover .fi-icon{color:var(--gray-500)}.fi-tenant-menu-trigger:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-tenant-menu-trigger:focus-visible .fi-icon{color:var(--gray-500)}.fi-tenant-menu-trigger:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-tenant-menu-trigger-text{text-align:start;justify-items:start;display:grid}.fi-tenant-menu-trigger-current-tenant-label{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-500)}.fi-tenant-menu-trigger-current-tenant-label:where(.dark,.dark *){color:var(--gray-400)}.fi-tenant-menu-trigger-tenant-name{color:var(--gray-950)}.fi-tenant-menu-trigger-tenant-name:where(.dark,.dark *){color:var(--color-white)}.fi-sidebar .fi-tenant-menu{margin-inline:calc(var(--spacing)*4);margin-top:calc(var(--spacing)*3)}.fi-theme-switcher{column-gap:calc(var(--spacing)*1);grid-auto-flow:column;display:grid}.fi-theme-switcher-btn{border-radius:var(--radius-md);padding:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;justify-content:center;display:flex}@media (forced-colors:active){.fi-theme-switcher-btn{outline-offset:2px;outline:2px solid #0000}}.fi-theme-switcher-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-theme-switcher-btn:hover{background-color:var(--gray-50)}}.fi-theme-switcher-btn:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-theme-switcher-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-theme-switcher-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-theme-switcher-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-theme-switcher-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-theme-switcher-btn.fi-active{background-color:var(--gray-50);color:var(--primary-500)}.fi-theme-switcher-btn.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-theme-switcher-btn.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-theme-switcher-btn.fi-active:where(.dark,.dark *){color:var(--primary-400)}.fi-theme-switcher-btn:not(.fi-active){color:var(--gray-400)}@media (hover:hover){.fi-theme-switcher-btn:not(.fi-active):hover{color:var(--gray-500)}}.fi-theme-switcher-btn:not(.fi-active):focus-visible,.fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *):hover{color:var(--gray-400)}}.fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *):focus-visible{color:var(--gray-400)}.fi-topbar-ctn{top:calc(var(--spacing)*0);z-index:30;position:sticky;overflow-x:clip}.fi-topbar{min-height:calc(var(--spacing)*16);background-color:var(--color-white);padding-inline:calc(var(--spacing)*4);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);align-items:center;display:flex}.fi-topbar:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.fi-topbar:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-topbar .fi-tenant-menu{display:none}@media (min-width:64rem){.fi-topbar .fi-tenant-menu{display:block}}.fi-topbar-open-sidebar-btn,.fi-topbar-close-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-topbar-close-sidebar-btn{display:none}}.fi-topbar-open-collapse-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}.fi-topbar-close-collapse-sidebar-btn{display:none;margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.fi-topbar-close-collapse-sidebar-btn{display:flex}}.fi-topbar-start{align-items:center;margin-inline-end:calc(var(--spacing)*6);display:none}@media (min-width:64rem){.fi-topbar-start{display:flex}}.fi-topbar-start .fi-logo{margin-inline-start:calc(var(--spacing)*3)}.fi-topbar-collapse-sidebar-btn-ctn{width:calc(var(--spacing)*9);flex-shrink:0}@media (min-width:64rem){:is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body:not(.fi-body-has-sidebar-fully-collapsible-on-desktop)) .fi-topbar-open-sidebar-btn{display:none}}.fi-topbar-nav-groups{align-items:center;column-gap:calc(var(--spacing)*4);margin-inline-start:calc(var(--spacing)*4);margin-inline-end:calc(var(--spacing)*4);display:none}@media (min-width:64rem){.fi-topbar-nav-groups{margin-block:calc(var(--spacing)*2);row-gap:calc(var(--spacing)*1);flex-wrap:wrap;display:flex}}.fi-topbar-end{align-items:center;column-gap:calc(var(--spacing)*4);margin-inline-start:auto;display:flex}.fi-topbar-item-btn{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*2);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);--tw-outline-style:none;outline-style:none;display:flex}@media (forced-colors:active){.fi-topbar-item-btn{outline-offset:2px;outline:2px solid #0000}}.fi-topbar-item-btn{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.fi-topbar-item-btn:hover{background-color:var(--gray-50)}}.fi-topbar-item-btn:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.fi-topbar-item-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-topbar-item-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.fi-topbar-item-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-topbar-item-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-topbar-item-btn>.fi-icon{color:var(--gray-400)}.fi-topbar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.fi-topbar-item-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}.fi-topbar-item-label:where(.dark,.dark *){color:var(--gray-200)}.fi-topbar-item.fi-active .fi-topbar-item-btn{background-color:var(--gray-50)}.fi-topbar-item.fi-active .fi-topbar-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.fi-topbar-item.fi-active .fi-topbar-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.fi-topbar-item.fi-active .fi-topbar-item-btn>.fi-icon{color:var(--primary-600)}.fi-topbar-item.fi-active .fi-topbar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--primary-400)}.fi-topbar-item.fi-active .fi-topbar-item-label{color:var(--primary-600)}.fi-topbar-item.fi-active .fi-topbar-item-label:where(.dark,.dark *){color:var(--primary-400)}.fi-simple-user-menu-ctn{align-items:center;column-gap:calc(var(--spacing)*4);display:flex}.fi-topbar .fi-user-menu-trigger{flex-shrink:0}.fi-sidebar .fi-user-menu-trigger{justify-content:center;align-items:center;column-gap:calc(var(--spacing)*3);border-radius:var(--radius-lg);width:100%;padding:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;outline-style:none;display:flex}@media (forced-colors:active){.fi-sidebar .fi-user-menu-trigger{outline-offset:2px;outline:2px solid #0000}}.fi-sidebar .fi-user-menu-trigger{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;transition-duration:75ms}.fi-sidebar .fi-user-menu-trigger .fi-user-avatar{flex-shrink:0}.fi-sidebar .fi-user-menu-trigger .fi-icon{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5);color:var(--gray-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:75ms;flex-shrink:0;margin-inline-start:auto;transition-duration:75ms}@media (hover:hover){.fi-sidebar .fi-user-menu-trigger .fi-icon:is(:where(.group):hover *){color:var(--gray-500)}}.fi-sidebar .fi-user-menu-trigger .fi-icon:is(:where(.group):focus-visible *),.fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):hover *){color:var(--gray-400)}}.fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-400)}.fi-sidebar .fi-user-menu-trigger:hover .fi-icon{color:var(--gray-500)}.fi-sidebar .fi-user-menu-trigger:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-sidebar .fi-user-menu-trigger:focus-visible .fi-icon{color:var(--gray-500)}.fi-sidebar .fi-user-menu-trigger:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.fi-sidebar .fi-user-menu-trigger .fi-tenant-menu-trigger-text{text-align:start;color:var(--gray-950);justify-items:start;display:grid}.fi-sidebar .fi-user-menu-trigger .fi-tenant-menu-trigger-text:where(.dark,.dark *){color:var(--color-white)}.fi-sidebar .fi-user-menu .fi-dropdown-panel{max-width:max(14rem,100% - 1.5rem)!important}.fi-account-widget .fi-section-content{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-account-widget-logout-form{margin-block:auto}.fi-account-widget-main{flex:1}.fi-account-widget-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1;display:grid}.fi-account-widget-heading:where(.dark,.dark *){color:var(--color-white)}.fi-account-widget-user-name{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}.fi-account-widget-user-name:where(.dark,.dark *){color:var(--gray-400)}.fi-filament-info-widget .fi-section-content{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.fi-filament-info-widget-main{flex:1}.fi-filament-info-widget-logo{height:calc(var(--spacing)*5);color:var(--gray-950)}.fi-filament-info-widget-logo:where(.dark,.dark *){color:var(--color-white)}.fi-filament-info-widget-version{margin-top:calc(var(--spacing)*2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-500)}.fi-filament-info-widget-version:where(.dark,.dark *){color:var(--gray-400)}.fi-filament-info-widget-links{align-items:flex-end;row-gap:calc(var(--spacing)*1);flex-direction:column;display:flex}}@layer utilities{.fi-color-danger{--color-50:var(--danger-50);--color-100:var(--danger-100);--color-200:var(--danger-200);--color-300:var(--danger-300);--color-400:var(--danger-400);--color-500:var(--danger-500);--color-600:var(--danger-600);--color-700:var(--danger-700);--color-800:var(--danger-800);--color-900:var(--danger-900);--color-950:var(--danger-950)}.fi-color-gray{--color-50:var(--gray-50);--color-100:var(--gray-100);--color-200:var(--gray-200);--color-300:var(--gray-300);--color-400:var(--gray-400);--color-500:var(--gray-500);--color-600:var(--gray-600);--color-700:var(--gray-700);--color-800:var(--gray-800);--color-900:var(--gray-900);--color-950:var(--gray-950)}.fi-color-info{--color-50:var(--info-50);--color-100:var(--info-100);--color-200:var(--info-200);--color-300:var(--info-300);--color-400:var(--info-400);--color-500:var(--info-500);--color-600:var(--info-600);--color-700:var(--info-700);--color-800:var(--info-800);--color-900:var(--info-900);--color-950:var(--info-950)}.fi-color-primary{--color-50:var(--primary-50);--color-100:var(--primary-100);--color-200:var(--primary-200);--color-300:var(--primary-300);--color-400:var(--primary-400);--color-500:var(--primary-500);--color-600:var(--primary-600);--color-700:var(--primary-700);--color-800:var(--primary-800);--color-900:var(--primary-900);--color-950:var(--primary-950)}.fi-color-success{--color-50:var(--success-50);--color-100:var(--success-100);--color-200:var(--success-200);--color-300:var(--success-300);--color-400:var(--success-400);--color-500:var(--success-500);--color-600:var(--success-600);--color-700:var(--success-700);--color-800:var(--success-800);--color-900:var(--success-900);--color-950:var(--success-950)}.fi-color-warning{--color-50:var(--warning-50);--color-100:var(--warning-100);--color-200:var(--warning-200);--color-300:var(--warning-300);--color-400:var(--warning-400);--color-500:var(--warning-500);--color-600:var(--warning-600);--color-700:var(--warning-700);--color-800:var(--warning-800);--color-900:var(--warning-900);--color-950:var(--warning-950)}.fi-bg-color-50{--bg:var(--color-50)}.fi-bg-color-100{--bg:var(--color-100)}.fi-bg-color-200{--bg:var(--color-200)}.fi-bg-color-300{--bg:var(--color-300)}.fi-bg-color-400{--bg:var(--color-400)}.fi-bg-color-500{--bg:var(--color-500)}.fi-bg-color-600{--bg:var(--color-600)}.fi-bg-color-700{--bg:var(--color-700)}.fi-bg-color-800{--bg:var(--color-800)}.fi-bg-color-900{--bg:var(--color-900)}.fi-bg-color-950{--bg:var(--color-950)}.hover\:fi-bg-color-50{--hover-bg:var(--color-50)}.hover\:fi-bg-color-100{--hover-bg:var(--color-100)}.hover\:fi-bg-color-200{--hover-bg:var(--color-200)}.hover\:fi-bg-color-300{--hover-bg:var(--color-300)}.hover\:fi-bg-color-400{--hover-bg:var(--color-400)}.hover\:fi-bg-color-500{--hover-bg:var(--color-500)}.hover\:fi-bg-color-600{--hover-bg:var(--color-600)}.hover\:fi-bg-color-700{--hover-bg:var(--color-700)}.hover\:fi-bg-color-800{--hover-bg:var(--color-800)}.hover\:fi-bg-color-900{--hover-bg:var(--color-900)}.hover\:fi-bg-color-950{--hover-bg:var(--color-950)}.dark\:fi-bg-color-50{--dark-bg:var(--color-50)}.dark\:fi-bg-color-100{--dark-bg:var(--color-100)}.dark\:fi-bg-color-200{--dark-bg:var(--color-200)}.dark\:fi-bg-color-300{--dark-bg:var(--color-300)}.dark\:fi-bg-color-400{--dark-bg:var(--color-400)}.dark\:fi-bg-color-500{--dark-bg:var(--color-500)}.dark\:fi-bg-color-600{--dark-bg:var(--color-600)}.dark\:fi-bg-color-700{--dark-bg:var(--color-700)}.dark\:fi-bg-color-800{--dark-bg:var(--color-800)}.dark\:fi-bg-color-900{--dark-bg:var(--color-900)}.dark\:fi-bg-color-950{--dark-bg:var(--color-950)}.dark\:hover\:fi-bg-color-50{--dark-hover-bg:var(--color-50)}.dark\:hover\:fi-bg-color-100{--dark-hover-bg:var(--color-100)}.dark\:hover\:fi-bg-color-200{--dark-hover-bg:var(--color-200)}.dark\:hover\:fi-bg-color-300{--dark-hover-bg:var(--color-300)}.dark\:hover\:fi-bg-color-400{--dark-hover-bg:var(--color-400)}.dark\:hover\:fi-bg-color-500{--dark-hover-bg:var(--color-500)}.dark\:hover\:fi-bg-color-600{--dark-hover-bg:var(--color-600)}.dark\:hover\:fi-bg-color-700{--dark-hover-bg:var(--color-700)}.dark\:hover\:fi-bg-color-800{--dark-hover-bg:var(--color-800)}.dark\:hover\:fi-bg-color-900{--dark-hover-bg:var(--color-900)}.dark\:hover\:fi-bg-color-950{--dark-hover-bg:var(--color-950)}.fi-text-color-0{--text:oklch(100% 0 0)}.fi-text-color-50{--text:var(--color-50)}.fi-text-color-100{--text:var(--color-100)}.fi-text-color-200{--text:var(--color-200)}.fi-text-color-300{--text:var(--color-300)}.fi-text-color-400{--text:var(--color-400)}.fi-text-color-500{--text:var(--color-500)}.fi-text-color-600{--text:var(--color-600)}.fi-text-color-700{--text:var(--color-700)}.fi-text-color-800{--text:var(--color-800)}.fi-text-color-900{--text:var(--color-900)}.fi-text-color-950{--text:var(--color-950)}.hover\:fi-text-color-0{--hover-text:oklch(100% 0 0)}.hover\:fi-text-color-50{--hover-text:var(--color-50)}.hover\:fi-text-color-100{--hover-text:var(--color-100)}.hover\:fi-text-color-200{--hover-text:var(--color-200)}.hover\:fi-text-color-300{--hover-text:var(--color-300)}.hover\:fi-text-color-400{--hover-text:var(--color-400)}.hover\:fi-text-color-500{--hover-text:var(--color-500)}.hover\:fi-text-color-600{--hover-text:var(--color-600)}.hover\:fi-text-color-700{--hover-text:var(--color-700)}.hover\:fi-text-color-800{--hover-text:var(--color-800)}.hover\:fi-text-color-900{--hover-text:var(--color-900)}.hover\:fi-text-color-950{--hover-text:var(--color-950)}.dark\:fi-text-color-0{--dark-text:oklch(100% 0 0)}.dark\:fi-text-color-50{--dark-text:var(--color-50)}.dark\:fi-text-color-100{--dark-text:var(--color-100)}.dark\:fi-text-color-200{--dark-text:var(--color-200)}.dark\:fi-text-color-300{--dark-text:var(--color-300)}.dark\:fi-text-color-400{--dark-text:var(--color-400)}.dark\:fi-text-color-500{--dark-text:var(--color-500)}.dark\:fi-text-color-600{--dark-text:var(--color-600)}.dark\:fi-text-color-700{--dark-text:var(--color-700)}.dark\:fi-text-color-800{--dark-text:var(--color-800)}.dark\:fi-text-color-900{--dark-text:var(--color-900)}.dark\:fi-text-color-950{--dark-text:var(--color-950)}.dark\:hover\:fi-text-color-0{--dark-hover-text:oklch(100% 0 0)}.dark\:hover\:fi-text-color-50{--dark-hover-text:var(--color-50)}.dark\:hover\:fi-text-color-100{--dark-hover-text:var(--color-100)}.dark\:hover\:fi-text-color-200{--dark-hover-text:var(--color-200)}.dark\:hover\:fi-text-color-300{--dark-hover-text:var(--color-300)}.dark\:hover\:fi-text-color-400{--dark-hover-text:var(--color-400)}.dark\:hover\:fi-text-color-500{--dark-hover-text:var(--color-500)}.dark\:hover\:fi-text-color-600{--dark-hover-text:var(--color-600)}.dark\:hover\:fi-text-color-700{--dark-hover-text:var(--color-700)}.dark\:hover\:fi-text-color-800{--dark-hover-text:var(--color-800)}.dark\:hover\:fi-text-color-900{--dark-hover-text:var(--color-900)}.dark\:hover\:fi-text-color-950{--dark-hover-text:var(--color-950)}.fi-sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.fi-prose{--prose-color:var(--color-gray-700);--prose-heading-color:var(--color-gray-950);--prose-strong-color:var(--color-gray-950);--prose-link-color:var(--color-gray-950);--prose-code-color:var(--color-gray-950);--prose-marker-color:var(--color-gray-700)}@supports (color:color-mix(in lab, red, red)){.fi-prose{--prose-marker-color:color-mix(in oklab,var(--color-gray-700)25%,transparent)}}.fi-prose{--prose-link-underline-color:var(--color-primary-400);--prose-th-borders:var(--color-gray-300);--prose-td-borders:var(--color-gray-200);--prose-hr-color:var(--color-gray-950)}@supports (color:color-mix(in lab, red, red)){.fi-prose{--prose-hr-color:color-mix(in oklab,var(--color-gray-950)5%,transparent)}}.fi-prose{--prose-blockquote-border-color:var(--color-gray-300);--prose-pre-bg:var(--color-gray-100)}.fi-prose:where(.dark,.dark *){--prose-color:var(--color-gray-300);--prose-heading-color:var(--color-white);--prose-strong-color:var(--color-white);--prose-link-color:var(--color-white);--prose-code-color:var(--color-white);--prose-marker-color:var(--color-gray-300)}@supports (color:color-mix(in lab, red, red)){.fi-prose:where(.dark,.dark *){--prose-marker-color:color-mix(in oklab,var(--color-gray-300)35%,transparent)}}.fi-prose:where(.dark,.dark *){--prose-link-underline-color:var(--color-sky-400);--prose-th-borders:var(--color-gray-600);--prose-td-borders:var(--color-gray-700);--prose-hr-color:oklab(100% 0 5.96046e-8/.1)}@supports (color:color-mix(in lab, red, red)){.fi-prose:where(.dark,.dark *){--prose-hr-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.fi-prose:where(.dark,.dark *){--prose-blockquote-border-color:var(--color-gray-600);--prose-pre-bg:var(--color-gray-900)}@supports (color:color-mix(in lab, red, red)){.fi-prose:where(.dark,.dark *){--prose-pre-bg:color-mix(in oklab,var(--color-gray-900)40%,transparent)}}.fi-prose{color:var(--prose-color);font-size:var(--text-sm);line-height:1.5}.fi-prose img+img{margin-top:0}.fi-prose :where(:not(.fi-not-prose,.fi-not-prose *,br))+:where(:not(.fi-not-prose,.fi-not-prose *,br)){margin-top:calc(var(--spacing)*4)}.fi-prose p br{margin:0}.fi-prose h1:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-xl);letter-spacing:-.025em;color:var(--prose-code-color);line-height:1.55556;font-weight:var(--font-weight-extrabold)}.fi-prose h2:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-lg);letter-spacing:-.025em;color:var(--prose-code-color);line-height:1.55556;font-weight:var(--font-weight-bold)}.fi-prose h3:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-base);color:var(--prose-heading-color);line-height:1.55556;font-weight:var(--font-weight-bold)}.fi-prose h4:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-sm);color:var(--prose-heading-color);line-height:2;font-weight:var(--font-weight-bold)}.fi-prose h5:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-sm);color:var(--prose-heading-color);line-height:2;font-weight:var(--font-weight-semibold)}.fi-prose h6:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-sm);color:var(--prose-heading-color);line-height:2;font-weight:var(--font-weight-medium)}.fi-prose :is(h2,h3,h4,h5,h6):where(:not(.fi-not-prose,.fi-not-prose *)){scroll-margin-top:calc(var(--spacing)*32)}@media (min-width:64rem){.fi-prose :is(h2,h3,h4,h5,h6):where(:not(.fi-not-prose,.fi-not-prose *)){scroll-margin-top:calc(var(--spacing)*18)}}.fi-prose ol:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*6);list-style-type:decimal}.fi-prose ul:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*6);list-style-type:disc}.fi-prose ol li:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose ul li:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*3)}.fi-prose ol li+li:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose ul li+li:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*4)}.fi-prose ol li:where(:not(.fi-not-prose,.fi-not-prose *))::marker{color:var(--prose-marker-color)}.fi-prose ul li:where(:not(.fi-not-prose,.fi-not-prose *))::marker{color:var(--prose-marker-color)}.fi-prose a:not(:where(:is(h2,h3,h4,h5,h6) *)):where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-link-color);font-weight:var(--font-weight-semibold);text-underline-offset:3px;text-decoration:underline;-webkit-text-decoration-color:var(--prose-link-underline-color);-webkit-text-decoration-color:var(--prose-link-underline-color);text-decoration-color:var(--prose-link-underline-color);text-decoration-thickness:1px}.fi-prose a:not(:where(:is(h2,h3,h4,h5,h6) *)):where(:not(.fi-not-prose,.fi-not-prose *)) code{font-weight:var(--font-weight-semibold)}.fi-prose a:hover:where(:not(.fi-not-prose,.fi-not-prose *)){text-decoration-thickness:2px}.fi-prose strong:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-strong-color);font-weight:var(--font-weight-semibold)}.fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)){font-variant-ligatures:none;font-family:var(--font-mono);font-weight:var(--font-weight-medium);color:var(--prose-code-color)}.fi-prose :where(h2,h3,h4,h5,h6) code:where(:not(.fi-not-prose,.fi-not-prose *)){font-weight:var(--font-weight-semibold)}.fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)):before,.fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)):after{content:"`";display:inline}.fi-prose pre:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*4);margin-bottom:calc(var(--spacing)*10);border-radius:var(--radius-lg);padding-top:calc(var(--spacing)*3);padding-inline-end:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*3);background-color:var(--prose-pre-bg);padding-inline-start:calc(var(--spacing)*4)}.fi-prose pre code *+:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:0}.fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)):before,.fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)):after{content:none}.fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)){font-variant-ligatures:none;font-family:var(--font-mono);font-size:var(--text-sm);line-height:2}.fi-prose table:where(:not(.fi-not-prose,.fi-not-prose *)){table-layout:auto;width:100%;font-size:var(--text-sm);margin-top:2em;margin-bottom:2em;line-height:1.4}.fi-prose thead:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:1px;border-bottom-color:var(--prose-th-borders)}.fi-prose thead th:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-heading-color);vertical-align:bottom;padding-inline-end:.6em;padding-bottom:.8em;padding-inline-start:.6em;font-weight:600}.fi-prose thead th:first-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:0}.fi-prose thead th:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:0}.fi-prose tbody tr:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:1px;border-bottom-color:var(--prose-td-borders)}.fi-prose tbody tr:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:0}.fi-prose tbody td:where(:not(.fi-not-prose,.fi-not-prose *)){vertical-align:baseline}.fi-prose tfoot:where(:not(.fi-not-prose,.fi-not-prose *)){border-top-width:1px;border-top-color:var(--prose-th-borders)}.fi-prose tfoot td:where(:not(.fi-not-prose,.fi-not-prose *)){vertical-align:top}.fi-prose tbody td:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose tfoot td:where(:not(.fi-not-prose,.fi-not-prose *)){padding-top:.8em;padding-inline-end:.6em;padding-bottom:.8em;padding-inline-start:.6em}.fi-prose tbody td:first-child:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose tfoot td:first-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:0}.fi-prose tbody td:last-child:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose tfoot td:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:0}.fi-prose th:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose td:where(:not(.fi-not-prose,.fi-not-prose *)){text-align:start}.fi-prose td code:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:.8125rem}.fi-prose hr:where(:not(.fi-not-prose,.fi-not-prose *)){border-color:var(--prose-hr-color);margin-block:calc(var(--spacing)*8)}.fi-prose hr:where(:not(.fi-not-prose,.fi-not-prose *))+h2{margin-top:calc(var(--spacing)*8)}.fi-prose blockquote{border-inline-start-width:.25rem;border-inline-start-color:var(--prose-blockquote-border-color);padding-inline-start:calc(var(--spacing)*4);font-style:italic}.fi-prose blockquote p:first-of-type:before{content:open-quote}.fi-prose blockquote p:last-of-type:after{content:close-quote}.fi-prose figure:where(:not(.fi-not-prose,.fi-not-prose *)) figcaption:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*3);text-align:center;font-size:var(--text-sm);line-height:var(--text-sm--line-height);color:var(--prose-color);font-style:italic}@supports (color:color-mix(in lab, red, red)){.fi-prose figure:where(:not(.fi-not-prose,.fi-not-prose *)) figcaption:where(:not(.fi-not-prose,.fi-not-prose *)){color:color-mix(in oklab,var(--prose-color)75%,transparent)}}.fi-prose :first-child:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:0}.fi-prose :last-child:where(:not(.fi-not-prose,.fi-not-prose *)){margin-bottom:0}.fi-prose .color:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--color)}.fi-prose .color:where(:not(.fi-not-prose,.fi-not-prose *)):where(.dark,.dark *){color:var(--dark-color)}.fi-prose .lead:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-base)}.fi-prose span[data-type=mention]:where(:not(.fi-not-prose,.fi-not-prose *)),.fi-prose a[data-type=mention]:where(:not(.fi-not-prose,.fi-not-prose *)){font-weight:var(--font-weight-semibold);white-space:nowrap;margin-block:0;display:inline-block}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *)){gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=default]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=default]>.grid-layout-col{grid-column:var(--col-span)}@media (min-width:40rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=sm]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=sm]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:48rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=md]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=md]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:64rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=lg]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=lg]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:80rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=xl]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=xl]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:96rem){.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint="2xl"]{grid-template-columns:var(--cols)}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint="2xl"]>.grid-layout-col{grid-column:var(--col-span)}}.fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))>.grid-layout-col{min-width:0;margin-top:0}}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-ease{syntax:"*";inherits:false}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} ================================================ FILE: public/css/filament/forms/forms.css ================================================ input::-webkit-datetime-edit{display:block;padding:0}.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{inset:0;position:absolute}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;visibility:hidden;width:0}.filepond--data,.filepond--drip{pointer-events:none;position:absolute}.filepond--drip{background:#00000003;border-radius:.5em;inset:0;opacity:.1;overflow:hidden}.filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:center center;width:8em}.filepond--drip-blob,.filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;text-decoration:underline;text-decoration-color:#a7a4a4;text-decoration-skip-ink:auto}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";inset:-.75em;position:absolute}.filepond--file-action-button{background-color:#00000080;background-image:none;border-radius:50%;box-shadow:0 0 #fff0;color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{background-color:#00000040;color:#ffffff80}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";inset:0;position:absolute;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;touch-action:auto;will-change:transform,opacity;z-index:1}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 0 transparent;transition:box-shadow .125s ease-in-out}.filepond--item[data-drag-state=drag]{cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);overflow-x:hidden;overflow-y:scroll}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:#0000004d;border:.3125em solid transparent;border-radius:99999px}.filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}@media not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{background-color:transparent!important;border:none!important;transform-style:preserve-3d}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.filepond--panel-bottom,.filepond--panel-center{backface-visibility:hidden;transform:translate3d(0,.5em,0);transform-origin:left top;will-change:transform}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left;text-rendering:optimizeLegibility}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.4;position:absolute;right:0;text-decoration:none;z-index:3}.filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}.filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{background:transparent;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{left:0;position:absolute;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.filepond--image-preview-overlay-idle{color:#282828d9;mix-blend-mode:multiply}.filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{background:#00000003;border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{margin:2.3em auto auto;width:calc(100% - 1.4em)}.filepond--media-preview .playpausebtn{background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;cursor:pointer;float:left;height:25px;margin-right:.3em;margin-top:.3em;outline:none;width:25px}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{background:#ffffff4d;border-radius:15px;float:left;height:3px;margin-top:1em;width:calc(100% - 2.5em)}.filepond--media-preview .playhead{background:#fff;border-radius:50%;height:13px;margin-top:-5px;width:13px}.filepond--media-preview-wrapper{background:#00000003;border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;pointer-events:auto;position:absolute;right:0;top:0}.filepond--media-preview-wrapper:before{background:linear-gradient(180deg,#000,#0000);content:" ";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);height:2em;position:absolute;width:100%;z-index:3}.filepond--media-preview{display:block;height:100%;position:relative;transform-origin:center center;width:100%;will-change:transform,opacity;z-index:1}.filepond--media-preview audio,.filepond--media-preview video{width:100%;will-change:transform}.filepond--root{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);margin-bottom:0}.filepond--root:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2);background-color:hsla(0,0%,100%,.05)}.filepond--root[data-disabled=disabled]{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.filepond--root[data-disabled=disabled]:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1);background-color:transparent}.filepond--panel-root{background-color:transparent}.filepond--drop-label label{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity,1));font-size:.875rem;line-height:1.25rem;padding:.75rem!important}.filepond--drop-label label:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.filepond--label-action{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity,1));font-weight:500;text-decoration-line:none;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.filepond--label-action:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity,1))}.filepond--label-action:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.filepond--label-action:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity,1))}.filepond--drip-blob{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity,1))}.filepond--drip-blob:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity,1))}.filepond--root[data-style-panel-layout=grid] .filepond--item{display:inline;width:calc(50% - .5rem)}@media (min-width:1024px){.filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.filepond--download-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--download-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--open-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--open-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--file-action-button.filepond--action-edit-item{background-color:rgba(0,0,0,.5)}.cropper-drag-box.cropper-crop.cropper-modal{background-color:rgba(var(--gray-100),.5);opacity:1}.cropper-drag-box.cropper-crop.cropper-modal:is(.dark *){background-color:rgba(var(--gray-900),.8)}.fi-fo-file-upload-circle-cropper .cropper-face,.fi-fo-file-upload-circle-cropper .cropper-view-box{border-radius:50%}.CodeMirror{color:#000;direction:ltr;font-family:monospace;height:300px}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{background-color:#f7f7f7;border-right:1px solid #ddd;white-space:nowrap}.CodeMirror-linenumber{color:#999;min-width:20px;padding:0 3px 0 5px;text-align:right;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;border:0!important;width:auto}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{inset:-50px 0 0;overflow:hidden;position:absolute}.CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:#ff96004d}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;overflow:hidden;position:relative}.CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:0;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.CodeMirror-sizer{border-right:50px solid transparent;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{display:none;outline:0;position:absolute;z-index:6}.CodeMirror-vscrollbar{overflow-x:hidden;overflow-y:scroll;right:0;top:0}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-x:scroll;overflow-y:hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.CodeMirror-gutter-wrapper{background:0 0!important;border:none!important;position:absolute;z-index:4}.CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{word-wrap:normal;-webkit-tap-highlight-color:transparent;background:0 0;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-variant-ligatures:contextual;line-height:inherit;margin:0;overflow:visible;position:relative;white-space:pre;z-index:2}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{inset:0;position:absolute;z-index:0}.CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{display:flex;flex-direction:row;flex-wrap:wrap}.EasyMDEContainer .CodeMirror{word-wrap:break-word;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-sizing:border-box;font:inherit;height:auto;padding:10px;z-index:0}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{background:#fff;border-bottom-right-radius:0!important;border-right:none!important;height:auto;inset:50px 0 0;position:fixed!important;z-index:8}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;border-right:none!important;flex:1 1 auto;position:relative}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative;-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.editor-toolbar.fullscreen{background:#fff;border:0;box-sizing:border-box;height:50px;left:0;opacity:1;padding-bottom:10px;padding-top:10px;position:fixed;top:0;width:100%;z-index:9}.editor-toolbar.fullscreen:before{background:linear-gradient(90deg,#fff 0,#fff0);height:50px;left:0;margin:0;padding:0;position:fixed;top:0;width:20px}.editor-toolbar.fullscreen:after{background:linear-gradient(90deg,#fff0 0,#fff);height:50px;margin:0;padding:0;position:fixed;right:0;top:0;width:20px}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{background:0 0;border:1px solid transparent;border-radius:3px;cursor:pointer;display:inline-block;height:30px;margin:0;padding:0;text-align:center;text-decoration:none!important}.editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;display:inline-block;margin:0 6px;text-indent:-10px;width:0}.editor-toolbar button:after{font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px;vertical-align:text-bottom}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"\25b2"}.editor-toolbar button.heading-smaller:after{content:"\25bc"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;font-size:12px;padding:8px 10px;text-align:right}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{display:inline-block;margin-left:1em;min-width:4em}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{height:100%;left:0;position:absolute;top:0;width:100%;z-index:7}.editor-preview-full,.editor-preview-side{box-sizing:border-box;display:none;overflow:auto}.editor-preview-side{word-wrap:break-word;border:1px solid #ddd;bottom:0;position:fixed;right:0;top:50px;width:50%;z-index:9}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:1 1 auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{line-height:1.2;margin-bottom:.5rem}.cm-s-easymde .cm-comment{background:#0000000d;border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown,.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%)}.easymde-dropdown-content{background-color:#f9f9f9;box-shadow:0 8px 16px #0003;display:block;padding:8px;position:absolute;top:30px;visibility:hidden;z-index:2}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{background-image:var(--bg-image);background-repeat:no-repeat;background-size:contain;content:"";display:block;height:0;max-height:100%;max-width:100%;padding-top:var(--height);width:var(--width)}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:#ff000026}:root{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.dark{--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.cm-s-easymde .cm-comment{background-color:transparent;color:var(--color-cm-gray-muted)}.EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.dark .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert(100%)}.EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.EasyMDEContainer .cm-s-easymde .cm-operator,.EasyMDEContainer .cm-s-easymde .cm-property{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-string,.EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-bracket{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-list,.EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:1.875rem;line-height:2.25rem}.EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:1.5rem;line-height:2rem}.EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:1.25rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:1.125rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:1rem;line-height:1.5rem}.EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:.875rem;line-height:1.25rem}.EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.EasyMDEContainer .CodeMirror,.EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{background-color:transparent;color:inherit}.EasyMDEContainer .CodeMirror{border-style:none;padding:.375rem .75rem}.EasyMDEContainer .CodeMirror-scroll{height:auto}.EasyMDEContainer .editor-toolbar{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity,1));border-radius:0;border-width:0 0 1px;-moz-column-gap:.25rem;column-gap:.25rem;display:flex;overflow-x:auto;padding:.5rem .625rem}.EasyMDEContainer .editor-toolbar:is(.dark *){border-color:hsla(0,0%,100%,.1)}.EasyMDEContainer .editor-toolbar button{border-radius:.5rem;border-style:none;cursor:pointer;display:grid;height:2rem;padding:0;place-content:center;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.EasyMDEContainer .editor-toolbar button:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button.active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:before{--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity,1));display:block;height:1.25rem;width:1.25rem}.EasyMDEContainer .editor-toolbar button:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button:before{content:"";-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.EasyMDEContainer .editor-toolbar button.active:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity,1))}.EasyMDEContainer .editor-toolbar .separator{border-style:none;margin:0!important;width:.25rem}.EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06Zm-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06Zm-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3Zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3Zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-statusbar{display:none}.fi-fo-rich-editor trix-toolbar .trix-dialogs{position:relative}.fi-fo-rich-editor trix-toolbar .trix-dialog{--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1));border-radius:.5rem;bottom:auto;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);left:0;padding:.5rem;position:absolute;right:0;top:1rem}.fi-fo-rich-editor trix-toolbar .trix-dialog:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields{display:flex;flex-direction:column;gap:.5rem;width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group{display:flex;gap:.5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.375rem;border-style:none;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--gray-950),var(--tw-text-opacity,1));display:block;font-size:.875rem;line-height:1.25rem;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:.75rem;padding-top:.375rem;padding-inline-start:.75rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:hsla(0,0%,100%,.2);background-color:rgba(var(--gray-700),var(--tw-bg-opacity,1));color:rgb(255 255 255/var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity,1))}@media (min-width:640px){.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{font-size:.875rem;line-height:1.5rem}}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button{--tw-bg-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity,1));background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.75rem;line-height:1rem;padding:.125rem .5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button:is(.dark *){--tw-bg-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-600),var(--tw-ring-opacity,1));background-color:rgba(var(--gray-700),var(--tw-bg-opacity,1))}.fi-fo-rich-editor trix-editor:empty:before{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-editor:empty:is(.dark *):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.fi-fo-rich-editor trix-editor:empty:before{content:attr(placeholder)}.fi-fo-rich-editor trix-editor.prose :where(ol):not(:where([class~=not-prose] *)),.fi-fo-rich-editor trix-editor.prose :where(ul):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:1.625em!important}.fi-fo-rich-editor trix-editor.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:.375em!important}select:not(.choices){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E")}[dir=rtl] select{background-position:left .5rem center!important}.choices{outline:2px solid transparent;outline-offset:2px;position:relative}.choices [hidden]{display:none!important}.choices[data-type*=select-one] .has-no-choices{display:none}.choices[data-type*=select-one] .choices__input{display:block;margin:0;width:100%}.choices__inner{background-repeat:no-repeat;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:2rem;padding-top:.375rem;padding-inline-start:.75rem}@media (min-width:640px){.choices__inner{font-size:.875rem;line-height:1.5rem}}.choices__inner{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-size:1.5em 1.5em;&:has(.choices__button){padding-inline-end:3.5rem}}.choices.is-disabled .choices__inner{cursor:default}[dir=rtl] .choices__inner{background-position:left .5rem center}.choices__list--single{display:inline-block}.choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity,1))}.choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.choices.is-disabled .choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices.is-disabled .choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__list--multiple{display:flex;flex-wrap:wrap;gap:.375rem}.choices__list--multiple:not(:empty){margin-bottom:.25rem;margin-left:-.25rem;margin-right:-.25rem;padding-bottom:.125rem;padding-top:.125rem}.choices__list--multiple .choices__item{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:rgba(var(--primary-600),0.1);align-items:center;background-color:rgba(var(--primary-50),var(--tw-bg-opacity,1));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--primary-600),var(--tw-text-opacity,1));display:inline-flex;font-size:.75rem;font-weight:500;gap:.25rem;line-height:1rem;padding:.25rem .5rem;word-break:break-all}.choices__list--multiple .choices__item:is(.dark *){--tw-text-opacity:1;--tw-ring-color:rgba(var(--primary-400),0.3);background-color:rgba(var(--primary-400),.1);color:rgba(var(--primary-400),var(--tw-text-opacity,1))}.choices__list--dropdown,.choices__list[aria-expanded]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.05);background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:none;font-size:.875rem;line-height:1.25rem;margin-top:.5rem;overflow:hidden;overflow-wrap:break-word;position:absolute;top:100%;width:100%;will-change:visibility;z-index:10}.choices__list--dropdown:is(.dark *),.choices__list[aria-expanded]:is(.dark *){--tw-bg-opacity:1;--tw-ring-color:hsla(0,0%,100%,.1);background-color:rgba(var(--gray-900),var(--tw-bg-opacity,1))}.is-active.choices__list--dropdown,.is-active.choices__list[aria-expanded]{display:block;padding:.25rem}.choices__list--dropdown .choices__list,.choices__list[aria-expanded] .choices__list{max-height:15rem;overflow:auto;will-change:scroll-position}.choices__item--choice{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1));padding:.5rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__item--choice:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__item--choice.choices__item--selectable{--tw-text-opacity:1;border-radius:.375rem;color:rgba(var(--gray-950),var(--tw-text-opacity,1))}.choices__item--choice.choices__item--selectable:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.choices__list--dropdown .choices__item--selectable.is-highlighted,.choices__list[aria-expanded] .choices__item--selectable.is-highlighted{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity,1))}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *),.choices__list[aria-expanded] .choices__item--selectable.is-highlighted:is(.dark *){background-color:hsla(0,0%,100%,.05)}.choices__item{cursor:default}.choices__item--disabled{pointer-events:none}.choices__item--disabled:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__item--disabled:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices.is-disabled .choices__placeholder.choices__item,.choices__placeholder.choices__item{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1));cursor:default}.choices.is-disabled .choices__placeholder.choices__item:is(.dark *),.choices__placeholder.choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__button{background-color:transparent;background-position:50%;background-repeat:no-repeat;border-width:0;outline:2px solid transparent;outline-offset:2px;text-indent:-9999px}.choices[data-type*=select-one] .choices__button{height:1rem;inset-inline-end:0;margin-inline-end:2.25rem;opacity:.5;padding:0;position:absolute;transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.choices[data-type*=select-one] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em;top:calc(50% - .5714em)}.dark .choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button{height:1rem;opacity:.5;width:1rem}.choices[data-type*=select-multiple] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em}.dark .choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button:focus-visible,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus-visible,.choices[data-type*=select-one] .choices__button:hover{opacity:.7}.choices[data-type*=select-multiple] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-multiple] .choices__button:hover:is(.dark *),.choices[data-type*=select-one] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-one] .choices__button:hover:is(.dark *){opacity:.6}.choices.is-disabled .choices__button,.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices__input{--tw-text-opacity:1;background-color:transparent!important;border-style:none;color:rgba(var(--gray-950),var(--tw-text-opacity,1));font-size:1rem!important;line-height:1.5rem!important;padding:0!important;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.choices__input:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.choices__input:disabled{--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-500),1);color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__input:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.choices__input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1))}.choices__input:disabled:is(.dark *){--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-400),1);color:rgba(var(--gray-400),var(--tw-text-opacity,1))}@media (min-width:640px){.choices__input{font-size:.875rem!important;line-height:1.5rem}}.choices__list--dropdown .choices__input{padding:.5rem!important}.choices__input::-webkit-search-cancel-button,.choices__input::-webkit-search-decoration,.choices__input::-webkit-search-results-button,.choices__input::-webkit-search-results-decoration{display:none}.choices__input::-ms-clear,.choices__input::-ms-reveal{display:none;height:0;width:0}.choices__group{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity,1));padding:1rem .5rem .5rem}.choices__group:first-child{padding-top:.5rem}.choices__group:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity,1))}.webkit-calendar-picker-indicator\:opacity-0::-webkit-calendar-picker-indicator{opacity:0}/*! Bundled license information: cropperjs/dist/cropper.min.css: (*! * Cropper.js v1.6.2 * https://fengyuanchen.github.io/cropperjs * * Copyright 2015-present Chen Fengyuan * Released under the MIT license * * Date: 2024-04-21T07:43:02.731Z *) filepond/dist/filepond.min.css: (*! * FilePond 4.32.8 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-edit/dist/filepond-plugin-image-edit.css: (*! * FilePondPluginImageEdit 1.6.3 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css: (*! * FilePondPluginImagePreview 4.6.12 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-media-preview/dist/filepond-plugin-media-preview.css: (*! * FilePondPluginmediaPreview 1.0.11 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit undefined for details. *) easymde/dist/easymde.min.css: (** * easymde v2.20.0 * Copyright Jeroen Akkerman * @link https://github.com/ionaru/easy-markdown-editor * @license MIT *) */ ================================================ FILE: public/css/filament/support/support.css ================================================ .fi-pagination-items,.fi-pagination-overview,.fi-pagination-records-per-page-select:not(.fi-compact){display:none}@supports (container-type:inline-size){.fi-pagination{container-type:inline-size}@container (min-width: 28rem){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@container (min-width: 56rem){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media (min-width:640px){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@media (min-width:768px){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{background-color:#333;border-radius:4px;color:#fff;font-size:14px;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;height:16px;width:16px}.tippy-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.tippy-content{padding:5px 9px;position:relative;z-index:1}.tippy-box[data-theme~=light]{background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;color:#26323d}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fi-sortable-ghost{opacity:.3} ================================================ FILE: public/css/relaticle/custom-fields/custom-fields.css ================================================ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){.custom-fields-component *,.custom-fields-component ::backdrop,.custom-fields-component :after,.custom-fields-component :before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-tracking:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-ease:initial;--tw-divide-x-reverse:0;--tw-content:"";--tw-outline-style:solid;--tw-space-x-reverse:0}}}@layer theme{.custom-fields-component :host,.custom-fields-component :root{--font-mono:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-green-500:oklch(72.3% .219 149.579);--color-sky-400:oklch(74.6% .16 232.661);--color-gray-100:var(--gray-100);--color-gray-200:var(--gray-200);--color-gray-300:var(--gray-300);--color-gray-400:var(--gray-400);--color-gray-500:var(--gray-500);--color-gray-600:var(--gray-600);--color-gray-700:var(--gray-700);--color-gray-900:var(--gray-900);--color-gray-950:var(--gray-950);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:1.33333;--text-sm:.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--text-xl:1.25rem;--text-xl--line-height:1.4;--text-2xl:1.5rem;--text-2xl--line-height:1.33333;--text-3xl:1.875rem;--text-3xl--line-height:1.2;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--leading-relaxed:1.625;--leading-loose:2;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--default-mono-font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-primary-400:var(--primary-400)}}@layer base{.custom-fields-component *,.custom-fields-component ::backdrop,.custom-fields-component :after,.custom-fields-component :before{border:0 solid;box-sizing:border-box;margin:0;padding:0}.custom-fields-component ::file-selector-button{border:0 solid;box-sizing:border-box;margin:0;padding:0}.custom-fields-component :host,.custom-fields-component html{-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;tab-size:4;-webkit-tap-highlight-color:transparent}.custom-fields-component hr{border-top-width:1px;color:inherit;height:0}.custom-fields-component abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.custom-fields-component h1,.custom-fields-component h2,.custom-fields-component h3,.custom-fields-component h4,.custom-fields-component h5,.custom-fields-component h6{font-size:inherit;font-weight:inherit}.custom-fields-component a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.custom-fields-component b,.custom-fields-component strong{font-weight:bolder}.custom-fields-component code,.custom-fields-component kbd,.custom-fields-component pre,.custom-fields-component samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}.custom-fields-component small{font-size:80%}.custom-fields-component sub,.custom-fields-component sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.custom-fields-component sub{bottom:-.25em}.custom-fields-component sup{top:-.5em}.custom-fields-component table{border-collapse:collapse;border-color:inherit;text-indent:0}.custom-fields-component :-moz-focusring{outline:auto}.custom-fields-component progress{vertical-align:baseline}.custom-fields-component summary{display:list-item}.custom-fields-component menu,.custom-fields-component ol,.custom-fields-component ul{list-style:none}.custom-fields-component audio,.custom-fields-component canvas,.custom-fields-component embed,.custom-fields-component iframe,.custom-fields-component img,.custom-fields-component object,.custom-fields-component svg,.custom-fields-component video{display:block;vertical-align:middle}.custom-fields-component img,.custom-fields-component video{height:auto;max-width:100%}.custom-fields-component button,.custom-fields-component input,.custom-fields-component optgroup,.custom-fields-component select,.custom-fields-component textarea{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}.custom-fields-component ::file-selector-button{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}.custom-fields-component :where(select:is([multiple],[size])) optgroup{font-weight:bolder}.custom-fields-component :where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}.custom-fields-component ::file-selector-button{margin-inline-end:4px}.custom-fields-component ::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){.custom-fields-component ::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){.custom-fields-component ::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}.custom-fields-component textarea{resize:vertical}.custom-fields-component ::-webkit-search-decoration{-webkit-appearance:none}.custom-fields-component ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}.custom-fields-component ::-webkit-datetime-edit{display:inline-flex}.custom-fields-component ::-webkit-datetime-edit-fields-wrapper{padding:0}.custom-fields-component ::-webkit-datetime-edit,.custom-fields-component ::-webkit-datetime-edit-year-field{padding-block:0}.custom-fields-component ::-webkit-datetime-edit-day-field,.custom-fields-component ::-webkit-datetime-edit-month-field{padding-block:0}.custom-fields-component ::-webkit-datetime-edit-hour-field,.custom-fields-component ::-webkit-datetime-edit-minute-field{padding-block:0}.custom-fields-component ::-webkit-datetime-edit-millisecond-field,.custom-fields-component ::-webkit-datetime-edit-second-field{padding-block:0}.custom-fields-component ::-webkit-datetime-edit-meridiem-field{padding-block:0}.custom-fields-component ::-webkit-calendar-picker-indicator{line-height:1}.custom-fields-component :-moz-ui-invalid{box-shadow:none}.custom-fields-component button,.custom-fields-component input:where([type=button],[type=reset],[type=submit]){appearance:button}.custom-fields-component ::file-selector-button{appearance:button}.custom-fields-component ::-webkit-inner-spin-button,.custom-fields-component ::-webkit-outer-spin-button{height:auto}.custom-fields-component [hidden]:where(:not([hidden=until-found])){display:none!important}.custom-fields-component [role=button]:not(:disabled),.custom-fields-component button:not(:disabled){cursor:pointer}.custom-fields-component :root.dark{color-scheme:dark}.custom-fields-component [data-field-wrapper]{scroll-margin-top:8rem}}@layer components{.custom-fields-component .tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.custom-fields-component [data-tippy-root]{max-width:calc(100vw - 10px)}.custom-fields-component .tippy-box{background-color:#333;border-radius:4px;color:#fff;font-size:14px;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.custom-fields-component .tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.custom-fields-component .tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:top}.custom-fields-component .tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.custom-fields-component .tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:bottom}.custom-fields-component .tippy-box[data-placement^=left]>.tippy-arrow{right:0}.custom-fields-component .tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:0}.custom-fields-component .tippy-box[data-placement^=right]>.tippy-arrow{left:0}.custom-fields-component .tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:100%}.custom-fields-component .tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.custom-fields-component .tippy-arrow{color:#333;height:16px;width:16px}.custom-fields-component .tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.custom-fields-component .tippy-content{padding:5px 9px;position:relative;z-index:1}.custom-fields-component .tippy-box[data-theme~=light]{background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;color:#26323d}.custom-fields-component .tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.custom-fields-component .tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.custom-fields-component .tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.custom-fields-component .tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.custom-fields-component .tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.custom-fields-component .tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.custom-fields-component .fi-avatar{border-radius:var(--radius-md);height:calc(var(--spacing)*8);object-fit:cover;object-position:center;width:calc(var(--spacing)*8)}.custom-fields-component .fi-avatar.fi-circular{border-radius:3.40282e+38px}.custom-fields-component .fi-avatar.fi-size-sm{height:calc(var(--spacing)*6);width:calc(var(--spacing)*6)}.custom-fields-component .fi-avatar.fi-size-lg{height:calc(var(--spacing)*10);width:calc(var(--spacing)*10)}.custom-fields-component .fi-badge{align-items:center;background-color:var(--gray-50);border-radius:var(--radius-md);column-gap:calc(var(--spacing)*1);font-size:var(--text-xs);justify-content:center;line-height:var(--tw-leading,var(--text-xs--line-height));min-width:1.5rem;padding-block:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*2);--tw-font-weight:var(--font-weight-medium);color:var(--gray-600);font-weight:var(--font-weight-medium);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600);display:inline-flex}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.custom-fields-component .fi-badge{--tw-ring-inset:inset}.custom-fields-component .fi-badge:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.custom-fields-component .fi-badge:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.custom-fields-component .fi-badge:not(.fi-wrapped){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-badge.fi-disabled:not(.fi-force-enabled),.custom-fields-component .fi-badge[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}.custom-fields-component :is(.fi-badge.fi-disabled:not(.fi-force-enabled),.fi-badge[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.custom-fields-component .fi-badge .fi-badge-label-ctn{display:grid}.custom-fields-component .fi-badge .fi-badge-label.fi-wrapped{text-wrap:wrap;word-break:break-word}.custom-fields-component .fi-badge .fi-badge-label:not(.fi-wrapped){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-badge .fi-icon{flex-shrink:0}.custom-fields-component .fi-badge.fi-size-xs{min-width:1rem;padding-block:calc(var(--spacing)*0);padding-inline:calc(var(--spacing)*.5);--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.custom-fields-component .fi-badge.fi-size-sm{min-width:1.25rem;padding-block:calc(var(--spacing)*.5);padding-inline:calc(var(--spacing)*1.5);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.custom-fields-component .fi-badge.fi-color{background-color:var(--color-50);color:var(--text);--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge.fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)10%,transparent)}}.custom-fields-component .fi-badge.fi-color:where(.dark,.dark *){background-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.custom-fields-component .fi-badge.fi-color:where(.dark,.dark *){color:var(--dark-text);--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge.fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.custom-fields-component .fi-badge.fi-color .fi-badge-delete-btn>.fi-icon{color:var(--color-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge.fi-color .fi-badge-delete-btn>.fi-icon{color:color-mix(in oklab,var(--color-700)50%,transparent)}}.custom-fields-component .fi-badge.fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:var(--color-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge.fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:color-mix(in oklab,var(--color-300)50%,transparent)}}.custom-fields-component .fi-badge:not(.fi-color) .fi-icon{color:var(--gray-400)}.custom-fields-component .fi-badge:not(.fi-color) .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-badge .fi-badge-delete-btn{margin-block:calc(var(--spacing)*-1);padding:calc(var(--spacing)*1);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;--tw-outline-style:none;align-items:center;display:flex;justify-content:center;margin-inline-end:calc(var(--spacing)*-2);margin-inline-start:calc(var(--spacing)*-1);outline-style:none;transition-duration:75ms}.custom-fields-component .fi-badge .fi-badge-delete-btn>.fi-icon{color:var(--gray-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge .fi-badge-delete-btn>.fi-icon{color:color-mix(in oklab,var(--gray-700)50%,transparent)}}.custom-fields-component .fi-badge .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-badge .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *){color:color-mix(in oklab,var(--gray-300)50%,transparent)}}.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:focus-visible{color:var(--gray-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:focus-visible{color:color-mix(in oklab,var(--gray-700)75%,transparent)}}@media (hover:hover){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:var(--gray-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:color-mix(in oklab,var(--gray-300)75%,transparent)}}}.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:var(--gray-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])) .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:color-mix(in oklab,var(--gray-300)75%,transparent)}}@media (hover:hover){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:hover{color:var(--color-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:hover{color:color-mix(in oklab,var(--color-700)75%,transparent)}}}.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:focus-visible{color:var(--color-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:focus-visible{color:color-mix(in oklab,var(--color-700)75%,transparent)}}@media (hover:hover){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:var(--color-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):hover{color:color-mix(in oklab,var(--color-300)75%,transparent)}}}.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:var(--color-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-badge.fi-force-enabled,.fi-badge:not(.fi-disabled):not([disabled])).fi-color .fi-badge-delete-btn>.fi-icon:where(.dark,.dark *):focus-visible{color:color-mix(in oklab,var(--color-300)75%,transparent)}}.custom-fields-component .fi-breadcrumbs ol{align-items:center;column-gap:calc(var(--spacing)*2);display:flex;flex-wrap:wrap}.custom-fields-component .fi-breadcrumbs ol li{align-items:center;column-gap:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);display:flex;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-breadcrumbs ol li:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-breadcrumbs ol li a{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-breadcrumbs ol li a:hover{color:var(--gray-700)}.custom-fields-component .fi-breadcrumbs ol li a:where(.dark,.dark *):hover{color:var(--gray-200)}}.custom-fields-component .fi-breadcrumbs ol li .fi-icon{color:var(--gray-400);display:flex}.custom-fields-component .fi-breadcrumbs ol li .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-breadcrumbs ol li .fi-icon.fi-ltr:where(:dir(rtl),[dir=rtl],[dir=rtl] *),.custom-fields-component .fi-breadcrumbs ol li .fi-icon.fi-rtl:where(:dir(ltr),[dir=ltr],[dir=ltr] *){display:none}.custom-fields-component .fi-btn{align-items:center;border-radius:var(--radius-lg);font-size:var(--text-sm);gap:calc(var(--spacing)*1.5);justify-content:center;line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;--tw-outline-style:none;display:inline-grid;grid-auto-flow:column;outline-style:none;position:relative;transition-duration:75ms}.custom-fields-component :is(.fi-btn.fi-force-enabled,.fi-btn:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-btn.fi-disabled:not(.fi-force-enabled),.custom-fields-component .fi-btn[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}.custom-fields-component :is(.fi-btn.fi-disabled:not(.fi-force-enabled),.fi-btn[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.custom-fields-component .fi-btn>.fi-icon{color:var(--gray-400);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-btn.fi-size-xs{font-size:var(--text-xs);gap:calc(var(--spacing)*1);line-height:var(--tw-leading,var(--text-xs--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*2)}.custom-fields-component .fi-btn.fi-size-sm{font-size:var(--text-sm);gap:calc(var(--spacing)*1);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*2.5)}.custom-fields-component .fi-btn.fi-size-lg{padding-block:calc(var(--spacing)*2.5);padding-inline:calc(var(--spacing)*3.5)}.custom-fields-component .fi-btn.fi-size-lg,.custom-fields-component .fi-btn.fi-size-xl{font-size:var(--text-sm);gap:calc(var(--spacing)*1.5);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-btn.fi-size-xl{padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-btn.fi-outlined{color:var(--gray-950);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-300)}.custom-fields-component .fi-btn.fi-outlined:where(.dark,.dark *){color:var(--color-white);--tw-ring-color:var(--gray-700)}@media (hover:hover){.custom-fields-component :is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):hover{background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}}.custom-fields-component :is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn.fi-outlined.fi-force-enabled,.fi-btn.fi-outlined:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--gray-400)40%,transparent)}}.custom-fields-component .fi-btn.fi-outlined.fi-color{color:var(--text);--tw-ring-color:var(--color-600)}.custom-fields-component .fi-btn.fi-outlined.fi-color:where(.dark,.dark *){color:var(--dark-text);--tw-ring-color:var(--color-500)}@media (hover:hover){.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):hover{background-color:var(--color-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):hover{background-color:color-mix(in oklab,var(--color-500)10%,transparent)}}}.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-500)40%,transparent)}}@media (hover:hover){.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--color-600)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-600)10%,transparent)}}}.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn.fi-outlined.fi-color.fi-force-enabled,.fi-btn.fi-outlined.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-400)40%,transparent)}}.custom-fields-component .fi-btn.fi-outlined.fi-color>.fi-icon{color:var(--color-600)}.custom-fields-component .fi-btn.fi-outlined.fi-color>.fi-icon:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-btn:not(.fi-outlined){background-color:var(--color-white);color:var(--gray-950)}.custom-fields-component .fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-btn:not(.fi-outlined):where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-50)}.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-force-enabled,.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}}.custom-fields-component input:checked+label.fi-btn:not(.fi-outlined){background-color:var(--gray-400);color:var(--color-white);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component input:checked+label.fi-btn:not(.fi-outlined):where(.dark,.dark *){background-color:var(--gray-600)}@media (hover:hover){.custom-fields-component :is(input:checked+label.fi-btn:not(.fi-outlined).fi-force-enabled,input:checked+label.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):hover{background-color:var(--gray-300)}.custom-fields-component :is(input:checked+label.fi-btn:not(.fi-outlined).fi-force-enabled,input:checked+label.fi-btn:not(.fi-outlined):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--gray-500)}}.custom-fields-component .fi-btn:not(.fi-outlined).fi-color:not(label){background-color:var(--bg);color:var(--text)}.custom-fields-component .fi-btn:not(.fi-outlined).fi-color:not(label):where(.dark,.dark *){background-color:var(--dark-bg);color:var(--dark-text)}@media (hover:hover){.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):hover{background-color:var(--hover-bg);color:var(--hover-text)}}.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-500)50%,transparent)}}@media (hover:hover){.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--dark-hover-bg);color:var(--dark-hover-text)}}.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn:not(.fi-outlined).fi-color:not(label).fi-force-enabled,.fi-btn:not(.fi-outlined).fi-color:not(label):not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-400)50%,transparent)}}.custom-fields-component .fi-btn:not(.fi-outlined).fi-color:not(label)>.fi-icon{color:var(--text)}.custom-fields-component .fi-btn:not(.fi-outlined).fi-color:not(label)>.fi-icon:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color){background-color:var(--bg);color:var(--text);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color):where(.dark,.dark *){background-color:var(--dark-bg);color:var(--dark-text)}@media (hover:hover){.custom-fields-component input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):hover{background-color:var(--hover-bg);color:var(--hover-text)}.custom-fields-component input:checked+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{background-color:var(--dark-hover-bg);color:var(--dark-hover-text)}}.custom-fields-component input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){z-index:10;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.custom-fields-component input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:var(--color-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])){--tw-ring-color:color-mix(in oklab,var(--color-500)50%,transparent)}}.custom-fields-component input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input:checked:focus-visible+:is(label.fi-btn:not(.fi-outlined).fi-color.fi-force-enabled,label.fi-btn:not(.fi-outlined).fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)50%,transparent)}}.custom-fields-component label.fi-btn{cursor:pointer}.custom-fields-component label.fi-btn>.fi-icon:is(:checked+label>.fi-icon){color:var(--text)}.custom-fields-component label.fi-btn>.fi-icon:is(:checked+label>.fi-icon):where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-btn:not(.fi-color),.custom-fields-component label.fi-btn{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-btn:not(.fi-color),.custom-fields-component label.fi-btn{--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.custom-fields-component :is(.fi-btn:not(.fi-color),label.fi-btn):where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-btn:not(.fi-color),label.fi-btn):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-btn.fi-labeled-from-2xl,.custom-fields-component .fi-btn.fi-labeled-from-lg,.custom-fields-component .fi-btn.fi-labeled-from-md,.custom-fields-component .fi-btn.fi-labeled-from-sm,.custom-fields-component .fi-btn.fi-labeled-from-xl{display:none}@media (min-width:40rem){.custom-fields-component .fi-btn.fi-labeled-from-sm{display:inline-grid}}@media (min-width:48rem){.custom-fields-component .fi-btn.fi-labeled-from-md{display:inline-grid}}@media (min-width:64rem){.custom-fields-component .fi-btn.fi-labeled-from-lg{display:inline-grid}}@media (min-width:80rem){.custom-fields-component .fi-btn.fi-labeled-from-xl{display:inline-grid}}@media (min-width:96rem){.custom-fields-component .fi-btn.fi-labeled-from-2xl{display:inline-grid}}.custom-fields-component .fi-btn .fi-btn-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*0);z-index:1;--tw-translate-x:-50%;--tw-translate-y:-50%;background-color:var(--color-white);border-radius:var(--radius-md);display:flex;position:absolute;translate:var(--tw-translate-x)var(--tw-translate-y);width:max-content}.custom-fields-component .fi-btn .fi-btn-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-btn .fi-btn-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-btn-group{border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);display:grid;grid-auto-flow:column}.custom-fields-component .fi-btn-group:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-btn-group:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-btn-group>.fi-btn{border-radius:0;flex:1}.custom-fields-component .fi-btn-group>.fi-btn:nth-child(1 of .fi-btn){border-end-start-radius:var(--radius-lg);border-start-start-radius:var(--radius-lg)}.custom-fields-component .fi-btn-group>.fi-btn:nth-last-child(1 of .fi-btn){border-end-end-radius:var(--radius-lg);border-start-end-radius:var(--radius-lg)}.custom-fields-component .fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)){--tw-shadow:-1px 0 0 0 var(--tw-shadow-color,var(--color-gray-200));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-btn-group>.fi-btn:not(:nth-child(1 of .fi-btn)):where(.dark,.dark *){--tw-shadow:-1px 0 0 0 var(--tw-shadow-color,#fff3);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-btn-group>.fi-btn:not(:nth-last-child(1 of .fi-btn)){margin-inline-end:1px}.custom-fields-component .fi-btn-group>.fi-btn.fi-processing:enabled{cursor:wait;opacity:.7}.custom-fields-component .fi-btn-group>.fi-btn:not(.fi-outlined){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-btn-group>.fi-btn:not(.fi-color),.custom-fields-component label:is(.fi-btn-group>.fi-btn){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-dropdown-header{font-size:var(--text-sm);gap:calc(var(--spacing)*2);line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*3);width:100%;--tw-font-weight:var(--font-weight-medium);display:flex;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-dropdown-header .fi-icon{color:var(--gray-400)}.custom-fields-component .fi-dropdown-header .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-dropdown-header span{color:var(--gray-700);flex:1;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-dropdown-header span:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-dropdown-header.fi-color .fi-icon{color:var(--color-500)}.custom-fields-component .fi-dropdown-header.fi-color .fi-icon:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-dropdown-header.fi-color span{color:var(--text)}.custom-fields-component .fi-dropdown-header.fi-color span:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component :scope .fi-dropdown-trigger{cursor:pointer;display:flex}.custom-fields-component :scope .fi-dropdown-panel{background-color:var(--color-white);border-radius:var(--radius-lg);z-index:20;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);width:100vw;--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);max-width:14rem!important;position:absolute;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component :scope .fi-dropdown-panel:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :scope .fi-dropdown-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component :where(:scope .fi-dropdown-panel:not(.fi-dropdown-list)>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(:scope .fi-dropdown-panel:not(.fi-dropdown-list):where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(:scope .fi-dropdown-panel:not(.fi-dropdown-list):where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component :scope .fi-dropdown-panel.fi-opacity-0{opacity:0}.custom-fields-component :scope .fi-dropdown-panel.fi-width-xs{max-width:var(--container-xs)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-sm{max-width:var(--container-sm)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-md{max-width:var(--container-md)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-lg{max-width:var(--container-lg)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-xl{max-width:var(--container-xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-2xl{max-width:var(--container-2xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-3xl{max-width:var(--container-3xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-4xl{max-width:var(--container-4xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-5xl{max-width:var(--container-5xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-6xl{max-width:var(--container-6xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-width-7xl{max-width:var(--container-7xl)!important}.custom-fields-component :scope .fi-dropdown-panel.fi-scrollable{overflow-y:auto}.custom-fields-component .fi-dropdown-list{display:grid;gap:1px;padding:calc(var(--spacing)*1)}.custom-fields-component .fi-dropdown-list>.fi-grid{overflow-x:hidden}.custom-fields-component .fi-dropdown-list-item{align-items:center;border-radius:var(--radius-md);font-size:var(--text-sm);gap:calc(var(--spacing)*2);line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*2);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));white-space:nowrap;width:100%;--tw-duration:75ms;--tw-outline-style:none;display:flex;outline-style:none;overflow:hidden;transition-duration:75ms;-webkit-user-select:none;user-select:none}@media (hover:hover){.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]):hover{background-color:var(--gray-50)}}.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]):focus-visible{background-color:var(--gray-50)}@media (hover:hover){.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected{background-color:var(--gray-50)}.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-dropdown-list-item:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-dropdown-list-item.fi-disabled,.custom-fields-component .fi-dropdown-list-item[disabled]{cursor:default;opacity:.7}.custom-fields-component :is(.fi-dropdown-list-item.fi-disabled,.fi-dropdown-list-item[disabled]):not([x-tooltip]){pointer-events:none}.custom-fields-component .fi-dropdown-list-item .fi-icon{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-dropdown-list-item .fi-dropdown-list-item-image{background-position:50%;background-size:cover;border-radius:3.40282e+38px;height:calc(var(--spacing)*5);width:calc(var(--spacing)*5)}.custom-fields-component .fi-dropdown-list-item>.fi-icon{color:var(--gray-400)}.custom-fields-component .fi-dropdown-list-item>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-dropdown-list-item>.fi-icon.fi-color{color:var(--color-500)}.custom-fields-component .fi-dropdown-list-item>.fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}@media (hover:hover){.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):hover{background-color:var(--color-50)}}.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):focus-visible{background-color:var(--color-50)}@media (hover:hover){.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}}.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]):where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected{background-color:var(--color-50)}.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-dropdown-list-item.fi-color:not(.fi-disabled):not([disabled]).fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-400)10%,transparent)}}.custom-fields-component .fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label{color:var(--text)}@media (hover:hover){.custom-fields-component .fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:hover{color:var(--hover-text)}}.custom-fields-component .fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:where(.dark,.dark *){color:var(--dark-text)}@media (hover:hover){.custom-fields-component .fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label:where(.dark,.dark *):hover{color:var(--dark-hover-text)}}.custom-fields-component .fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label.fi-selected{color:var(--hover-text)}.custom-fields-component .fi-dropdown-list-item.fi-color .fi-dropdown-list-item-label.fi-selected:where(.dark,.dark *){color:var(--dark-hover-text)}.custom-fields-component .fi-dropdown-list-item .fi-badge{min-width:1.25rem;padding-block:calc(var(--spacing)*.5);padding-inline:calc(var(--spacing)*1.5);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.custom-fields-component .fi-dropdown-list-item-label{color:var(--gray-700);flex:1;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-dropdown-list-item-label:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-empty-state{padding-block:calc(var(--spacing)*12);padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-empty-state:not(.fi-empty-state-not-contained){background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-empty-state:not(.fi-empty-state-not-contained):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-empty-state:not(.fi-empty-state-not-contained):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-empty-state .fi-empty-state-content{display:grid;justify-items:center;margin-inline:auto;max-width:var(--container-lg);text-align:center}.custom-fields-component .fi-empty-state .fi-empty-state-text-ctn{display:grid;justify-items:center;text-align:center}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg{background-color:var(--gray-100);border-radius:3.40282e+38px;margin-bottom:calc(var(--spacing)*4);padding:calc(var(--spacing)*3)}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg.fi-color{background-color:var(--color-100)}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg.fi-color:where(.dark,.dark *){background-color:var(--color-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-500)20%,transparent)}}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg .fi-icon.fi-color{color:var(--color-500)}.custom-fields-component .fi-empty-state .fi-empty-state-icon-bg .fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-empty-state .fi-empty-state-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-empty-state .fi-empty-state-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-empty-state .fi-empty-state-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-empty-state .fi-empty-state-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-empty-state .fi-empty-state-footer{margin-top:calc(var(--spacing)*6)}.custom-fields-component .fi-empty-state.fi-compact{padding-block:calc(var(--spacing)*6)}.custom-fields-component .fi-empty-state.fi-compact .fi-empty-state-content{align-items:flex-start;display:flex;gap:calc(var(--spacing)*4);margin-inline:calc(var(--spacing)*0);max-width:none;text-align:start}.custom-fields-component .fi-empty-state.fi-compact .fi-empty-state-icon-bg{flex-shrink:0;margin-bottom:calc(var(--spacing)*0)}.custom-fields-component .fi-empty-state.fi-compact .fi-empty-state-text-ctn{flex:1;justify-items:start;text-align:start}.custom-fields-component .fi-empty-state.fi-compact .fi-empty-state-description{margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-empty-state.fi-compact .fi-empty-state-footer{margin-top:calc(var(--spacing)*4)}.custom-fields-component .fi-fieldset>legend{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-inline:calc(var(--spacing)*2);--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium);margin-inline-start:calc(var(--spacing)*-2)}.custom-fields-component .fi-fieldset>legend:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fieldset>legend .fi-fieldset-label-required-mark{--tw-font-weight:var(--font-weight-medium);color:var(--danger-600);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fieldset>legend .fi-fieldset-label-required-mark:where(.dark,.dark *){color:var(--danger-400)}.custom-fields-component .fi-fieldset.fi-fieldset-label-hidden>legend{border-width:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.custom-fields-component .fi-fieldset:not(.fi-fieldset-not-contained){border-color:var(--gray-200);border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;padding:calc(var(--spacing)*6)}.custom-fields-component .fi-fieldset:not(.fi-fieldset-not-contained):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fieldset:not(.fi-fieldset-not-contained):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fieldset.fi-fieldset-not-contained{padding-top:calc(var(--spacing)*6)}.custom-fields-component .fi-grid:not(.fi-grid-direction-col){display:grid;grid-template-columns:var(--cols-default)}@media (min-width:40rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).sm\:fi-grid-cols{grid-template-columns:var(--cols-sm)}}@media (min-width:48rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).md\:fi-grid-cols{grid-template-columns:var(--cols-md)}}@media (min-width:64rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).lg\:fi-grid-cols{grid-template-columns:var(--cols-lg)}}@media (min-width:80rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).xl\:fi-grid-cols{grid-template-columns:var(--cols-xl)}}@media (min-width:96rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\32 xl\:fi-grid-cols{grid-template-columns:var(--cols-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@3xs\:fi-grid-cols{grid-template-columns:var(--cols-c3xs)}}@container (min-width:18rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@2xs\:fi-grid-cols{grid-template-columns:var(--cols-c2xs)}}@container (min-width:20rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@xs\:fi-grid-cols{grid-template-columns:var(--cols-cxs)}}@container (min-width:24rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@sm\:fi-grid-cols{grid-template-columns:var(--cols-csm)}}@container (min-width:28rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@md\:fi-grid-cols{grid-template-columns:var(--cols-cmd)}}@container (min-width:32rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@lg\:fi-grid-cols{grid-template-columns:var(--cols-clg)}}@container (min-width:36rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@xl\:fi-grid-cols{grid-template-columns:var(--cols-cxl)}}@container (min-width:42rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@2xl\:fi-grid-cols{grid-template-columns:var(--cols-c2xl)}}@container (min-width:48rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@3xl\:fi-grid-cols{grid-template-columns:var(--cols-c3xl)}}@container (min-width:56rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@4xl\:fi-grid-cols{grid-template-columns:var(--cols-c4xl)}}@container (min-width:64rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@5xl\:fi-grid-cols{grid-template-columns:var(--cols-c5xl)}}@container (min-width:72rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@6xl\:fi-grid-cols{grid-template-columns:var(--cols-c6xl)}}@container (min-width:80rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\@7xl\:fi-grid-cols{grid-template-columns:var(--cols-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\!\@sm\:fi-grid-cols{grid-template-columns:var(--cols-ncsm)}}@media (min-width:48rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\!\@md\:fi-grid-cols{grid-template-columns:var(--cols-ncmd)}}@media (min-width:64rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\!\@lg\:fi-grid-cols{grid-template-columns:var(--cols-nclg)}}@media (min-width:80rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\!\@xl\:fi-grid-cols{grid-template-columns:var(--cols-ncxl)}}@media (min-width:96rem){.custom-fields-component .fi-grid:not(.fi-grid-direction-col).\!\@2xl\:fi-grid-cols{grid-template-columns:var(--cols-nc2xl)}}}.custom-fields-component .fi-grid.fi-grid-direction-col{columns:var(--cols-default)}@media (min-width:40rem){.custom-fields-component .fi-grid.fi-grid-direction-col.sm\:fi-grid-cols{columns:var(--cols-sm)}}@media (min-width:48rem){.custom-fields-component .fi-grid.fi-grid-direction-col.md\:fi-grid-cols{columns:var(--cols-md)}}@media (min-width:64rem){.custom-fields-component .fi-grid.fi-grid-direction-col.lg\:fi-grid-cols{columns:var(--cols-lg)}}@media (min-width:80rem){.custom-fields-component .fi-grid.fi-grid-direction-col.xl\:fi-grid-cols{columns:var(--cols-xl)}}@media (min-width:96rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\32 xl\:fi-grid-cols{columns:var(--cols-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@3xs\:fi-grid-cols{columns:var(--cols-c3xs)}}@container (min-width:18rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@2xs\:fi-grid-cols{columns:var(--cols-c2xs)}}@container (min-width:20rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@xs\:fi-grid-cols{columns:var(--cols-cxs)}}@container (min-width:24rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@sm\:fi-grid-cols{columns:var(--cols-csm)}}@container (min-width:28rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@md\:fi-grid-cols{columns:var(--cols-cmd)}}@container (min-width:32rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@lg\:fi-grid-cols{columns:var(--cols-clg)}}@container (min-width:36rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@xl\:fi-grid-cols{columns:var(--cols-cxl)}}@container (min-width:42rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@2xl\:fi-grid-cols{columns:var(--cols-c2xl)}}@container (min-width:48rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@3xl\:fi-grid-cols{columns:var(--cols-c3xl)}}@container (min-width:56rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@4xl\:fi-grid-cols{columns:var(--cols-c4xl)}}@container (min-width:64rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@5xl\:fi-grid-cols{columns:var(--cols-c5xl)}}@container (min-width:72rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@6xl\:fi-grid-cols{columns:var(--cols-c6xl)}}@container (min-width:80rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\@7xl\:fi-grid-cols{columns:var(--cols-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\!\@sm\:fi-grid-cols{columns:var(--cols-ncsm)}}@media (min-width:48rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\!\@md\:fi-grid-cols{columns:var(--cols-ncmd)}}@media (min-width:64rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\!\@lg\:fi-grid-cols{columns:var(--cols-nclg)}}@media (min-width:80rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\!\@xl\:fi-grid-cols{columns:var(--cols-ncxl)}}@media (min-width:96rem){.custom-fields-component .fi-grid.fi-grid-direction-col.\!\@2xl\:fi-grid-cols{columns:var(--cols-nc2xl)}}}@supports (container-type:inline-size){.custom-fields-component .fi-grid-ctn{container-type:inline-size}}.custom-fields-component .fi-grid-col{grid-column:var(--col-span-default)}@media (min-width:40rem){.custom-fields-component .fi-grid-col.sm\:fi-grid-col-span{grid-column:var(--col-span-sm)}}@media (min-width:48rem){.custom-fields-component .fi-grid-col.md\:fi-grid-col-span{grid-column:var(--col-span-md)}}@media (min-width:64rem){.custom-fields-component .fi-grid-col.lg\:fi-grid-col-span{grid-column:var(--col-span-lg)}}@media (min-width:80rem){.custom-fields-component .fi-grid-col.xl\:fi-grid-col-span{grid-column:var(--col-span-xl)}}@media (min-width:96rem){.custom-fields-component .fi-grid-col.\32 xl\:fi-grid-col-span{grid-column:var(--col-span-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.custom-fields-component .fi-grid-col.\@3xs\:fi-grid-col-span{grid-column:var(--col-span-c3xs)}}@container (min-width:18rem){.custom-fields-component .fi-grid-col.\@2xs\:fi-grid-col-span{grid-column:var(--col-span-c2xs)}}@container (min-width:20rem){.custom-fields-component .fi-grid-col.\@xs\:fi-grid-col-span{grid-column:var(--col-span-cxs)}}@container (min-width:24rem){.custom-fields-component .fi-grid-col.\@sm\:fi-grid-col-span{grid-column:var(--col-span-csm)}}@container (min-width:28rem){.custom-fields-component .fi-grid-col.\@md\:fi-grid-col-span{grid-column:var(--col-span-cmd)}}@container (min-width:32rem){.custom-fields-component .fi-grid-col.\@lg\:fi-grid-col-span{grid-column:var(--col-span-clg)}}@container (min-width:36rem){.custom-fields-component .fi-grid-col.\@xl\:fi-grid-col-span{grid-column:var(--col-span-cxl)}}@container (min-width:42rem){.custom-fields-component .fi-grid-col.\@2xl\:fi-grid-col-span{grid-column:var(--col-span-c2xl)}}@container (min-width:48rem){.custom-fields-component .fi-grid-col.\@3xl\:fi-grid-col-span{grid-column:var(--col-span-c3xl)}}@container (min-width:56rem){.custom-fields-component .fi-grid-col.\@4xl\:fi-grid-col-span{grid-column:var(--col-span-c4xl)}}@container (min-width:64rem){.custom-fields-component .fi-grid-col.\@5xl\:fi-grid-col-span{grid-column:var(--col-span-c5xl)}}@container (min-width:72rem){.custom-fields-component .fi-grid-col.\@6xl\:fi-grid-col-span{grid-column:var(--col-span-c6xl)}}@container (min-width:80rem){.custom-fields-component .fi-grid-col.\@7xl\:fi-grid-col-span{grid-column:var(--col-span-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-grid-col.\!\@sm\:fi-grid-col-span{grid-column:var(--col-span-ncsm)}}@media (min-width:48rem){.custom-fields-component .fi-grid-col.\!\@md\:fi-grid-col-span{grid-column:var(--col-span-ncmd)}}@media (min-width:64rem){.custom-fields-component .fi-grid-col.\!\@lg\:fi-grid-col-span{grid-column:var(--col-span-nclg)}}@media (min-width:80rem){.custom-fields-component .fi-grid-col.\!\@xl\:fi-grid-col-span{grid-column:var(--col-span-ncxl)}}@media (min-width:96rem){.custom-fields-component .fi-grid-col.\!\@2xl\:fi-grid-col-span{grid-column:var(--col-span-nc2xl)}}}.custom-fields-component .fi-grid-col.fi-grid-col-start{grid-column-start:var(--col-start-default)}@media (min-width:40rem){.custom-fields-component .fi-grid-col.sm\:fi-grid-col-start{grid-column-start:var(--col-start-sm)}}@media (min-width:48rem){.custom-fields-component .fi-grid-col.md\:fi-grid-col-start{grid-column-start:var(--col-start-md)}}@media (min-width:64rem){.custom-fields-component .fi-grid-col.lg\:fi-grid-col-start{grid-column-start:var(--col-start-lg)}}@media (min-width:80rem){.custom-fields-component .fi-grid-col.xl\:fi-grid-col-start{grid-column-start:var(--col-start-xl)}}@media (min-width:96rem){.custom-fields-component .fi-grid-col.\32 xl\:fi-grid-col-start{grid-column-start:var(--col-start-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.custom-fields-component .fi-grid-col.\@3xs\:fi-grid-col-start{grid-column-start:var(--col-start-c3xs)}}@container (min-width:18rem){.custom-fields-component .fi-grid-col.\@2xs\:fi-grid-col-start{grid-column-start:var(--col-start-c2xs)}}@container (min-width:20rem){.custom-fields-component .fi-grid-col.\@xs\:fi-grid-col-start{grid-column-start:var(--col-start-cxs)}}@container (min-width:24rem){.custom-fields-component .fi-grid-col.\@sm\:fi-grid-col-start{grid-column-start:var(--col-start-csm)}}@container (min-width:28rem){.custom-fields-component .fi-grid-col.\@md\:fi-grid-col-start{grid-column-start:var(--col-start-cmd)}}@container (min-width:32rem){.custom-fields-component .fi-grid-col.\@lg\:fi-grid-col-start{grid-column-start:var(--col-start-clg)}}@container (min-width:36rem){.custom-fields-component .fi-grid-col.\@xl\:fi-grid-col-start{grid-column-start:var(--col-start-cxl)}}@container (min-width:42rem){.custom-fields-component .fi-grid-col.\@2xl\:fi-grid-col-start{grid-column-start:var(--col-start-c2xl)}}@container (min-width:48rem){.custom-fields-component .fi-grid-col.\@3xl\:fi-grid-col-start{grid-column-start:var(--col-start-c3xl)}}@container (min-width:56rem){.custom-fields-component .fi-grid-col.\@4xl\:fi-grid-col-start{grid-column-start:var(--col-start-c4xl)}}@container (min-width:64rem){.custom-fields-component .fi-grid-col.\@5xl\:fi-grid-col-start{grid-column-start:var(--col-start-c5xl)}}@container (min-width:72rem){.custom-fields-component .fi-grid-col.\@6xl\:fi-grid-col-start{grid-column-start:var(--col-start-c6xl)}}@container (min-width:80rem){.custom-fields-component .fi-grid-col.\@7xl\:fi-grid-col-start{grid-column-start:var(--col-start-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-grid-col.\!\@sm\:fi-grid-col-start{grid-column-start:var(--col-start-ncsm)}}@media (min-width:48rem){.custom-fields-component .fi-grid-col.\!\@md\:fi-grid-col-start{grid-column-start:var(--col-start-ncmd)}}@media (min-width:64rem){.custom-fields-component .fi-grid-col.\!\@lg\:fi-grid-col-start{grid-column-start:var(--col-start-nclg)}}@media (min-width:80rem){.custom-fields-component .fi-grid-col.\!\@xl\:fi-grid-col-start{grid-column-start:var(--col-start-ncxl)}}@media (min-width:96rem){.custom-fields-component .fi-grid-col.\!\@2xl\:fi-grid-col-start{grid-column-start:var(--col-start-nc2xl)}}}.custom-fields-component .fi-grid-col.fi-grid-col-order{order:var(--col-order-default)}@media (min-width:40rem){.custom-fields-component .fi-grid-col.sm\:fi-grid-col-order{order:var(--col-order-sm)}}@media (min-width:48rem){.custom-fields-component .fi-grid-col.md\:fi-grid-col-order{order:var(--col-order-md)}}@media (min-width:64rem){.custom-fields-component .fi-grid-col.lg\:fi-grid-col-order{order:var(--col-order-lg)}}@media (min-width:80rem){.custom-fields-component .fi-grid-col.xl\:fi-grid-col-order{order:var(--col-order-xl)}}@media (min-width:96rem){.custom-fields-component .fi-grid-col.\32 xl\:fi-grid-col-order{order:var(--col-order-2xl)}}@supports (container-type:inline-size){@container (min-width:16rem){.custom-fields-component .fi-grid-col.\@3xs\:fi-grid-col-order{order:var(--col-order-c3xs)}}@container (min-width:18rem){.custom-fields-component .fi-grid-col.\@2xs\:fi-grid-col-order{order:var(--col-order-c2xs)}}@container (min-width:20rem){.custom-fields-component .fi-grid-col.\@xs\:fi-grid-col-order{order:var(--col-order-cxs)}}@container (min-width:24rem){.custom-fields-component .fi-grid-col.\@sm\:fi-grid-col-order{order:var(--col-order-csm)}}@container (min-width:28rem){.custom-fields-component .fi-grid-col.\@md\:fi-grid-col-order{order:var(--col-order-cmd)}}@container (min-width:32rem){.custom-fields-component .fi-grid-col.\@lg\:fi-grid-col-order{order:var(--col-order-clg)}}@container (min-width:36rem){.custom-fields-component .fi-grid-col.\@xl\:fi-grid-col-order{order:var(--col-order-cxl)}}@container (min-width:42rem){.custom-fields-component .fi-grid-col.\@2xl\:fi-grid-col-order{order:var(--col-order-c2xl)}}@container (min-width:48rem){.custom-fields-component .fi-grid-col.\@3xl\:fi-grid-col-order{order:var(--col-order-c3xl)}}@container (min-width:56rem){.custom-fields-component .fi-grid-col.\@4xl\:fi-grid-col-order{order:var(--col-order-c4xl)}}@container (min-width:64rem){.custom-fields-component .fi-grid-col.\@5xl\:fi-grid-col-order{order:var(--col-order-c5xl)}}@container (min-width:72rem){.custom-fields-component .fi-grid-col.\@6xl\:fi-grid-col-order{order:var(--col-order-c6xl)}}@container (min-width:80rem){.custom-fields-component .fi-grid-col.\@7xl\:fi-grid-col-order{order:var(--col-order-c7xl)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-grid-col.\!\@sm\:fi-grid-col-order{order:var(--col-order-ncsm)}}@media (min-width:48rem){.custom-fields-component .fi-grid-col.\!\@md\:fi-grid-col-order{order:var(--col-order-ncmd)}}@media (min-width:64rem){.custom-fields-component .fi-grid-col.\!\@lg\:fi-grid-col-order{order:var(--col-order-nclg)}}@media (min-width:80rem){.custom-fields-component .fi-grid-col.\!\@xl\:fi-grid-col-order{order:var(--col-order-ncxl)}}@media (min-width:96rem){.custom-fields-component .fi-grid-col.\!\@2xl\:fi-grid-col-order{order:var(--col-order-nc2xl)}}}.custom-fields-component .fi-grid-col.fi-hidden{display:none}.custom-fields-component .fi-icon{height:calc(var(--spacing)*5);width:calc(var(--spacing)*5)}.custom-fields-component .fi-icon.fi-size-xs{height:calc(var(--spacing)*3);width:calc(var(--spacing)*3)}.custom-fields-component .fi-icon.fi-size-sm{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}.custom-fields-component .fi-icon.fi-size-md{height:calc(var(--spacing)*5);width:calc(var(--spacing)*5)}.custom-fields-component .fi-icon.fi-size-lg{height:calc(var(--spacing)*6);width:calc(var(--spacing)*6)}.custom-fields-component .fi-icon.fi-size-xl{height:calc(var(--spacing)*7);width:calc(var(--spacing)*7)}.custom-fields-component .fi-icon.fi-size-2xl{height:calc(var(--spacing)*8);width:calc(var(--spacing)*8)}.custom-fields-component .fi-icon>svg{height:inherit;width:inherit}.custom-fields-component .fi-icon-btn{border-radius:var(--radius-lg);color:var(--gray-500);height:calc(var(--spacing)*9);margin:calc(var(--spacing)*-2);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));width:calc(var(--spacing)*9);--tw-duration:75ms;--tw-outline-style:none;align-items:center;display:flex;justify-content:center;outline-style:none;position:relative;transition-duration:75ms}.custom-fields-component .fi-icon-btn:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.custom-fields-component :is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):hover{color:var(--gray-600)}}.custom-fields-component :is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}@media (hover:hover){.custom-fields-component :is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{color:var(--gray-400)}}.custom-fields-component :is(.fi-icon-btn.fi-force-enabled,.fi-icon-btn:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500)}.custom-fields-component .fi-icon-btn.fi-disabled:not(.fi-force-enabled),.custom-fields-component .fi-icon-btn[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}.custom-fields-component :is(.fi-icon-btn.fi-disabled:not(.fi-force-enabled),.fi-icon-btn[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.custom-fields-component .fi-icon-btn.fi-size-xs{height:calc(var(--spacing)*7);width:calc(var(--spacing)*7)}.custom-fields-component .fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-1.5)}.custom-fields-component .fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-1)}.custom-fields-component .fi-icon-btn.fi-size-xs:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-.5)}.custom-fields-component .fi-icon-btn.fi-size-sm{height:calc(var(--spacing)*8);width:calc(var(--spacing)*8)}.custom-fields-component .fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-2)}.custom-fields-component .fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-1.5)}.custom-fields-component .fi-icon-btn.fi-size-sm:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-1)}.custom-fields-component .fi-icon-btn.fi-size-md:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-2.5)}.custom-fields-component .fi-icon-btn.fi-size-md:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-1.5)}.custom-fields-component .fi-icon-btn.fi-size-lg{height:calc(var(--spacing)*10);width:calc(var(--spacing)*10)}.custom-fields-component .fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-3)}.custom-fields-component .fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-2.5)}.custom-fields-component .fi-icon-btn.fi-size-lg:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-2)}.custom-fields-component .fi-icon-btn.fi-size-xl{height:calc(var(--spacing)*11);width:calc(var(--spacing)*11)}.custom-fields-component .fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-sm){margin:calc(var(--spacing)*-3.5)}.custom-fields-component .fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-md){margin:calc(var(--spacing)*-3)}.custom-fields-component .fi-icon-btn.fi-size-xl:has(.fi-icon.fi-size-lg){margin:calc(var(--spacing)*-2.5)}.custom-fields-component .fi-icon-btn.fi-color{color:var(--text)}.custom-fields-component .fi-icon-btn.fi-color:where(.dark,.dark *){color:var(--dark-text)}@media (hover:hover){.custom-fields-component :is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):hover{color:var(--hover-text)}}.custom-fields-component :is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):focus-visible{--tw-ring-color:var(--color-600)}@media (hover:hover){.custom-fields-component :is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):hover{color:var(--dark-hover-text)}}.custom-fields-component :is(.fi-icon-btn.fi-color.fi-force-enabled,.fi-icon-btn.fi-color:not(.fi-disabled):not([disabled])):where(.dark,.dark *):focus-visible{--tw-ring-color:var(--color-500)}.custom-fields-component .fi-icon-btn>.fi-icon-btn-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*1);z-index:1;--tw-translate-x:-50%;--tw-translate-y:-50%;background-color:var(--color-white);border-radius:var(--radius-md);display:flex;position:absolute;translate:var(--tw-translate-x)var(--tw-translate-y);width:max-content}.custom-fields-component .fi-icon-btn>.fi-icon-btn-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-icon-btn>.fi-icon-btn-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}@media (min-width:40rem){.custom-fields-component .fi-icon-btn:has(+.fi-btn.fi-labeled-from-sm){display:none}}@media (min-width:48rem){.custom-fields-component .fi-icon-btn:has(+.fi-btn.fi-labeled-from-md){display:none}}@media (min-width:64rem){.custom-fields-component .fi-icon-btn:has(+.fi-btn.fi-labeled-from-lg){display:none}}@media (min-width:80rem){.custom-fields-component .fi-icon-btn:has(+.fi-btn.fi-labeled-from-xl){display:none}}@media (min-width:96rem){.custom-fields-component .fi-icon-btn:has(+.fi-btn.fi-labeled-from-2xl){display:none}}.custom-fields-component input[type=checkbox].fi-checkbox-input{appearance:none;height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);--tw-border-style:none;background-color:var(--color-white);color:var(--primary-600);vertical-align:middle;--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-radius:.25rem;border-style:none}.custom-fields-component input[type=checkbox].fi-checkbox-input:checked{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component input[type=checkbox].fi-checkbox-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.custom-fields-component input[type=checkbox].fi-checkbox-input:checked:focus{--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:disabled{background-color:var(--gray-50);color:var(--gray-50);pointer-events:none}.custom-fields-component input[type=checkbox].fi-checkbox-input:disabled:checked{background-color:var(--gray-400);color:var(--gray-400)}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){color:var(--primary-500);--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked{background-color:var(--primary-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):focus{--tw-ring-color:var(--primary-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled{--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:where(.dark,.dark *):disabled:checked{background-color:var(--gray-600)}.custom-fields-component input[type=checkbox].fi-checkbox-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0'/%3E%3C/svg%3E")}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:where(.dark,.dark *){background-color:var(--primary-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M4.5 6.75a1.25 1.25 0 0 0 0 2.5h7a1.25 1.25 0 0 0 0-2.5z'/%3E%3C/svg%3E")}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:disabled{background-color:var(--gray-400)}.custom-fields-component input[type=checkbox].fi-checkbox-input:indeterminate:disabled:where(.dark,.dark *){background-color:var(--gray-600)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid{color:var(--danger-600);--tw-ring-color:var(--danger-600)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:checked{background-color:var(--danger-600)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:focus{--tw-ring-color:var(--danger-600)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:checked:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *){color:var(--danger-500);--tw-ring-color:var(--danger-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked{background-color:var(--danger-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):focus{--tw-ring-color:var(--danger-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate{background-color:var(--danger-600)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:where(.dark,.dark *){background-color:var(--danger-500)}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=checkbox].fi-checkbox-input.fi-invalid:indeterminate:focus:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}.custom-fields-component input.fi-input{appearance:none;--tw-border-style:none;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);text-align:start;width:100%;--tw-leading:calc(var(--spacing)*6);color:var(--gray-950);line-height:calc(var(--spacing)*6);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;background-color:#0000;border-style:none;display:block;transition-duration:75ms}.custom-fields-component input.fi-input::placeholder{color:var(--gray-400)}.custom-fields-component input.fi-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.custom-fields-component input.fi-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.custom-fields-component input.fi-input:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component input.fi-input:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component input.fi-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.custom-fields-component input.fi-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component input.fi-input:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}@supports (-webkit-touch-callout:none){.custom-fields-component input.fi-input{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.custom-fields-component input.fi-input.fi-input-has-inline-prefix{padding-inline-start:calc(var(--spacing)*0)}.custom-fields-component input.fi-input.fi-input-has-inline-suffix{padding-inline-end:calc(var(--spacing)*0)}.custom-fields-component input.fi-input.fi-align-center{text-align:center}.custom-fields-component input.fi-input.fi-align-end{text-align:end}.custom-fields-component input.fi-input.fi-align-left{text-align:left}.custom-fields-component input.fi-input.fi-align-right{text-align:end}.custom-fields-component input.fi-input.fi-align-between,.custom-fields-component input.fi-input.fi-align-justify{text-align:justify}.custom-fields-component input[type=date].fi-input,.custom-fields-component input[type=datetime-local].fi-input,.custom-fields-component input[type=time].fi-input{background-color:#ffffff03}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=date].fi-input,.custom-fields-component input[type=datetime-local].fi-input,.custom-fields-component input[type=time].fi-input{background-color:color-mix(in oklab,var(--color-white)1%,transparent)}}.custom-fields-component input[type=range].fi-input{appearance:auto;margin-inline:auto;width:calc(100% - 1.5rem)}.custom-fields-component input[type=text].fi-one-time-code-input{inset-block:calc(var(--spacing)*0);left:calc(var(--spacing)*0);right:calc(var(--spacing)*-8);--tw-border-style:none;font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;padding-inline:calc(var(--spacing)*3);--tw-tracking:1.72rem;color:var(--gray-950);letter-spacing:1.72rem;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;background-color:#0000;border-style:none;display:block;position:absolute;transition-duration:75ms}.custom-fields-component input[type=text].fi-one-time-code-input::placeholder{color:var(--gray-400)}.custom-fields-component input[type=text].fi-one-time-code-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.custom-fields-component input[type=text].fi-one-time-code-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.custom-fields-component input[type=text].fi-one-time-code-input:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component input[type=text].fi-one-time-code-input:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component input[type=text].fi-one-time-code-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.custom-fields-component input[type=text].fi-one-time-code-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component input[type=text].fi-one-time-code-input:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}.custom-fields-component input[type=text].fi-one-time-code-input.fi-valid{caret-color:#0000}.custom-fields-component .fi-one-time-code-input-ctn{height:calc(var(--spacing)*12);position:relative}.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{border-color:var(--gray-950);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;display:inline-block;height:100%;width:calc(var(--spacing)*8)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field{background-color:var(--color-white)}.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field.fi-active{border-color:var(--primary-600);border-style:var(--tw-border-style);border-width:2px}.custom-fields-component .fi-one-time-code-input-ctn>.fi-one-time-code-input-digit-field.fi-active:where(.dark,.dark *){border-color:var(--primary-500)}.custom-fields-component input[type=radio].fi-radio-input{appearance:none;height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);--tw-border-style:none;background-color:var(--color-white);color:var(--primary-600);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-radius:3.40282e+38px;border-style:none}.custom-fields-component input[type=radio].fi-radio-input,.custom-fields-component input[type=radio].fi-radio-input:checked{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component input[type=radio].fi-radio-input:checked{background-color:var(--primary-600);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)}.custom-fields-component input[type=radio].fi-radio-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.custom-fields-component input[type=radio].fi-radio-input:checked:focus{--tw-ring-color:var(--primary-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input:checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-500)50%,transparent)}}.custom-fields-component input[type=radio].fi-radio-input:disabled{background-color:var(--gray-50);color:var(--gray-50)}.custom-fields-component input[type=radio].fi-radio-input:disabled:checked{background-color:var(--gray-400);color:var(--gray-400)}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *){color:var(--primary-500);--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):checked{background-color:var(--primary-500)}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):focus{--tw-ring-color:var(--primary-500)}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--primary-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--primary-400)50%,transparent)}}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):disabled{--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):disabled{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component input[type=radio].fi-radio-input:where(.dark,.dark *):disabled:checked{background-color:var(--gray-600)}.custom-fields-component input[type=radio].fi-radio-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid{color:var(--danger-600);--tw-ring-color:var(--danger-600)}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:checked{background-color:var(--danger-600)}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:focus{--tw-ring-color:var(--danger-600)}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:checked:focus{--tw-ring-color:var(--danger-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-500)50%,transparent)}}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *){color:var(--danger-500);--tw-ring-color:var(--danger-500)}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked{background-color:var(--danger-500)}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):focus{--tw-ring-color:var(--danger-500)}.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:var(--danger-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component input[type=radio].fi-radio-input.fi-invalid:where(.dark,.dark *):checked:focus{--tw-ring-color:color-mix(in oklab,var(--danger-400)50%,transparent)}}.custom-fields-component select.fi-select-input{appearance:none;--tw-border-style:none;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);width:100%;--tw-leading:calc(var(--spacing)*6);color:var(--gray-950);line-height:calc(var(--spacing)*6);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;background-color:#0000;border-style:none;display:block;padding-inline-end:calc(var(--spacing)*8);padding-inline-start:calc(var(--spacing)*3);transition-duration:75ms}.custom-fields-component select.fi-select-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.custom-fields-component select.fi-select-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.custom-fields-component select.fi-select-input:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component select.fi-select-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component select.fi-select-input optgroup{background-color:var(--color-white)}.custom-fields-component select.fi-select-input optgroup:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component select.fi-select-input option{background-color:var(--color-white)}.custom-fields-component select.fi-select-input option:where(.dark,.dark *){background-color:var(--gray-900)}@supports (-webkit-touch-callout:none){.custom-fields-component select.fi-select-input{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.custom-fields-component select.fi-select-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}.custom-fields-component select.fi-select-input:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.5rem}.custom-fields-component select.fi-select-input.fi-select-input-has-inline-prefix{padding-inline-start:calc(var(--spacing)*0)}.custom-fields-component .fi-select-input .fi-select-input-ctn{position:relative}.custom-fields-component .fi-select-input div[x-ref=select]{min-height:calc(var(--spacing)*9)}.custom-fields-component .fi-select-input .fi-select-input-btn{border-radius:var(--radius-lg);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));min-height:calc(var(--spacing)*9);padding-block:calc(var(--spacing)*1.5);text-align:start;width:100%;--tw-leading:calc(var(--spacing)*6);color:var(--gray-950);display:flex;line-height:calc(var(--spacing)*6);padding-inline-end:calc(var(--spacing)*8);padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-select-input .fi-select-input-btn:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.custom-fields-component .fi-select-input .fi-select-input-btn:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-select-input .fi-select-input-btn{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}.custom-fields-component .fi-select-input .fi-select-input-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.5rem}.custom-fields-component .fi-select-input .fi-select-input-value-ctn{align-items:center;display:flex;text-wrap:wrap;width:100%;word-break:break-word}.custom-fields-component .fi-select-input .fi-select-input-value-badges-ctn{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*1.5)}.custom-fields-component .fi-select-input .fi-select-input-value-label{flex:1}.custom-fields-component .fi-select-input .fi-select-input-value-remove-btn{--tw-translate-y:-50%;color:var(--gray-500);inset-inline-end:calc(var(--spacing)*8);position:absolute;top:50%;translate:var(--tw-translate-x)var(--tw-translate-y)}@media (hover:hover){.custom-fields-component .fi-select-input .fi-select-input-value-remove-btn:hover{color:var(--gray-600)}}.custom-fields-component .fi-select-input .fi-select-input-value-remove-btn:focus-visible{color:var(--gray-600);--tw-outline-style:none;outline-style:none}@media (hover:hover){.custom-fields-component .fi-select-input .fi-select-input-value-remove-btn:where(.dark,.dark *):hover{color:var(--gray-300)}}.custom-fields-component .fi-select-input .fi-select-input-value-remove-btn:where(.dark,.dark *):focus-visible{color:var(--gray-300)}.custom-fields-component .fi-select-input .fi-select-input-ctn-clearable .fi-select-input-btn{padding-inline-end:calc(var(--spacing)*14)}.custom-fields-component .fi-select-input .fi-dropdown-panel{max-height:calc(var(--spacing)*60);max-width:100%!important}.custom-fields-component :where(.fi-select-input .fi-select-input-options-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-select-input .fi-select-input-options-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-select-input .fi-select-input-options-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component :where(.fi-select-input .fi-select-input-option-group>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-100);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-select-input .fi-select-input-option-group:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-select-input .fi-select-input-option-group:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-select-input .fi-select-input-option-group .fi-dropdown-header{--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-select-input .fi-select-input-option-group .fi-dropdown-header:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-select-input .fi-select-input-search-ctn{background-color:var(--color-white);position:sticky;top:calc(var(--spacing)*0);z-index:10}.custom-fields-component .fi-select-input .fi-select-input-search-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-select-input .fi-select-input-option{min-width:1px;text-wrap:wrap;word-break:break-word}.custom-fields-component .fi-select-input .fi-select-input-placeholder{color:var(--gray-400)}.custom-fields-component .fi-select-input .fi-select-input-placeholder:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-select-input .fi-disabled{cursor:not-allowed;opacity:.7}.custom-fields-component .fi-select-input .fi-disabled .fi-select-input-placeholder{color:var(--gray-400)}.custom-fields-component .fi-select-input .fi-disabled .fi-select-input-placeholder:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-select-input .fi-select-input-message{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-select-input .fi-select-input-message:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-select-input .fi-select-input-ctn.fi-select-input-ctn-option-labels-not-wrapped .fi-select-input-value-ctn>span{overflow:hidden;overflow-wrap:normal;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;word-break:normal}.custom-fields-component .fi-select-input .fi-select-input-ctn.fi-select-input-ctn-option-labels-not-wrapped .fi-select-input-option>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-input-wrp{background-color:var(--color-white);border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;display:flex;transition-duration:75ms}.custom-fields-component .fi-input-wrp:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-input-wrp:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-input-wrp:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-input-wrp:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.custom-fields-component .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):where(.dark,.dark *):focus-within{--tw-ring-color:var(--primary-500)}.custom-fields-component .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:focus-within{--tw-ring-color:var(--danger-600)}.custom-fields-component .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:where(.dark,.dark *):focus-within{--tw-ring-color:var(--danger-500)}.custom-fields-component .fi-input-wrp.fi-disabled{background-color:var(--gray-50)}.custom-fields-component .fi-input-wrp.fi-disabled:where(.dark,.dark *){background-color:#0000}.custom-fields-component .fi-input-wrp.fi-disabled:not(.fi-invalid):where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-input-wrp.fi-disabled:not(.fi-invalid):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-input-wrp.fi-invalid{--tw-ring-color:var(--danger-600)}.custom-fields-component .fi-input-wrp.fi-invalid:where(.dark,.dark *){--tw-ring-color:var(--danger-500)}.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix{align-items:center;column-gap:calc(var(--spacing)*3);display:none;padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix.fi-input-wrp-prefix-has-content{display:flex}.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix.fi-inline{padding-inline-end:calc(var(--spacing)*2)}.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix.fi-inline.fi-input-wrp-prefix-has-label{padding-inline-end:calc(var(--spacing)*1)}.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline){border-color:var(--gray-200);border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;padding-inline-end:calc(var(--spacing)*3);padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-input-wrp .fi-input-wrp-prefix:not(.fi-inline):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-input-wrp .fi-input-wrp-content-ctn,.custom-fields-component .fi-input-wrp:not(:has(.fi-input-wrp-content-ctn))>*{flex:1;min-width:calc(var(--spacing)*0)}.custom-fields-component :is(.fi-input-wrp .fi-input-wrp-content-ctn,.fi-input-wrp:not(:has(.fi-input-wrp-content-ctn))>*).fi-input-wrp-content-ctn-ps{padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-input-wrp .fi-input-wrp-suffix{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;padding-inline-end:calc(var(--spacing)*3)}.custom-fields-component .fi-input-wrp .fi-input-wrp-suffix.fi-inline{padding-inline-start:calc(var(--spacing)*2)}.custom-fields-component .fi-input-wrp .fi-input-wrp-suffix.fi-inline.fi-input-wrp-suffix-has-label{padding-inline-start:calc(var(--spacing)*1)}.custom-fields-component .fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline){border-color:var(--gray-200);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-input-wrp .fi-input-wrp-suffix:not(.fi-inline):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-input-wrp .fi-input-wrp-actions{align-items:center;display:flex;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-input-wrp .fi-input-wrp-label{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap}.custom-fields-component .fi-input-wrp .fi-input-wrp-label:where(.dark,.dark *),.custom-fields-component :is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon{color:var(--gray-400)}.custom-fields-component :is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component :is(.fi-input-wrp .fi-input-wrp-prefix,.fi-input-wrp .fi-input-wrp-suffix)>.fi-icon.fi-color{color:var(--color-500)}.custom-fields-component .fi-link{align-items:center;gap:calc(var(--spacing)*1.5);justify-content:center;--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);font-weight:var(--font-weight-medium);--tw-outline-style:none;display:inline-flex;outline-style:none;position:relative}.custom-fields-component .fi-link:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){.custom-fields-component :is(.fi-link.fi-force-enabled,.fi-link:not(.fi-disabled):not([disabled])):hover{text-decoration-line:underline}}.custom-fields-component :is(.fi-link.fi-force-enabled,.fi-link:not(.fi-disabled):not([disabled])):focus-visible{text-decoration-line:underline}.custom-fields-component .fi-link.fi-disabled:not(.fi-force-enabled),.custom-fields-component .fi-link[disabled]:not(.fi-force-enabled){cursor:default;opacity:.7}.custom-fields-component :is(.fi-link.fi-disabled:not(.fi-force-enabled),.fi-link[disabled]:not(.fi-force-enabled)):not([x-tooltip]){pointer-events:none}.custom-fields-component .fi-link.fi-size-xs{font-size:var(--text-xs);gap:calc(var(--spacing)*1);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-link.fi-size-sm{font-size:var(--text-sm);gap:calc(var(--spacing)*1);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-link.fi-size-lg,.custom-fields-component .fi-link.fi-size-md,.custom-fields-component .fi-link.fi-size-xl{font-size:var(--text-sm);gap:calc(var(--spacing)*1.5);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-link.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.custom-fields-component .fi-link.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.custom-fields-component .fi-link.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.custom-fields-component .fi-link.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.custom-fields-component .fi-link.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-link.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.custom-fields-component .fi-link.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.custom-fields-component .fi-link.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.custom-fields-component .fi-link.fi-color{color:var(--text)}.custom-fields-component .fi-link.fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-link:not(.fi-color)>.fi-icon{color:var(--gray-400)}.custom-fields-component .fi-link:not(.fi-color)>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-link .fi-link-badge-ctn{inset-inline-start:100%;top:calc(var(--spacing)*0);z-index:1;--tw-translate-x:-25%;--tw-translate-y:-75%;background-color:var(--color-white);border-radius:var(--radius-md);translate:var(--tw-translate-x)var(--tw-translate-y);width:max-content;--tw-font-weight:var(--font-weight-normal);display:flex;font-weight:var(--font-weight-normal);position:absolute}@media (hover:hover){.custom-fields-component .fi-link .fi-link-badge-ctn:hover{text-decoration-line:none}}.custom-fields-component .fi-link .fi-link-badge-ctn:focus-visible{text-decoration-line:none}.custom-fields-component .fi-link .fi-link-badge-ctn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:25%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-link .fi-link-badge-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component p>.fi-link,.custom-fields-component span>.fi-link{padding-bottom:2px;text-align:inherit;vertical-align:middle}.custom-fields-component .fi-loading-indicator{animation:var(--animate-spin)}.custom-fields-component .fi-loading-section{animation:var(--animate-pulse)}.custom-fields-component :is(.fi-modal.fi-modal-slide-over,.fi-modal.fi-width-screen)>.fi-modal-window-ctn>.fi-modal-window{height:100dvh}.custom-fields-component :is(.fi-modal.fi-modal-slide-over,.fi-modal.fi-width-screen)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content{flex:1}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window{margin-inline-start:auto;overflow-y:auto}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component :is(.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-end,.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-start{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header{column-gap:calc(var(--spacing)*3)}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg{margin-block:calc(var(--spacing)*-2);margin-inline-start:calc(var(--spacing)*-2);padding:calc(var(--spacing)*2)}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{inset-inline-end:calc(var(--spacing)*6);top:calc(var(--spacing)*6)}.custom-fields-component .fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen):not(.fi-modal-has-sticky-header):not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn{overflow-y:auto}.custom-fields-component :is(.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-header,.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window{max-height:calc(100dvh - 2rem);overflow-y:auto}.custom-fields-component .fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-start,.custom-fields-component .fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-end{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;opacity:0;scale:var(--tw-scale-x)var(--tw-scale-y)}.custom-fields-component .fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter-end,.custom-fields-component .fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave-start{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;opacity:1;scale:var(--tw-scale-x)var(--tw-scale-y)}.custom-fields-component .fi-modal:not(.fi-modal-slide-over)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{inset-inline-end:calc(var(--spacing)*4);top:calc(var(--spacing)*4)}.custom-fields-component .fi-modal.fi-align-start:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window-has-icon .fi-modal-content,.custom-fields-component .fi-modal.fi-align-start:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window-has-icon .fi-modal-footer:not(.fi-align-center){padding-inline-end:calc(var(--spacing)*6);padding-inline-start:5.25rem}.custom-fields-component .fi-modal:not(.fi-align-start)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content,.custom-fields-component .fi-modal:not(.fi-align-start)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-modal>.fi-modal-close-overlay{background-color:var(--gray-950);inset:calc(var(--spacing)*0);position:fixed;z-index:40}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal>.fi-modal-close-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.custom-fields-component .fi-modal>.fi-modal-close-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal>.fi-modal-close-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}.custom-fields-component .fi-modal>.fi-modal-window-ctn{display:grid;grid-template-rows:1fr auto 1fr;inset:calc(var(--spacing)*0);justify-items:center;min-height:100%;position:fixed;z-index:40}@media (min-width:40rem){.custom-fields-component .fi-modal>.fi-modal-window-ctn{grid-template-rows:1fr auto 3fr}}.custom-fields-component .fi-modal>.fi-modal-window-ctn.fi-clickable{cursor:pointer}.custom-fields-component .fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)>.fi-modal-window-ctn{padding:calc(var(--spacing)*4)}.custom-fields-component .fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)>.fi-modal-window-ctn .fi-modal-window{border-radius:var(--radius-xl);margin-inline:auto}.custom-fields-component .fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.custom-fields-component .fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen).fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{border-bottom-left-radius:var(--radius-xl);border-bottom-right-radius:var(--radius-xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window{background-color:var(--color-white);cursor:default;pointer-events:auto;--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);width:100%;--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex;flex-direction:column;grid-row-start:2;position:relative}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header{display:flex;padding-inline:calc(var(--spacing)*6);padding-top:calc(var(--spacing)*6)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-header.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-top:calc(var(--spacing)*2)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content{display:flex;flex-direction:column;padding-block:calc(var(--spacing)*6);row-gap:calc(var(--spacing)*4)}.custom-fields-component :is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-left) .fi-modal-header{column-gap:calc(var(--spacing)*5)}.custom-fields-component :is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-left) .fi-modal-icon-bg{padding:calc(var(--spacing)*2)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-header{flex-direction:column;text-align:center}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-icon-ctn{align-items:center;display:flex;justify-content:center;margin-bottom:calc(var(--spacing)*5)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-align-center .fi-modal-icon-bg{padding:calc(var(--spacing)*3)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-hidden{display:none}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-xs{max-width:var(--container-xs)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-sm{max-width:var(--container-sm)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-md{max-width:var(--container-md)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-lg{max-width:var(--container-lg)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-xl{max-width:var(--container-xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-2xl{max-width:var(--container-2xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-3xl{max-width:var(--container-3xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-4xl{max-width:var(--container-4xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-5xl{max-width:var(--container-5xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-6xl{max-width:var(--container-6xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-7xl{max-width:var(--container-7xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-full{max-width:100%}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-min{max-width:min-content}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-max{max-width:max-content}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-fit{max-width:fit-content}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-prose{max-width:65ch}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-sm{max-width:var(--breakpoint-sm)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-md{max-width:var(--breakpoint-md)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-lg{max-width:var(--breakpoint-lg)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-xl{max-width:var(--breakpoint-xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen-2xl{max-width:var(--breakpoint-2xl)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-width-screen{inset:calc(var(--spacing)*0);position:fixed}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-transition-enter,.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-transition-leave{--tw-duration:.3s;transition-duration:.3s}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-center:not(.fi-modal-window-has-icon) .fi-modal-heading{margin-inline-start:calc(var(--spacing)*6)}.custom-fields-component :is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn:not(.fi-modal-window-has-icon),.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-close-btn.fi-align-left) .fi-modal-heading{margin-inline-end:calc(var(--spacing)*6)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-close-btn{position:absolute}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{width:100%}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer .fi-modal-footer-actions{gap:calc(var(--spacing)*3)}.custom-fields-component :is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-start,.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-left) .fi-modal-footer-actions{align-items:center;display:flex;flex-wrap:wrap}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center{padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{display:flex;flex-direction:column-reverse}.custom-fields-component :is(.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-end,.fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-right) .fi-modal-footer-actions{align-items:center;display:flex;flex-flow:row-reverse wrap}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg{background-color:var(--gray-100);border-radius:3.40282e+38px}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg>.fi-icon{color:var(--gray-500)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg>.fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color{background-color:var(--color-100)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color:where(.dark,.dark *){background-color:var(--color-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-500)20%,transparent)}}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color>.fi-icon{color:var(--color-600)}.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-icon-bg.fi-color>.fi-icon:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header{background-color:var(--color-white);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-bottom:calc(var(--spacing)*6);position:sticky;top:calc(var(--spacing)*0);z-index:10}.custom-fields-component .fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-header:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window .fi-modal-content,.custom-fields-component .fi-modal.fi-modal-has-sticky-header>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{background-color:var(--color-white);border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;bottom:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*5);position:sticky}.custom-fields-component .fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-modal.fi-modal-has-sticky-footer>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-content) .fi-modal-footer{margin-top:calc(var(--spacing)*6)}.custom-fields-component .fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer,.custom-fields-component .fi-modal:not(.fi-modal-has-sticky-footer)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-content):not(.fi-modal-window-has-footer) .fi-modal-header{padding-bottom:calc(var(--spacing)*6)}.custom-fields-component .fi-modal:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-icon) .fi-modal-content,.custom-fields-component .fi-modal:not(.fi-modal-has-sticky-header)>.fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-icon) .fi-modal-footer{padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-modal.fi-modal-slide-over>.fi-modal-window-ctn>.fi-modal-window>.fi-modal-footer{margin-top:auto}@supports (container-type:inline-size){.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center{container-type:inline-size}@container (min-width:24rem){.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr))}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-modal>.fi-modal-window-ctn>.fi-modal-window .fi-modal-footer.fi-align-center .fi-modal-footer-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr))}}}.custom-fields-component :scope .fi-modal-trigger{display:flex}.custom-fields-component .fi-pagination{align-items:center;column-gap:calc(var(--spacing)*3);display:grid;grid-template-columns:1fr auto 1fr}.custom-fields-component .fi-pagination:empty{display:none}.custom-fields-component .fi-pagination .fi-pagination-previous-btn{justify-self:flex-start}.custom-fields-component .fi-pagination .fi-pagination-overview{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);display:none;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-pagination .fi-pagination-overview:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-pagination .fi-pagination-records-per-page-select-ctn{grid-column-start:2;justify-self:center}.custom-fields-component .fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:none}.custom-fields-component .fi-pagination .fi-pagination-next-btn{grid-column-start:3;justify-self:flex-end}.custom-fields-component .fi-pagination .fi-pagination-items{background-color:var(--color-white);border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);display:none;justify-self:flex-end}.custom-fields-component .fi-pagination .fi-pagination-items:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-pagination .fi-pagination-items:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-pagination .fi-pagination-items:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-pagination .fi-pagination-items:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-pagination .fi-pagination-item{border-color:var(--gray-200);border-inline-style:var(--tw-border-style);border-inline-width:.5px}.custom-fields-component .fi-pagination .fi-pagination-item:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.custom-fields-component .fi-pagination .fi-pagination-item:last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.custom-fields-component .fi-pagination .fi-pagination-item:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-pagination .fi-pagination-item:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn{background-color:var(--gray-50)}.custom-fields-component .fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-label{color:var(--primary-700)}.custom-fields-component .fi-pagination .fi-pagination-item.fi-active .fi-pagination-item-label:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-pagination .fi-pagination-item:first-of-type .fi-pagination-item-btn{border-end-start-radius:var(--radius-lg);border-start-start-radius:var(--radius-lg)}.custom-fields-component .fi-pagination .fi-pagination-item:last-of-type .fi-pagination-item-btn{border-end-end-radius:var(--radius-lg);border-start-end-radius:var(--radius-lg)}.custom-fields-component .fi-pagination .fi-pagination-item.fi-disabled .fi-pagination-item-label{color:var(--gray-500)}.custom-fields-component .fi-pagination .fi-pagination-item.fi-disabled .fi-pagination-item-label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-pagination .fi-pagination-item-btn{padding:calc(var(--spacing)*2);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;--tw-outline-style:none;display:flex;outline-style:none;overflow:hidden;position:relative;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-pagination .fi-pagination-item-btn:enabled:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-pagination .fi-pagination-item-btn:enabled:focus-visible{z-index:10;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}@media (hover:hover){.custom-fields-component .fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-pagination .fi-pagination-item-btn:enabled:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500)}.custom-fields-component .fi-pagination .fi-pagination-item-btn:hover .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-pagination .fi-pagination-item-btn:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-pagination .fi-pagination-item-btn .fi-icon{color:var(--gray-400);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-pagination .fi-pagination-item-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-pagination .fi-pagination-item-btn .fi-pagination-item-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-inline:calc(var(--spacing)*1.5);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-700);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-pagination .fi-pagination-item-btn .fi-pagination-item-label:where(.dark,.dark *){color:var(--gray-200)}@supports (container-type:inline-size){.custom-fields-component .fi-pagination{container-type:inline-size}@container (min-width:28rem){.custom-fields-component .fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:inline}.custom-fields-component .fi-pagination .fi-pagination-records-per-page-select.fi-compact{display:none}}@container (min-width:56rem){.custom-fields-component .fi-pagination:not(.fi-simple) .fi-pagination-next-btn,.custom-fields-component .fi-pagination:not(.fi-simple) .fi-pagination-previous-btn{display:none}.custom-fields-component .fi-pagination .fi-pagination-overview{display:inline}.custom-fields-component .fi-pagination .fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-pagination .fi-pagination-records-per-page-select:not(.fi-compact){display:inline}.custom-fields-component .fi-pagination .fi-pagination-records-per-page-select.fi-compact{display:none}}@media (min-width:48rem){.custom-fields-component .fi-pagination:not(.fi-simple) .fi-pagination-next-btn,.custom-fields-component .fi-pagination:not(.fi-simple) .fi-pagination-previous-btn{display:none}.custom-fields-component .fi-pagination .fi-pagination-overview{display:inline}.custom-fields-component .fi-pagination .fi-pagination-items{display:flex}}}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-divided>.fi-section-content-ctn>.fi-section-content>*,.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-divided)>.fi-section-content-ctn>.fi-section-content{padding:calc(var(--spacing)*6)}.custom-fields-component .fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-section:not(.fi-section-not-contained)>.fi-section-content-ctn>.fi-section-footer:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside){background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-compact{border-radius:var(--radius-lg)}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary{background-color:var(--gray-50)}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-secondary:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside)>.fi-section-header{padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px}.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)>.fi-section-content-ctn:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:48rem){.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn{grid-column:span 2/span 2}}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside>.fi-section-content-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside.fi-compact>.fi-section-content-ctn{border-radius:var(--radius-lg)}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn{background-color:var(--gray-50)}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-aside.fi-secondary>.fi-section-content-ctn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-compact:not(.fi-aside)>.fi-section-header{padding-block:calc(var(--spacing)*2.5);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-compact.fi-divided>.fi-section-content-ctn>.fi-section-content>*,.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-compact:not(.fi-divided)>.fi-section-content-ctn>.fi-section-content{padding:calc(var(--spacing)*4)}.custom-fields-component .fi-section:not(.fi-section-not-contained).fi-compact>.fi-section-footer{padding-block:calc(var(--spacing)*2.5);padding-inline:calc(var(--spacing)*4)}@media (min-width:48rem){.custom-fields-component .fi-section.fi-section-not-contained.fi-aside>.fi-section-content-ctn{grid-column:span 2/span 2}}.custom-fields-component .fi-section.fi-section-not-contained:not(.fi-aside),.custom-fields-component .fi-section.fi-section-not-contained:not(.fi-aside)>.fi-section-content-ctn{display:grid;row-gap:calc(var(--spacing)*4)}.custom-fields-component .fi-section.fi-section-not-contained:not(.fi-aside).fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding-block:calc(var(--spacing)*6)}.custom-fields-component .fi-section.fi-section-not-contained:not(.fi-aside).fi-compact,.custom-fields-component .fi-section.fi-section-not-contained:not(.fi-aside).fi-compact>.fi-section-content-ctn{row-gap:calc(var(--spacing)*2.5)}.custom-fields-component .fi-section.fi-section-not-contained:not(.fi-aside).fi-compact.fi-divided>.fi-section-content-ctn>.fi-section-content>*{padding-block:calc(var(--spacing)*4)}.custom-fields-component :where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-section.fi-divided>.fi-section-content-ctn>.fi-section-content:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-section.fi-aside{align-items:flex-start;column-gap:calc(var(--spacing)*6);display:grid;grid-template-columns:repeat(1,minmax(0,1fr));row-gap:calc(var(--spacing)*4)}@media (min-width:48rem){.custom-fields-component .fi-section.fi-aside{grid-template-columns:repeat(3,minmax(0,1fr))}}.custom-fields-component .fi-section.fi-collapsible>.fi-section-header{cursor:pointer}.custom-fields-component .fi-section.fi-collapsed>.fi-section-header>.fi-section-collapse-btn{rotate:180deg}.custom-fields-component .fi-section.fi-collapsed>.fi-section-content-ctn{height:calc(var(--spacing)*0);visibility:hidden;--tw-border-style:none;border-style:none;overflow:hidden;position:absolute}@media (min-width:48rem){.custom-fields-component .fi-section.fi-section-has-content-before>.fi-section-content-ctn{order:-9999}}.custom-fields-component .fi-section>.fi-section-header{align-items:center;display:flex;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-section>.fi-section-header>.fi-icon{color:var(--gray-400);flex-shrink:0}.custom-fields-component .fi-section>.fi-section-header>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-section>.fi-section-header>.fi-icon.fi-color{color:var(--color-500)}.custom-fields-component .fi-section>.fi-section-header>.fi-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-section>.fi-section-header>.fi-icon.fi-size-sm{margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-section>.fi-section-header>.fi-icon.fi-size-md{margin-top:calc(var(--spacing)*.5)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-link,.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-sc-text{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn.fi-size-xs{margin-block:calc(var(--spacing)*-.5)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn.fi-size-sm{margin-block:calc(var(--spacing)*-1)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn.fi-size-md{margin-block:calc(var(--spacing)*-1.5)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn.fi-size-lg{margin-block:calc(var(--spacing)*-2)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-header-after-ctn .fi-btn.fi-size-xl{margin-block:calc(var(--spacing)*-2.5)}.custom-fields-component .fi-section>.fi-section-header>.fi-section-collapse-btn{flex-shrink:0;margin-block:calc(var(--spacing)*-1.5)}.custom-fields-component .fi-section .fi-section-header-text-ctn{display:grid;flex:1;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-section .fi-section-header-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-section .fi-section-header-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-section .fi-section-header-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow:hidden;overflow-wrap:break-word}.custom-fields-component .fi-section .fi-section-header-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-tabs{column-gap:calc(var(--spacing)*1);display:flex;max-width:100%;overflow-x:auto}.custom-fields-component .fi-tabs.fi-contained{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-block:calc(var(--spacing)*2.5);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-tabs.fi-contained:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tabs.fi-contained:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-tabs:not(.fi-contained){background-color:var(--color-white);border-radius:var(--radius-xl);padding:calc(var(--spacing)*2);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);margin-inline:auto}.custom-fields-component .fi-tabs:not(.fi-contained):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tabs:not(.fi-contained):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-tabs.fi-vertical{column-gap:calc(var(--spacing)*0);flex-direction:column;overflow:hidden auto;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-tabs.fi-vertical.fi-contained{border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-tabs.fi-vertical:not(.fi-contained){margin-inline:calc(var(--spacing)*0)}.custom-fields-component .fi-tabs.fi-vertical .fi-tabs-item{justify-content:flex-start}.custom-fields-component .fi-tabs-item{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*2);font-size:var(--text-sm);justify-content:center;line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));white-space:nowrap;--tw-duration:75ms;--tw-outline-style:none;display:flex;outline-style:none;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-tabs-item:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-tabs-item:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.custom-fields-component .fi-tabs-item:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tabs-item:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-tabs-item:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tabs-item:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-tabs-item.fi-active{background-color:var(--gray-50)}.custom-fields-component .fi-tabs-item.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tabs-item.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-tabs-item.fi-active .fi-icon,.custom-fields-component .fi-tabs-item.fi-active .fi-tabs-item-label{color:var(--primary-700)}.custom-fields-component :is(.fi-tabs-item.fi-active .fi-tabs-item-label,.fi-tabs-item.fi-active .fi-icon):where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label,.custom-fields-component .fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:is(:where(.group):focus-visible *){color:var(--gray-700)}.custom-fields-component .fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:where(.dark,.dark *),.custom-fields-component .fi-tabs-item :not(.fi-active):hover .fi-tabs-item-label:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-200)}.custom-fields-component .fi-tabs-item :not(.fi-active):focus-visible .fi-tabs-item-label{color:var(--gray-700)}.custom-fields-component .fi-tabs-item :not(.fi-active):focus-visible .fi-tabs-item-label:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-tabs-item .fi-tabs-item-label{color:var(--gray-500);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-tabs-item .fi-tabs-item-label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-tabs-item .fi-icon{color:var(--gray-400);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;flex-shrink:0;transition-duration:75ms}.custom-fields-component .fi-tabs-item .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-tabs-item .fi-badge{width:max-content}.custom-fields-component .fi-toggle{background-color:var(--gray-200);border-style:var(--tw-border-style);cursor:pointer;height:calc(var(--spacing)*6);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));width:calc(var(--spacing)*11);--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out);--tw-outline-style:none;border-color:#0000;border-radius:3.40282e+38px;border-width:2px;display:inline-flex;flex-shrink:0;outline-style:none;position:relative}.custom-fields-component .fi-toggle:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600);--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.custom-fields-component .fi-toggle:disabled{opacity:.7;pointer-events:none}.custom-fields-component .fi-toggle:where(.dark,.dark *){background-color:var(--gray-700)}.custom-fields-component .fi-toggle:where(.dark,.dark *):focus-visible{--tw-ring-color:var(--primary-500);--tw-ring-offset-color:var(--gray-900)}.custom-fields-component .fi-toggle:disabled,.custom-fields-component .fi-toggle[disabled]{opacity:.7;pointer-events:none}.custom-fields-component .fi-toggle.fi-color{background-color:var(--bg)}.custom-fields-component .fi-toggle.fi-color:where(.dark,.dark *){background-color:var(--dark-bg)}.custom-fields-component .fi-toggle.fi-color .fi-icon{color:var(--text)}.custom-fields-component .fi-toggle.fi-hidden{display:none}.custom-fields-component .fi-toggle>:first-child{background-color:var(--color-white);height:calc(var(--spacing)*5);pointer-events:none;transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,);width:calc(var(--spacing)*5);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:.2s;--tw-ease:var(--ease-in-out);border-radius:3.40282e+38px;display:inline-block;position:relative;transition-duration:.2s;transition-timing-function:var(--ease-in-out)}.custom-fields-component .fi-toggle>:first-child>*{align-items:center;display:flex;height:100%;inset:calc(var(--spacing)*0);justify-content:center;position:absolute;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));width:100%}.custom-fields-component .fi-toggle .fi-icon{color:var(--gray-400)}.custom-fields-component .fi-toggle .fi-icon:where(.dark,.dark *){color:var(--gray-700)}.custom-fields-component .fi-toggle.fi-toggle-on>:first-child{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-toggle.fi-toggle-on>:first-child:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*-5);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-toggle.fi-toggle-on>:first-child>:first-child{opacity:0;--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.custom-fields-component .fi-toggle.fi-toggle-on>:first-child>:last-child{opacity:1;--tw-duration:.2s;--tw-ease:var(--ease-in);transition-duration:.2s;transition-timing-function:var(--ease-in)}.custom-fields-component .fi-toggle.fi-toggle-off>:first-child{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-toggle.fi-toggle-off>:first-child>:first-child{opacity:1;--tw-duration:.2s;--tw-ease:var(--ease-in);transition-duration:.2s;transition-timing-function:var(--ease-in)}.custom-fields-component .fi-toggle.fi-toggle-off>:first-child>:last-child{opacity:0;--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.custom-fields-component .fi-sortable-ghost{opacity:.3}.custom-fields-component .fi-ac{gap:calc(var(--spacing)*3)}.custom-fields-component .fi-ac:not(.fi-width-full){align-items:center;display:flex;flex-wrap:wrap}.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-left,.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-start{justify-content:flex-start}.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-center{justify-content:center}.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-end,.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-right{flex-direction:row-reverse}.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-between,.custom-fields-component .fi-ac:not(.fi-width-full).fi-align-justify{justify-content:space-between}.custom-fields-component .fi-ac.fi-width-full{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.custom-fields-component .CodeMirror{color:#000;direction:ltr;font-family:monospace;height:300px}.custom-fields-component .CodeMirror-lines{padding:4px 0}.custom-fields-component .CodeMirror pre.CodeMirror-line,.custom-fields-component .CodeMirror pre.CodeMirror-line-like{padding:0 4px}.custom-fields-component .CodeMirror-gutter-filler,.custom-fields-component .CodeMirror-scrollbar-filler{background-color:#fff}.custom-fields-component .CodeMirror-gutters{background-color:#f7f7f7;border-right:1px solid #ddd;white-space:nowrap}.custom-fields-component .CodeMirror-linenumber{color:#999;min-width:20px;padding:0 3px 0 5px;text-align:right;white-space:nowrap}.custom-fields-component .CodeMirror-guttermarker{color:#000}.custom-fields-component .CodeMirror-guttermarker-subtle{color:#999}.custom-fields-component .CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.custom-fields-component .CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.custom-fields-component .cm-fat-cursor .CodeMirror-cursor{background:#7e7;border:0!important;width:auto}.custom-fields-component .cm-fat-cursor div.CodeMirror-cursors{z-index:1}.custom-fields-component .cm-fat-cursor .CodeMirror-line::selection{background:0 0}.custom-fields-component .cm-fat-cursor .CodeMirror-line>span::selection{background:0 0}.custom-fields-component .cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.custom-fields-component .cm-fat-cursor .CodeMirror-line::-moz-selection,.custom-fields-component .cm-fat-cursor .CodeMirror-line>span::-moz-selection{background:0 0}.custom-fields-component .cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.custom-fields-component .cm-fat-cursor{caret-color:#0000}@keyframes blink{50%{background-color:#0000}}.custom-fields-component .cm-tab{display:inline-block;-webkit-text-decoration:inherit;text-decoration:inherit}.custom-fields-component .CodeMirror-rulers{inset:-50px 0 0;overflow:hidden;position:absolute}.custom-fields-component .CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.custom-fields-component .cm-s-default .cm-header{color:#00f}.custom-fields-component .cm-s-default .cm-quote{color:#090}.custom-fields-component .cm-negative{color:#d44}.custom-fields-component .cm-positive{color:#292}.custom-fields-component .cm-header,.custom-fields-component .cm-strong{font-weight:700}.custom-fields-component .cm-em{font-style:italic}.custom-fields-component .cm-link{text-decoration:underline}.custom-fields-component .cm-strikethrough{text-decoration:line-through}.custom-fields-component .cm-s-default .cm-keyword{color:#708}.custom-fields-component .cm-s-default .cm-atom{color:#219}.custom-fields-component .cm-s-default .cm-number{color:#164}.custom-fields-component .cm-s-default .cm-def{color:#00f}.custom-fields-component .cm-s-default .cm-variable-2{color:#05a}.custom-fields-component .cm-s-default .cm-type,.custom-fields-component .cm-s-default .cm-variable-3{color:#085}.custom-fields-component .cm-s-default .cm-comment{color:#a50}.custom-fields-component .cm-s-default .cm-string{color:#a11}.custom-fields-component .cm-s-default .cm-string-2{color:#f50}.custom-fields-component .cm-s-default .cm-meta,.custom-fields-component .cm-s-default .cm-qualifier{color:#555}.custom-fields-component .cm-s-default .cm-builtin{color:#30a}.custom-fields-component .cm-s-default .cm-bracket{color:#997}.custom-fields-component .cm-s-default .cm-tag{color:#170}.custom-fields-component .cm-s-default .cm-attribute{color:#00c}.custom-fields-component .cm-s-default .cm-hr{color:#999}.custom-fields-component .cm-s-default .cm-link{color:#00c}.custom-fields-component .cm-invalidchar,.custom-fields-component .cm-s-default .cm-error{color:red}.custom-fields-component .CodeMirror-composing{border-bottom:2px solid}.custom-fields-component div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}.custom-fields-component div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.custom-fields-component .CodeMirror-matchingtag{background:#ff96004d}.custom-fields-component .CodeMirror-activeline-background{background:#e8f2ff}.custom-fields-component .CodeMirror{background:#fff;overflow:hidden;position:relative}.custom-fields-component .CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:0;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.custom-fields-component .CodeMirror-sizer{border-right:50px solid #0000;position:relative}.custom-fields-component .CodeMirror-gutter-filler,.custom-fields-component .CodeMirror-hscrollbar,.custom-fields-component .CodeMirror-scrollbar-filler,.custom-fields-component .CodeMirror-vscrollbar{display:none;outline:0;position:absolute;z-index:6}.custom-fields-component .CodeMirror-vscrollbar{overflow:hidden scroll;right:0;top:0}.custom-fields-component .CodeMirror-hscrollbar{bottom:0;left:0;overflow:scroll hidden}.custom-fields-component .CodeMirror-scrollbar-filler{bottom:0;right:0}.custom-fields-component .CodeMirror-gutter-filler{bottom:0;left:0}.custom-fields-component .CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.custom-fields-component .CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.custom-fields-component .CodeMirror-gutter-wrapper{background:0 0!important;border:none!important;position:absolute;z-index:4}.custom-fields-component .CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.custom-fields-component .CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.custom-fields-component .CodeMirror-gutter-wrapper ::selection{background-color:#0000}.custom-fields-component .CodeMirror-lines{cursor:text;min-height:1px}.custom-fields-component .CodeMirror pre.CodeMirror-line,.custom-fields-component .CodeMirror pre.CodeMirror-line-like{font-family:inherit;font-size:inherit;white-space:pre;word-wrap:normal;color:inherit;line-height:inherit;z-index:2;-webkit-tap-highlight-color:transparent;background:0 0;border-radius:0;border-width:0;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual;margin:0;overflow:visible;position:relative}.custom-fields-component .CodeMirror-wrap pre.CodeMirror-line,.custom-fields-component .CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.custom-fields-component .CodeMirror-linebackground{inset:0;position:absolute;z-index:0}.custom-fields-component .CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.custom-fields-component .CodeMirror-code{outline:0}.custom-fields-component .CodeMirror-gutter,.custom-fields-component .CodeMirror-gutters,.custom-fields-component .CodeMirror-linenumber,.custom-fields-component .CodeMirror-scroll,.custom-fields-component .CodeMirror-sizer{box-sizing:content-box}.custom-fields-component .CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.custom-fields-component .CodeMirror-cursor{pointer-events:none;position:absolute}.custom-fields-component .CodeMirror-measure pre{position:static}.custom-fields-component div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.custom-fields-component .CodeMirror-focused div.CodeMirror-cursors,.custom-fields-component div.CodeMirror-dragcursors{visibility:visible}.custom-fields-component .CodeMirror-selected{background:#d9d9d9}.custom-fields-component .CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.custom-fields-component .CodeMirror-crosshair{cursor:crosshair}.custom-fields-component .CodeMirror-line::selection{background:#d7d4f0}.custom-fields-component .CodeMirror-line>span::selection{background:#d7d4f0}.custom-fields-component .CodeMirror-line>span>span::selection{background:#d7d4f0}.custom-fields-component .CodeMirror-line::-moz-selection,.custom-fields-component .CodeMirror-line>span::-moz-selection{background:#d7d4f0}.custom-fields-component .CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.custom-fields-component .cm-searching{background-color:#ff06}.custom-fields-component .cm-force-border{padding-right:.1px}@media print{.custom-fields-component .CodeMirror div.CodeMirror-cursors{visibility:hidden}}.custom-fields-component .cm-tab-wrap-hack:after{content:""}.custom-fields-component span.CodeMirror-selectedtext{background:0 0}.custom-fields-component .EasyMDEContainer{display:block}.custom-fields-component .CodeMirror-rtl pre{direction:rtl}.custom-fields-component .EasyMDEContainer.sided--no-fullscreen{display:flex;flex-flow:wrap}.custom-fields-component .EasyMDEContainer .CodeMirror{box-sizing:border-box;font:inherit;height:auto;z-index:0;word-wrap:break-word;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;padding:10px}.custom-fields-component .EasyMDEContainer .CodeMirror-scroll{cursor:text}.custom-fields-component .EasyMDEContainer .CodeMirror-fullscreen{background:#fff;border-bottom-right-radius:0!important;border-right:none!important;height:auto;inset:50px 0 0;position:fixed!important;z-index:8}.custom-fields-component .EasyMDEContainer .CodeMirror-sided{width:50%!important}.custom-fields-component .EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;border-right:none!important;flex:auto;position:relative}.custom-fields-component .EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.custom-fields-component .EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.custom-fields-component .editor-toolbar{border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative;-webkit-user-select:none;user-select:none;-o-user-select:none}.custom-fields-component .editor-toolbar.fullscreen{background:#fff;border:0;box-sizing:border-box;height:50px;left:0;opacity:1;padding-bottom:10px;padding-top:10px;position:fixed;top:0;width:100%;z-index:9}.custom-fields-component .editor-toolbar.fullscreen:before{background:-o-linear-gradient(270deg,#fff 0,#fff0 100%);background:-ms-linear-gradient(left,#fff 0,#fff0 100%);background:linear-gradient(90deg,#fff,#fff0);height:50px;left:0;margin:0;padding:0;position:fixed;top:0;width:20px}.custom-fields-component .editor-toolbar.fullscreen:after{background:-o-linear-gradient(270deg,#fff0 0,#fff 100%);background:-ms-linear-gradient(left,#fff0 0,#fff 100%);background:linear-gradient(90deg,#fff0,#fff);height:50px;margin:0;padding:0;position:fixed;right:0;top:0;width:20px}.custom-fields-component .EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.custom-fields-component .editor-toolbar .easymde-dropdown,.custom-fields-component .editor-toolbar button{background:0 0;border:1px solid #0000;border-radius:3px;cursor:pointer;display:inline-block;height:30px;margin:0;padding:0;text-align:center;text-decoration:none!important}.custom-fields-component .editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.custom-fields-component .editor-toolbar button.active,.custom-fields-component .editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.custom-fields-component .editor-toolbar i.separator{border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:#0000;display:inline-block;margin:0 6px;text-indent:-10px;width:0}.custom-fields-component .editor-toolbar button:after{font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px;vertical-align:text-bottom}.custom-fields-component .editor-toolbar button.heading-1:after{content:"1"}.custom-fields-component .editor-toolbar button.heading-2:after{content:"2"}.custom-fields-component .editor-toolbar button.heading-3:after{content:"3"}.custom-fields-component .editor-toolbar button.heading-bigger:after{content:"▲"}.custom-fields-component .editor-toolbar button.heading-smaller:after{content:"▼"}.custom-fields-component .editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.custom-fields-component .editor-toolbar i.no-mobile{display:none}}.custom-fields-component .editor-statusbar{color:#959694;font-size:12px;padding:8px 10px;text-align:right}.custom-fields-component .EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.custom-fields-component .editor-statusbar span{display:inline-block;margin-left:1em;min-width:4em}.custom-fields-component .editor-statusbar .lines:before{content:"lines: "}.custom-fields-component .editor-statusbar .words:before{content:"words: "}.custom-fields-component .editor-statusbar .characters:before{content:"characters: "}.custom-fields-component .editor-preview-full{box-sizing:border-box;display:none;height:100%;left:0;overflow:auto;position:absolute;top:0;width:100%;z-index:7}.custom-fields-component .editor-preview-side{box-sizing:border-box;z-index:9;word-wrap:break-word;border:1px solid #ddd;bottom:0;display:none;overflow:auto;position:fixed;right:0;top:50px;width:50%}.custom-fields-component .editor-preview-active-side{display:block}.custom-fields-component .EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:auto;height:auto;position:static}.custom-fields-component .editor-preview-active{display:block}.custom-fields-component .editor-preview{background:#fafafa;padding:10px}.custom-fields-component .editor-preview>p{margin-top:0}.custom-fields-component .editor-preview pre{background:#eee;margin-bottom:10px}.custom-fields-component .editor-preview table td,.custom-fields-component .editor-preview table th{border:1px solid #ddd;padding:5px}.custom-fields-component .cm-s-easymde .cm-tag{color:#63a35c}.custom-fields-component .cm-s-easymde .cm-attribute{color:#795da3}.custom-fields-component .cm-s-easymde .cm-string{color:#183691}.custom-fields-component .cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.custom-fields-component .cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.custom-fields-component .cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.custom-fields-component .cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.custom-fields-component .cm-s-easymde .cm-header-5{font-size:1.25rem}.custom-fields-component .cm-s-easymde .cm-header-6{font-size:1rem}.custom-fields-component .cm-s-easymde .cm-header-1,.custom-fields-component .cm-s-easymde .cm-header-2,.custom-fields-component .cm-s-easymde .cm-header-3,.custom-fields-component .cm-s-easymde .cm-header-4,.custom-fields-component .cm-s-easymde .cm-header-5,.custom-fields-component .cm-s-easymde .cm-header-6{line-height:1.2;margin-bottom:.5rem}.custom-fields-component .cm-s-easymde .cm-comment{background:#0000000d;border-radius:2px}.custom-fields-component .cm-s-easymde .cm-link{color:#7f8c8d}.custom-fields-component .cm-s-easymde .cm-url{color:#aab2b3}.custom-fields-component .cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.custom-fields-component .editor-toolbar .easymde-dropdown{border:1px solid #fff;border-radius:0;position:relative}.custom-fields-component .editor-toolbar .easymde-dropdown,.custom-fields-component .editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff 0 84%,#333 50% 100%)}.custom-fields-component .easymde-dropdown-content{background-color:#f9f9f9;box-shadow:0 8px 16px #0003;display:block;padding:8px;position:absolute;top:30px;visibility:hidden;z-index:2}.custom-fields-component .easymde-dropdown:active .easymde-dropdown-content,.custom-fields-component .easymde-dropdown:focus .easymde-dropdown-content,.custom-fields-component .easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.custom-fields-component .easymde-dropdown-content button{display:block}.custom-fields-component span[data-img-src]:after{background-image:var(--bg-image);background-repeat:no-repeat;background-size:contain;content:"";display:block;height:0;max-height:100%;max-width:100%;padding-top:var(--height);width:var(--width)}.custom-fields-component .CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:#ff000026}.custom-fields-component .cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;user-select:none}.custom-fields-component .cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.custom-fields-component .cropper-canvas,.custom-fields-component .cropper-crop-box,.custom-fields-component .cropper-drag-box,.custom-fields-component .cropper-modal,.custom-fields-component .cropper-wrap-box{inset:0;position:absolute}.custom-fields-component .cropper-canvas,.custom-fields-component .cropper-wrap-box{overflow:hidden}.custom-fields-component .cropper-drag-box{background-color:#fff;opacity:0}.custom-fields-component .cropper-modal{background-color:#000;opacity:.5}.custom-fields-component .cropper-view-box{display:block;height:100%;outline:1px solid #3399ffbf;overflow:hidden;width:100%}.custom-fields-component .cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.custom-fields-component .cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.3333%;left:0;top:33.3333%;width:100%}.custom-fields-component .cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.3333%;top:0;width:33.3333%}.custom-fields-component .cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.custom-fields-component .cropper-center:after,.custom-fields-component .cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.custom-fields-component .cropper-center:before{height:1px;left:-3px;top:0;width:7px}.custom-fields-component .cropper-center:after{height:7px;left:0;top:-3px;width:1px}.custom-fields-component .cropper-face,.custom-fields-component .cropper-line,.custom-fields-component .cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.custom-fields-component .cropper-face{background-color:#fff;left:0;top:0}.custom-fields-component .cropper-line{background-color:#39f}.custom-fields-component .cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.custom-fields-component .cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.custom-fields-component .cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.custom-fields-component .cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.custom-fields-component .cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.custom-fields-component .cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.custom-fields-component .cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.custom-fields-component .cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.custom-fields-component .cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.custom-fields-component .cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.custom-fields-component .cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.custom-fields-component .cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.custom-fields-component .cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.custom-fields-component .cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.custom-fields-component .cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.custom-fields-component .cropper-point.point-se{height:5px;opacity:.75;width:5px}}.custom-fields-component .cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.custom-fields-component .cropper-invisible{opacity:0}.custom-fields-component .cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.custom-fields-component .cropper-hide{display:block;height:0;position:absolute;width:0}.custom-fields-component .cropper-hidden{display:none!important}.custom-fields-component .cropper-move{cursor:move}.custom-fields-component .cropper-crop{cursor:crosshair}.custom-fields-component .cropper-disabled .cropper-drag-box,.custom-fields-component .cropper-disabled .cropper-face,.custom-fields-component .cropper-disabled .cropper-line,.custom-fields-component .cropper-disabled .cropper-point{cursor:not-allowed}.custom-fields-component .filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.custom-fields-component .filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.custom-fields-component .filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;pointer-events:none;position:absolute;visibility:hidden;width:0}.custom-fields-component .filepond--drip{background:#00000003;border-radius:.5em;inset:0;opacity:.1;overflow:hidden;pointer-events:none;position:absolute}.custom-fields-component .filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:50%;width:8em}.custom-fields-component .filepond--drip-blob,.custom-fields-component .filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.custom-fields-component .filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;user-select:none}.custom-fields-component .filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.custom-fields-component .filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.custom-fields-component .filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;-webkit-text-decoration:underline #a7a4a4;text-decoration:underline #a7a4a4;-webkit-text-decoration-skip-ink:auto;text-decoration-skip-ink:auto}.custom-fields-component .filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.custom-fields-component .filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.custom-fields-component .filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.custom-fields-component .filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.custom-fields-component .filepond--file-action-button.filepond--file-action-button:after{content:"";inset:-.75em;position:absolute}.custom-fields-component .filepond--file-action-button{background-color:#00000080;background-image:none;border-radius:50%;box-shadow:0 0 #fff0;color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.custom-fields-component .filepond--file-action-button:focus,.custom-fields-component .filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.custom-fields-component .filepond--file-action-button[disabled]{background-color:#00000040;color:#ffffff80}.custom-fields-component .filepond--file-action-button[hidden]{display:none}.custom-fields-component .filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;user-select:none;will-change:transform,opacity}.custom-fields-component .filepond--file-info *{margin:0}.custom-fields-component .filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.custom-fields-component .filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.custom-fields-component .filepond--file-info .filepond--file-info-sub:empty{display:none}.custom-fields-component .filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;user-select:none;will-change:transform,opacity}.custom-fields-component .filepond--file-status *{margin:0;white-space:nowrap}.custom-fields-component .filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.custom-fields-component .filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.custom-fields-component .filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.custom-fields-component .filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.custom-fields-component .filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.custom-fields-component .filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.custom-fields-component .filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;user-select:none;z-index:3}.custom-fields-component .filepond--file .filepond--file-action-button,.custom-fields-component .filepond--file .filepond--processing-complete-indicator,.custom-fields-component .filepond--file .filepond--progress-indicator{position:absolute}.custom-fields-component .filepond--file [data-align*=left]{left:.5625em}.custom-fields-component .filepond--file [data-align*=right]{right:.5625em}.custom-fields-component .filepond--file [data-align*=center]{left:calc(50% - .8125em)}.custom-fields-component .filepond--file [data-align*=bottom]{bottom:1.125em}.custom-fields-component .filepond--file [data-align=center]{top:calc(50% - .8125em)}.custom-fields-component .filepond--file .filepond--progress-indicator{margin-top:.1875em}.custom-fields-component .filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.custom-fields-component .filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}.custom-fields-component [data-filepond-item-state*=error] .filepond--file-info,.custom-fields-component [data-filepond-item-state*=invalid] .filepond--file-info,.custom-fields-component [data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}.custom-fields-component [data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}.custom-fields-component [data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}.custom-fields-component [data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}.custom-fields-component [data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}.custom-fields-component [data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:fall .5s linear .125s both}.custom-fields-component [data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}.custom-fields-component [data-filepond-item-state=processing-complete] .filepond--file-info-sub,.custom-fields-component [data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}.custom-fields-component [data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}.custom-fields-component [data-filepond-item-state*=error] .filepond--file-wrapper,.custom-fields-component [data-filepond-item-state*=error] .filepond--panel,.custom-fields-component [data-filepond-item-state*=invalid] .filepond--file-wrapper,.custom-fields-component [data-filepond-item-state*=invalid] .filepond--panel{animation:shake .65s linear both}.custom-fields-component [data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:spin 1s linear infinite}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.custom-fields-component .filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.custom-fields-component .filepond--hopper[data-hopper-state=drag-over]:after{content:"";inset:0;position:absolute;z-index:100}.custom-fields-component .filepond--progress-indicator{z-index:103}.custom-fields-component .filepond--file-action-button{z-index:102}.custom-fields-component .filepond--file-status{z-index:101}.custom-fields-component .filepond--file-info{z-index:100}.custom-fields-component .filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;touch-action:auto;will-change:transform,opacity;z-index:1}.custom-fields-component .filepond--item>.filepond--panel{z-index:-1}.custom-fields-component .filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.custom-fields-component .filepond--item>.filepond--file-wrapper,.custom-fields-component .filepond--item>.filepond--panel{transition:opacity .15s ease-out}.custom-fields-component .filepond--item[data-drag-state]{cursor:-webkit-grab;cursor:grab}.custom-fields-component .filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 #0000;transition:box-shadow .125s ease-in-out}.custom-fields-component .filepond--item[data-drag-state=drag]{cursor:-webkit-grabbing;cursor:grabbing}.custom-fields-component .filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.custom-fields-component .filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.custom-fields-component .filepond--item-panel{background-color:#64605e}.custom-fields-component [data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}.custom-fields-component [data-filepond-item-state*=error] .filepond--item-panel,.custom-fields-component [data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.custom-fields-component .filepond--item-panel{border-radius:.5em;transition:background-color .25s}.custom-fields-component .filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.custom-fields-component .filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.custom-fields-component .filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(#000 calc(100% - .5em),#0000);mask:linear-gradient(#000 calc(100% - .5em),#0000);overflow:hidden scroll}.custom-fields-component .filepond--list-scroller::-webkit-scrollbar{background:0 0}.custom-fields-component .filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.custom-fields-component .filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.custom-fields-component .filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:#0000004d;border:.3125em solid #0000;border-radius:99999px}.custom-fields-component .filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.custom-fields-component .filepond--list{left:.75em;right:.75em}.custom-fields-component .filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.custom-fields-component .filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.custom-fields-component .filepond--root[data-style-panel-layout~=compact] .filepond--list,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.custom-fields-component .filepond--root[data-style-panel-layout~=compact] .filepond--item,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.custom-fields-component .filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.custom-fields-component .filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.custom-fields-component .filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.custom-fields-component .filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.custom-fields-component .filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}@media not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)) and (stroke-color:transparent){.custom-fields-component .filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.custom-fields-component .filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.custom-fields-component .filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.custom-fields-component .filepond-panel:not([data-scalable=false]){height:auto!important}.custom-fields-component .filepond--panel[data-scalable=false]>div{display:none}.custom-fields-component .filepond--panel[data-scalable=true]{background-color:#0000!important;border:none!important;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.custom-fields-component .filepond--panel-bottom,.custom-fields-component .filepond--panel-center,.custom-fields-component .filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.custom-fields-component .filepond--panel-bottom,.custom-fields-component .filepond--panel-top{height:.5em}.custom-fields-component .filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.custom-fields-component .filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.custom-fields-component .filepond--panel-bottom,.custom-fields-component .filepond--panel-center{backface-visibility:hidden;transform:translateY(.5em);transform-origin:0 0;will-change:transform}.custom-fields-component .filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.custom-fields-component .filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.custom-fields-component .filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.custom-fields-component .filepond--panel-center:not([style]){visibility:hidden}.custom-fields-component .filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.custom-fields-component .filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.custom-fields-component .filepond--progress-indicator path{fill:none;stroke:currentColor}.custom-fields-component .filepond--list-scroller{z-index:6}.custom-fields-component .filepond--drop-label{z-index:5}.custom-fields-component .filepond--drip{z-index:3}.custom-fields-component .filepond--root>.filepond--panel{z-index:2}.custom-fields-component .filepond--browser{z-index:1}.custom-fields-component .filepond--root{box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left;text-rendering:optimizeLegibility}.custom-fields-component .filepond--root *{box-sizing:inherit;line-height:inherit}.custom-fields-component .filepond--root :not(text){font-size:inherit}.custom-fields-component .filepond--root[data-disabled]{pointer-events:none}.custom-fields-component .filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.custom-fields-component .filepond--root[data-disabled] .filepond--list{pointer-events:none}.custom-fields-component .filepond--root .filepond--drop-label{min-height:4.75em}.custom-fields-component .filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.custom-fields-component .filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.4;position:absolute;right:0;text-decoration:none;z-index:3}.custom-fields-component .filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}.custom-fields-component .filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.custom-fields-component .filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.custom-fields-component .filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.custom-fields-component .filepond--action-edit-item-alt{background:0 0;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.custom-fields-component .filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.custom-fields-component .filepond--action-edit-item-alt span{font-size:0;opacity:0}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.custom-fields-component .filepond--image-preview-markup{left:0;position:absolute;top:0}.custom-fields-component .filepond--image-preview-wrapper{z-index:2}.custom-fields-component .filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;user-select:none;width:100%;z-index:2}.custom-fields-component .filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.custom-fields-component .filepond--image-preview-overlay-idle{color:#282828d9;mix-blend-mode:multiply}.custom-fields-component .filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.custom-fields-component .filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.custom-fields-component .filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.custom-fields-component .filepond--image-preview-wrapper{background:#00000003;border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;user-select:none}.custom-fields-component .filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.custom-fields-component .filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.custom-fields-component .filepond--image-clip[data-transparency-indicator=grid] canvas,.custom-fields-component .filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23eee' viewBox='0 0 100 100'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.custom-fields-component .filepond--image-bitmap,.custom-fields-component .filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.custom-fields-component .filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.custom-fields-component .filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.custom-fields-component .filepond--media-preview audio{display:none}.custom-fields-component .filepond--media-preview .audioplayer{margin:2.3em auto auto;width:calc(100% - 1.4em)}.custom-fields-component .filepond--media-preview .playpausebtn{background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;cursor:pointer;float:left;height:25px;margin-right:.3em;margin-top:.3em;outline:none;width:25px}.custom-fields-component .filepond--media-preview .playpausebtn:hover{background-color:#00000080}.custom-fields-component .filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.custom-fields-component .filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.custom-fields-component .filepond--media-preview .timeline{background:#ffffff4d;border-radius:15px;float:left;height:3px;margin-top:1em;width:calc(100% - 2.5em)}.custom-fields-component .filepond--media-preview .playhead{background:#fff;border-radius:50%;height:13px;margin-top:-5px;width:13px}.custom-fields-component .filepond--media-preview-wrapper{background:#00000003;border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;pointer-events:auto;position:absolute;right:0;top:0}.custom-fields-component .filepond--media-preview-wrapper:before{background:linear-gradient(#000,#0000);content:" ";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);height:2em;position:absolute;width:100%;z-index:3}.custom-fields-component .filepond--media-preview{display:block;height:100%;position:relative;transform-origin:50%;width:100%;will-change:transform,opacity;z-index:1}.custom-fields-component .filepond--media-preview audio,.custom-fields-component .filepond--media-preview video{width:100%;will-change:transform}.custom-fields-component .noUi-target,.custom-fields-component .noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:#0000;box-sizing:border-box;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;user-select:none}.custom-fields-component .noUi-target{position:relative}.custom-fields-component .noUi-base,.custom-fields-component .noUi-connects{height:100%;position:relative;width:100%;z-index:1}.custom-fields-component .noUi-connects{overflow:hidden;z-index:0}.custom-fields-component .noUi-connect,.custom-fields-component .noUi-origin{height:100%;position:absolute;right:0;top:0;transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-style:flat;width:100%;will-change:transform;z-index:1}.custom-fields-component .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.custom-fields-component .noUi-vertical .noUi-origin{top:-100%;width:0}.custom-fields-component .noUi-horizontal .noUi-origin{height:0}.custom-fields-component .noUi-handle{backface-visibility:hidden;position:absolute}.custom-fields-component .noUi-touch-area{height:100%;width:100%}.custom-fields-component .noUi-state-tap .noUi-connect,.custom-fields-component .noUi-state-tap .noUi-origin{transition:transform .3s}.custom-fields-component .noUi-state-drag *{cursor:inherit!important}.custom-fields-component .noUi-horizontal{height:18px}.custom-fields-component .noUi-horizontal .noUi-handle{height:28px;right:-17px;top:-6px;width:34px}.custom-fields-component .noUi-vertical{width:18px}.custom-fields-component .noUi-vertical .noUi-handle{bottom:-17px;height:34px;right:-6px;width:28px}.custom-fields-component .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.custom-fields-component .noUi-target{background:#fafafa;border:1px solid #d3d3d3;border-radius:4px;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.custom-fields-component .noUi-connects{border-radius:3px}.custom-fields-component .noUi-connect{background:#3fb8af}.custom-fields-component .noUi-draggable{cursor:ew-resize}.custom-fields-component .noUi-vertical .noUi-draggable{cursor:ns-resize}.custom-fields-component .noUi-handle{background:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb;cursor:default}.custom-fields-component .noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.custom-fields-component .noUi-handle:after,.custom-fields-component .noUi-handle:before{background:#e8e7e6;content:"";display:block;height:14px;left:14px;position:absolute;top:6px;width:1px}.custom-fields-component .noUi-handle:after{left:17px}.custom-fields-component .noUi-vertical .noUi-handle:after,.custom-fields-component .noUi-vertical .noUi-handle:before{height:1px;left:6px;top:14px;width:14px}.custom-fields-component .noUi-vertical .noUi-handle:after{top:17px}.custom-fields-component [disabled] .noUi-connect{background:#b8b8b8}.custom-fields-component [disabled] .noUi-handle,.custom-fields-component [disabled].noUi-handle,.custom-fields-component [disabled].noUi-target{cursor:not-allowed}.custom-fields-component .noUi-pips,.custom-fields-component .noUi-pips *{box-sizing:border-box}.custom-fields-component .noUi-pips{color:#999;position:absolute}.custom-fields-component .noUi-value{position:absolute;text-align:center;white-space:nowrap}.custom-fields-component .noUi-value-sub{color:#ccc;font-size:10px}.custom-fields-component .noUi-marker{background:#ccc;position:absolute}.custom-fields-component .noUi-marker-large,.custom-fields-component .noUi-marker-sub{background:#aaa}.custom-fields-component .noUi-pips-horizontal{height:80px;left:0;padding:10px 0;top:100%;width:100%}.custom-fields-component .noUi-value-horizontal{transform:translate(-50%,50%)}.custom-fields-component .noUi-rtl .noUi-value-horizontal{transform:translate(50%,50%)}.custom-fields-component .noUi-marker-horizontal.noUi-marker{height:5px;margin-left:-1px;width:2px}.custom-fields-component .noUi-marker-horizontal.noUi-marker-sub{height:10px}.custom-fields-component .noUi-marker-horizontal.noUi-marker-large{height:15px}.custom-fields-component .noUi-pips-vertical{height:100%;left:100%;padding:0 10px;top:0}.custom-fields-component .noUi-value-vertical{padding-left:25px;transform:translateY(-50%)}.custom-fields-component .noUi-rtl .noUi-value-vertical{transform:translateY(50%)}.custom-fields-component .noUi-marker-vertical.noUi-marker{height:2px;margin-top:-1px;width:5px}.custom-fields-component .noUi-marker-vertical.noUi-marker-sub{width:10px}.custom-fields-component .noUi-marker-vertical.noUi-marker-large{width:15px}.custom-fields-component .noUi-tooltip{background:#fff;border:1px solid #d9d9d9;border-radius:3px;color:#000;display:block;padding:5px;position:absolute;text-align:center;white-space:nowrap}.custom-fields-component .noUi-horizontal .noUi-tooltip{bottom:120%;left:50%;transform:translate(-50%)}.custom-fields-component .noUi-vertical .noUi-tooltip{right:120%;top:50%;transform:translateY(-50%)}.custom-fields-component .noUi-horizontal .noUi-origin>.noUi-tooltip{bottom:10px;left:auto;transform:translate(50%)}.custom-fields-component .noUi-vertical .noUi-origin>.noUi-tooltip{right:28px;top:auto;transform:translateY(-18px)}.custom-fields-component .fi-fo-builder{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));row-gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-builder .fi-fo-builder-actions{column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-fo-builder .fi-fo-builder-actions.fi-hidden{display:none}.custom-fields-component .fi-fo-builder .fi-fo-builder-items{display:grid;grid-template-columns:repeat(1,minmax(0,1fr))}.custom-fields-component .fi-fo-builder .fi-fo-builder-items>*+*{margin-top:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-builder .fi-fo-builder-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-builder .fi-fo-builder-item.fi-collapsed .fi-fo-builder-item-header-collapsible-actions{rotate:-180deg}.custom-fields-component .fi-fo-builder .fi-fo-builder-item.fi-collapsed .fi-fo-builder-item-header-collapse-action,.custom-fields-component .fi-fo-builder .fi-fo-builder-item:not(.fi-collapsed) .fi-fo-builder-item-header-expand-action{opacity:0;pointer-events:none}.custom-fields-component .fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-item{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);background-color:#0000;border-radius:0;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-item>.fi-fo-builder-item-content{padding:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-label-between-items-ctn>.fi-fo-builder-label-between-items-divider-before{width:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-builder.fi-fo-builder-not-contained>.fi-fo-builder-items>.fi-fo-builder-label-between-items-ctn>.fi-fo-builder-label-between-items{padding-inline-start:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;overflow:hidden;padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-builder.fi-collapsible .fi-fo-builder-item-header{cursor:pointer;-webkit-user-select:none;user-select:none}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-start-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-icon{color:var(--gray-400)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-label.fi-truncated{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-end-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;margin-inline-start:auto}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-collapsible-actions{position:relative}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-collapse-action,.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-collapsible-actions,.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-expand-action{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-header-expand-action{inset:calc(var(--spacing)*0);position:absolute;rotate:180deg}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-content:not(.fi-fo-builder-item-content-has-preview){padding:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-content.fi-fo-builder-item-content-has-preview{position:relative}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content{border-color:var(--gray-100);border-top-style:var(--tw-border-style);border-top-width:1px}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-builder .fi-fo-builder-item-has-header>.fi-fo-builder-item-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-preview:not(.fi-interactive){pointer-events:none}.custom-fields-component .fi-fo-builder .fi-fo-builder-item-preview-edit-overlay{cursor:pointer;inset:calc(var(--spacing)*0);position:absolute;z-index:1}.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker-ctn{background-color:var(--color-white);border-radius:var(--radius-lg)}.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker-ctn:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-fo-builder .fi-fo-builder-add-between-items-ctn{display:flex;height:calc(var(--spacing)*0);justify-content:center;margin-top:calc(var(--spacing)*0);opacity:0;overflow:visible;pointer-events:none;position:relative;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));visibility:hidden;width:100%}.custom-fields-component .fi-fo-builder .fi-fo-builder-add-between-items-ctn:focus-within,.custom-fields-component .fi-fo-builder .fi-fo-builder-add-between-items-ctn:has(+.fi-fo-builder-item:hover),.custom-fields-component .fi-fo-builder .fi-fo-builder-add-between-items-ctn:hover,.custom-fields-component .fi-fo-builder .fi-fo-builder-item:hover+.fi-fo-builder-add-between-items-ctn{opacity:1;pointer-events:auto;visibility:visible}.custom-fields-component .fi-fo-builder .fi-fo-builder-add-between-items{z-index:10;--tw-translate-y:calc(-50% + 0.5rem);background-color:var(--color-white);border-radius:var(--radius-lg);position:absolute;top:50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-fo-builder .fi-fo-builder-add-between-items:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-ctn{align-items:center;display:flex;margin-bottom:calc(var(--spacing)*-3);margin-top:calc(var(--spacing)*1);position:relative}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-divider-before{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;flex-shrink:0;width:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-divider-before:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-divider-before:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-inline:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);flex-shrink:0;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-divider-after{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;flex:1}.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-divider-after:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-builder .fi-fo-builder-label-between-items-divider-after:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker{display:flex;justify-content:center}.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker.fi-align-left,.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker.fi-align-end,.custom-fields-component .fi-fo-builder .fi-fo-builder-block-picker.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-search-input-wrp{margin-bottom:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-actions{margin-bottom:calc(var(--spacing)*2)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-options{gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-options.fi-grid-direction-col{margin-top:calc(var(--spacing)*-4)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-options.fi-grid-direction-col .fi-fo-checkbox-list-option-ctn{break-inside:avoid;padding-top:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option{column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-checkbox-input{flex-shrink:0;margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);display:grid;line-height:calc(var(--spacing)*6)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-label{--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium);overflow:hidden;overflow-wrap:break-word}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-description{color:var(--gray-500)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-option .fi-fo-checkbox-list-option-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-no-search-results-message{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-fo-checkbox-list .fi-fo-checkbox-list-no-search-results-message:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-code-editor{overflow:hidden}.custom-fields-component .fi-fo-code-editor .cm-editor.cm-focused{--tw-outline-style:none!important;outline-style:none!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters{background-color:var(--gray-100)!important;border-inline-end-color:var(--gray-300)!important;min-height:calc(var(--spacing)*48)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters:where(.dark,.dark *){background-color:var(--gray-950)!important;border-inline-end-color:var(--gray-800)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement{border-end-start-radius:var(--radius-md);border-start-start-radius:var(--radius-md);margin-inline-start:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter{background-color:var(--gray-200)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter:where(.dark,.dark *){background-color:var(--gray-800)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter{background-color:var(--gray-200)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter:where(.dark,.dark *){background-color:var(--gray-800)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-scroller{min-height:calc(var(--spacing)*48)!important}.custom-fields-component .fi-fo-code-editor .cm-editor .cm-line{border-end-end-radius:var(--radius-md);border-start-end-radius:var(--radius-md);margin-inline-end:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-code-editor.fi-disabled .cm-editor .cm-gutters .cm-gutter.cm-foldGutter .cm-gutterElement.cm-activeLineGutter,.custom-fields-component .fi-fo-code-editor.fi-disabled .cm-editor .cm-gutters .cm-gutter.cm-lineNumbers .cm-gutterElement.cm-activeLineGutter,.custom-fields-component .fi-fo-code-editor.fi-disabled .cm-editor .cm-line.cm-activeLine{background-color:#0000!important}.custom-fields-component .fi-fo-color-picker .fi-input-wrp-content{display:flex}.custom-fields-component .fi-fo-color-picker .fi-fo-color-picker-preview{border-radius:3.40282e+38px;flex-shrink:0;height:calc(var(--spacing)*5);margin-block:auto;margin-inline-end:calc(var(--spacing)*3);-webkit-user-select:none;user-select:none;width:calc(var(--spacing)*5)}.custom-fields-component .fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-200);--tw-ring-inset:inset}.custom-fields-component .fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-color-picker .fi-fo-color-picker-preview.fi-empty:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-color-picker .fi-fo-color-picker-panel{border-radius:var(--radius-lg);z-index:10;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:none;position:absolute}.custom-fields-component .fi-fo-date-time-picker input::-webkit-datetime-edit{display:block;padding:0}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-trigger{width:100%}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{--tw-border-style:none;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);width:100%;--tw-leading:calc(var(--spacing)*6);color:var(--gray-950);line-height:calc(var(--spacing)*6);--tw-outline-style:none;background-color:#0000;border-style:none;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input::placeholder{color:var(--gray-400)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-display-text-input:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-panel{position:absolute;z-index:10}.custom-fields-component :where(.fi-fo-date-time-picker .fi-fo-date-time-picker-panel>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-panel{background-color:var(--color-white);border-radius:var(--radius-lg);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-panel:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-panel .fi-fo-date-time-picker-panel-header{align-items:center;display:flex;justify-content:space-between}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-month-select{cursor:pointer;--tw-border-style:none;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*0);--tw-font-weight:var(--font-weight-medium);background-color:#0000;border-style:none;color:var(--gray-950);flex-grow:1;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-month-select:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-month-select:where(.dark,.dark *){background-color:var(--gray-900);color:var(--color-white)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-year-input{width:calc(var(--spacing)*16);--tw-border-style:none;background-color:#0000;border-style:none;color:var(--gray-950);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*0);text-align:right}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-year-input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-year-input:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header{display:grid;gap:calc(var(--spacing)*1);grid-template-columns:repeat(7,minmax(0,1fr))}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header .fi-fo-date-time-picker-calendar-header-day{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-align:center;--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar-header .fi-fo-date-time-picker-calendar-header-day:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar{display:grid;gap:calc(var(--spacing)*1);grid-template-columns:repeat(7,minmax(calc(var(--spacing)*7),1fr))}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-align:center;--tw-leading:var(--leading-loose);line-height:var(--leading-loose);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;border-radius:3.40282e+38px;transition-duration:75ms}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-disabled{opacity:.5;pointer-events:none}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-disabled){cursor:pointer}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected{background-color:var(--gray-50);color:var(--primary-600)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-selected:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled){background-color:var(--gray-100)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-focused:not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-fo-date-time-picker-calendar-day-today:not(.fi-focused):not(.fi-selected):not(.fi-disabled){color:var(--primary-600)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day.fi-fo-date-time-picker-calendar-day-today:not(.fi-focused):not(.fi-selected):not(.fi-disabled):where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-fo-date-time-picker-calendar-day-today):not(.fi-selected){color:var(--gray-950)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-calendar .fi-fo-date-time-picker-calendar-day:not(.fi-fo-date-time-picker-calendar-day-today):not(.fi-selected):where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs{align-items:center;display:flex;justify-content:center}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input{width:calc(var(--spacing)*10);--tw-border-style:none;background-color:#0000;border-style:none;color:var(--gray-950);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-inline-end:calc(var(--spacing)*1);padding:calc(var(--spacing)*0);text-align:center}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs input:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs .fi-fo-date-time-picker-time-input-separator{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-date-time-picker .fi-fo-date-time-picker-time-inputs .fi-fo-date-time-picker-time-input-separator:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-field{display:grid;row-gap:calc(var(--spacing)*2)}@media (min-width:40rem){.custom-fields-component .fi-fo-field.fi-fo-field-has-inline-label{align-items:flex-start;column-gap:calc(var(--spacing)*4);grid-template-columns:repeat(3,minmax(0,1fr))}.custom-fields-component .fi-fo-field.fi-fo-field-has-inline-label .fi-fo-field-content-col{grid-column:span 2/span 2}}.custom-fields-component .fi-fo-field .fi-fo-field-label,.custom-fields-component .fi-fo-field .fi-fo-field-label-ctn{align-items:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component :is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-checkbox-input{flex-shrink:0;margin-top:calc(var(--spacing)*.5)}.custom-fields-component :is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-toggle{margin-block:calc(var(--spacing)*-.5)}.custom-fields-component :is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label)>.fi-sc:first-child{flex-grow:0}.custom-fields-component :is(.fi-fo-field .fi-fo-field-label-ctn,.fi-fo-field .fi-fo-field-label).fi-hidden{display:none}.custom-fields-component .fi-fo-field .fi-fo-field-label-content{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-field .fi-fo-field-label-content:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-field .fi-fo-field-label-content .fi-fo-field-label-required-mark{--tw-font-weight:var(--font-weight-medium);color:var(--danger-600);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-field .fi-fo-field-label-content .fi-fo-field-label-required-mark:where(.dark,.dark *){color:var(--danger-400)}.custom-fields-component .fi-fo-field .fi-fo-field-label-col{display:grid;grid-auto-columns:minmax(0,1fr);height:100%;row-gap:calc(var(--spacing)*2)}@media (min-width:40rem){.custom-fields-component .fi-fo-field .fi-fo-field-label-col.fi-vertical-align-start{align-items:flex-start}.custom-fields-component .fi-fo-field .fi-fo-field-label-col.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-fo-field .fi-fo-field-label-col.fi-vertical-align-end{align-items:flex-end}}.custom-fields-component .fi-fo-field .fi-fo-field-content-col{display:grid;grid-auto-columns:minmax(0,1fr);row-gap:calc(var(--spacing)*2)}.custom-fields-component .fi-fo-field .fi-fo-field-content-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;width:100%}.custom-fields-component .fi-fo-field .fi-fo-field-content{width:100%}.custom-fields-component .fi-fo-field .fi-fo-field-wrp-error-message{color:var(--danger-600);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-fo-field .fi-fo-field-wrp-error-message:where(.dark,.dark *){color:var(--danger-400)}.custom-fields-component .fi-fo-field .fi-fo-field-wrp-error-list{list-style-position:inside;list-style-type:disc}.custom-fields-component :where(.fi-fo-field .fi-fo-field-wrp-error-list>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*.5*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*.5*var(--tw-space-y-reverse))}.custom-fields-component .fi-fo-file-upload{display:flex;flex-direction:column;row-gap:calc(var(--spacing)*2)}.custom-fields-component .fi-fo-file-upload.fi-align-left,.custom-fields-component .fi-fo-file-upload.fi-align-start{align-items:flex-start}.custom-fields-component .fi-fo-file-upload.fi-align-center{align-items:center}.custom-fields-component .fi-fo-file-upload.fi-align-end,.custom-fields-component .fi-fo-file-upload.fi-align-right{align-items:flex-end}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-input-ctn{height:100%;width:100%}.custom-fields-component .fi-fo-file-upload.fi-fo-file-upload-avatar .fi-fo-file-upload-input-ctn{height:100%;width:calc(var(--spacing)*32)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-error-message{color:var(--danger-600);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-error-message:where(.dark,.dark *){color:var(--danger-400)}.custom-fields-component .fi-fo-file-upload .filepond--root{background-color:var(--color-white);border-radius:var(--radius-lg);font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";margin-bottom:calc(var(--spacing)*0);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow:hidden}.custom-fields-component .fi-fo-file-upload .filepond--root:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .filepond--root:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-file-upload .filepond--root:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .filepond--root:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-file-upload .filepond--root[data-disabled=disabled]{background-color:var(--gray-50)}.custom-fields-component .fi-fo-file-upload .filepond--root[data-disabled=disabled]:where(.dark,.dark *){--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .filepond--root[data-disabled=disabled]:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-file-upload .filepond--root[data-style-panel-layout=compact\ circle]{border-radius:3.40282e+38px}.custom-fields-component .fi-fo-file-upload .filepond--panel-root{background-color:#0000}.custom-fields-component .fi-fo-file-upload .filepond--drop-label label{color:var(--gray-600);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*3)!important}.custom-fields-component .fi-fo-file-upload .filepond--drop-label label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-file-upload .filepond--label-action{--tw-font-weight:var(--font-weight-medium);color:var(--primary-600);font-weight:var(--font-weight-medium);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;text-decoration-line:none;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-fo-file-upload .filepond--label-action:hover{color:var(--primary-500)}}.custom-fields-component .fi-fo-file-upload .filepond--label-action:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.custom-fields-component .fi-fo-file-upload .filepond--label-action:where(.dark,.dark *):hover{color:var(--primary-500)}}.custom-fields-component .fi-fo-file-upload .filepond--drip-blob{background-color:var(--gray-400)}.custom-fields-component .fi-fo-file-upload .filepond--drip-blob:where(.dark,.dark *){background-color:var(--gray-500)}.custom-fields-component .fi-fo-file-upload .filepond--root[data-style-panel-layout=grid] .filepond--item{display:inline;width:calc(50% - .5rem)}@media (min-width:64rem){.custom-fields-component .fi-fo-file-upload .filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.custom-fields-component .fi-fo-file-upload .filepond--download-icon{background-color:var(--color-white);display:inline-block;height:calc(var(--spacing)*4);margin-inline-end:calc(var(--spacing)*1);pointer-events:auto;vertical-align:bottom;width:calc(var(--spacing)*4)}@media (hover:hover){.custom-fields-component .fi-fo-file-upload .filepond--download-icon:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .filepond--download-icon:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}}.custom-fields-component .fi-fo-file-upload .filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.custom-fields-component .fi-fo-file-upload .filepond--open-icon{background-color:var(--color-white);display:inline-block;height:calc(var(--spacing)*4);margin-inline-end:calc(var(--spacing)*1);pointer-events:auto;vertical-align:bottom;width:calc(var(--spacing)*4)}@media (hover:hover){.custom-fields-component .fi-fo-file-upload .filepond--open-icon:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .filepond--open-icon:hover{background-color:color-mix(in oklab,var(--color-white)70%,transparent)}}}.custom-fields-component .fi-fo-file-upload .filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGNsYXNzPSJoLTYgdy02IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGNsYXNzPSJoLTYgdy02IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.custom-fields-component .fi-fo-file-upload .filepond--file-action-button.filepond--action-edit-item{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .filepond--file-action-button.filepond--action-edit-item{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor{height:100dvh;inset:calc(var(--spacing)*0);isolation:isolate;padding:calc(var(--spacing)*2);position:fixed;width:100vw;z-index:50}@media (min-width:40rem){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor{padding:calc(var(--spacing)*10)}}@media (min-width:48rem){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor{padding:calc(var(--spacing)*20)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{background-color:var(--gray-950);cursor:pointer;height:100%;inset:calc(var(--spacing)*0);position:fixed;width:100%}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-overlay{will-change:transform}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{background-color:var(--color-white);border-radius:var(--radius-xl);isolation:isolate;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);height:100%;width:100%;--tw-ring-color:var(--gray-900);display:flex;flex-direction:column;margin-inline:auto;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{--tw-ring-color:color-mix(in oklab,var(--gray-900)10%,transparent)}}@media (min-width:64rem){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window{flex-direction:row}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window:where(.dark,.dark *){background-color:var(--gray-800);--tw-ring-color:var(--gray-50)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-window:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-50)10%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-image-ctn{flex:1;margin:calc(var(--spacing)*4);max-height:100%;max-width:100%}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-image{height:100%;width:auto}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel{background-color:var(--gray-50);display:flex;flex:1;flex-direction:column;height:100%;overflow-y:auto;width:100%}@media (min-width:64rem){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel{max-width:var(--container-xs)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main{flex:1}.custom-fields-component :where(.fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*6*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*6*var(--tw-space-y-reverse))}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-main{overflow:auto;padding:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group{display:grid;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn-group{width:100%}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn.fi-active{background-color:var(--gray-50)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-btn.fi-active:where(.dark,.dark *){background-color:var(--gray-700)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-fo-file-upload-editor-control-panel-group-title{color:var(--gray-950);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-group .fi-fo-file-upload-editor-control-panel-group-title:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-footer{align-items:center;display:flex;gap:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .fi-fo-file-upload-editor-control-panel .fi-fo-file-upload-editor-control-panel-reset-action{margin-left:auto}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{background-color:var(--gray-100)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{background-color:color-mix(in oklab,var(--gray-100)50%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal{opacity:1}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor .cropper-drag-box.cropper-crop.cropper-modal:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)80%,transparent)}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-circle-cropper .cropper-face,.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-circle-cropper .cropper-view-box{border-radius:50%}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-window{flex-direction:column;max-width:var(--container-3xl)}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-image-ctn{flex:1;min-height:calc(var(--spacing)*0);overflow:hidden}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel{flex:none;height:auto}@media (min-width:64rem){.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel{max-width:none}}.custom-fields-component .fi-fo-file-upload .fi-fo-file-upload-editor.fi-fo-file-upload-editor-crop-only .fi-fo-file-upload-editor-control-panel-footer{justify-content:flex-start}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table{table-layout:auto;width:100%}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>thead>tr>th{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);text-align:start;--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>thead>tr>th:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>thead>tr>th.fi-has-action{padding:calc(var(--spacing)*0);width:calc(var(--spacing)*9)}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr>:not(:last-child)){--tw-divide-x-reverse:0;border-color:var(--gray-200);border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style)}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-divide-x-reverse:1}.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-key-value .fi-fo-key-value-table>tbody>tr:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td{padding:calc(var(--spacing)*0);width:50%}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td.fi-has-action{padding:calc(var(--spacing)*.5);width:auto}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td.fi-has-action .fi-fo-key-value-table-row-sortable-handle{display:flex}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-table>tbody>tr>td .fi-input{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.custom-fields-component .fi-fo-key-value .fi-fo-key-value-add-action-ctn{display:flex;justify-content:center;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-fo-key-value-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.custom-fields-component .fi-fo-markdown-editor{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.custom-fields-component .fi-fo-markdown-editor:not(.fi-disabled){color:var(--gray-950);font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));max-width:100%;overflow:hidden}.custom-fields-component .fi-fo-markdown-editor:not(.fi-disabled):where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-markdown-editor.fi-disabled{background-color:var(--gray-50);border-radius:var(--radius-lg);color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*3);width:100%;--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);display:block}.custom-fields-component .fi-fo-markdown-editor.fi-disabled:where(.dark,.dark *){color:var(--gray-400);--tw-ring-color:#ffffff1a;background-color:#0000}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-markdown-editor.fi-disabled:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .CodeMirror{padding-block:calc(var(--spacing)*3)!important;padding-inline:calc(var(--spacing)*4)!important}.custom-fields-component .fi-fo-markdown-editor .cm-s-easymde .cm-comment{background-color:#0000;color:var(--color-cm-gray-muted)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-operator,.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-property{color:var(--color-cm-gray)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-string,.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-bracket,.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list,.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{background-color:#0000;color:inherit}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .CodeMirror{--tw-border-style:none;background-color:#0000;border-style:none;color:inherit;padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .CodeMirror-scroll{height:auto}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar{border-style:var(--tw-border-style);border-bottom-style:var(--tw-border-style);border-color:var(--gray-200);border-radius:0;border-width:0 0 1px;display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*1);padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*2.5)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button{border-radius:var(--radius-lg);height:calc(var(--spacing)*8);width:calc(var(--spacing)*8);--tw-border-style:none;padding:calc(var(--spacing)*0);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;border-style:none;display:grid;place-content:center;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active{background-color:var(--gray-50)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button:before{background-color:var(--gray-700);content:"";display:block;height:calc(var(--spacing)*5);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;width:calc(var(--spacing)*5)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar button.active:before{background-color:var(--primary-600)}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .separator{width:calc(var(--spacing)*1);--tw-border-style:none;border-style:none;margin:calc(var(--spacing)*0)!important}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1zm2.5 5.5v-4H11a2 2 0 1 1 0 4zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1zm2.5 5.5v-4H11a2 2 0 1 1 0 4zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5z' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476s-.007 1.313.684 2.1c.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a6 6 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.7 6.7 0 0 0-1.968-.875m1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043s-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476s-.007 1.313.684 2.1c.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a6 6 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.7 6.7 0 0 0-1.968-.875m1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043s-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4M13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4M13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902q1.753.283 3.55.414c.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.78.78 0 0 1 .642-.413 41 41 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41 41 0 0 0 10 2M6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902q1.753.283 3.55.414c.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.78.78 0 0 1 .642-.413 41 41 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41 41 0 0 0 10 2M6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5z' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0m7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06m-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0m7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06m-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75M6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10m0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75M1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75M6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10m0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75M1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1z' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.03.03 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5 5 0 0 0-2.277.155.75.75 0 0 0 .44 1.434M7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.03.03 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5 5 0 0 0-2.277.155.75.75 0 0 0 .44 1.434M7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5z'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74m1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75m-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75M17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75m-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74m1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75m-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75M17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75m-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0zM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0zM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' class='size-5' viewBox='0 0 20 20'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.custom-fields-component .fi-fo-markdown-editor .EasyMDEContainer .editor-statusbar{display:none}.custom-fields-component .fi-fo-markdown-editor:where(.dark,.dark *){--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.custom-fields-component .fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert()}.custom-fields-component .fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .editor-toolbar button:before{background-color:var(--gray-300)}.custom-fields-component .fi-fo-markdown-editor:where(.dark,.dark *) .EasyMDEContainer .editor-toolbar button.active:before{background-color:var(--primary-400)}.custom-fields-component [x-sortable]:has(.fi-sortable-ghost) .fi-fo-markdown-editor{pointer-events:none}.custom-fields-component .fi-fo-modal-table-select:not(.fi-fo-modal-table-select-multiple){align-items:flex-start;column-gap:calc(var(--spacing)*3);--tw-leading:calc(var(--spacing)*5);display:flex;line-height:calc(var(--spacing)*5)}.custom-fields-component .fi-fo-modal-table-select.fi-fo-modal-table-select-multiple{display:grid;gap:calc(var(--spacing)*2)}.custom-fields-component .fi-fo-modal-table-select.fi-fo-modal-table-select-multiple .fi-fo-modal-table-select-badges-ctn{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*1.5)}.custom-fields-component .fi-fo-modal-table-select .fi-fo-modal-table-select-placeholder{color:var(--gray-400)}.custom-fields-component .fi-fo-modal-table-select .fi-fo-modal-table-select-placeholder:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-fo-radio{gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-radio.fi-inline{display:flex;flex-wrap:wrap}.custom-fields-component .fi-fo-radio:not(.fi-inline).fi-grid-direction-col{margin-top:calc(var(--spacing)*-4)}.custom-fields-component .fi-fo-radio:not(.fi-inline).fi-grid-direction-col>.fi-fo-radio-label{break-inside:avoid;padding-top:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-radio>.fi-fo-radio-label{align-self:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-fo-radio>.fi-fo-radio-label>.fi-radio-input{flex-shrink:0;margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-radio>.fi-fo-radio-label>.fi-fo-radio-label-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);display:grid;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-radio>.fi-fo-radio-label>.fi-fo-radio-label-text:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-radio>.fi-fo-radio-label .fi-fo-radio-label-description{--tw-font-weight:var(--font-weight-normal);color:var(--gray-500);font-weight:var(--font-weight-normal)}.custom-fields-component .fi-fo-radio>.fi-fo-radio-label .fi-fo-radio-label-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-repeater{display:grid;row-gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-actions{column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-actions.fi-hidden{display:none}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-items{align-items:flex-start;gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item.fi-collapsed .fi-fo-repeater-item-header-collapsible-actions{rotate:-180deg}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item.fi-collapsed .fi-fo-repeater-item-header-collapse-action,.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item:not(.fi-collapsed) .fi-fo-repeater-item-header-expand-action{opacity:0;pointer-events:none}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;overflow:hidden;padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-repeater.fi-collapsible .fi-fo-repeater-item-header{cursor:pointer;-webkit-user-select:none;user-select:none}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-start-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-icon{color:var(--gray-400)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-label.fi-truncated{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-end-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;margin-inline-start:auto}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-collapsible-actions{position:relative}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-collapse-action,.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-collapsible-actions,.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-expand-action{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-header-expand-action{inset:calc(var(--spacing)*0);position:absolute;rotate:180deg}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content{border-color:var(--gray-100);border-top-style:var(--tw-border-style);border-top-width:1px}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-item-content{padding:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add-between-items-ctn{display:flex;justify-content:center;width:100%}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add-between-items{background-color:var(--color-white);border-radius:var(--radius-lg)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add-between-items:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-ctn{align-items:center;display:flex;margin-block:calc(var(--spacing)*-2);position:relative}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;flex-shrink:0;width:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-divider-before:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-inline:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);flex-shrink:0;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;flex:1}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-repeater .fi-fo-repeater-label-between-items-divider-after:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add{display:flex;justify-content:center;width:100%}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add.fi-align-left,.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add.fi-align-end,.custom-fields-component .fi-fo-repeater .fi-fo-repeater-add.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-fo-simple-repeater{display:grid;row-gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-items{gap:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-item{column-gap:calc(var(--spacing)*3);display:flex;justify-content:flex-start}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-item-content{flex:1}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-item-actions{align-items:center;column-gap:calc(var(--spacing)*1);display:flex}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-add{display:flex;justify-content:center;width:100%}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-left,.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-end,.custom-fields-component .fi-fo-simple-repeater .fi-fo-simple-repeater-add.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-fo-table-repeater{display:grid;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-table-repeater>table{display:block;width:100%}.custom-fields-component :where(.fi-fo-table-repeater>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-fo-table-repeater>table{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component :where(.fi-fo-table-repeater>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-table-repeater>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-table-repeater>table:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-table-repeater>table:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-table-repeater>table>thead{display:none;white-space:nowrap}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th{background-color:var(--gray-50);border-color:var(--gray-200);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:first-of-type{border-top-left-radius:var(--radius-xl)}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:last-of-type{border-top-right-radius:var(--radius-xl)}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th.fi-align-left,.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th.fi-align-start{text-align:start}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th.fi-align-end,.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th.fi-align-right{text-align:end}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th.fi-wrapped{white-space:normal}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th:not(.fi-wrapped){white-space:nowrap}.custom-fields-component .fi-fo-table-repeater>table>thead>tr>th.fi-fo-table-repeater-empty-header-cell{width:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-table-repeater>table>tbody{display:block}.custom-fields-component :where(.fi-fo-table-repeater>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-fo-table-repeater>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-table-repeater>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr{display:grid;gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td{display:block}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:none}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-start{vertical-align:top}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-center{vertical-align:middle}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td.fi-vertical-align-end{vertical-align:bottom}.custom-fields-component .fi-fo-table-repeater>table .fi-fo-table-repeater-header-required-mark{--tw-font-weight:var(--font-weight-medium);color:var(--danger-600);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-table-repeater>table .fi-fo-table-repeater-header-required-mark:where(.dark,.dark *){color:var(--danger-400)}.custom-fields-component .fi-fo-table-repeater>table .fi-fo-table-repeater-actions{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;height:100%}@supports (container-type:inline-size){.custom-fields-component .fi-fo-table-repeater{container-type:inline-size}@container (min-width:36rem){.custom-fields-component .fi-fo-table-repeater>table{display:table}.custom-fields-component .fi-fo-table-repeater>table>thead{display:table-header-group}.custom-fields-component .fi-fo-table-repeater>table>tbody{display:table-row-group}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr{display:table-row;padding:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td{display:table-cell;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:table-cell}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field,.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field-label-content,.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry-label{display:none}.custom-fields-component .fi-fo-table-repeater>table .fi-fo-table-repeater-actions{padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td{border-color:var(--gray-200);padding-block:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-input-wrp{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;background-color:#0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-fo-field-wrp-error-message{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2)}.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-fo-radio,.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-in-entry-content{padding-inline:calc(var(--spacing)*3)}}}@supports not (container-type:inline-size){@media (min-width:64rem){.custom-fields-component .fi-fo-table-repeater>table{display:table}.custom-fields-component .fi-fo-table-repeater>table>thead{display:table-header-group}.custom-fields-component .fi-fo-table-repeater>table>tbody{display:table-row-group}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr{display:table-row;padding:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td{display:table-cell;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td.fi-hidden{display:table-cell}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field,.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field-label-content,.custom-fields-component .fi-fo-table-repeater>table>tbody>tr>td .fi-in-entry-label{display:none}.custom-fields-component .fi-fo-table-repeater>table .fi-fo-table-repeater-actions{padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td{border-color:var(--gray-200);padding-block:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .fi-fo-table-repeater.fi-compact>table>tbody>tr>td:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-input-wrp{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;background-color:#0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-fo-field-wrp-error-message{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2)}.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-fo-radio,.custom-fields-component .fi-fo-table-repeater.fi-compact .fi-in-entry-content{padding-inline:calc(var(--spacing)*3)}}}.custom-fields-component .fi-fo-table-repeater .fi-fo-table-repeater-add{display:flex;justify-content:center;width:100%}.custom-fields-component .fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-left,.custom-fields-component .fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-end,.custom-fields-component .fi-fo-table-repeater .fi-fo-table-repeater-add.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file{cursor:wait;opacity:.5;pointer-events:none}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-toolbar{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);column-gap:calc(var(--spacing)*3);display:flex;flex-wrap:wrap;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*2.5);position:relative;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-floating-toolbar{background-color:var(--color-white);border-color:var(--gray-300);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;column-gap:calc(var(--spacing)*3);margin-top:calc(var(--spacing)*-1);max-width:100%;padding:calc(var(--spacing)*1);row-gap:calc(var(--spacing)*1);visibility:hidden;z-index:20;--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:flex;flex-wrap:wrap;position:absolute}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-floating-toolbar:where(.dark,.dark *){background-color:var(--gray-800);border-color:var(--gray-600)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-toolbar-group{column-gap:calc(var(--spacing)*1);display:flex}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool{border-radius:var(--radius-lg);font-size:var(--text-sm);height:calc(var(--spacing)*8);line-height:var(--tw-leading,var(--text-sm--line-height));min-width:calc(var(--spacing)*8);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-700);font-weight:var(--font-weight-semibold);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;align-items:center;display:flex;justify-content:center;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:focus-visible{background-color:var(--gray-50)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *){color:var(--gray-200)}@media (hover:hover){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool[disabled]{cursor:default;opacity:.7;pointer-events:none}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active{background-color:var(--gray-50);color:var(--primary-600)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-active:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-tool.fi-fo-rich-editor-tool-with-label{align-items:center;column-gap:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*1.5)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message{align-items:center;background-color:var(--gray-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);column-gap:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*5);--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);display:flex;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message .fi-loading-indicator{color:var(--gray-400)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-uploading-file-message .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message{align-items:center;background-color:var(--danger-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--danger-200);column-gap:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*5);--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--danger-700);display:flex;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-file-validation-message:where(.dark,.dark *){color:var(--danger-200)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-main{display:flex;flex-direction:column-reverse}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-content{flex:1;min-height:calc(var(--spacing)*12);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*5);position:relative;width:100%}.custom-fields-component .fi-fo-rich-editor span[data-type=mergeTag]{display:inline-block;margin-block:calc(var(--spacing)*0);white-space:nowrap}.custom-fields-component .fi-fo-rich-editor span[data-type=mergeTag]:before{--tw-font-weight:var(--font-weight-normal);content:"{{";font-weight:var(--font-weight-normal);margin-inline-end:calc(var(--spacing)*1);opacity:.6}.custom-fields-component .fi-fo-rich-editor span[data-type=mergeTag]:after{--tw-font-weight:var(--font-weight-normal);content:"}}";font-weight:var(--font-weight-normal);margin-inline-start:calc(var(--spacing)*1);opacity:.6}.custom-fields-component .fi-fo-rich-editor span[data-type=mention]{background-color:var(--primary-50);margin-block:calc(var(--spacing)*0);padding-inline:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-medium);border-radius:.25rem;color:var(--primary-600);display:inline-block;font-weight:var(--font-weight-medium);white-space:nowrap}.custom-fields-component .fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){background-color:var(--primary-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--primary-400)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor span[data-type=mention]:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels{background-color:var(--gray-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);width:100%}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panel-header{align-items:flex-start;display:flex;gap:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panel-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1;font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panel-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panel-close-btn-ctn{flex-shrink:0}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panel{display:grid}.custom-fields-component :where(.fi-fo-rich-editor .fi-fo-rich-editor-panel>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-fo-rich-editor .fi-fo-rich-editor-panel:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-rich-editor .fi-fo-rich-editor-panel:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tags-list{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn{background-color:var(--color-white);border-radius:var(--radius-lg);color:var(--gray-600);cursor:move;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*1);text-align:start;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-merge-tag-btn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-blocks-list{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn{background-color:var(--color-white);border-radius:var(--radius-lg);color:var(--gray-600);cursor:move;font-size:var(--text-sm);gap:calc(var(--spacing)*1.5);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1);padding-inline:calc(var(--spacing)*2);text-align:start;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-600);display:flex}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn{--tw-ring-color:color-mix(in oklab,var(--gray-600)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){background-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-400)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){color:var(--gray-200);--tw-ring-color:var(--gray-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-btn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--gray-400)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap{height:100%}.custom-fields-component .fi-fo-rich-editor .tiptap:focus{--tw-outline-style:none;outline-style:none}.custom-fields-component div:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)[data-type=customBlock],.custom-fields-component img:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.custom-fields-component :is(div:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)[data-type=customBlock],img:is(.fi-fo-rich-editor .tiptap:focus .ProseMirror-selectednode)):where(.dark,.dark *){--tw-ring-color:var(--primary-500)}.custom-fields-component .fi-fo-rich-editor .tiptap p.is-editor-empty:first-child:before{color:var(--gray-400);content:attr(data-placeholder);float:inline-start;height:calc(var(--spacing)*0);pointer-events:none}.custom-fields-component .fi-fo-rich-editor .tiptap p.is-editor-empty:first-child:where(.dark,.dark *):before{color:var(--gray-500)}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]{border-color:var(--gray-950);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;display:flex;gap:calc(var(--spacing)*1);margin-block:calc(var(--spacing)*6)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]{border-color:color-mix(in oklab,var(--gray-950)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]{padding:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>div:first-of-type{margin-top:calc(var(--spacing)*0)!important}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details] summary{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);list-style-type:none}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>button{border-radius:var(--radius-md);font-size:var(--text-xs);height:calc(var(--spacing)*5);line-height:var(--tw-leading,var(--text-xs--line-height));margin-right:calc(var(--spacing)*2);margin-top:1px;padding:calc(var(--spacing)*1);width:calc(var(--spacing)*5);--tw-leading:1;align-items:center;background-color:#0000;display:flex;justify-content:center;line-height:1}@media (hover:hover){.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>button:hover{background-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>button:hover{background-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>button:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>button:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>button:before{content:"▶"}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details].is-open>button:before{transform:rotate(90deg)}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>div{display:flex;flex-direction:column;gap:calc(var(--spacing)*4);width:100%}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>div>[data-type=detailsContent]{margin-top:calc(var(--spacing)*0)!important}.custom-fields-component .fi-fo-rich-editor .tiptap [data-type=details]>div>[data-type=detailsContent]>:last-child{margin-bottom:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .tiptap table{border-collapse:collapse;margin:calc(var(--spacing)*0);overflow:hidden;table-layout:fixed;width:100%}.custom-fields-component .fi-fo-rich-editor .tiptap table:first-child{margin-top:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-rich-editor .tiptap table td,.custom-fields-component .fi-fo-rich-editor .tiptap table th{border-color:var(--gray-300);border-style:var(--tw-border-style);border-width:1px;min-width:1em;padding:calc(var(--spacing)*2)!important;position:relative;vertical-align:top}.custom-fields-component :is(.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th):where(.dark,.dark *){border-color:var(--gray-600)}.custom-fields-component :is(.fi-fo-rich-editor .tiptap table td,.fi-fo-rich-editor .tiptap table th)>*{margin-bottom:calc(var(--spacing)*0)}.custom-fields-component .fi-fo-rich-editor .tiptap table th{background-color:var(--gray-100);text-align:start;--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.custom-fields-component .fi-fo-rich-editor .tiptap table th:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white)}.custom-fields-component .fi-fo-rich-editor .tiptap table .selectedCell:after{background-color:var(--gray-200);bottom:calc(var(--spacing)*0);inset-inline-end:calc(var(--spacing)*0);inset-inline-start:calc(var(--spacing)*0);pointer-events:none;position:absolute;top:calc(var(--spacing)*0);z-index:2}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap table .selectedCell:after{background-color:color-mix(in oklab,var(--gray-200)80%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap table .selectedCell:after{--tw-content:"";content:var(--tw-content)}.custom-fields-component .fi-fo-rich-editor .tiptap table .selectedCell:where(.dark,.dark *):after{background-color:var(--gray-800)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap table .selectedCell:where(.dark,.dark *):after{background-color:color-mix(in oklab,var(--gray-800)80%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap table .column-resize-handle{background-color:var(--primary-600);bottom:calc(var(--spacing)*0);inset-inline-end:calc(var(--spacing)*0);margin:calc(var(--spacing)*0)!important;pointer-events:none;position:absolute;top:calc(var(--spacing)*0);width:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-rich-editor .tiptap .tableWrapper{overflow-x:auto}.custom-fields-component .fi-fo-rich-editor .tiptap.resize-cursor{cursor:col-resize;cursor:ew-resize}.custom-fields-component .fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{border-color:var(--gray-950);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{border-color:color-mix(in oklab,var(--gray-950)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col{padding:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .tiptap .grid-layout>.grid-layout-col:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle]{background:#00000080;border:1px solid #fffc;border-radius:2px;position:absolute;z-index:10}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle]:hover{background:#000c}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle]{margin:0!important}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-left],.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-right],.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-left],.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-right]{height:8px;width:8px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-left]{cursor:nwse-resize;left:-4px;top:-4px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top-right]{cursor:nesw-resize;right:-4px;top:-4px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-left]{bottom:-4px;cursor:nesw-resize;left:-4px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom-right]{bottom:-4px;cursor:nwse-resize;right:-4px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom],.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top]{height:6px;left:8px;right:8px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=top]{cursor:ns-resize;top:-3px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=bottom]{bottom:-3px;cursor:ns-resize}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=left],.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=right]{bottom:8px;top:8px;width:6px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=left]{cursor:ew-resize;left:-3px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-handle][data-resize-handle=right]{cursor:ew-resize;right:-3px}.custom-fields-component .fi-fo-rich-editor .tiptap [data-resize-state=true] [data-resize-wrapper]{border-radius:.125rem;outline:1px solid #00000040;position:relative}@supports (-webkit-touch-callout:none){.custom-fields-component .fi-fo-rich-editor .tiptap.ProseMirror{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.custom-fields-component .fi-fo-rich-editor img{display:inline-block}.custom-fields-component .fi-fo-rich-editor div[data-type=customBlock]{display:grid}.custom-fields-component :where(.fi-fo-rich-editor div[data-type=customBlock]>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-fo-rich-editor div[data-type=customBlock]{border-radius:var(--radius-lg);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow:hidden}.custom-fields-component :where(.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor div[data-type=customBlock]:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header{align-items:flex-start;background-color:var(--gray-50);display:flex;gap:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)30%,transparent)}}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);flex:1;font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-delete-btn-ctn,.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-edit-btn-ctn{flex-shrink:0}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-custom-block-preview{padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}@supports (container-type:inline-size){.custom-fields-component .fi-fo-rich-editor{container-type:inline-size}@container (min-width:42rem){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:row}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels{border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-end-end-radius:var(--radius-lg);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;max-width:var(--container-3xs)}}}@supports not (container-type:inline-size){@media (min-width:48rem){.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-main{flex-direction:row}.custom-fields-component .fi-fo-rich-editor .fi-fo-rich-editor-panels{border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-end-end-radius:var(--radius-lg);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;max-width:var(--container-3xs)}}}.custom-fields-component :scope .fi-fo-rich-editor-text-color-select-option{align-items:center;display:flex;gap:calc(var(--spacing)*2)}.custom-fields-component :scope .fi-fo-rich-editor-text-color-select-option .fi-fo-rich-editor-text-color-select-option-preview{background-color:var(--color);border-radius:3.40282e+38px;flex-shrink:0;height:calc(var(--spacing)*5);width:calc(var(--spacing)*5)}.custom-fields-component :scope .fi-fo-rich-editor-text-color-select-option .fi-fo-rich-editor-text-color-select-option-preview:where(.dark,.dark *){background-color:var(--dark-color)}.custom-fields-component [x-sortable]:has(.fi-sortable-ghost) .fi-fo-rich-editor{pointer-events:none}.custom-fields-component .fi-fo-select .fi-hidden{display:none}@media (min-width:40rem){.custom-fields-component .fi-fo-select-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.custom-fields-component .fi-fo-slider{border-radius:var(--radius-lg);border-style:var(--tw-border-style);gap:calc(var(--spacing)*4);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);background-color:#0000;border-width:0}.custom-fields-component .fi-fo-slider:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-slider:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-slider .noUi-connect{background-color:var(--primary-500)}.custom-fields-component .fi-fo-slider .noUi-connect:where(.dark,.dark *){background-color:var(--primary-600)}.custom-fields-component .fi-fo-slider .noUi-connects{background-color:var(--gray-950);border-radius:var(--radius-lg)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-slider .noUi-connects{background-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.custom-fields-component .fi-fo-slider .noUi-connects:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-slider .noUi-connects:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-fo-slider .noUi-handle{border-color:var(--gray-950);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;position:absolute}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-slider .noUi-handle{border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.custom-fields-component .fi-fo-slider .noUi-handle{background-color:var(--color-white);--tw-shadow:0 0 #0000;backface-visibility:hidden;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-fo-slider .noUi-handle:focus{outline-color:var(--primary-600);outline-style:var(--tw-outline-style);outline-width:2px}.custom-fields-component .fi-fo-slider .noUi-handle:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-slider .noUi-handle:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-slider .noUi-handle:where(.dark,.dark *){background-color:var(--gray-700)}.custom-fields-component .fi-fo-slider .noUi-handle:where(.dark,.dark *):focus{outline-color:var(--primary-500)}.custom-fields-component .fi-fo-slider .noUi-handle:after,.custom-fields-component .fi-fo-slider .noUi-handle:before{background-color:var(--gray-400);border-style:var(--tw-border-style);border-width:0}.custom-fields-component .fi-fo-slider .noUi-tooltip{background-color:var(--color-white);border-radius:var(--radius-md);border-style:var(--tw-border-style);color:var(--gray-950);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);border-width:0}.custom-fields-component .fi-fo-slider .noUi-tooltip:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white);--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-slider .noUi-tooltip:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-fo-slider .noUi-pips .noUi-value{color:var(--gray-950)}.custom-fields-component .fi-fo-slider .noUi-pips .noUi-value:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-slider.fi-fo-slider-vertical{height:calc(var(--spacing)*40);margin-top:calc(var(--spacing)*4)}.custom-fields-component .fi-fo-slider.fi-fo-slider-vertical.fi-fo-slider-has-tooltips{margin-inline-start:calc(var(--spacing)*10)}.custom-fields-component .fi-fo-slider:not(.fi-fo-slider-vertical).fi-fo-slider-has-pips{margin-bottom:calc(var(--spacing)*8)}.custom-fields-component .fi-fo-slider:not(.fi-fo-slider-vertical).fi-fo-slider-has-tooltips{margin-top:calc(var(--spacing)*10)}.custom-fields-component .fi-fo-slider:not(.fi-fo-slider-vertical) .noUi-pips .noUi-value{margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-fo-tags-input.fi-disabled .fi-badge-delete-btn{display:none}.custom-fields-component .fi-fo-tags-input .fi-fo-tags-input-tags-ctn{border-top:1px var(--tw-border-style) var(--gray-200);display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*1.5);padding:calc(var(--spacing)*2);width:100%}.custom-fields-component .fi-fo-tags-input .fi-fo-tags-input-tags-ctn:where(.dark,.dark *){border-top-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-fo-tags-input .fi-fo-tags-input-tags-ctn:where(.dark,.dark *){border-top-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-fo-tags-input .fi-fo-tags-input-tags-ctn>template{display:none}.custom-fields-component .fi-fo-tags-input .fi-fo-tags-input-tags-ctn>.fi-badge.fi-reorderable{cursor:move}.custom-fields-component .fi-fo-tags-input .fi-fo-tags-input-tags-ctn>.fi-badge .fi-badge-label-ctn{text-align:start;-webkit-user-select:none;user-select:none}@media (min-width:40rem){.custom-fields-component .fi-fo-tags-input-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.custom-fields-component .fi-fo-text-input{overflow:hidden}.custom-fields-component .fi-fo-text-input input.fi-revealable::-ms-reveal{display:none}.custom-fields-component .fi-fo-textarea{overflow:hidden}.custom-fields-component .fi-fo-textarea textarea{--tw-border-style:none;font-size:var(--text-sm);height:100%;line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);width:100%;--tw-leading:calc(var(--spacing)*6);background-color:#0000;border-style:none;color:var(--gray-950);display:block;line-height:calc(var(--spacing)*6)}.custom-fields-component .fi-fo-textarea textarea::placeholder{color:var(--gray-400)}.custom-fields-component .fi-fo-textarea textarea:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.custom-fields-component .fi-fo-textarea textarea:disabled{color:var(--gray-500);-webkit-text-fill-color:var(--color-gray-500)}.custom-fields-component .fi-fo-textarea textarea:disabled::placeholder{-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component .fi-fo-textarea textarea:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-fo-textarea textarea:where(.dark,.dark *)::placeholder{color:var(--gray-500)}.custom-fields-component .fi-fo-textarea textarea:where(.dark,.dark *):disabled{color:var(--gray-400);-webkit-text-fill-color:var(--color-gray-400)}.custom-fields-component .fi-fo-textarea textarea:where(.dark,.dark *):disabled::placeholder{-webkit-text-fill-color:var(--color-gray-500)}@supports (-webkit-touch-callout:none){.custom-fields-component .fi-fo-textarea textarea{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}.custom-fields-component .fi-fo-textarea.fi-autosizable textarea{resize:none}@media (min-width:40rem){.custom-fields-component .fi-fo-textarea-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.custom-fields-component .fi-fo-toggle-buttons.fi-btn-group{width:max-content}.custom-fields-component .fi-fo-toggle-buttons:not(.fi-btn-group){gap:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-toggle-buttons:not(.fi-btn-group).fi-inline{display:flex;flex-wrap:wrap}.custom-fields-component .fi-fo-toggle-buttons:not(.fi-btn-group):not(.fi-inline).fi-grid-direction-col{margin-top:calc(var(--spacing)*-3)}.custom-fields-component .fi-fo-toggle-buttons:not(.fi-btn-group):not(.fi-inline).fi-grid-direction-col .fi-fo-toggle-buttons-btn-ctn{break-inside:avoid;padding-top:calc(var(--spacing)*3)}.custom-fields-component .fi-fo-toggle-buttons .fi-fo-toggle-buttons-input{opacity:0;pointer-events:none;position:absolute}@media (min-width:40rem){.custom-fields-component .fi-fo-toggle-buttons-wrp.fi-fo-field-has-inline-label .fi-fo-field-label-col{padding-top:calc(var(--spacing)*1.5)}}.custom-fields-component .fi-in-code .phiki{border-radius:var(--radius-lg);padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent);overflow-x:auto}.custom-fields-component .fi-in-code .phiki:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-code .phiki:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-in-code:where(.dark,.dark *) .phiki,.custom-fields-component .fi-in-code:where(.dark,.dark *) .phiki span{background-color:var(--phiki-dark-background-color)!important;color:var(--phiki-dark-color)!important;font-style:var(--phiki-dark-font-style)!important;font-weight:var(--phiki-dark-font-weight)!important;-webkit-text-decoration:var(--phiki-dark-text-decoration)!important;text-decoration:var(--phiki-dark-text-decoration)!important}.custom-fields-component .fi-in-code.fi-copyable{cursor:pointer}.custom-fields-component .fi-in-color{display:flex;gap:calc(var(--spacing)*1.5);width:100%}.custom-fields-component .fi-in-color.fi-wrapped{flex-wrap:wrap}.custom-fields-component .fi-in-color.fi-align-left,.custom-fields-component .fi-in-color.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-in-color.fi-align-center{justify-content:center}.custom-fields-component .fi-in-color.fi-align-end,.custom-fields-component .fi-in-color.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-in-color.fi-align-between,.custom-fields-component .fi-in-color.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-in-color>.fi-in-color-item{border-radius:var(--radius-md);height:calc(var(--spacing)*6);width:calc(var(--spacing)*6)}.custom-fields-component .fi-in-color>.fi-in-color-item.fi-copyable{cursor:pointer}.custom-fields-component .fi-in-entry{display:grid;row-gap:calc(var(--spacing)*2)}@media (min-width:40rem){.custom-fields-component .fi-in-entry.fi-in-entry-has-inline-label{align-items:flex-start;column-gap:calc(var(--spacing)*4);grid-template-columns:repeat(3,minmax(0,1fr))}.custom-fields-component .fi-in-entry.fi-in-entry-has-inline-label .fi-in-entry-content-col{grid-column:span 2/span 2}}.custom-fields-component .fi-in-entry .fi-in-entry-label-ctn{align-items:flex-start;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-in-entry .fi-in-entry-label-ctn>.fi-sc:first-child{flex-grow:0}.custom-fields-component .fi-in-entry .fi-in-entry-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-in-entry .fi-in-entry-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-in-entry .fi-in-entry-label.fi-hidden{display:none}.custom-fields-component .fi-in-entry .fi-in-entry-content-col,.custom-fields-component .fi-in-entry .fi-in-entry-label-col{display:grid;grid-auto-columns:minmax(0,1fr);row-gap:calc(var(--spacing)*2)}.custom-fields-component .fi-in-entry .fi-in-entry-content-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;width:100%}.custom-fields-component .fi-in-entry .fi-in-entry-content{display:block;text-align:start;width:100%}.custom-fields-component .fi-in-entry .fi-in-entry-content.fi-align-center{text-align:center}.custom-fields-component .fi-in-entry .fi-in-entry-content.fi-align-end{text-align:end}.custom-fields-component .fi-in-entry .fi-in-entry-content.fi-align-left{text-align:left}.custom-fields-component .fi-in-entry .fi-in-entry-content.fi-align-right{text-align:right}.custom-fields-component .fi-in-entry .fi-in-entry-content.fi-align-between,.custom-fields-component .fi-in-entry .fi-in-entry-content.fi-align-justify{text-align:justify}.custom-fields-component .fi-in-entry .fi-in-placeholder{color:var(--gray-400);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-in-entry .fi-in-placeholder:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-in-key-value{table-layout:auto;width:100%}.custom-fields-component :where(.fi-in-key-value>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-in-key-value{background-color:var(--color-white);border-radius:var(--radius-lg);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component :where(.fi-in-key-value:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-in-key-value:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-key-value:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-key-value:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-key-value:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-key-value:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-in-key-value th{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);text-align:start;--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-in-key-value th:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component :where(.fi-in-key-value tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-in-key-value tbody{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media (min-width:40rem){.custom-fields-component .fi-in-key-value tbody{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}}.custom-fields-component :where(.fi-in-key-value tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-in-key-value tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component :where(.fi-in-key-value tr>:not(:last-child)){--tw-divide-x-reverse:0;border-color:var(--gray-200);border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style)}.custom-fields-component :where(.fi-in-key-value tr:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-divide-x-reverse:1}.custom-fields-component :where(.fi-in-key-value tr:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-in-key-value tr:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-key-value td{overflow-wrap:anywhere;padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);width:50%}.custom-fields-component .fi-in-key-value td.fi-in-placeholder{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";padding-block:calc(var(--spacing)*2);text-align:center;width:100%}.custom-fields-component .fi-in-icon{display:flex;gap:calc(var(--spacing)*1.5);width:100%}.custom-fields-component .fi-in-icon.fi-wrapped{flex-wrap:wrap}.custom-fields-component .fi-in-icon.fi-in-icon-has-line-breaks{flex-direction:column}.custom-fields-component .fi-in-icon.fi-align-left,.custom-fields-component .fi-in-icon.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-in-icon.fi-align-center{justify-content:center}.custom-fields-component .fi-in-icon.fi-align-end,.custom-fields-component .fi-in-icon.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-in-icon.fi-align-between,.custom-fields-component .fi-in-icon.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-in-icon>.fi-icon,.custom-fields-component .fi-in-icon>a>.fi-icon{color:var(--gray-400)}.custom-fields-component :is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component :is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon).fi-color{color:var(--text)}.custom-fields-component :is(.fi-in-icon>.fi-icon,.fi-in-icon>a>.fi-icon).fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-in-image{align-items:center;display:flex;gap:calc(var(--spacing)*1.5);width:100%}.custom-fields-component .fi-in-image img{max-width:none;object-fit:cover;object-position:center}.custom-fields-component .fi-in-image.fi-circular img{border-radius:3.40282e+38px}.custom-fields-component .fi-in-image.fi-in-image-ring .fi-in-image-limited-remaining-text,.custom-fields-component .fi-in-image.fi-in-image-ring img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-white)}.custom-fields-component :is(.fi-in-image.fi-in-image-ring img,.fi-in-image.fi-in-image-ring .fi-in-image-limited-remaining-text):where(.dark,.dark *){--tw-ring-color:var(--gray-900)}.custom-fields-component .fi-in-image.fi-in-image-ring.fi-in-image-ring-1 .fi-in-image-limited-remaining-text,.custom-fields-component .fi-in-image.fi-in-image-ring.fi-in-image-ring-1 img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-in-image.fi-in-image-ring.fi-in-image-ring-2 .fi-in-image-limited-remaining-text,.custom-fields-component .fi-in-image.fi-in-image-ring.fi-in-image-ring-2 img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-in-image.fi-in-image-ring.fi-in-image-ring-4 .fi-in-image-limited-remaining-text,.custom-fields-component .fi-in-image.fi-in-image-ring.fi-in-image-ring-4 img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-in-image.fi-in-image-overlap-1{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-1*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-2{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-2*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-3{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-3*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-3*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-4{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-4*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-5{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-5*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-5*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-6{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-6*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-6*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-7{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-7>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-7*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-7*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-in-image-overlap-8{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-in-image.fi-in-image-overlap-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-8*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-8*var(--tw-space-x-reverse))}.custom-fields-component .fi-in-image.fi-wrapped{flex-wrap:wrap}.custom-fields-component .fi-in-image.fi-align-left,.custom-fields-component .fi-in-image.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-in-image.fi-align-center{justify-content:center}.custom-fields-component .fi-in-image.fi-align-end,.custom-fields-component .fi-in-image.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-in-image.fi-align-between,.custom-fields-component .fi-in-image.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-in-image.fi-stacked .fi-in-image-limited-remaining-text{background-color:var(--gray-100);border-radius:3.40282e+38px}.custom-fields-component .fi-in-image.fi-stacked .fi-in-image-limited-remaining-text:where(.dark,.dark *){background-color:var(--gray-800)}.custom-fields-component .fi-in-image .fi-in-image-limited-remaining-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);align-items:center;color:var(--gray-500);display:flex;font-weight:var(--font-weight-medium);justify-content:center}.custom-fields-component .fi-in-image .fi-in-image-limited-remaining-text:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-in-image .fi-in-image-limited-remaining-text.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-in-image .fi-in-image-limited-remaining-text.fi-size-base,.custom-fields-component .fi-in-image .fi-in-image-limited-remaining-text.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-in-image .fi-in-image-limited-remaining-text.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component ul.fi-in-repeatable{gap:calc(var(--spacing)*4)}.custom-fields-component .fi-in-repeatable .fi-in-repeatable-item{display:block}.custom-fields-component .fi-in-repeatable.fi-contained .fi-in-repeatable-item{background-color:var(--color-white);border-radius:var(--radius-xl);padding:calc(var(--spacing)*4);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-repeatable.fi-contained .fi-in-repeatable-item:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-in-table-repeatable{display:grid;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-in-table-repeatable>table{display:block;width:100%}.custom-fields-component :where(.fi-in-table-repeatable>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-in-table-repeatable>table{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component :where(.fi-in-table-repeatable>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-in-table-repeatable>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-in-table-repeatable>table:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-table-repeatable>table:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-in-table-repeatable>table>thead{display:none;white-space:nowrap}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th{background-color:var(--gray-50);border-color:var(--gray-200);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);text-align:start;--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:first-of-type{border-top-left-radius:var(--radius-xl)}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:last-of-type{border-top-right-radius:var(--radius-xl)}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th.fi-align-center{text-align:center}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th.fi-align-end,.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th.fi-align-right{text-align:end}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th.fi-wrapped{white-space:normal}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th:not(.fi-wrapped){white-space:nowrap}.custom-fields-component .fi-in-table-repeatable>table>thead>tr>th.fi-in-table-repeatable-empty-header-cell{width:calc(var(--spacing)*1)}.custom-fields-component .fi-in-table-repeatable>table>tbody{display:block}.custom-fields-component :where(.fi-in-table-repeatable>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-in-table-repeatable>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-in-table-repeatable>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr{display:grid;gap:calc(var(--spacing)*6);padding:calc(var(--spacing)*6)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td{display:block}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:none}@supports (container-type:inline-size){.custom-fields-component .fi-in-table-repeatable{container-type:inline-size}@container (min-width:36rem){.custom-fields-component .fi-in-table-repeatable>table{display:table}.custom-fields-component .fi-in-table-repeatable>table>thead{display:table-header-group}.custom-fields-component .fi-in-table-repeatable>table>tbody{display:table-row-group}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr{display:table-row;padding:calc(var(--spacing)*0)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td{display:table-cell;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:table-cell}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry-label{display:none}.custom-fields-component .fi-in-table-repeatable>table .fi-in-table-repeatable-actions{padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}}}@supports not (container-type:inline-size){@media (min-width:64rem){.custom-fields-component .fi-in-table-repeatable>table{display:table}.custom-fields-component .fi-in-table-repeatable>table>thead{display:table-header-group}.custom-fields-component .fi-in-table-repeatable>table>tbody{display:table-row-group}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr{display:table-row;padding:calc(var(--spacing)*0)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td{display:table-cell;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td.fi-hidden{display:table-cell}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry{row-gap:calc(var(--spacing)*0)}.custom-fields-component .fi-in-table-repeatable>table>tbody>tr>td .fi-in-entry-label{display:none}}}.custom-fields-component .fi-in-text{width:100%}.custom-fields-component .fi-in-text.fi-in-text-affixed{display:flex;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-in-text .fi-in-text-affixed-content{flex:1;min-width:calc(var(--spacing)*0)}.custom-fields-component .fi-in-text .fi-in-text-affix{align-items:center;align-self:stretch;display:flex;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-in-text.fi-in-text-list-limited{display:flex;flex-direction:column}.custom-fields-component .fi-in-text.fi-in-text-list-limited.fi-in-text-has-badges{row-gap:calc(var(--spacing)*2)}.custom-fields-component .fi-in-text.fi-in-text-list-limited:not(.fi-in-text-has-badges){row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-in-text.fi-bulleted ul,.custom-fields-component ul.fi-in-text.fi-bulleted{list-style-position:inside;list-style-type:disc}.custom-fields-component .fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul,.custom-fields-component ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges{column-gap:calc(var(--spacing)*1.5);display:flex}.custom-fields-component :is(ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul).fi-wrapped,.custom-fields-component :is(ul.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges,.fi-in-text:not(.fi-in-text-has-line-breaks).fi-in-text-has-badges ul):is(.fi-wrapped ul){flex-wrap:wrap;row-gap:calc(var(--spacing)*1)}.custom-fields-component :is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul).fi-in-text-has-line-breaks,.custom-fields-component :is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):is(.fi-in-text-has-line-breaks ul){display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}.custom-fields-component :is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul),.custom-fields-component :is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks){column-gap:calc(var(--spacing)*1.5);display:flex}.custom-fields-component :is(:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul)).fi-wrapped,.custom-fields-component :is(:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(ul.fi-in-text-has-line-breaks),:is(ul.fi-in-text.fi-in-text-has-badges,.fi-in-text.fi-in-text-has-badges ul):not(.fi-in-text-has-line-breaks ul)):is(.fi-wrapped ul){flex-wrap:wrap;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks){overflow-wrap:break-word;white-space:normal}.custom-fields-component .fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks) .fi-badge,.custom-fields-component .fi-in-text.fi-wrapped:not(.fi-in-text-has-badges.fi-in-text-has-line-breaks) .fi-in-text-list-limited-message{white-space:nowrap}.custom-fields-component .fi-in-text>.fi-in-text-list-limited-message{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-in-text>.fi-in-text-list-limited-message:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-in-text.fi-align-center{text-align:center}.custom-fields-component .fi-in-text.fi-align-center ul,.custom-fields-component ul.fi-in-text.fi-align-center{justify-content:center}.custom-fields-component .fi-in-text.fi-align-end,.custom-fields-component .fi-in-text.fi-align-right{text-align:end}.custom-fields-component :is(.fi-in-text.fi-align-end,.fi-in-text.fi-align-right) ul,.custom-fields-component ul:is(.fi-in-text.fi-align-end,.fi-in-text.fi-align-right){justify-content:flex-end}.custom-fields-component .fi-in-text.fi-align-between,.custom-fields-component .fi-in-text.fi-align-justify{text-align:justify}.custom-fields-component :is(.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between) ul,.custom-fields-component ul:is(.fi-in-text.fi-align-justify,.fi-in-text.fi-align-between){justify-content:space-between}.custom-fields-component .fi-in-text-item{color:var(--gray-950)}.custom-fields-component .fi-in-text-item:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.custom-fields-component .fi-in-text-item a:hover{text-decoration-line:underline}}.custom-fields-component .fi-in-text-item a:focus-visible{text-decoration-line:underline}.custom-fields-component .fi-in-text-item:not(.fi-bulleted li.fi-in-text-item){-webkit-line-clamp:var(--line-clamp,none);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.custom-fields-component .fi-in-text-item>.fi-copyable{cursor:pointer}.custom-fields-component .fi-in-text-item.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-in-text-item.fi-size-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-in-text-item.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-in-text-item.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .fi-in-text-item.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.custom-fields-component .fi-in-text-item.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.custom-fields-component .fi-in-text-item.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.custom-fields-component .fi-in-text-item.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.custom-fields-component .fi-in-text-item.fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-in-text-item.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-in-text-item.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.custom-fields-component .fi-in-text-item.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.custom-fields-component .fi-in-text-item.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.custom-fields-component .fi-in-text-item.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.custom-fields-component .fi-in-text-item.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.custom-fields-component .fi-in-text-item.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.custom-fields-component .fi-in-text-item.fi-color{color:var(--text)}.custom-fields-component .fi-in-text-item.fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component li.fi-in-text-item.fi-color::marker{color:var(--gray-950)}.custom-fields-component li.fi-in-text-item.fi-color:where(.dark,.dark *)::marker{color:var(--color-white)}.custom-fields-component .fi-in-text-item.fi-color-gray{color:var(--gray-500)}.custom-fields-component .fi-in-text-item.fi-color-gray:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component li.fi-in-text-item.fi-color-gray::marker{color:var(--gray-950)}.custom-fields-component .fi-in-text-item>.fi-icon,.custom-fields-component .fi-in-text-item>span:not(.fi-badge)>.fi-icon{color:var(--gray-400);display:inline-block;flex-shrink:0}.custom-fields-component :is(.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component :is(.fi-in-text-item>.fi-icon,.fi-in-text-item>span:not(.fi-badge)>.fi-icon).fi-color{color:var(--color-500)}.custom-fields-component .fi-no-database{display:flex}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-heading{display:inline-block;position:relative}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-heading .fi-badge{inset-inline-start:100%;margin-inline-start:calc(var(--spacing)*1);position:absolute;top:calc(var(--spacing)*-1);width:max-content}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-header .fi-ac{margin-top:calc(var(--spacing)*2)}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content{margin-inline:calc(var(--spacing)*-6);margin-top:calc(var(--spacing)*-6);row-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-no-database .fi-modal-window-ctn>.fi-modal-window .fi-modal-content:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window:not(.fi-modal-window-has-footer) .fi-modal-content{margin-bottom:calc(var(--spacing)*-6)}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200)}.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-no-database .fi-modal-window-ctn>.fi-modal-window.fi-modal-window-has-footer .fi-modal-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-no-database .fi-no-notification-unread-ctn{position:relative}.custom-fields-component .fi-no-database .fi-no-notification-unread-ctn:before{background-color:var(--primary-600);content:var(--tw-content);height:100%;inset-inline-start:calc(var(--spacing)*0);position:absolute;width:calc(var(--spacing)*.5)}.custom-fields-component .fi-no-database .fi-no-notification-unread-ctn:where(.dark,.dark *):before{background-color:var(--primary-500);content:var(--tw-content)}.custom-fields-component .fi-no-notification{gap:calc(var(--spacing)*3);padding:calc(var(--spacing)*4);pointer-events:auto;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));visibility:hidden;width:100%;--tw-duration:.3s;display:flex;flex-shrink:0;overflow:hidden;transition-duration:.3s}.custom-fields-component .fi-no-notification .fi-no-notification-icon{color:var(--gray-400)}.custom-fields-component .fi-no-notification .fi-no-notification-icon.fi-color{color:var(--color-400)}.custom-fields-component .fi-no-notification .fi-no-notification-main{display:grid;flex:1;gap:calc(var(--spacing)*3);margin-top:calc(var(--spacing)*.5)}.custom-fields-component .fi-no-notification .fi-no-notification-text{display:grid;gap:calc(var(--spacing)*1)}.custom-fields-component .fi-no-notification .fi-no-notification-title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-no-notification .fi-no-notification-title:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-no-notification .fi-no-notification-date{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-no-notification .fi-no-notification-date:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-no-notification .fi-no-notification-body{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow:hidden;overflow-wrap:break-word;text-wrap:pretty}.custom-fields-component .fi-no-notification .fi-no-notification-body:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-no-notification .fi-no-notification-body>p:not(:first-of-type){margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-no-notification:not(.fi-inline){background-color:var(--color-white);border-radius:var(--radius-xl);gap:calc(var(--spacing)*3);max-width:var(--container-sm);padding:calc(var(--spacing)*4);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex}.custom-fields-component .fi-no-notification:not(.fi-inline):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-no-notification:not(.fi-inline):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-no-notification:not(.fi-inline).fi-color{--tw-ring-color:var(--color-600)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-no-notification:not(.fi-inline).fi-color{--tw-ring-color:color-mix(in oklab,var(--color-600)20%,transparent)}}.custom-fields-component .fi-no-notification:not(.fi-inline).fi-color:where(.dark,.dark *){--tw-ring-color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-no-notification:not(.fi-inline).fi-color:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-400)30%,transparent)}}.custom-fields-component .fi-no-notification:not(.fi-inline).fi-transition-leave-end{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.custom-fields-component .fi-no-notification.fi-color{background-color:#fff}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-no-notification.fi-color{background-color:color-mix(in oklab,#fff 90%,var(--color-400))}}.custom-fields-component .fi-no-notification.fi-color:where(.dark,.dark *){background-color:var(--gray-900)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-no-notification.fi-color:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-900)90%,var(--color-400))}}.custom-fields-component .fi-no-notification.fi-transition-enter-start,.custom-fields-component .fi-no-notification.fi-transition-leave-end{opacity:0}.custom-fields-component :is(.fi-no.fi-align-start,.fi-no.fi-align-left) .fi-no-notification.fi-transition-enter-start{--tw-translate-x:calc(var(--spacing)*-12);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component :is(.fi-no.fi-align-end,.fi-no.fi-align-right) .fi-no-notification.fi-transition-enter-start{--tw-translate-x:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-no.fi-align-center.fi-vertical-align-start .fi-no-notification.fi-transition-enter-start{--tw-translate-y:calc(var(--spacing)*-12);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-no.fi-align-center.fi-vertical-align-end .fi-no-notification.fi-transition-enter-start{--tw-translate-y:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-no{display:flex;gap:calc(var(--spacing)*3);inset:calc(var(--spacing)*4);margin-inline:auto;pointer-events:none;position:fixed;z-index:50}.custom-fields-component .fi-no.fi-align-left,.custom-fields-component .fi-no.fi-align-start{align-items:flex-start}.custom-fields-component .fi-no.fi-align-center{align-items:center}.custom-fields-component .fi-no.fi-align-end,.custom-fields-component .fi-no.fi-align-right{align-items:flex-end}.custom-fields-component .fi-no.fi-vertical-align-start{flex-direction:column-reverse;justify-content:flex-end}.custom-fields-component .fi-no.fi-vertical-align-center{flex-direction:column;justify-content:center}.custom-fields-component .fi-no.fi-vertical-align-end{flex-direction:column;justify-content:flex-end}.custom-fields-component .fi-sc-actions{display:flex;flex-direction:column;gap:calc(var(--spacing)*2);height:100%}.custom-fields-component .fi-sc-actions .fi-sc-actions-label-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-sc-actions .fi-sc-actions-label-ctn .fi-sc-actions-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-sc-actions .fi-sc-actions-label-ctn .fi-sc-actions-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-sc-actions.fi-sticky .fi-ac{background-color:var(--color-white);bottom:calc(var(--spacing)*0);margin-inline:calc(var(--spacing)*-4);padding:calc(var(--spacing)*4);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,);width:100%;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);position:fixed;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}@media (min-width:48rem){.custom-fields-component .fi-sc-actions.fi-sticky .fi-ac{border-radius:var(--radius-xl);bottom:calc(var(--spacing)*4)}}.custom-fields-component .fi-sc-actions.fi-sticky .fi-ac:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-actions.fi-sticky .fi-ac:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-sc-actions.fi-vertical-align-start{justify-content:flex-start}.custom-fields-component .fi-sc-actions.fi-vertical-align-center{justify-content:center}.custom-fields-component .fi-sc-actions.fi-vertical-align-end{justify-content:flex-end}.custom-fields-component .fi-sc-flex{display:flex;gap:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-flex.fi-dense{gap:calc(var(--spacing)*3)}.custom-fields-component .fi-sc-flex>.fi-hidden{display:none}.custom-fields-component .fi-sc-flex>.fi-growable{flex:1;width:100%}.custom-fields-component .fi-sc-flex.fi-from-default{align-items:flex-start}.custom-fields-component .fi-sc-flex.fi-from-default.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-sc-flex.fi-from-default.fi-vertical-align-end{align-items:flex-end}.custom-fields-component .fi-sc-flex.fi-from-sm{flex-direction:column}@media (min-width:40rem){.custom-fields-component .fi-sc-flex.fi-from-sm{align-items:flex-start;flex-direction:row}.custom-fields-component .fi-sc-flex.fi-from-sm.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-sc-flex.fi-from-sm.fi-vertical-align-end{align-items:flex-end}}.custom-fields-component .fi-sc-flex.fi-from-md{flex-direction:column}@media (min-width:48rem){.custom-fields-component .fi-sc-flex.fi-from-md{align-items:flex-start;flex-direction:row}.custom-fields-component .fi-sc-flex.fi-from-md.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-sc-flex.fi-from-md.fi-vertical-align-end{align-items:flex-end}}.custom-fields-component .fi-sc-flex.fi-from-lg{flex-direction:column}@media (min-width:64rem){.custom-fields-component .fi-sc-flex.fi-from-lg{align-items:flex-start;flex-direction:row}.custom-fields-component .fi-sc-flex.fi-from-lg.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-sc-flex.fi-from-lg.fi-vertical-align-end{align-items:flex-end}}.custom-fields-component .fi-sc-flex.fi-from-xl{flex-direction:column}@media (min-width:80rem){.custom-fields-component .fi-sc-flex.fi-from-xl{align-items:flex-start;flex-direction:row}.custom-fields-component .fi-sc-flex.fi-from-xl.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-sc-flex.fi-from-xl.fi-vertical-align-end{align-items:flex-end}}.custom-fields-component .fi-sc-flex.fi-from-2xl{flex-direction:column}@media (min-width:96rem){.custom-fields-component .fi-sc-flex.fi-from-2xl{align-items:flex-start;flex-direction:row}.custom-fields-component .fi-sc-flex.fi-from-2xl.fi-vertical-align-center{align-items:center}.custom-fields-component .fi-sc-flex.fi-from-2xl.fi-vertical-align-end{align-items:flex-end}}.custom-fields-component .fi-sc-form{display:flex;flex-direction:column;gap:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-form.fi-dense{gap:calc(var(--spacing)*3)}.custom-fields-component .fi-sc-fused-group>.fi-sc{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)10%,transparent)}.custom-fields-component .fi-sc-fused-group>.fi-sc:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--primary-600)}.custom-fields-component .fi-sc-fused-group>.fi-sc:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-fused-group>.fi-sc:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-sc-fused-group>.fi-sc:where(.dark,.dark *):focus-within{--tw-ring-color:var(--primary-500)}.custom-fields-component :where(.fi-sc-fused-group .fi-sc>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-950);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-sc-fused-group .fi-sc>:not(:last-child)){border-color:color-mix(in oklab,var(--gray-950)10%,transparent)}}.custom-fields-component .fi-sc-fused-group .fi-sc{border-radius:var(--radius-lg)}.custom-fields-component :where(.fi-sc-fused-group .fi-sc:where(.dark,.dark *)>:not(:last-child)){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-sc-fused-group .fi-sc:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-sc-fused-group .fi-sc .fi-sc-component,.custom-fields-component .fi-sc-fused-group .fi-sc .fi-sc-component .fi-fo-field,.custom-fields-component .fi-sc-fused-group .fi-sc .fi-sc-component .fi-input{min-height:100%}.custom-fields-component .fi-sc-fused-group .fi-sc .fi-sc-component .fi-sc-actions{padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-sc-fused-group .fi-sc>:first-child .fi-input-wrp{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.custom-fields-component .fi-sc-fused-group .fi-sc>:last-child .fi-input-wrp{border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.custom-fields-component :where(.fi-sc-fused-group .fi-sc.fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}@media (min-width:40rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.sm\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:48rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.md\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:64rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.lg\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:80rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:96rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\32 xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@supports (container-type:inline-size){@container (min-width:16rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@3xs\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:18rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@2xs\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:20rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@xs\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:24rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@sm\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:28rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@md\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:32rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@lg\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:36rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:42rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@2xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:48rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@3xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:56rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@4xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:64rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@5xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:72rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@6xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@container (min-width:80rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\@7xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@sm\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:48rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@md\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:64rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@lg\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:80rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}@media (min-width:96rem){.custom-fields-component :where(.fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-end-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-style:var(--tw-border-style);--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:first-child .fi-input-wrp{border-end-start-radius:var(--radius-lg);border-start-end-radius:0}.custom-fields-component .fi-sc-fused-group .fi-sc.\!\@2xl\:fi-grid-cols>:last-child .fi-input-wrp{border-end-start-radius:0;border-start-end-radius:var(--radius-lg)}}}.custom-fields-component .fi-sc-fused-group .fi-input-wrp{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);border-radius:0;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-sc-fused-group .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)).fi-invalid:focus-within,.custom-fields-component .fi-sc-fused-group .fi-input-wrp:not(.fi-disabled):not(:has(.fi-ac-action:focus)):focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-sc-icon{color:var(--gray-400)}.custom-fields-component .fi-sc-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-sc-icon.fi-color{color:var(--color-500)}.custom-fields-component .fi-sc-icon.fi-color:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-sc-image{border-color:var(--gray-300);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px}.custom-fields-component .fi-sc-image:where(.dark,.dark *){border-color:#0000}.custom-fields-component .fi-sc-image.fi-align-center{margin-inline:auto}.custom-fields-component .fi-sc-image.fi-align-end,.custom-fields-component .fi-sc-image.fi-align-right{margin-inline-start:auto}.custom-fields-component .fi-sc-section{display:flex;flex-direction:column;gap:calc(var(--spacing)*2)}.custom-fields-component .fi-sc-section .fi-sc-section-label-ctn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-sc-section .fi-sc-section-label-ctn .fi-sc-section-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-sc-section .fi-sc-section-label-ctn .fi-sc-section-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-sc-tabs{display:flex;flex-direction:column}.custom-fields-component .fi-sc-tabs .fi-tabs.fi-invisible{visibility:hidden}.custom-fields-component .fi-sc-tabs .fi-sc-tabs-tab{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-sc-tabs .fi-sc-tabs-tab{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-sc-tabs .fi-sc-tabs-tab.fi-active{margin-top:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-tabs .fi-sc-tabs-tab:not(.fi-active){height:calc(var(--spacing)*0);overflow:hidden;padding:calc(var(--spacing)*0);position:absolute;visibility:hidden}.custom-fields-component .fi-sc-tabs.fi-contained{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-sc-tabs.fi-contained:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-tabs.fi-contained:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-sc-tabs.fi-contained .fi-sc-tabs-tab.fi-active{margin-top:calc(var(--spacing)*0);padding:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-tabs.fi-vertical{flex-direction:row}.custom-fields-component .fi-sc-tabs.fi-vertical .fi-sc-tabs-tab.fi-active{flex:1;margin-inline-start:calc(var(--spacing)*6);margin-top:calc(var(--spacing)*0)}.custom-fields-component .fi-sc-text.fi-copyable{cursor:pointer}.custom-fields-component .fi-sc-text.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.custom-fields-component .fi-sc-text.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.custom-fields-component .fi-sc-text.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.custom-fields-component .fi-sc-text:not(.fi-badge){color:var(--gray-600);display:inline-block;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow-wrap:break-word}.custom-fields-component .fi-sc-text:not(.fi-badge):where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-color-neutral{color:var(--gray-950)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-color-neutral:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral){color:var(--text)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral):where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-sc-text:not(.fi-badge).fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-sc-unordered-list{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));list-style-type:disc;margin-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-sc-unordered-list.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-sc-unordered-list.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-sc-unordered-list.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .fi-sc-wizard{display:flex;flex-direction:column}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header{display:grid}@media (min-width:48rem){.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header{grid-auto-flow:column;overflow-x:auto}}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step{display:flex;position:relative}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active){display:none}@media (min-width:48rem){.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active){display:flex}}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn{align-items:center;column-gap:calc(var(--spacing)*4);display:flex;height:100%;padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*6);text-align:start}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{align-items:center;border-radius:3.40282e+38px;display:flex;flex-shrink:0;height:calc(var(--spacing)*10);justify-content:center;width:calc(var(--spacing)*10)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text{display:grid;justify-items:start}@media (min-width:48rem){.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text{max-width:calc(var(--spacing)*60);width:max-content}}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-align:start}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator{color:var(--gray-200);display:none;height:100%;inset-inline-end:calc(var(--spacing)*0);position:absolute;width:calc(var(--spacing)*5)}@media (min-width:48rem){.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator{display:block}}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(.dark,.dark *){color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step .fi-sc-wizard-header-step-separator:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{background-color:var(--primary-600)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){background-color:var(--primary-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--color-white)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--gray-950)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-completed .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-style:var(--tw-border-style);border-width:2px}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed).fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--primary-600)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed).fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon:where(.dark,.dark *){color:var(--primary-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed):not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-completed):not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-color:var(--primary-600)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){border-color:var(--primary-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{color:var(--primary-600)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number:where(.dark,.dark *){color:var(--primary-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--primary-700)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step.fi-active .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn{border-color:var(--gray-300)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn:where(.dark,.dark *){border-color:var(--gray-600)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number{color:var(--gray-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-number:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label{color:var(--gray-500)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-header .fi-sc-wizard-header-step:not(.fi-active) .fi-sc-wizard-header-step-btn .fi-sc-wizard-header-step-icon-ctn .fi-sc-wizard-header-step-text .fi-sc-wizard-header-step-label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-step{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-sc-wizard .fi-sc-wizard-step{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-step:not(.fi-active){height:calc(var(--spacing)*0);overflow:hidden;padding:calc(var(--spacing)*0);position:absolute;visibility:hidden}.custom-fields-component .fi-sc-wizard:not(.fi-sc-wizard-header-hidden) .fi-sc-wizard-step.fi-active{margin-top:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-footer{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;justify-content:space-between}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-footer>.fi-hidden{display:none}.custom-fields-component .fi-sc-wizard .fi-sc-wizard-footer>.fi-disabled{opacity:.7;pointer-events:none}.custom-fields-component .fi-sc-wizard.fi-contained{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-sc-wizard.fi-contained:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-wizard.fi-contained:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-sc-wizard.fi-contained .fi-sc-wizard-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200)}.custom-fields-component .fi-sc-wizard.fi-contained .fi-sc-wizard-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-wizard.fi-contained .fi-sc-wizard-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-sc-wizard.fi-contained .fi-sc-wizard-step.fi-active{margin-top:calc(var(--spacing)*0);padding:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-wizard.fi-contained .fi-sc-wizard-footer{padding-inline:calc(var(--spacing)*6);padding-bottom:calc(var(--spacing)*6)}.custom-fields-component .fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-header:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-sc-wizard:not(.fi-contained) .fi-sc-wizard-footer{margin-top:calc(var(--spacing)*6)}.custom-fields-component .fi-sc{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-sc.fi-inline{align-items:center;display:flex;flex-grow:1;flex-wrap:wrap}.custom-fields-component .fi-sc.fi-sc-has-gap{gap:calc(var(--spacing)*6)}.custom-fields-component .fi-sc.fi-sc-has-gap.fi-sc-dense{gap:calc(var(--spacing)*3)}.custom-fields-component .fi-sc.fi-align-left,.custom-fields-component .fi-sc.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-sc.fi-align-center{justify-content:center}.custom-fields-component .fi-sc.fi-align-end,.custom-fields-component .fi-sc.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-sc.fi-align-between,.custom-fields-component .fi-sc.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-sc>.fi-hidden{display:none}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-xs{max-width:var(--container-xs)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-sm{max-width:var(--container-sm)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-md{max-width:var(--container-md)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-lg{max-width:var(--container-lg)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-xl{max-width:var(--container-xl)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-2xl{max-width:var(--container-2xl)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-3xl{max-width:var(--container-3xl)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-4xl{max-width:var(--container-4xl)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-5xl{max-width:var(--container-5xl)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-6xl{max-width:var(--container-6xl)}.custom-fields-component .fi-sc>.fi-grid-col.fi-width-7xl{max-width:var(--container-7xl)}.custom-fields-component .fi-sc>.fi-grid-col>.fi-sc-component{height:100%}.custom-fields-component .fi-ta-actions{align-items:center;display:flex;flex-shrink:0;gap:calc(var(--spacing)*3);justify-content:flex-end;max-width:100%}.custom-fields-component .fi-ta-actions>*{flex-shrink:0}.custom-fields-component .fi-ta-actions.fi-wrapped{flex-wrap:wrap}@media (min-width:40rem){.custom-fields-component .fi-ta-actions.sm\:fi-not-wrapped{flex-wrap:nowrap}}.custom-fields-component .fi-ta-actions.fi-align-center{justify-content:center}.custom-fields-component .fi-ta-actions.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-ta-actions.fi-align-between{justify-content:space-between}@media (min-width:48rem){.custom-fields-component .fi-ta-actions.md\:fi-align-end{justify-content:flex-end}}.custom-fields-component .fi-ta-cell{padding:calc(var(--spacing)*0)}.custom-fields-component .fi-ta-cell:first-of-type{padding-inline-start:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-cell:last-of-type{padding-inline-end:calc(var(--spacing)*1)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell:first-of-type{padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-cell:last-of-type{padding-inline-end:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-cell.fi-vertical-align-start{vertical-align:top}.custom-fields-component .fi-ta-cell.fi-vertical-align-end{vertical-align:bottom}@media (min-width:40rem){.custom-fields-component .fi-ta-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.custom-fields-component .fi-ta-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.custom-fields-component .fi-ta-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.custom-fields-component .fi-ta-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.custom-fields-component .fi-ta-cell.\32 xl\:fi-hidden{display:none}}.custom-fields-component .fi-ta-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.custom-fields-component .fi-ta-cell.sm\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-cell.md\:fi-visible{display:none}@media (min-width:48rem){.custom-fields-component .fi-ta-cell.md\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.custom-fields-component .fi-ta-cell.lg\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.custom-fields-component .fi-ta-cell.xl\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.custom-fields-component .fi-ta-cell.\32 xl\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-cell>.fi-ta-col{display:flex;justify-content:flex-start;text-align:start;width:100%}.custom-fields-component .fi-ta-cell>.fi-ta-col:disabled{pointer-events:none}.custom-fields-component .fi-ta-cell:has(.fi-ta-reorder-handle){padding-inline:calc(var(--spacing)*3);width:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-cell:has(.fi-ta-reorder-handle):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-cell:has(.fi-ta-reorder-handle):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell:has(.fi-ta-reorder-handle):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell:has(.fi-ta-reorder-handle):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-cell:has(.fi-ta-actions){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);white-space:nowrap}.custom-fields-component .fi-ta-cell:has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-cell:has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell:has(.fi-ta-actions):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell:has(.fi-ta-actions):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-cell:has(.fi-ta-record-checkbox){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);width:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-cell:has(.fi-ta-record-checkbox):first-of-type{padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-cell:has(.fi-ta-record-checkbox):last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell:has(.fi-ta-record-checkbox):first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell:has(.fi-ta-record-checkbox):last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-cell .fi-ta-placeholder{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);color:var(--gray-400);line-height:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell .fi-ta-placeholder:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-ta-cell.fi-ta-summary-row-heading-cell{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell.fi-ta-summary-row-heading-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell.fi-ta-summary-row-heading-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-cell.fi-ta-summary-row-heading-cell:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-cell.fi-align-start{text-align:start}.custom-fields-component .fi-ta-cell.fi-align-center{text-align:center}.custom-fields-component .fi-ta-cell.fi-align-end{text-align:end}.custom-fields-component .fi-ta-cell.fi-align-left{text-align:left}.custom-fields-component .fi-ta-cell.fi-align-right{text-align:right}.custom-fields-component .fi-ta-cell.fi-align-between,.custom-fields-component .fi-ta-cell.fi-align-justify{text-align:justify}.custom-fields-component .fi-ta-cell.fi-ta-summary-header-cell{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell.fi-ta-summary-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-cell.fi-ta-summary-header-cell:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-cell.fi-ta-summary-header-cell.fi-wrapped,.custom-fields-component .fi-ta-cell.fi-ta-summary-header-cell:not(.fi-wrapped){white-space:nowrap}.custom-fields-component .fi-ta-cell.fi-ta-individual-search-cell{min-width:calc(var(--spacing)*48);padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-cell .fi-ta-reorder-handle{cursor:move}.custom-fields-component .fi-ta-cell.fi-ta-selection-cell{padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);width:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-cell.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-cell.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell.fi-ta-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell.fi-ta-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-cell.fi-ta-group-selection-cell{padding-inline:calc(var(--spacing)*3);width:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-cell.fi-ta-group-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-cell.fi-ta-group-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-cell.fi-ta-group-selection-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-cell.fi-ta-group-selection-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-checkbox{width:100%}.custom-fields-component .fi-ta-checkbox:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-checkbox.fi-align-center{text-align:center}.custom-fields-component .fi-ta-checkbox.fi-align-end,.custom-fields-component .fi-ta-checkbox.fi-align-right{text-align:end}.custom-fields-component .fi-ta-color{display:flex;gap:calc(var(--spacing)*1.5);width:100%}.custom-fields-component .fi-ta-color.fi-wrapped{flex-wrap:wrap}.custom-fields-component .fi-ta-color:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-color.fi-align-left,.custom-fields-component .fi-ta-color.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-ta-color.fi-align-center{justify-content:center}.custom-fields-component .fi-ta-color.fi-align-end,.custom-fields-component .fi-ta-color.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-ta-color.fi-align-between,.custom-fields-component .fi-ta-color.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-ta-color>.fi-ta-color-item{border-radius:var(--radius-md);height:calc(var(--spacing)*6);width:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-color>.fi-ta-color-item.fi-copyable{cursor:pointer}.custom-fields-component .fi-ta-icon{display:flex;gap:calc(var(--spacing)*1.5);width:100%}.custom-fields-component .fi-ta-icon.fi-wrapped{flex-wrap:wrap}.custom-fields-component .fi-ta-icon.fi-ta-icon-has-line-breaks{flex-direction:column}.custom-fields-component .fi-ta-icon:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-icon.fi-align-left,.custom-fields-component .fi-ta-icon.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-ta-icon.fi-align-center{justify-content:center}.custom-fields-component .fi-ta-icon.fi-align-end,.custom-fields-component .fi-ta-icon.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-ta-icon.fi-align-between,.custom-fields-component .fi-ta-icon.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-ta-icon>.fi-icon,.custom-fields-component .fi-ta-icon>a>.fi-icon{color:var(--gray-400)}.custom-fields-component :is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component :is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon).fi-color{color:var(--text)}.custom-fields-component :is(.fi-ta-icon>.fi-icon,.fi-ta-icon>a>.fi-icon).fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-ta-image{align-items:center;display:flex;gap:calc(var(--spacing)*1.5);width:100%}.custom-fields-component .fi-ta-image img{max-width:none;object-fit:cover;object-position:center}.custom-fields-component .fi-ta-image.fi-circular img{border-radius:3.40282e+38px}.custom-fields-component .fi-ta-image.fi-ta-image-ring .fi-ta-image-limited-remaining-text,.custom-fields-component .fi-ta-image.fi-ta-image-ring img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-white)}.custom-fields-component :is(.fi-ta-image.fi-ta-image-ring img,.fi-ta-image.fi-ta-image-ring .fi-ta-image-limited-remaining-text):where(.dark,.dark *){--tw-ring-color:var(--gray-900)}.custom-fields-component .fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-1 .fi-ta-image-limited-remaining-text,.custom-fields-component .fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-1 img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-2 .fi-ta-image-limited-remaining-text,.custom-fields-component .fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-2 img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-4 .fi-ta-image-limited-remaining-text,.custom-fields-component .fi-ta-image.fi-ta-image-ring.fi-ta-image-ring-4 img{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-1{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-1*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-2{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-2*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-3{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-3*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-3*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-4{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-4*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-5{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-5*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-5*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-6{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-6*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-6*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-7{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-7>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-7*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-7*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-ta-image-overlap-8{column-gap:calc(var(--spacing)*0)}.custom-fields-component :where(.fi-ta-image.fi-ta-image-overlap-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*-8*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*-8*var(--tw-space-x-reverse))}.custom-fields-component .fi-ta-image.fi-wrapped{flex-wrap:wrap}.custom-fields-component .fi-ta-image:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-image.fi-align-left,.custom-fields-component .fi-ta-image.fi-align-start{justify-content:flex-start}.custom-fields-component .fi-ta-image.fi-align-center{justify-content:center}.custom-fields-component .fi-ta-image.fi-align-end,.custom-fields-component .fi-ta-image.fi-align-right{justify-content:flex-end}.custom-fields-component .fi-ta-image.fi-align-between,.custom-fields-component .fi-ta-image.fi-align-justify{justify-content:space-between}.custom-fields-component .fi-ta-image.fi-stacked .fi-ta-image-limited-remaining-text{background-color:var(--gray-100);border-radius:3.40282e+38px}.custom-fields-component .fi-ta-image.fi-stacked .fi-ta-image-limited-remaining-text:where(.dark,.dark *){background-color:var(--gray-800)}.custom-fields-component .fi-ta-image .fi-ta-image-limited-remaining-text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);align-items:center;color:var(--gray-500);display:flex;font-weight:var(--font-weight-medium);justify-content:center}.custom-fields-component .fi-ta-image .fi-ta-image-limited-remaining-text:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-base,.custom-fields-component .fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-ta-image .fi-ta-image-limited-remaining-text.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .fi-ta-select{min-width:calc(var(--spacing)*48);width:100%}.custom-fields-component .fi-ta-select:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-text{width:100%}.custom-fields-component .fi-ta-text.fi-ta-text-has-descriptions,.custom-fields-component .fi-ta-text.fi-ta-text-list-limited{display:flex;flex-direction:column}.custom-fields-component :is(.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited).fi-ta-text-has-badges{row-gap:calc(var(--spacing)*2)}.custom-fields-component :is(.fi-ta-text.fi-ta-text-has-descriptions,.fi-ta-text.fi-ta-text-list-limited):not(.fi-ta-text-has-badges){row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-text:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-text.fi-bulleted ul,.custom-fields-component ul.fi-ta-text.fi-bulleted{list-style-position:inside;list-style-type:disc}.custom-fields-component .fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul,.custom-fields-component ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges{column-gap:calc(var(--spacing)*1.5);display:flex}.custom-fields-component :is(ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul).fi-wrapped,.custom-fields-component :is(ul.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges,.fi-ta-text:not(.fi-ta-text-has-line-breaks).fi-ta-text-has-badges ul):is(.fi-wrapped ul){flex-wrap:wrap;row-gap:calc(var(--spacing)*1)}.custom-fields-component :is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul).fi-ta-text-has-line-breaks,.custom-fields-component :is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):is(.fi-ta-text-has-line-breaks ul){display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}.custom-fields-component :is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul),.custom-fields-component :is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks){column-gap:calc(var(--spacing)*1.5);display:flex}.custom-fields-component :is(:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul)).fi-wrapped,.custom-fields-component :is(:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(ul.fi-ta-text-has-line-breaks),:is(ul.fi-ta-text.fi-ta-text-has-badges,.fi-ta-text.fi-ta-text-has-badges ul):not(.fi-ta-text-has-line-breaks ul)):is(.fi-wrapped ul){flex-wrap:wrap;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks){white-space:normal}.custom-fields-component .fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks) .fi-badge,.custom-fields-component .fi-ta-text.fi-wrapped:not(.fi-ta-text-has-badges.fi-ta-text-has-line-breaks) .fi-ta-text-list-limited-message{white-space:nowrap}.custom-fields-component .fi-ta-text>.fi-ta-text-description,.custom-fields-component .fi-ta-text>.fi-ta-text-list-limited-message{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component :is(.fi-ta-text>.fi-ta-text-description,.fi-ta-text>.fi-ta-text-list-limited-message):where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-text.fi-align-center{text-align:center}.custom-fields-component .fi-ta-text.fi-align-center ul,.custom-fields-component ul.fi-ta-text.fi-align-center{justify-content:center}.custom-fields-component .fi-ta-text.fi-align-end,.custom-fields-component .fi-ta-text.fi-align-right{text-align:end}.custom-fields-component :is(.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right) ul,.custom-fields-component ul:is(.fi-ta-text.fi-align-end,.fi-ta-text.fi-align-right){justify-content:flex-end}.custom-fields-component .fi-ta-text.fi-align-between,.custom-fields-component .fi-ta-text.fi-align-justify{text-align:justify}.custom-fields-component :is(.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between) ul,.custom-fields-component ul:is(.fi-ta-text.fi-align-justify,.fi-ta-text.fi-align-between){justify-content:space-between}.custom-fields-component .fi-ta-text-item{color:var(--gray-950)}.custom-fields-component .fi-ta-text-item:where(.dark,.dark *){color:var(--color-white)}@media (hover:hover){.custom-fields-component .fi-ta-text-item a:hover{text-decoration-line:underline}}.custom-fields-component .fi-ta-text-item a:focus-visible{text-decoration-line:underline}.custom-fields-component .fi-ta-text-item:not(.fi-bulleted li.fi-ta-text-item){-webkit-line-clamp:var(--line-clamp,none);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.custom-fields-component .fi-ta-text-item>.fi-copyable{cursor:pointer}.custom-fields-component .fi-ta-text-item.fi-size-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-ta-text-item.fi-size-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-text-item.fi-size-md{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .fi-ta-text-item.fi-size-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .fi-ta-text-item.fi-font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.custom-fields-component .fi-ta-text-item.fi-font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.custom-fields-component .fi-ta-text-item.fi-font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.custom-fields-component .fi-ta-text-item.fi-font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.custom-fields-component .fi-ta-text-item.fi-font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-text-item.fi-font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-ta-text-item.fi-font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.custom-fields-component .fi-ta-text-item.fi-font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.custom-fields-component .fi-ta-text-item.fi-font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.custom-fields-component .fi-ta-text-item.fi-font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.custom-fields-component .fi-ta-text-item.fi-font-serif{font-family:var(--serif-font-family),ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.custom-fields-component .fi-ta-text-item.fi-font-mono{font-family:var(--mono-font-family),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.custom-fields-component .fi-ta-text-item.fi-color{color:var(--text)}.custom-fields-component .fi-ta-text-item.fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component li.fi-ta-text-item.fi-color::marker{color:var(--gray-950)}.custom-fields-component li.fi-ta-text-item.fi-color:where(.dark,.dark *)::marker{color:var(--color-white)}.custom-fields-component .fi-ta-text-item.fi-color-gray{color:var(--gray-500)}.custom-fields-component .fi-ta-text-item.fi-color-gray:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component li.fi-ta-text-item.fi-color-gray::marker{color:var(--gray-950)}.custom-fields-component li.fi-ta-text-item.fi-color-gray:where(.dark,.dark *)::marker{color:var(--color-white)}.custom-fields-component .fi-ta-text-item>.fi-icon,.custom-fields-component .fi-ta-text-item>span:not(.fi-badge)>.fi-icon{color:var(--gray-400);display:inline-block;flex-shrink:0}.custom-fields-component :is(.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon):where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component :is(.fi-ta-text-item>.fi-icon,.fi-ta-text-item>span:not(.fi-badge)>.fi-icon).fi-color{color:var(--color-500)}.custom-fields-component .fi-ta-text-item.fi-ta-text-has-badges>.fi-badge{vertical-align:middle}@media (hover:hover){.custom-fields-component .fi-ta-col-has-column-url .fi-ta-text-item:hover{text-decoration-line:underline}}.custom-fields-component .fi-ta-col-has-column-url .fi-ta-text-item:focus-visible{text-decoration-line:underline}@media (hover:hover){.custom-fields-component .fi-ta-col-has-column-url .fi-ta-text-item .fi-icon:hover{text-decoration-line:none}}.custom-fields-component .fi-ta-col-has-column-url .fi-ta-text-item .fi-icon:focus-visible{text-decoration-line:none}@media (hover:hover){.custom-fields-component .fi-ta-col-has-column-url .fi-ta-text-item>.fi-badge:hover{text-decoration-line:none}}.custom-fields-component .fi-ta-col-has-column-url .fi-ta-text-item>.fi-badge:focus-visible{text-decoration-line:none}.custom-fields-component .fi-ta-text-input{min-width:calc(var(--spacing)*48);width:100%}.custom-fields-component .fi-ta-text-input:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-toggle{width:100%}.custom-fields-component .fi-ta-toggle:not(.fi-inline){padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-toggle.fi-align-center{text-align:center}.custom-fields-component .fi-ta-toggle.fi-align-end,.custom-fields-component .fi-ta-toggle.fi-align-right{text-align:end}.custom-fields-component .fi-ta-grid.fi-gap-sm{gap:calc(var(--spacing)*1)}@media (min-width:40rem){.custom-fields-component .fi-ta-grid.sm\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:48rem){.custom-fields-component .fi-ta-grid.md\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:64rem){.custom-fields-component .fi-ta-grid.lg\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:80rem){.custom-fields-component .fi-ta-grid.xl\:fi-gap-sm{gap:calc(var(--spacing)*1)}}@media (min-width:96rem){.custom-fields-component .fi-ta-grid.\32 xl\:fi-gap-sm{gap:calc(var(--spacing)*1)}}.custom-fields-component .fi-ta-grid.fi-gap-lg{gap:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-ta-grid.sm\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:48rem){.custom-fields-component .fi-ta-grid.md\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:64rem){.custom-fields-component .fi-ta-grid.lg\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:80rem){.custom-fields-component .fi-ta-grid.xl\:fi-gap-lg{gap:calc(var(--spacing)*3)}}@media (min-width:96rem){.custom-fields-component .fi-ta-grid.\32 xl\:fi-gap-lg{gap:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-panel{background-color:var(--gray-50);border-radius:var(--radius-lg);padding:calc(var(--spacing)*4);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-panel{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.custom-fields-component .fi-ta-panel{--tw-ring-inset:inset}.custom-fields-component .fi-ta-panel:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-panel:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-panel:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-panel:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-split{display:flex}.custom-fields-component .fi-ta-split.default\:fi-ta-split{align-items:center;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-split.\32 xl\:fi-ta-split,.custom-fields-component .fi-ta-split.lg\:fi-ta-split,.custom-fields-component .fi-ta-split.md\:fi-ta-split,.custom-fields-component .fi-ta-split.sm\:fi-ta-split,.custom-fields-component .fi-ta-split.xl\:fi-ta-split{flex-direction:column;gap:calc(var(--spacing)*2)}@media (min-width:40rem){.custom-fields-component .fi-ta-split.sm\:fi-ta-split{align-items:center;flex-direction:row;gap:calc(var(--spacing)*3)}}@media (min-width:48rem){.custom-fields-component .fi-ta-split.md\:fi-ta-split{align-items:center;flex-direction:row;gap:calc(var(--spacing)*3)}}@media (min-width:64rem){.custom-fields-component .fi-ta-split.lg\:fi-ta-split{align-items:center;flex-direction:row;gap:calc(var(--spacing)*3)}}@media (min-width:80rem){.custom-fields-component .fi-ta-split.xl\:fi-ta-split{align-items:center;flex-direction:row;gap:calc(var(--spacing)*3)}}@media (min-width:96rem){.custom-fields-component .fi-ta-split.\32 xl\:fi-ta-split{align-items:center;flex-direction:row;gap:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-stack{display:flex;flex-direction:column}.custom-fields-component .fi-ta-stack.fi-align-left,.custom-fields-component .fi-ta-stack.fi-align-start{align-items:flex-start}.custom-fields-component .fi-ta-stack.fi-align-center{align-items:center}.custom-fields-component .fi-ta-stack.fi-align-end,.custom-fields-component .fi-ta-stack.fi-align-right{align-items:flex-end}.custom-fields-component :where(.fi-ta-stack.fi-gap-sm>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}.custom-fields-component :where(.fi-ta-stack.fi-gap-md>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}.custom-fields-component :where(.fi-ta-stack.fi-gap-lg>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}.custom-fields-component .fi-ta-icon-count-summary{color:var(--gray-500);display:grid;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1.5)}.custom-fields-component .fi-ta-icon-count-summary:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-icon-count-summary>.fi-ta-icon-count-summary-label{--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-icon-count-summary>.fi-ta-icon-count-summary-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-icon-count-summary>ul{display:grid;row-gap:calc(var(--spacing)*1.5)}.custom-fields-component .fi-ta-icon-count-summary>ul>li{align-items:center;column-gap:calc(var(--spacing)*1.5);display:flex;justify-content:flex-end}.custom-fields-component .fi-ta-icon-count-summary>ul>li>.fi-icon{color:var(--gray-400)}.custom-fields-component .fi-ta-icon-count-summary>ul>li>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-ta-icon-count-summary>ul>li>.fi-icon.fi-color{color:var(--text)}.custom-fields-component .fi-ta-icon-count-summary>ul>li>.fi-icon.fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-ta-range-summary{color:var(--gray-500);display:grid;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-range-summary:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-range-summary>.fi-ta-range-summary-label{--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-range-summary>.fi-ta-range-summary-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-text-summary{color:var(--gray-500);display:grid;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-text-summary:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-text-summary>.fi-ta-text-summary-label{--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-text-summary>.fi-ta-text-summary-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-values-summary{color:var(--gray-500);display:grid;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-values-summary:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-values-summary>.fi-ta-values-summary-label{--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-values-summary>.fi-ta-values-summary-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-values-summary>ul.fi-bulleted{list-style-position:inside;list-style-type:disc}.custom-fields-component .fi-ta-ctn{background-color:var(--color-white);border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:flex;position:relative}.custom-fields-component .fi-ta-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn:not(.fi-ta-ctn-with-header){overflow:hidden}.custom-fields-component .fi-ta-ctn.fi-loading{animation:var(--animate-pulse)}.custom-fields-component .fi-ta-ctn .fi-ta-header-ctn{margin-top:-1px}.custom-fields-component .fi-ta-ctn .fi-ta-header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);display:flex;flex-direction:column;gap:calc(var(--spacing)*3);padding:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-header{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position{align-items:center;flex-direction:row}.custom-fields-component .fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position .fi-ta-actions{margin-inline-start:auto}}.custom-fields-component .fi-ta-ctn .fi-ta-header.fi-ta-header-adaptive-actions-position:not(:has(.fi-ta-header-heading)):not(:has(.fi-ta-header-description)) .fi-ta-actions{margin-inline-start:auto}.custom-fields-component .fi-ta-ctn .fi-ta-header .fi-ta-header-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-ta-ctn .fi-ta-header .fi-ta-header-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-ctn .fi-ta-header .fi-ta-header-description{color:var(--gray-600);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-ctn .fi-ta-header .fi-ta-header-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar{align-items:center;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*4);justify-content:space-between;padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar>*{align-items:center;column-gap:calc(var(--spacing)*4);display:flex}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar>:first-child{flex-shrink:0}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar>:nth-child(2){margin-inline-start:auto}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown.sm\:fi-hidden{display:none}}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields{display:grid;padding:calc(var(--spacing)*6);row-gap:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));row-gap:calc(var(--spacing)*2);--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);display:grid;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings .fi-dropdown .fi-ta-grouping-settings-fields label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings>.fi-ta-grouping-settings-fields{align-items:center;column-gap:calc(var(--spacing)*3);display:none}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-grouping-settings>.fi-ta-grouping-settings-fields{display:flex}}.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-col-manager-dropdown .fi-ta-col-manager,.custom-fields-component .fi-ta-ctn .fi-ta-header-toolbar .fi-ta-filters-dropdown .fi-ta-filters{padding:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-ctn .fi-ta-filters{display:grid;row-gap:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;padding:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-filters.fi-ta-filters-below-content:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-filters .fi-ta-filters-header{align-items:center;display:flex;justify-content:space-between}.custom-fields-component .fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-ta-filters-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-ta-filters-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-loading-indicator{color:var(--gray-400)}.custom-fields-component .fi-ta-ctn .fi-ta-filters .fi-ta-filters-header .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-ta-ctn .fi-ta-filters .fi-ta-filters-actions-ctn{display:flex;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);display:grid;padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn .fi-ta-filters-trigger-action-ctn{margin-inline-start:auto}.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn.fi-open .fi-ta-filters-trigger-action-ctn{margin-top:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-ctn .fi-ta-filters-above-content-ctn.fi-open:has(.fi-ta-filters-actions-ctn) .fi-ta-filters-trigger-action-ctn{margin-top:calc(var(--spacing)*-7)}.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator{align-items:center;background-color:var(--gray-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);column-gap:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3);--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);display:flex;font-weight:var(--font-weight-medium)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator .fi-loading-indicator{color:var(--gray-400)}.custom-fields-component .fi-ta-ctn .fi-ta-reorder-indicator .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator{background-color:var(--gray-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);display:flex;flex-direction:column;justify-content:space-between;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);row-gap:calc(var(--spacing)*1)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator{align-items:center;flex-direction:row;padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator .fi-loading-indicator{color:var(--gray-400)}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator .fi-loading-indicator:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator .fi-ta-selection-indicator-actions-ctn,.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator>*{column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator>:first-child{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator>:first-child:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-ta-ctn .fi-ta-selection-indicator>:nth-child(2){margin-inline-start:auto}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators{align-items:flex-start;background-color:var(--gray-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);column-gap:calc(var(--spacing)*3);display:flex;justify-content:space-between;padding-block:calc(var(--spacing)*1.5);padding-inline:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators>:first-child{column-gap:calc(var(--spacing)*3);display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators>:first-child{flex-direction:row}}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);font-weight:var(--font-weight-medium);white-space:nowrap}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-label:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators>:first-child .fi-ta-filter-indicators-badges-ctn{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*1.5)}.custom-fields-component .fi-ta-ctn .fi-ta-filter-indicators>:nth-child(2).fi-icon-btn{margin-top:calc(var(--spacing)*-1)}.custom-fields-component .fi-ta-ctn .fi-pagination{border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px;padding-block:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-ta-ctn .fi-pagination{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-ctn .fi-pagination:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-ctn .fi-pagination:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-ctn .fi-ta-table-loading-ctn{align-items:center;display:flex;height:calc(var(--spacing)*32);justify-content:center}.custom-fields-component .fi-ta-ctn .fi-ta-main{flex:1;min-width:calc(var(--spacing)*0)}@media (min-width:64rem){.custom-fields-component .fi-ta-ctn .fi-ta-filters-trigger-action-ctn.lg\:fi-hidden{display:none}}.custom-fields-component .fi-ta-ctn .fi-ta-filters-after-content-ctn,.custom-fields-component .fi-ta-ctn .fi-ta-filters-before-content-ctn{background-color:var(--color-white);border-color:var(--gray-200);border-radius:var(--radius-lg);z-index:20;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);width:100vw;--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:none;flex-shrink:0;max-width:14rem!important;position:absolute;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}@media (min-width:64rem){.custom-fields-component .fi-ta-ctn .fi-ta-filters-after-content-ctn,.custom-fields-component .fi-ta-ctn .fi-ta-filters-before-content-ctn{z-index:auto;--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:static}}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn) .fi-ta-filters{padding:calc(var(--spacing)*6)}@media (min-width:64rem){.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn) .fi-ta-filters{padding-block:calc(var(--spacing)*4)}}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-open{display:block}@media (min-width:64rem){.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).lg\:fi-open{display:block}}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-opacity-0{opacity:0}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-xs{max-width:var(--container-xs)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-sm{max-width:var(--container-sm)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-md{max-width:var(--container-md)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-lg{max-width:var(--container-lg)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-xl{max-width:var(--container-xl)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-2xl{max-width:var(--container-2xl)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-3xl{max-width:var(--container-3xl)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-4xl{max-width:var(--container-4xl)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-5xl{max-width:var(--container-5xl)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-6xl{max-width:var(--container-6xl)!important}.custom-fields-component :is(.fi-ta-ctn .fi-ta-filters-before-content-ctn,.fi-ta-ctn .fi-ta-filters-after-content-ctn).fi-width-7xl{max-width:var(--container-7xl)!important}.custom-fields-component .fi-ta-ctn .fi-ta-filters-before-content-ctn{inset-inline-start:calc(var(--spacing)*0)}@media (min-width:64rem){.custom-fields-component .fi-ta-ctn .fi-ta-filters-before-content-ctn{border-end-end-radius:0;border-end-start-radius:var(--radius-xl);border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-start-end-radius:0;border-start-start-radius:var(--radius-xl)}}.custom-fields-component .fi-ta-ctn .fi-ta-filters-after-content-ctn{inset-inline-end:calc(var(--spacing)*0)}@media (min-width:64rem){.custom-fields-component .fi-ta-ctn .fi-ta-filters-after-content-ctn{border-end-end-radius:var(--radius-xl);border-end-start-radius:0;border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-start-end-radius:var(--radius-xl);border-start-start-radius:0}}.custom-fields-component .fi-ta-content-ctn{position:relative}.custom-fields-component :where(.fi-ta-content-ctn>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-ta-content-ctn{overflow-x:auto}.custom-fields-component :where(.fi-ta-content-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-ta-content-ctn:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-content-ctn:where(.dark,.dark *){border-top-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn:where(.dark,.dark *){border-top-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content-header{align-items:center;background-color:var(--gray-50);gap:calc(var(--spacing)*4);column-gap:calc(var(--spacing)*6);display:flex;padding-inline:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content-header{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content-header:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content-header .fi-ta-page-checkbox{flex-shrink:0;margin-block:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content-header .fi-ta-sorting-settings{column-gap:calc(var(--spacing)*3);display:flex;padding-block:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-content-ctn:not(.fi-ta-ctn-with-footer .fi-ta-content-ctn){border-bottom-left-radius:var(--radius-xl);border-bottom-right-radius:var(--radius-xl)}.custom-fields-component .fi-ta-content-ctn:not(.fi-ta-ctn-with-header .fi-ta-content-ctn){border-top-style:var(--tw-border-style);border-top-width:0}.custom-fields-component .fi-ta-content-ctn .fi-ta-content{display:grid}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid{gap:calc(var(--spacing)*4);padding:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid{padding-inline:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid.fi-ta-content-grouped{padding-top:calc(var(--spacing)*0)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{border-block-style:var(--tw-border-style);border-block-width:1px;border-color:var(--gray-200);margin-inline:calc(var(--spacing)*-4)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:first-child{border-top-style:var(--tw-border-style);border-top-width:0}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{margin-inline:calc(var(--spacing)*-6)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{width:calc(100% + 2rem)}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-group-header{width:calc(100% + 3rem)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record{border-radius:var(--radius-xl);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (hover:hover){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-selected:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected){background-color:var(--color-white)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record:not(.fi-selected):where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-record-content{padding-inline-start:calc(var(--spacing)*2)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content.fi-ta-content-grid .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-record-content{padding-inline-end:calc(var(--spacing)*2)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid){background-color:var(--gray-200);row-gap:1px}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}@media (hover:hover){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:before{background-color:var(--primary-600);content:var(--tw-content);inset-block:calc(var(--spacing)*0);inset-inline-start:calc(var(--spacing)*0);position:absolute;width:calc(var(--spacing)*.5)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-selected:where(.dark,.dark *):before{background-color:var(--primary-500);content:var(--tw-content)}@media (min-width:48rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record .fi-ta-record-content-ctn{align-items:center;flex-direction:row}}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-record-content{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-record-content{padding-inline-end:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix{padding-inline-start:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-prefix .fi-ta-record-content{padding-inline-start:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix{padding-inline-end:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record.fi-ta-record-with-content-suffix .fi-ta-record-content{padding-inline-end:calc(var(--spacing)*3)}@media (min-width:48rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content:not(.fi-ta-content-grid) .fi-ta-record .fi-ta-actions{padding-inline-start:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header{align-items:center;background-color:var(--gray-50);column-gap:calc(var(--spacing)*3);display:flex;grid-column:1/-1;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*1);width:100%}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header{padding-inline:calc(var(--spacing)*3)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header.fi-collapsible{cursor:pointer}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header.fi-collapsible.fi-collapsed .fi-icon-btn{rotate:-180deg}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-group-header .fi-ta-group-checkbox{margin-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-table{grid-column:1/-1}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record{background-color:var(--color-white);height:100%;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;align-items:center;display:flex;position:relative;transition-duration:75ms}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-with-content-prefix{padding-inline-start:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-with-content-suffix{padding-inline-end:calc(var(--spacing)*1)}@media (hover:hover){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-clickable:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-collapsed{display:none}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-selected{background-color:var(--gray-50)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-reorder-handle{margin-block:calc(var(--spacing)*2);margin-inline:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-checkbox{flex-shrink:0;margin-block:calc(var(--spacing)*4);margin-inline:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn{display:flex;flex-direction:column;height:100%;padding-block:calc(var(--spacing)*4);row-gap:calc(var(--spacing)*3);width:100%}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn>:first-child{flex:1}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content{display:block;width:100%}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col{display:flex;justify-content:flex-start;text-align:start}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col:disabled{pointer-events:none}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-growable{width:100%}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-center{justify-content:center;text-align:center}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-end{justify-content:flex-end;text-align:end}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-left{justify-content:flex-start;text-align:left}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-right{justify-content:flex-end;text-align:right}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-between,.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-ta-col.fi-align-justify{justify-content:space-between;text-align:justify}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content.fi-collapsible{margin-top:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .fi-growable{flex:1;width:100%}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-hidden{display:none}}@media (min-width:48rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-hidden{display:none}}@media (min-width:64rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-hidden{display:none}}@media (min-width:80rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-hidden{display:none}}@media (min-width:96rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-hidden{display:none}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-visible{display:none}@media (min-width:40rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .sm\:fi-visible{display:block}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-visible{display:none}@media (min-width:48rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .md\:fi-visible{display:block}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-visible{display:none}@media (min-width:64rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .lg\:fi-visible{display:block}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-visible{display:none}@media (min-width:80rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .xl\:fi-visible{display:block}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-visible{display:none}@media (min-width:96rem){.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-content-ctn .fi-ta-record-content .\32 xl\:fi-visible{display:block}}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-record-collapse-btn{flex-shrink:0;margin-block:calc(var(--spacing)*2);margin-inline:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record .fi-ta-actions.fi-ta-actions-before-columns-position{order:-9999}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-prefix) .fi-ta-record-content{padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-actions,.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record:not(.fi-ta-record-with-content-suffix) .fi-ta-record-content{padding-inline-end:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-content-ctn .fi-ta-content .fi-ta-record.fi-ta-record-collapsed .fi-ta-record-collapse-btn{rotate:180deg}.custom-fields-component .fi-ta-empty-state{padding-block:calc(var(--spacing)*12);padding-inline:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state){border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:1px}.custom-fields-component .fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state):where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-empty-state:not(.fi-ta-ctn-with-content-layout .fi-ta-empty-state):where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-content{display:grid;justify-items:center;margin-inline:auto;max-width:var(--container-lg);text-align:center}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-icon-bg{background-color:var(--gray-100);border-radius:3.40282e+38px;margin-bottom:calc(var(--spacing)*4);padding:calc(var(--spacing)*3)}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-icon-bg:where(.dark,.dark *){background-color:var(--gray-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-icon-bg:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-500)20%,transparent)}}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-icon-bg .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-icon-bg .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-ta-empty-state .fi-ta-empty-state-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-empty-state .fi-ta-actions{margin-top:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-header-cell{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*3.5);padding-inline:calc(var(--spacing)*3);text-align:start;--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}@media (min-width:40rem){.custom-fields-component .fi-ta-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-header-cell:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-header-cell.fi-growable{width:100%}.custom-fields-component .fi-ta-header-cell.fi-grouped{border-color:var(--gray-200)}.custom-fields-component .fi-ta-header-cell.fi-grouped:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-header-cell.fi-grouped:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-header-cell.fi-grouped:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .fi-ta-header-cell.fi-grouped:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-ta-header-cell.fi-align-center{text-align:center}.custom-fields-component .fi-ta-header-cell.fi-align-center .fi-ta-header-cell-sort-btn{justify-content:center}.custom-fields-component .fi-ta-header-cell.fi-align-end{text-align:end}.custom-fields-component .fi-ta-header-cell.fi-align-end .fi-ta-header-cell-sort-btn{justify-content:flex-end}.custom-fields-component .fi-ta-header-cell.fi-align-left{text-align:left}.custom-fields-component .fi-ta-header-cell.fi-align-left .fi-ta-header-cell-sort-btn{justify-content:flex-start}.custom-fields-component .fi-ta-header-cell.fi-align-left .fi-ta-header-cell-sort-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.custom-fields-component .fi-ta-header-cell.fi-align-right{text-align:right}.custom-fields-component .fi-ta-header-cell.fi-align-right .fi-ta-header-cell-sort-btn{justify-content:flex-end}.custom-fields-component .fi-ta-header-cell.fi-align-right .fi-ta-header-cell-sort-btn:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.custom-fields-component .fi-ta-header-cell.fi-align-between,.custom-fields-component .fi-ta-header-cell.fi-align-justify{text-align:justify}.custom-fields-component :is(.fi-ta-header-cell.fi-align-justify,.fi-ta-header-cell.fi-align-between) .fi-ta-header-cell-sort-btn{justify-content:space-between}.custom-fields-component .fi-ta-header-cell.fi-ta-header-cell-sorted .fi-icon{color:var(--gray-950)}.custom-fields-component .fi-ta-header-cell.fi-ta-header-cell-sorted .fi-icon:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-icon{color:var(--gray-400)}.custom-fields-component .fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-icon:where(.dark,.dark *),.custom-fields-component .fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:hover .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:focus-visible .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-ta-header-cell:not(.fi-ta-header-cell-sorted) .fi-ta-header-cell-sort-btn:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}@media (min-width:40rem){.custom-fields-component .fi-ta-header-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.custom-fields-component .fi-ta-header-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.custom-fields-component .fi-ta-header-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.custom-fields-component .fi-ta-header-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.custom-fields-component .fi-ta-header-cell.\32 xl\:fi-hidden{display:none}}.custom-fields-component .fi-ta-header-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.custom-fields-component .fi-ta-header-cell.sm\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-cell.md\:fi-visible{display:none}@media (min-width:48rem){.custom-fields-component .fi-ta-header-cell.md\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.custom-fields-component .fi-ta-header-cell.lg\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.custom-fields-component .fi-ta-header-cell.xl\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.custom-fields-component .fi-ta-header-cell.\32 xl\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-cell.fi-wrapped{white-space:normal}.custom-fields-component .fi-ta-header-cell:not(.fi-wrapped){white-space:nowrap}.custom-fields-component .fi-ta-header-cell .fi-ta-header-cell-sort-btn{align-items:center;column-gap:calc(var(--spacing)*1);cursor:pointer;display:flex;justify-content:flex-start;width:100%}.custom-fields-component .fi-ta-header-cell .fi-icon{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;flex-shrink:0;transition-duration:75ms}.custom-fields-component .fi-ta-header-group-cell{border-color:var(--gray-200);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}@media (min-width:40rem){.custom-fields-component .fi-ta-header-group-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-header-group-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-header-group-cell:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-header-group-cell:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-header-group-cell:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-header-group-cell:not(:first-of-type){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .fi-ta-header-group-cell:not(:last-of-type){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.custom-fields-component .fi-ta-header-group-cell.fi-align-start{text-align:start}.custom-fields-component .fi-ta-header-group-cell.fi-align-center{text-align:center}.custom-fields-component .fi-ta-header-group-cell.fi-align-end{text-align:end}.custom-fields-component .fi-ta-header-group-cell.fi-align-left{text-align:left}.custom-fields-component .fi-ta-header-group-cell.fi-align-right{text-align:right}.custom-fields-component .fi-ta-header-group-cell.fi-align-between,.custom-fields-component .fi-ta-header-group-cell.fi-align-justify{text-align:justify}@media (min-width:40rem){.custom-fields-component .fi-ta-header-group-cell.sm\:fi-hidden{display:none}}@media (min-width:48rem){.custom-fields-component .fi-ta-header-group-cell.md\:fi-hidden{display:none}}@media (min-width:64rem){.custom-fields-component .fi-ta-header-group-cell.lg\:fi-hidden{display:none}}@media (min-width:80rem){.custom-fields-component .fi-ta-header-group-cell.xl\:fi-hidden{display:none}}@media (min-width:96rem){.custom-fields-component .fi-ta-header-group-cell.\32 xl\:fi-hidden{display:none}}.custom-fields-component .fi-ta-header-group-cell.sm\:fi-visible{display:none}@media (min-width:40rem){.custom-fields-component .fi-ta-header-group-cell.sm\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-group-cell.md\:fi-visible{display:none}@media (min-width:48rem){.custom-fields-component .fi-ta-header-group-cell.md\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-group-cell.lg\:fi-visible{display:none}@media (min-width:64rem){.custom-fields-component .fi-ta-header-group-cell.lg\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-group-cell.xl\:fi-visible{display:none}@media (min-width:80rem){.custom-fields-component .fi-ta-header-group-cell.xl\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-group-cell.\32 xl\:fi-visible{display:none}@media (min-width:96rem){.custom-fields-component .fi-ta-header-group-cell.\32 xl\:fi-visible{display:table-cell}}.custom-fields-component .fi-ta-header-group-cell.fi-wrapped{white-space:normal}.custom-fields-component .fi-ta-header-group-cell:not(.fi-wrapped){white-space:nowrap}.custom-fields-component .fi-ta-empty-header-cell{width:calc(var(--spacing)*1)}@media (hover:hover){.custom-fields-component .fi-ta-row{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-ta-row.fi-clickable:hover{background-color:var(--gray-50)}.custom-fields-component .fi-ta-row.fi-clickable:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-row.fi-clickable:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-ta-row.fi-striped{background-color:var(--gray-50)}.custom-fields-component .fi-ta-row.fi-striped:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-row.fi-striped:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-row.fi-collapsed{display:none}.custom-fields-component .fi-ta-row.fi-ta-group-header-row>td{background-color:var(--gray-50)}.custom-fields-component .fi-ta-row.fi-ta-group-header-row>td:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-row.fi-ta-group-header-row>td:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-row .fi-ta-group-header-cell{padding-inline:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-ta-row .fi-ta-group-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-row .fi-ta-group-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.custom-fields-component .fi-ta-row .fi-ta-group-header{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;padding-block:calc(var(--spacing)*2);width:100%}.custom-fields-component .fi-ta-row .fi-ta-group-header.fi-collapsible{cursor:pointer}.custom-fields-component .fi-ta-row .fi-ta-group-header.fi-collapsible.fi-collapsed .fi-icon-btn{rotate:-180deg}.custom-fields-component .fi-ta-row .fi-ta-group-header .fi-ta-group-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-row .fi-ta-group-header .fi-ta-group-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-row .fi-ta-group-header .fi-ta-group-description{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-ta-row .fi-ta-group-header .fi-ta-group-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-ta-row.fi-selected:not(.fi-striped){background-color:var(--gray-50)}.custom-fields-component .fi-ta-row.fi-selected:not(.fi-striped):where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-row.fi-selected:not(.fi-striped):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-row.fi-selected>:first-child{position:relative}.custom-fields-component .fi-ta-row.fi-selected>:first-child:before{background-color:var(--primary-600);content:"";inset-block:calc(var(--spacing)*0);inset-inline-start:calc(var(--spacing)*0);position:absolute;width:calc(var(--spacing)*.5)}.custom-fields-component .fi-ta-row.fi-selected>:first-child:where(.dark,.dark *):before{background-color:var(--primary-500)}.custom-fields-component .fi-ta-reordering .fi-ta-row:not(.fi-ta-row-not-reorderable){cursor:move}.custom-fields-component .fi-ta-table{table-layout:auto;width:100%}.custom-fields-component :where(.fi-ta-table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-ta-table{text-align:start}.custom-fields-component :where(.fi-ta-table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-ta-table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component :where(.fi-ta-table>thead>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-ta-table>thead:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-ta-table>thead:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-table>thead>tr{background-color:var(--gray-50)}.custom-fields-component .fi-ta-table>thead>tr:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-table>thead>tr:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-table>thead>tr.fi-ta-table-head-groups-row{background-color:var(--gray-100)}.custom-fields-component .fi-ta-table>thead>tr.fi-ta-table-head-groups-row:where(.dark,.dark *){background-color:#0000}.custom-fields-component :where(.fi-ta-table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component .fi-ta-table>tbody{white-space:nowrap}.custom-fields-component :where(.fi-ta-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-ta-table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-table>tfoot{background-color:var(--gray-50)}.custom-fields-component .fi-ta-table>tfoot:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-ta-table>tfoot:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-ta-col-manager{display:grid;row-gap:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-ctn{display:grid;gap:calc(var(--spacing)*4)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-header{align-items:center;display:flex;justify-content:space-between}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-items{column-gap:calc(var(--spacing)*6);margin-top:calc(var(--spacing)*-6)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-item{align-items:center;break-inside:avoid;display:flex;gap:calc(var(--spacing)*3);padding-top:calc(var(--spacing)*6)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label{align-items:center;column-gap:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));width:100%;--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);display:flex;flex:1;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-label .fi-checkbox-input{flex-shrink:0}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-item .fi-ta-col-manager-reorder-handle{cursor:move}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-group{break-inside:avoid}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-group .fi-ta-col-manager-group-items{padding-inline-start:calc(var(--spacing)*8)}.custom-fields-component .fi-ta-col-manager .fi-ta-col-manager-actions-ctn{display:flex;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-wi-chart .fi-wi-chart-canvas-ctn{margin-inline:auto}.custom-fields-component .fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1}@supports (container-type:inline-size){.custom-fields-component .fi-wi-chart .fi-section-content{container-type:inline-size}@container (min-width:24rem){.custom-fields-component .fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1.5}}}@supports not (container-type:inline-size){@media (min-width:40rem){.custom-fields-component .fi-wi-chart .fi-wi-chart-canvas-ctn:not(.fi-wi-chart-canvas-ctn-no-aspect-ratio){aspect-ratio:1.5}}}.custom-fields-component .fi-wi-chart .fi-wi-chart-filter.fi-input-wrp{width:max-content}@media (min-width:40rem){.custom-fields-component .fi-wi-chart .fi-wi-chart-filter.fi-input-wrp{margin-block:calc(var(--spacing)*-2)}}.custom-fields-component .fi-wi-chart .fi-wi-chart-filter.fi-dropdown .fi-wi-chart-filter-content{padding:calc(var(--spacing)*6)}.custom-fields-component .fi-wi-chart .fi-color .fi-wi-chart-bg-color{color:var(--color-50)}.custom-fields-component .fi-wi-chart .fi-color .fi-wi-chart-bg-color:where(.dark,.dark *){color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-wi-chart .fi-color .fi-wi-chart-bg-color:where(.dark,.dark *){color:color-mix(in oklab,var(--color-400)10%,transparent)}}.custom-fields-component .fi-wi-chart .fi-color .fi-wi-chart-border-color{color:var(--color-500)}.custom-fields-component .fi-wi-chart .fi-color .fi-wi-chart-border-color:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-wi-chart .fi-wi-chart-bg-color{color:var(--gray-100)}.custom-fields-component .fi-wi-chart .fi-wi-chart-bg-color:where(.dark,.dark *){color:var(--gray-800)}.custom-fields-component .fi-wi-chart .fi-wi-chart-border-color{color:var(--gray-400)}.custom-fields-component .fi-wi-chart .fi-wi-chart-grid-color{color:var(--gray-200)}.custom-fields-component .fi-wi-chart .fi-wi-chart-grid-color:where(.dark,.dark *){color:var(--gray-800)}.custom-fields-component .fi-wi-chart .fi-wi-chart-text-color{color:var(--gray-500)}.custom-fields-component .fi-wi-chart .fi-wi-chart-text-color:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-wi-stats-overview-stat{background-color:var(--color-white);border-radius:var(--radius-xl);height:100%;padding:calc(var(--spacing)*6);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);display:block;position:relative}.custom-fields-component .fi-wi-stats-overview-stat:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-wi-stats-overview-stat:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-wi-stats-overview-stat .fi-icon{color:var(--gray-400);flex-shrink:0}.custom-fields-component .fi-wi-stats-overview-stat .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-content{display:grid;row-gap:calc(var(--spacing)*2)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label-ctn{align-items:center;column-gap:calc(var(--spacing)*2);display:flex}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);color:var(--gray-950);letter-spacing:var(--tracking-tight)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description{align-items:center;color:var(--gray-500);column-gap:calc(var(--spacing)*1);display:flex;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color{color:var(--text)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color:where(.dark,.dark *){color:var(--dark-text)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-description.fi-color .fi-icon{color:var(--color-500)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart{border-bottom-left-radius:var(--radius-xl);border-bottom-right-radius:var(--radius-xl);inset-inline:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);overflow:hidden;position:absolute}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart>canvas{height:calc(var(--spacing)*6)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-bg-color{color:var(--gray-100)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:var(--gray-800)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart .fi-wi-stats-overview-stat-chart-border-color{color:var(--gray-400)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color{color:var(--color-50)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:var(--color-400)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-bg-color:where(.dark,.dark *){color:color-mix(in oklab,var(--color-400)10%,transparent)}}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-border-color{color:var(--color-500)}.custom-fields-component .fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-chart.fi-color .fi-wi-stats-overview-stat-chart-border-color:where(.dark,.dark *){color:var(--color-400)}.custom-fields-component .fi-wi{gap:calc(var(--spacing)*6)}.custom-fields-component .fi-global-search-ctn{align-items:center;display:flex}.custom-fields-component .fi-global-search{flex:1}@media (min-width:40rem){.custom-fields-component .fi-global-search{position:relative}}.custom-fields-component .fi-global-search-results-ctn{background-color:var(--color-white);border-radius:var(--radius-lg);inset-inline:calc(var(--spacing)*4);margin-top:calc(var(--spacing)*2);max-height:calc(var(--spacing)*96);z-index:10;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);overflow:auto;position:absolute;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}@media (min-width:40rem){.custom-fields-component .fi-global-search-results-ctn{inset-inline:auto}}.custom-fields-component .fi-global-search-results-ctn:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-global-search-results-ctn:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-global-search-results-ctn{transform:translateZ(0)}.custom-fields-component .fi-global-search-results-ctn.fi-transition-enter-start,.custom-fields-component .fi-global-search-results-ctn.fi-transition-leave-end{opacity:0}@media (min-width:40rem){.custom-fields-component .fi-topbar .fi-global-search-results-ctn{inset-inline-end:calc(var(--spacing)*0);max-width:var(--container-sm);width:100vw}}.custom-fields-component .fi-sidebar .fi-global-search-ctn{margin-inline:calc(var(--spacing)*3);margin-top:calc(var(--spacing)*3)}@media (min-width:40rem){.custom-fields-component .fi-sidebar .fi-global-search-results-ctn{inset-inline-start:calc(var(--spacing)*0)}}.custom-fields-component .fi-global-search-no-results-message{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*4);padding-inline:calc(var(--spacing)*4)}.custom-fields-component .fi-global-search-no-results-message:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component :where(.fi-global-search-results>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-global-search-results:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-global-search-results:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-global-search-result-group-header{background-color:var(--gray-50);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*4);top:calc(var(--spacing)*0);z-index:10;--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);font-weight:var(--font-weight-semibold);position:sticky;text-transform:capitalize}.custom-fields-component .fi-global-search-result-group-header:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-global-search-result-group-header:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-global-search-result-group-header:where(.dark,.dark *){background-color:var(--gray-800);color:var(--color-white)}.custom-fields-component :where(.fi-global-search-result-group-results>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-color:var(--gray-200);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.fi-global-search-result-group-results:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.fi-global-search-result-group-results:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-global-search-result{scroll-margin-top:calc(var(--spacing)*9);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-global-search-result:focus-within{background-color:var(--gray-50)}@media (hover:hover){.custom-fields-component .fi-global-search-result:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-global-search-result:where(.dark,.dark *):focus-within{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-global-search-result:where(.dark,.dark *):focus-within{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}@media (hover:hover){.custom-fields-component .fi-global-search-result:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-global-search-result:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-global-search-result.fi-global-search-result-has-actions .fi-global-search-result-link{padding-bottom:calc(var(--spacing)*0)}.custom-fields-component .fi-global-search-result-link{padding:calc(var(--spacing)*4);--tw-outline-style:none;display:block;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-global-search-result-link{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-global-search-result-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-950);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-global-search-result-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-global-search-result-details{margin-top:calc(var(--spacing)*1)}.custom-fields-component .fi-global-search-result-detail{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-global-search-result-detail:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-global-search-result-detail-label{--tw-font-weight:var(--font-weight-medium);display:inline;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-global-search-result-detail-value{display:inline}.custom-fields-component .fi-global-search-result-actions{column-gap:calc(var(--spacing)*3);display:flex;margin-top:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*4)}.custom-fields-component .fi-header{display:flex;flex-direction:column;gap:calc(var(--spacing)*4)}@media (min-width:40rem){.custom-fields-component .fi-header{align-items:center;flex-direction:row;justify-content:space-between}}.custom-fields-component .fi-header .fi-breadcrumbs{display:none;margin-bottom:calc(var(--spacing)*2)}@media (min-width:40rem){.custom-fields-component .fi-header .fi-breadcrumbs{display:block}.custom-fields-component .fi-header.fi-header-has-breadcrumbs .fi-header-actions-ctn{margin-top:calc(var(--spacing)*7)}}.custom-fields-component .fi-header-heading{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);color:var(--gray-950);letter-spacing:var(--tracking-tight)}@media (min-width:40rem){.custom-fields-component .fi-header-heading{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}.custom-fields-component .fi-header-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-header-subheading{color:var(--gray-600);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));margin-top:calc(var(--spacing)*2);max-width:var(--container-2xl)}.custom-fields-component .fi-header-subheading:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-header-actions-ctn{align-items:center;display:flex;flex-shrink:0;gap:calc(var(--spacing)*3)}.custom-fields-component .fi-header-actions-ctn>.fi-ac{flex:1}.custom-fields-component .fi-header-actions-ctn>.fi-ac:not(.fi-width-full).fi-align-end,.custom-fields-component .fi-header-actions-ctn>.fi-ac:not(.fi-width-full).fi-align-right{flex-direction:row;justify-content:flex-end}.custom-fields-component .fi-simple-header{align-items:center;display:flex;flex-direction:column}.custom-fields-component .fi-simple-header .fi-logo{margin-bottom:calc(var(--spacing)*4)}.custom-fields-component .fi-simple-header-heading{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));text-align:center;--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);color:var(--gray-950);letter-spacing:var(--tracking-tight)}.custom-fields-component .fi-simple-header-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-simple-header-subheading{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));margin-top:calc(var(--spacing)*2);text-align:center}.custom-fields-component .fi-simple-header-subheading:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component html.fi{min-height:100dvh}.custom-fields-component .fi-body{background-color:var(--gray-50);--tw-font-weight:var(--font-weight-normal);color:var(--gray-950);font-weight:var(--font-weight-normal);min-height:100dvh;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.custom-fields-component .fi-body:where(.dark,.dark *){background-color:var(--gray-950);color:var(--color-white)}.custom-fields-component :is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-main-ctn{min-height:calc(100dvh - 4rem);opacity:0;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .fi-body>.fi-layout-sidebar-toggle-btn-ctn{padding-inline-start:calc(var(--spacing)*5);padding-top:calc(var(--spacing)*5)}@media (min-width:64rem){.custom-fields-component .fi-body>.fi-layout-sidebar-toggle-btn-ctn.lg\:fi-hidden{display:none}}.custom-fields-component .fi-body.fi-body-has-navigation:not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop):not(.fi-body-has-top-navigation) .fi-main-ctn{opacity:0}.custom-fields-component :is(.fi-body.fi-body-has-top-navigation,.fi-body:not(.fi-body-has-navigation)) .fi-main-ctn{display:flex;min-height:calc(100dvh - 4rem)}.custom-fields-component .fi-body:not(.fi-body-has-topbar) .fi-main-ctn{display:flex;min-height:100dvh}.custom-fields-component .fi-layout{display:flex;height:100%;overflow-x:clip;width:100%}.custom-fields-component .fi-main-ctn{flex:1;flex-direction:column;width:100vw}.custom-fields-component .fi-main{height:100%;margin-inline:auto;padding-inline:calc(var(--spacing)*4);width:100%}@media (min-width:48rem){.custom-fields-component .fi-main{padding-inline:calc(var(--spacing)*6)}}@media (min-width:64rem){.custom-fields-component .fi-main{padding-inline:calc(var(--spacing)*8)}}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-xs{max-width:var(--container-xs)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-sm{max-width:var(--container-sm)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-md{max-width:var(--container-md)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-lg{max-width:var(--container-lg)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-xl{max-width:var(--container-xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-2xl{max-width:var(--container-2xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-3xl{max-width:var(--container-3xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-4xl{max-width:var(--container-4xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-5xl{max-width:var(--container-5xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-6xl{max-width:var(--container-6xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-7xl{max-width:var(--container-7xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-full{max-width:100%}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-min{max-width:min-content}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-max{max-width:max-content}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-fit{max-width:fit-content}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-prose{max-width:65ch}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-screen-sm{max-width:var(--breakpoint-sm)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-screen-md{max-width:var(--breakpoint-md)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-screen-lg{max-width:var(--breakpoint-lg)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-screen-xl{max-width:var(--breakpoint-xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-screen-2xl{max-width:var(--breakpoint-2xl)}.custom-fields-component :is(.fi-main,.fi-simple-main).fi-width-screen{inset:calc(var(--spacing)*0);position:fixed}.custom-fields-component .fi-simple-layout{align-items:center;display:flex;flex-direction:column;min-height:100dvh}.custom-fields-component .fi-simple-layout-header{align-items:center;column-gap:calc(var(--spacing)*4);display:flex;height:calc(var(--spacing)*16);inset-inline-end:calc(var(--spacing)*0);padding-inline-end:calc(var(--spacing)*4);position:absolute;top:calc(var(--spacing)*0)}@media (min-width:48rem){.custom-fields-component .fi-simple-layout-header{padding-inline-end:calc(var(--spacing)*6)}}@media (min-width:64rem){.custom-fields-component .fi-simple-layout-header{padding-inline-end:calc(var(--spacing)*8)}}.custom-fields-component .fi-simple-main-ctn{align-items:center;display:flex;flex-grow:1;justify-content:center;width:100%}.custom-fields-component .fi-simple-main{background-color:var(--color-white);margin-block:calc(var(--spacing)*16);padding-block:calc(var(--spacing)*12);padding-inline:calc(var(--spacing)*6);width:100%;--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:40rem){.custom-fields-component .fi-simple-main{border-radius:var(--radius-xl);padding-inline:calc(var(--spacing)*12)}}.custom-fields-component .fi-simple-main:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-simple-main:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-logo{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-tight);color:var(--gray-950);display:flex;letter-spacing:var(--tracking-tight)}.custom-fields-component .fi-logo:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-logo.fi-logo-dark,.custom-fields-component .fi-logo.fi-logo-light:where(.dark,.dark *){display:none}.custom-fields-component .fi-logo.fi-logo-dark:where(.dark,.dark *){display:flex}@media (min-width:48rem){.custom-fields-component .fi-page-sub-navigation-dropdown{display:none}}.custom-fields-component .fi-page-sub-navigation-dropdown>.fi-dropdown-trigger>.fi-btn{justify-content:space-between;width:100%}.custom-fields-component .fi-page-sub-navigation-sidebar-ctn{display:none;flex-direction:column;width:calc(var(--spacing)*72)}@media (min-width:48rem){.custom-fields-component .fi-page-sub-navigation-sidebar-ctn{display:flex}}.custom-fields-component .fi-page-sub-navigation-sidebar{display:flex;flex-direction:column;row-gap:calc(var(--spacing)*7)}.custom-fields-component .fi-page-sub-navigation-tabs{display:none}@media (min-width:48rem){.custom-fields-component .fi-page-sub-navigation-tabs{display:flex}}.custom-fields-component .fi-page.fi-height-full,.custom-fields-component .fi-page.fi-height-full .fi-page-content,.custom-fields-component .fi-page.fi-height-full .fi-page-header-main-ctn,.custom-fields-component .fi-page.fi-height-full .fi-page-main{height:100%}.custom-fields-component .fi-page.fi-page-has-sub-navigation .fi-page-main{display:flex;flex-direction:column;gap:calc(var(--spacing)*8)}@media (min-width:48rem){.custom-fields-component :is(.fi-page.fi-page-has-sub-navigation.fi-page-has-sub-navigation-start,.fi-page.fi-page-has-sub-navigation.fi-page-has-sub-navigation-end) .fi-page-main{align-items:flex-start;flex-direction:row}}.custom-fields-component .fi-page-header-main-ctn{display:flex;flex-direction:column;padding-block:calc(var(--spacing)*8);row-gap:calc(var(--spacing)*8)}.custom-fields-component .fi-page-main-sub-navigation-mobile-menu-render-hook-ctn{display:contents}@media (min-width:48rem){.custom-fields-component .fi-page-main-sub-navigation-mobile-menu-render-hook-ctn{display:none}}.custom-fields-component .fi-page-content{display:grid;flex:1;grid-auto-columns:minmax(0,1fr);row-gap:calc(var(--spacing)*8)}.custom-fields-component .fi-simple-page-content{display:grid;grid-auto-columns:minmax(0,1fr);row-gap:calc(var(--spacing)*6)}.custom-fields-component .fi-sidebar-group{display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-sidebar-group.fi-collapsed .fi-sidebar-group-collapse-btn{rotate:-180deg}.custom-fields-component .fi-sidebar-group.fi-collapsible>.fi-sidebar-group-btn{cursor:pointer}.custom-fields-component .fi-sidebar-group.fi-active .fi-sidebar-group-dropdown-trigger-btn .fi-icon{color:var(--primary-600)}.custom-fields-component .fi-sidebar-group.fi-active .fi-sidebar-group-dropdown-trigger-btn .fi-icon:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-sidebar-group-btn{align-items:center;column-gap:calc(var(--spacing)*3);display:flex;padding:calc(var(--spacing)*2)}.custom-fields-component .fi-sidebar-group-btn .fi-icon{color:var(--gray-400)}.custom-fields-component .fi-sidebar-group-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-sidebar-group-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-medium);color:var(--gray-500);flex:1;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-sidebar-group-label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*3);justify-content:center;padding:calc(var(--spacing)*2);--tw-outline-style:none;display:flex;flex:1;outline-style:none;position:relative}@media (forced-colors:active){.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn:hover{background-color:var(--gray-100)}}.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn .fi-icon{color:var(--gray-400)}.custom-fields-component .fi-sidebar-group-dropdown-trigger-btn .fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-sidebar-group-items{display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}.custom-fields-component :is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter{transition-delay:.1s}@media (min-width:64rem){.custom-fields-component :is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}}.custom-fields-component :is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter-start{opacity:0}.custom-fields-component :is(.fi-sidebar-group-btn,.fi-sidebar-group-items).fi-transition-enter-end{opacity:1}.custom-fields-component .fi-sidebar{align-content:flex-start;background-color:var(--color-white);display:flex;flex-direction:column;height:100dvh;inset-block:calc(var(--spacing)*0);inset-inline-start:calc(var(--spacing)*0);position:fixed;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));z-index:30}@media (min-width:64rem){.custom-fields-component .fi-sidebar{background-color:#0000;transition-property:none;z-index:20}}.custom-fields-component .fi-sidebar:where(.dark,.dark *){background-color:var(--gray-900)}@media (min-width:64rem){.custom-fields-component .fi-sidebar:where(.dark,.dark *){background-color:#0000}}.custom-fields-component .fi-sidebar.fi-sidebar-open{width:var(--sidebar-width);--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}@media (min-width:64rem){.custom-fields-component .fi-sidebar.fi-sidebar-open{--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.custom-fields-component .fi-sidebar.fi-sidebar-open:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-sidebar.fi-sidebar-open:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar.fi-sidebar-open:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-sidebar:not(.fi-sidebar-open){--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-sidebar:not(.fi-sidebar-open):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}@media (min-width:64rem){.custom-fields-component .fi-body-has-topbar .fi-sidebar{height:calc(100dvh - 4rem);top:4rem}}.custom-fields-component .fi-sidebar-close-overlay{background-color:var(--gray-950);inset:calc(var(--spacing)*0);position:fixed;z-index:30}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-close-overlay{background-color:color-mix(in oklab,var(--gray-950)50%,transparent)}}.custom-fields-component .fi-sidebar-close-overlay{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:.5s;transition-duration:.5s}@media (min-width:64rem){.custom-fields-component .fi-sidebar-close-overlay{display:none}}.custom-fields-component .fi-sidebar-close-overlay:where(.dark,.dark *){background-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-close-overlay:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-950)75%,transparent)}}@media (min-width:64rem){.custom-fields-component .fi-body.fi-body-has-top-navigation .fi-sidebar{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-body.fi-body-has-top-navigation .fi-sidebar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .fi-body:not(.fi-body-has-top-navigation) .fi-sidebar.fi-sidebar-open,.custom-fields-component .fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open){position:sticky}.custom-fields-component .fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open),.custom-fields-component .fi-body:not(.fi-body-has-top-navigation).fi-body-has-sidebar-collapsible-on-desktop .fi-sidebar:not(.fi-sidebar-open):where(:dir(rtl),[dir=rtl],[dir=rtl] *),.custom-fields-component .fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar,.custom-fields-component .fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}}.custom-fields-component .fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:not(.fi-sidebar-open){width:var(--sidebar-width)}@media (min-width:64rem){.custom-fields-component .fi-body:not(.fi-body-has-top-navigation):not(.fi-body-has-sidebar-collapsible-on-desktop):not(.fi-body-has-sidebar-fully-collapsible-on-desktop) .fi-sidebar:not(.fi-sidebar-open){position:sticky}}.custom-fields-component .fi-sidebar-header-ctn{overflow-x:clip}.custom-fields-component .fi-sidebar-header{align-items:center;display:flex;height:calc(var(--spacing)*16);justify-content:center}.custom-fields-component .fi-sidebar-header-logo-ctn{flex:1}.custom-fields-component .fi-body-has-topbar .fi-sidebar-header{background-color:var(--color-white);padding-inline:calc(var(--spacing)*6);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-body-has-topbar .fi-sidebar-header{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}@media (min-width:64rem){.custom-fields-component .fi-body-has-topbar .fi-sidebar-header{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:none}}.custom-fields-component .fi-body-has-topbar .fi-sidebar-header:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-body-has-topbar .fi-sidebar-header:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component :not(.fi-body-has-topbar) .fi-sidebar-header{padding-inline:calc(var(--spacing)*4);--tw-shadow:0 0 #0000;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);background-color:#0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component :not(.fi-body-has-topbar) .fi-sidebar-header .fi-logo{margin-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-sidebar-nav{display:flex;flex-direction:column;flex-grow:1;overflow:hidden auto;padding-block:calc(var(--spacing)*8);padding-inline:calc(var(--spacing)*6);row-gap:calc(var(--spacing)*7);scrollbar-gutter:stable}.custom-fields-component .fi-sidebar-nav-groups{display:flex;flex-direction:column;margin-inline:calc(var(--spacing)*-2);row-gap:calc(var(--spacing)*7)}.custom-fields-component .fi-sidebar-item.fi-active,.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-active-child-items{display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn{background-color:var(--gray-100)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-icon{color:var(--primary-700)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-grouped-border>.fi-sidebar-item-grouped-border-part{background-color:var(--primary-700)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-grouped-border>.fi-sidebar-item-grouped-border-part:where(.dark,.dark *){background-color:var(--primary-400)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-label{color:var(--primary-700)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn>.fi-sidebar-item-label:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-sidebar-item.fi-active>.fi-sidebar-item-btn .fi-sidebar-item-grouped-border-part{border-radius:3.40282e+38px;height:calc(var(--spacing)*1.5);position:relative;width:calc(var(--spacing)*1.5)}@media (hover:hover){.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:hover{background-color:var(--gray-100)}}.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-item.fi-sidebar-item-has-url>.fi-sidebar-item-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-sidebar-item-btn{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*3);justify-content:center;padding:calc(var(--spacing)*2);--tw-outline-style:none;display:flex;outline-style:none;position:relative}@media (forced-colors:active){.custom-fields-component .fi-sidebar-item-btn{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-sidebar-item-btn{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-sidebar-item-btn>.fi-icon{color:var(--gray-400)}.custom-fields-component .fi-sidebar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-sidebar-item-grouped-border{align-items:center;display:flex;height:calc(var(--spacing)*6);justify-content:center;position:relative;width:calc(var(--spacing)*6)}.custom-fields-component .fi-sidebar-item-grouped-border-part-not-first{background-color:var(--gray-300);bottom:50%;position:absolute;top:-50%;width:1px}.custom-fields-component .fi-sidebar-item-grouped-border-part-not-first:where(.dark,.dark *){background-color:var(--gray-600)}.custom-fields-component .fi-sidebar-item-grouped-border-part-not-last{background-color:var(--gray-300);bottom:-50%;position:absolute;top:50%;width:1px}.custom-fields-component .fi-sidebar-item-grouped-border-part-not-last:where(.dark,.dark *){background-color:var(--gray-600)}.custom-fields-component .fi-sidebar-item-grouped-border-part{background-color:var(--gray-400);border-radius:3.40282e+38px;height:calc(var(--spacing)*1.5);position:relative;width:calc(var(--spacing)*1.5)}.custom-fields-component .fi-sidebar-item-grouped-border-part:where(.dark,.dark *){background-color:var(--gray-500)}.custom-fields-component .fi-sidebar-item-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-overflow:ellipsis;white-space:nowrap;--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);flex:1;font-weight:var(--font-weight-medium);overflow:hidden}.custom-fields-component .fi-sidebar-item-label:where(.dark,.dark *){color:var(--gray-200)}@media (min-width:64rem){.custom-fields-component :is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter{transition-delay:.1s;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}}.custom-fields-component :is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter-start{opacity:0}.custom-fields-component :is(.fi-sidebar-item-label,.fi-sidebar-item-badge-ctn).fi-transition-enter-end{opacity:1}.custom-fields-component .fi-sidebar-footer{display:grid;margin-block:calc(var(--spacing)*3);margin-inline:calc(var(--spacing)*4);row-gap:calc(var(--spacing)*3)}.custom-fields-component .fi-sidebar-footer>.fi-no-database{display:block}.custom-fields-component .fi-sidebar-sub-group-items{display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}.custom-fields-component .fi-sidebar-database-notifications-btn{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*3);justify-content:center;padding:calc(var(--spacing)*2);text-align:start;width:100%;--tw-outline-style:none;display:flex;outline-style:none;position:relative}@media (forced-colors:active){.custom-fields-component .fi-sidebar-database-notifications-btn{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-sidebar-database-notifications-btn{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-sidebar-database-notifications-btn:hover{background-color:var(--gray-100)}}.custom-fields-component .fi-sidebar-database-notifications-btn:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.custom-fields-component .fi-sidebar-database-notifications-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-database-notifications-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-sidebar-database-notifications-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-sidebar-database-notifications-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-sidebar-database-notifications-btn>.fi-icon{color:var(--gray-400)}.custom-fields-component .fi-sidebar-database-notifications-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));text-overflow:ellipsis;white-space:nowrap;--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);flex:1;font-weight:var(--font-weight-medium);overflow:hidden}.custom-fields-component .fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label:where(.dark,.dark *){color:var(--gray-200)}@media (min-width:64rem){.custom-fields-component :is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter{transition-delay:.1s;transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}}.custom-fields-component :is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter-start{opacity:0}.custom-fields-component :is(.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-label,.fi-sidebar-database-notifications-btn>.fi-sidebar-database-notifications-btn-badge-ctn).fi-transition-enter-end{opacity:1}.custom-fields-component .fi-sidebar-open-collapse-sidebar-btn,.custom-fields-component .fi-sidebar-open-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}.custom-fields-component .fi-sidebar-close-collapse-sidebar-btn{display:none;margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.custom-fields-component .fi-sidebar-close-collapse-sidebar-btn{display:flex}.custom-fields-component :is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body:not(.fi-body-has-sidebar-fully-collapsible-on-desktop)) .fi-sidebar-open-sidebar-btn{display:none}}.custom-fields-component .fi-sidebar-close-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.custom-fields-component .fi-sidebar-close-sidebar-btn{display:none}}.custom-fields-component .fi-tenant-menu-trigger{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*3);font-size:var(--text-sm);justify-content:center;line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*2);width:100%;--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;display:flex;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-tenant-menu-trigger{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-tenant-menu-trigger{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-tenant-menu-trigger:hover{background-color:var(--gray-100)}}.custom-fields-component .fi-tenant-menu-trigger:focus-visible{background-color:var(--gray-100)}@media (hover:hover){.custom-fields-component .fi-tenant-menu-trigger:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tenant-menu-trigger:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-tenant-menu-trigger:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-tenant-menu-trigger:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-tenant-menu-trigger .fi-tenant-avatar{flex-shrink:0}.custom-fields-component .fi-tenant-menu-trigger .fi-icon{color:var(--gray-400);height:calc(var(--spacing)*5);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));width:calc(var(--spacing)*5);--tw-duration:75ms;flex-shrink:0;margin-inline-start:auto;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-tenant-menu-trigger .fi-icon:is(:where(.group):hover *){color:var(--gray-500)}}.custom-fields-component .fi-tenant-menu-trigger .fi-icon:is(:where(.group):focus-visible *),.custom-fields-component .fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.custom-fields-component .fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):hover *){color:var(--gray-400)}}.custom-fields-component .fi-tenant-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-400)}.custom-fields-component .fi-tenant-menu-trigger:hover .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-tenant-menu-trigger:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-tenant-menu-trigger:focus-visible .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-tenant-menu-trigger:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-tenant-menu-trigger-text{display:grid;justify-items:start;text-align:start}.custom-fields-component .fi-tenant-menu-trigger-current-tenant-label{color:var(--gray-500);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .fi-tenant-menu-trigger-current-tenant-label:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-tenant-menu-trigger-tenant-name{color:var(--gray-950)}.custom-fields-component .fi-tenant-menu-trigger-tenant-name:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-sidebar .fi-tenant-menu{margin-inline:calc(var(--spacing)*4);margin-top:calc(var(--spacing)*3)}.custom-fields-component .fi-theme-switcher{column-gap:calc(var(--spacing)*1);display:grid;grid-auto-flow:column}.custom-fields-component .fi-theme-switcher-btn{border-radius:var(--radius-md);padding:calc(var(--spacing)*2);--tw-outline-style:none;display:flex;justify-content:center;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-theme-switcher-btn{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-theme-switcher-btn{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-theme-switcher-btn:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-theme-switcher-btn:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.custom-fields-component .fi-theme-switcher-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-theme-switcher-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-theme-switcher-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-theme-switcher-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-theme-switcher-btn.fi-active{background-color:var(--gray-50);color:var(--primary-500)}.custom-fields-component .fi-theme-switcher-btn.fi-active:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-theme-switcher-btn.fi-active:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-theme-switcher-btn.fi-active:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-theme-switcher-btn:not(.fi-active){color:var(--gray-400)}@media (hover:hover){.custom-fields-component .fi-theme-switcher-btn:not(.fi-active):hover{color:var(--gray-500)}}.custom-fields-component .fi-theme-switcher-btn:not(.fi-active):focus-visible,.custom-fields-component .fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.custom-fields-component .fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *):hover{color:var(--gray-400)}}.custom-fields-component .fi-theme-switcher-btn:not(.fi-active):where(.dark,.dark *):focus-visible{color:var(--gray-400)}.custom-fields-component .fi-topbar-ctn{overflow-x:clip;position:sticky;top:calc(var(--spacing)*0);z-index:30}.custom-fields-component .fi-topbar{background-color:var(--color-white);min-height:calc(var(--spacing)*16);padding-inline:calc(var(--spacing)*4);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent);align-items:center;display:flex}.custom-fields-component .fi-topbar:where(.dark,.dark *){background-color:var(--gray-900);--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-topbar:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-topbar .fi-tenant-menu{display:none}@media (min-width:64rem){.custom-fields-component .fi-topbar .fi-tenant-menu{display:block}}.custom-fields-component .fi-topbar-close-sidebar-btn,.custom-fields-component .fi-topbar-open-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.custom-fields-component .fi-topbar-close-sidebar-btn{display:none}}.custom-fields-component .fi-topbar-open-collapse-sidebar-btn{margin-inline:calc(var(--spacing)*0)!important}.custom-fields-component .fi-topbar-close-collapse-sidebar-btn{display:none;margin-inline:calc(var(--spacing)*0)!important}@media (min-width:64rem){.custom-fields-component .fi-topbar-close-collapse-sidebar-btn{display:flex}}.custom-fields-component .fi-topbar-start{align-items:center;display:none;margin-inline-end:calc(var(--spacing)*6)}@media (min-width:64rem){.custom-fields-component .fi-topbar-start{display:flex}}.custom-fields-component .fi-topbar-start .fi-logo{margin-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-topbar-collapse-sidebar-btn-ctn{flex-shrink:0;width:calc(var(--spacing)*9)}@media (min-width:64rem){.custom-fields-component :is(.fi-body.fi-body-has-sidebar-collapsible-on-desktop,.fi-body:not(.fi-body-has-sidebar-fully-collapsible-on-desktop)) .fi-topbar-open-sidebar-btn{display:none}}.custom-fields-component .fi-topbar-nav-groups{align-items:center;column-gap:calc(var(--spacing)*4);display:none;margin-inline-end:calc(var(--spacing)*4);margin-inline-start:calc(var(--spacing)*4)}@media (min-width:64rem){.custom-fields-component .fi-topbar-nav-groups{display:flex;flex-wrap:wrap;margin-block:calc(var(--spacing)*2);row-gap:calc(var(--spacing)*1)}}.custom-fields-component .fi-topbar-end{align-items:center;column-gap:calc(var(--spacing)*4);display:flex;margin-inline-start:auto}.custom-fields-component .fi-topbar-item-btn{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*2);justify-content:center;padding-block:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*3);--tw-outline-style:none;display:flex;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-topbar-item-btn{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-topbar-item-btn{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-topbar-item-btn:hover{background-color:var(--gray-50)}}.custom-fields-component .fi-topbar-item-btn:focus-visible{background-color:var(--gray-50)}@media (hover:hover){.custom-fields-component .fi-topbar-item-btn:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-topbar-item-btn:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}.custom-fields-component .fi-topbar-item-btn:where(.dark,.dark *):focus-visible{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-topbar-item-btn:where(.dark,.dark *):focus-visible{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-topbar-item-btn>.fi-icon{color:var(--gray-400)}.custom-fields-component .fi-topbar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .fi-topbar-item-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);color:var(--gray-700);font-weight:var(--font-weight-medium)}.custom-fields-component .fi-topbar-item-label:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-btn{background-color:var(--gray-50)}.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-btn:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-btn:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-btn>.fi-icon{color:var(--primary-600)}.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-btn>.fi-icon:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-label{color:var(--primary-600)}.custom-fields-component .fi-topbar-item.fi-active .fi-topbar-item-label:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .fi-simple-user-menu-ctn{align-items:center;column-gap:calc(var(--spacing)*4);display:flex}.custom-fields-component .fi-topbar .fi-user-menu-trigger{flex-shrink:0}.custom-fields-component .fi-sidebar .fi-user-menu-trigger{align-items:center;border-radius:var(--radius-lg);column-gap:calc(var(--spacing)*3);font-size:var(--text-sm);justify-content:center;line-height:var(--tw-leading,var(--text-sm--line-height));padding:calc(var(--spacing)*2);width:100%;--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;display:flex;outline-style:none}@media (forced-colors:active){.custom-fields-component .fi-sidebar .fi-user-menu-trigger{outline:2px solid #0000;outline-offset:2px}}.custom-fields-component .fi-sidebar .fi-user-menu-trigger{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-user-avatar{flex-shrink:0}.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-icon{color:var(--gray-400);height:calc(var(--spacing)*5);transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));width:calc(var(--spacing)*5);--tw-duration:75ms;flex-shrink:0;margin-inline-start:auto;transition-duration:75ms}@media (hover:hover){.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-icon:is(:where(.group):hover *){color:var(--gray-500)}}.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-icon:is(:where(.group):focus-visible *),.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *){color:var(--gray-500)}@media (hover:hover){.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):hover *){color:var(--gray-400)}}.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-icon:where(.dark,.dark *):is(:where(.group):focus-visible *){color:var(--gray-400)}.custom-fields-component .fi-sidebar .fi-user-menu-trigger:hover .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-sidebar .fi-user-menu-trigger:hover .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sidebar .fi-user-menu-trigger:focus-visible .fi-icon{color:var(--gray-500)}.custom-fields-component .fi-sidebar .fi-user-menu-trigger:focus-visible .fi-icon:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-tenant-menu-trigger-text{color:var(--gray-950);display:grid;justify-items:start;text-align:start}.custom-fields-component .fi-sidebar .fi-user-menu-trigger .fi-tenant-menu-trigger-text:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-sidebar .fi-user-menu .fi-dropdown-panel{max-width:max(14rem,100% - 1.5rem)!important}.custom-fields-component .fi-account-widget .fi-section-content{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-account-widget-logout-form{margin-block:auto}.custom-fields-component .fi-account-widget-main{flex:1}.custom-fields-component .fi-account-widget-heading{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);color:var(--gray-950);display:grid;flex:1;font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-account-widget-heading:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-account-widget-user-name{color:var(--gray-500);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .fi-account-widget-user-name:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-filament-info-widget .fi-section-content{align-items:center;column-gap:calc(var(--spacing)*3);display:flex}.custom-fields-component .fi-filament-info-widget-main{flex:1}.custom-fields-component .fi-filament-info-widget-logo{color:var(--gray-950);height:calc(var(--spacing)*5)}.custom-fields-component .fi-filament-info-widget-logo:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .fi-filament-info-widget-version{color:var(--gray-500);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));margin-top:calc(var(--spacing)*2)}.custom-fields-component .fi-filament-info-widget-version:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .fi-filament-info-widget-links{align-items:flex-end;display:flex;flex-direction:column;row-gap:calc(var(--spacing)*1)}}@layer utilities{.custom-fields-component .pointer-events-none{pointer-events:none}.custom-fields-component .visible{visibility:visible}.custom-fields-component .sr-only{border-width:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.custom-fields-component .absolute{position:absolute}.custom-fields-component .relative{position:relative}.custom-fields-component .static{position:static}.custom-fields-component .top-1\/2{top:50%}.custom-fields-component .right-0{right:calc(var(--spacing)*0)}.custom-fields-component .left-3{left:calc(var(--spacing)*3)}.custom-fields-component .z-50{z-index:50}.custom-fields-component .col-span-3{grid-column:span 3/span 3}.custom-fields-component .col-span-4{grid-column:span 4/span 4}.custom-fields-component .col-span-6{grid-column:span 6/span 6}.custom-fields-component .col-span-8{grid-column:span 8/span 8}.custom-fields-component .col-span-9{grid-column:span 9/span 9}.custom-fields-component .col-span-12{grid-column:span 12/span 12}.custom-fields-component .container{width:100%}@media (min-width:40rem){.custom-fields-component .container{max-width:40rem}}@media (min-width:48rem){.custom-fields-component .container{max-width:48rem}}@media (min-width:64rem){.custom-fields-component .container{max-width:64rem}}@media (min-width:80rem){.custom-fields-component .container{max-width:80rem}}@media (min-width:96rem){.custom-fields-component .container{max-width:96rem}}.custom-fields-component .-mx-1{margin-inline:calc(var(--spacing)*-1)}.custom-fields-component .mx-auto{margin-inline:auto}.custom-fields-component .mt-1{margin-top:calc(var(--spacing)*1)}.custom-fields-component .mt-6{margin-top:calc(var(--spacing)*6)}.custom-fields-component .mb-1{margin-bottom:calc(var(--spacing)*1)}.custom-fields-component .mb-2{margin-bottom:calc(var(--spacing)*2)}.custom-fields-component .mb-4{margin-bottom:calc(var(--spacing)*4)}.custom-fields-component .mb-6{margin-bottom:calc(var(--spacing)*6)}.custom-fields-component .ml-0\.5{margin-left:calc(var(--spacing)*.5)}.custom-fields-component .ml-2{margin-left:calc(var(--spacing)*2)}.custom-fields-component .ml-auto{margin-left:auto}.custom-fields-component .block{display:block}.custom-fields-component .flex{display:flex}.custom-fields-component .grid{display:grid}.custom-fields-component .hidden{display:none}.custom-fields-component .inline{display:inline}.custom-fields-component .inline-flex{display:inline-flex}.custom-fields-component .table{display:table}.custom-fields-component .size-3{height:calc(var(--spacing)*3);width:calc(var(--spacing)*3)}.custom-fields-component .size-3\.5{height:calc(var(--spacing)*3.5);width:calc(var(--spacing)*3.5)}.custom-fields-component .size-4{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}.custom-fields-component .h-2\.5{height:calc(var(--spacing)*2.5)}.custom-fields-component .h-3{height:calc(var(--spacing)*3)}.custom-fields-component .h-3\.5{height:calc(var(--spacing)*3.5)}.custom-fields-component .h-4{height:calc(var(--spacing)*4)}.custom-fields-component .h-4\.5{height:calc(var(--spacing)*4.5)}.custom-fields-component .h-5{height:calc(var(--spacing)*5)}.custom-fields-component .h-6{height:calc(var(--spacing)*6)}.custom-fields-component .h-8{height:calc(var(--spacing)*8)}.custom-fields-component .h-full{height:100%}.custom-fields-component .max-h-48{max-height:calc(var(--spacing)*48)}.custom-fields-component .max-h-60{max-height:calc(var(--spacing)*60)}.custom-fields-component .max-h-\[280px\]{max-height:280px}.custom-fields-component .min-h-\[2\.25rem\]{min-height:2.25rem}.custom-fields-component .min-h-\[28px\]{min-height:28px}.custom-fields-component .min-h-\[50px\]{min-height:50px}.custom-fields-component .w-2\.5{width:calc(var(--spacing)*2.5)}.custom-fields-component .w-3{width:calc(var(--spacing)*3)}.custom-fields-component .w-3\.5{width:calc(var(--spacing)*3.5)}.custom-fields-component .w-4{width:calc(var(--spacing)*4)}.custom-fields-component .w-4\.5{width:calc(var(--spacing)*4.5)}.custom-fields-component .w-5{width:calc(var(--spacing)*5)}.custom-fields-component .w-6{width:calc(var(--spacing)*6)}.custom-fields-component .w-8{width:calc(var(--spacing)*8)}.custom-fields-component .w-20{width:calc(var(--spacing)*20)}.custom-fields-component .w-23{width:calc(var(--spacing)*23)}.custom-fields-component .w-64{width:calc(var(--spacing)*64)}.custom-fields-component .w-\[180px\]{width:180px}.custom-fields-component .w-\[220px\]{width:220px}.custom-fields-component .w-full{width:100%}.custom-fields-component .w-px{width:1px}.custom-fields-component .max-w-\[100px\]{max-width:100px}.custom-fields-component .max-w-\[120px\]{max-width:120px}.custom-fields-component .max-w-\[150px\]{max-width:150px}.custom-fields-component .max-w-\[250px\]{max-width:250px}.custom-fields-component .max-w-full{max-width:100%}.custom-fields-component .max-w-md{max-width:var(--container-md)}.custom-fields-component .max-w-sm{max-width:var(--container-sm)}.custom-fields-component .max-w-xs{max-width:var(--container-xs)}.custom-fields-component .min-w-0{min-width:calc(var(--spacing)*0)}.custom-fields-component .min-w-48{min-width:calc(var(--spacing)*48)}.custom-fields-component .min-w-\[600px\]{min-width:600px}.custom-fields-component .flex-1{flex:1}.custom-fields-component .shrink-0{flex-shrink:0}.custom-fields-component .-translate-y-1\/2{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.custom-fields-component .rotate-180{rotate:180deg}.custom-fields-component .transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.custom-fields-component .cursor-grab{cursor:grab}.custom-fields-component .cursor-pointer{cursor:pointer}.custom-fields-component .grid-cols-\[40px_1fr\]{grid-template-columns:40px 1fr}.custom-fields-component .grid-cols-\[40px_1fr_minmax\(120px\,160px\)_minmax\(100px\,140px\)_minmax\(80px\,120px\)_50px\]{grid-template-columns:40px 1fr minmax(120px,160px) minmax(100px,140px) minmax(80px,120px) 50px}.custom-fields-component .flex-col{flex-direction:column}.custom-fields-component .flex-wrap{flex-wrap:wrap}.custom-fields-component .items-center{align-items:center}.custom-fields-component .justify-between{justify-content:space-between}.custom-fields-component .justify-center{justify-content:center}.custom-fields-component .justify-items-center{justify-items:center}.custom-fields-component .gap-1{gap:calc(var(--spacing)*1)}.custom-fields-component .gap-1\.5{gap:calc(var(--spacing)*1.5)}.custom-fields-component .gap-2{gap:calc(var(--spacing)*2)}.custom-fields-component .gap-4{gap:calc(var(--spacing)*4)}.custom-fields-component .gap-6{gap:calc(var(--spacing)*6)}.custom-fields-component :where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}.custom-fields-component .gap-x-1{column-gap:calc(var(--spacing)*1)}.custom-fields-component .gap-x-2{column-gap:calc(var(--spacing)*2)}.custom-fields-component .gap-x-3{column-gap:calc(var(--spacing)*3)}.custom-fields-component .gap-x-4{column-gap:calc(var(--spacing)*4)}.custom-fields-component .gap-y-1{row-gap:calc(var(--spacing)*1)}.custom-fields-component .gap-y-2{row-gap:calc(var(--spacing)*2)}.custom-fields-component .gap-y-6{row-gap:calc(var(--spacing)*6)}.custom-fields-component :where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}.custom-fields-component :where(.divide-gray-200>:not(:last-child)){border-color:var(--gray-200)}.custom-fields-component .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-fields-component .overflow-hidden{overflow:hidden}.custom-fields-component .overflow-x-auto{overflow-x:auto}.custom-fields-component .overflow-y-auto{overflow-y:auto}.custom-fields-component .rounded{border-radius:.25rem}.custom-fields-component .rounded-full{border-radius:3.40282e+38px}.custom-fields-component .rounded-lg{border-radius:var(--radius-lg)}.custom-fields-component .rounded-md{border-radius:var(--radius-md)}.custom-fields-component .rounded-xl{border-radius:var(--radius-xl)}.custom-fields-component .rounded-s-md{border-end-start-radius:var(--radius-md);border-start-start-radius:var(--radius-md)}.custom-fields-component .rounded-e-md{border-end-end-radius:var(--radius-md);border-start-end-radius:var(--radius-md)}.custom-fields-component .rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.custom-fields-component .rounded-l-lg{border-bottom-left-radius:var(--radius-lg);border-top-left-radius:var(--radius-lg)}.custom-fields-component .rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.custom-fields-component .border{border-style:var(--tw-border-style);border-width:1px}.custom-fields-component .border-0{border-style:var(--tw-border-style);border-width:0}.custom-fields-component .border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.custom-fields-component .border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.custom-fields-component .border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.custom-fields-component .border-dashed{--tw-border-style:dashed;border-style:dashed}.custom-fields-component .border-none{--tw-border-style:none;border-style:none}.custom-fields-component .border-gray-100{border-color:var(--gray-100)}.custom-fields-component .border-gray-200{border-color:var(--gray-200)}.custom-fields-component .border-gray-300{border-color:var(--gray-300)}.custom-fields-component .border-primary-600{border-color:var(--primary-600)}.custom-fields-component .bg-gray-50{background-color:var(--gray-50)}.custom-fields-component .bg-gray-100{background-color:var(--gray-100)}.custom-fields-component .bg-gray-200{background-color:var(--gray-200)}.custom-fields-component .bg-primary-50{background-color:var(--primary-50)}.custom-fields-component .bg-primary-600{background-color:var(--primary-600)}.custom-fields-component .bg-transparent{background-color:#0000}.custom-fields-component .bg-white{background-color:var(--color-white)}.custom-fields-component .bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.custom-fields-component .from-gray-100\/90{--tw-gradient-from:var(--gray-100)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .from-gray-100\/90{--tw-gradient-from:color-mix(in oklab,var(--gray-100)90%,transparent)}}.custom-fields-component .from-gray-100\/90{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.custom-fields-component .via-gray-100\/100{--tw-gradient-via:var(--gray-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.custom-fields-component .to-gray-100{--tw-gradient-to:var(--gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.custom-fields-component .object-cover{object-fit:cover}.custom-fields-component .p-0{padding:calc(var(--spacing)*0)}.custom-fields-component .p-0\.5{padding:calc(var(--spacing)*.5)}.custom-fields-component .p-1{padding:calc(var(--spacing)*1)}.custom-fields-component .p-3{padding:calc(var(--spacing)*3)}.custom-fields-component .p-4{padding:calc(var(--spacing)*4)}.custom-fields-component .\!px-2{padding-inline:calc(var(--spacing)*2)!important}.custom-fields-component .px-1{padding-inline:calc(var(--spacing)*1)}.custom-fields-component .px-2{padding-inline:calc(var(--spacing)*2)}.custom-fields-component .px-3{padding-inline:calc(var(--spacing)*3)}.custom-fields-component .px-6{padding-inline:calc(var(--spacing)*6)}.custom-fields-component .\!py-2{padding-block:calc(var(--spacing)*2)!important}.custom-fields-component .py-0\.5{padding-block:calc(var(--spacing)*.5)}.custom-fields-component .py-1{padding-block:calc(var(--spacing)*1)}.custom-fields-component .py-1\.5{padding-block:calc(var(--spacing)*1.5)}.custom-fields-component .py-2{padding-block:calc(var(--spacing)*2)}.custom-fields-component .py-2\.5{padding-block:calc(var(--spacing)*2.5)}.custom-fields-component .py-3{padding-block:calc(var(--spacing)*3)}.custom-fields-component .py-6{padding-block:calc(var(--spacing)*6)}.custom-fields-component .py-12{padding-block:calc(var(--spacing)*12)}.custom-fields-component .py-16{padding-block:calc(var(--spacing)*16)}.custom-fields-component .pt-4{padding-top:calc(var(--spacing)*4)}.custom-fields-component .pr-1{padding-right:calc(var(--spacing)*1)}.custom-fields-component .pr-1\.5{padding-right:calc(var(--spacing)*1.5)}.custom-fields-component .pr-3{padding-right:calc(var(--spacing)*3)}.custom-fields-component .pl-2{padding-left:calc(var(--spacing)*2)}.custom-fields-component .pl-3{padding-left:calc(var(--spacing)*3)}.custom-fields-component .pl-9{padding-left:calc(var(--spacing)*9)}.custom-fields-component .text-center{text-align:center}.custom-fields-component .text-left{text-align:left}.custom-fields-component .text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.custom-fields-component .text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.custom-fields-component .text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.custom-fields-component .text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.custom-fields-component .leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.custom-fields-component .leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.custom-fields-component .leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.custom-fields-component .font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.custom-fields-component .font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.custom-fields-component .whitespace-nowrap{white-space:nowrap}.custom-fields-component .text-gray-400{color:var(--gray-400)}.custom-fields-component .text-gray-500{color:var(--gray-500)}.custom-fields-component .text-gray-600{color:var(--gray-600)}.custom-fields-component .text-gray-700{color:var(--gray-700)}.custom-fields-component .text-gray-900{color:var(--gray-900)}.custom-fields-component .text-gray-950{color:var(--gray-950)}.custom-fields-component .text-green-500{color:var(--color-green-500)}.custom-fields-component .text-neutral-700{color:var(--color-neutral-700)}.custom-fields-component .text-primary-500{color:var(--primary-500)}.custom-fields-component .text-primary-600{color:var(--primary-600)}.custom-fields-component .text-primary-700{color:var(--primary-700)}.custom-fields-component .text-white{color:var(--color-white)}.custom-fields-component .uppercase{text-transform:uppercase}.custom-fields-component .underline{text-decoration-line:underline}.custom-fields-component .decoration-gray-300{-webkit-text-decoration-color:var(--gray-300);text-decoration-color:var(--gray-300)}.custom-fields-component .decoration-1{text-decoration-thickness:1px}.custom-fields-component .underline-offset-2{text-underline-offset:2px}.custom-fields-component .opacity-0{opacity:0}.custom-fields-component .opacity-60{opacity:.6}.custom-fields-component .opacity-70{opacity:.7}.custom-fields-component .shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.custom-fields-component .shadow-lg,.custom-fields-component .shadow-none{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .shadow-none{--tw-shadow:0 0 #0000}.custom-fields-component .shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.custom-fields-component .ring-1,.custom-fields-component .shadow-sm{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)}.custom-fields-component .ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .ring-gray-950\/5{--tw-ring-color:var(--gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .ring-gray-950\/5{--tw-ring-color:color-mix(in oklab,var(--gray-950)5%,transparent)}}.custom-fields-component .ring-primary-600{--tw-ring-color:var(--primary-600)}.custom-fields-component .filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.custom-fields-component .transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .transition-all{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .transition-opacity{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.custom-fields-component .duration-75{--tw-duration:75ms;transition-duration:75ms}.custom-fields-component .duration-200{--tw-duration:.2s;transition-duration:.2s}.custom-fields-component .duration-300{--tw-duration:.3s;transition-duration:.3s}.custom-fields-component .outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.custom-fields-component .group-hover\/item\:opacity-100:is(:where(.group\/item):hover *),.custom-fields-component .group-hover\/value\:opacity-100:is(:where(.group\/value):hover *),.custom-fields-component .group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.custom-fields-component .placeholder\:text-gray-400::placeholder{color:var(--gray-400)}.custom-fields-component .first\:rounded-t-lg:first-child{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.custom-fields-component .last\:rounded-b-lg:last-child{border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.custom-fields-component .last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.custom-fields-component .hover\:border-gray-400:hover{border-color:var(--gray-400)}.custom-fields-component .hover\:bg-danger-50:hover{background-color:var(--danger-50)}.custom-fields-component .hover\:bg-gray-50:hover{background-color:var(--gray-50)}.custom-fields-component .hover\:bg-gray-100:hover{background-color:var(--gray-100)}.custom-fields-component .hover\:bg-gray-300:hover{background-color:var(--gray-300)}.custom-fields-component .hover\:bg-primary-50:hover{background-color:var(--primary-50)}.custom-fields-component .hover\:bg-primary-600\/80:hover{background-color:var(--primary-600)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .hover\:bg-primary-600\/80:hover{background-color:color-mix(in oklab,var(--primary-600)80%,transparent)}}.custom-fields-component .hover\:text-danger-500:hover{color:var(--danger-500)}.custom-fields-component .hover\:text-gray-500:hover{color:var(--gray-500)}.custom-fields-component .hover\:text-gray-600:hover{color:var(--gray-600)}.custom-fields-component .hover\:text-primary-600:hover{color:var(--primary-600)}}.custom-fields-component .focus\:opacity-100:focus{opacity:1}.custom-fields-component .focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)}.custom-fields-component .focus\:ring-0:focus,.custom-fields-component .focus\:ring-2:focus{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)}.custom-fields-component .focus\:ring-primary-500:focus{--tw-ring-color:var(--primary-500)}.custom-fields-component .focus\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.custom-fields-component .focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.custom-fields-component .focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.custom-fields-component .focus-visible\:ring-primary-500:focus-visible{--tw-ring-color:var(--primary-500)}.custom-fields-component .focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.custom-fields-component .active\:cursor-grabbing:active{cursor:grabbing}.custom-fields-component .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.custom-fields-component .disabled\:text-gray-500:disabled{color:var(--gray-500)}.custom-fields-component .disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.custom-fields-component .disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}}@media (min-width:40rem){.custom-fields-component .sm\:flex-row{flex-direction:row}.custom-fields-component .sm\:items-center{align-items:center}.custom-fields-component .sm\:justify-between{justify-content:space-between}}.custom-fields-component :where(.dark\:divide-white\/10:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component :where(.dark\:divide-white\/10:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .dark\:border-gray-600:where(.dark,.dark *){border-color:var(--gray-600)}.custom-fields-component .dark\:border-gray-800:where(.dark,.dark *){border-color:var(--gray-800)}.custom-fields-component .dark\:border-primary-500:where(.dark,.dark *){border-color:var(--primary-500)}.custom-fields-component .dark\:border-white\/10:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:border-white\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .dark\:bg-gray-700:where(.dark,.dark *){background-color:var(--gray-700)}.custom-fields-component .dark\:bg-gray-800:where(.dark,.dark *),.custom-fields-component .dark\:bg-gray-800\/50:where(.dark,.dark *){background-color:var(--gray-800)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:bg-gray-800\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--gray-800)50%,transparent)}}.custom-fields-component .dark\:bg-gray-900:where(.dark,.dark *){background-color:var(--gray-900)}.custom-fields-component .dark\:bg-primary-500:where(.dark,.dark *),.custom-fields-component .dark\:bg-primary-500\/10:where(.dark,.dark *){background-color:var(--primary-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:bg-primary-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--primary-500)10%,transparent)}}.custom-fields-component .dark\:bg-primary-950\/50:where(.dark,.dark *){background-color:var(--primary-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:bg-primary-950\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--primary-950)50%,transparent)}}.custom-fields-component .dark\:bg-white\/5:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:bg-white\/5:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .dark\:from-gray-700\/0:where(.dark,.dark *){--tw-gradient-from:var(--gray-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:from-gray-700\/0:where(.dark,.dark *){--tw-gradient-from:color-mix(in oklab,var(--gray-700)0%,transparent)}}.custom-fields-component .dark\:from-gray-700\/0:where(.dark,.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.custom-fields-component .dark\:from-gray-800\/0:where(.dark,.dark *){--tw-gradient-from:var(--gray-800)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:from-gray-800\/0:where(.dark,.dark *){--tw-gradient-from:color-mix(in oklab,var(--gray-800)0%,transparent)}}.custom-fields-component .dark\:from-gray-800\/0:where(.dark,.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.custom-fields-component .dark\:via-gray-700\/70:where(.dark,.dark *){--tw-gradient-via:var(--gray-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:via-gray-700\/70:where(.dark,.dark *){--tw-gradient-via:color-mix(in oklab,var(--gray-700)70%,transparent)}}.custom-fields-component .dark\:via-gray-700\/70:where(.dark,.dark *){--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.custom-fields-component .dark\:via-gray-800\/70:where(.dark,.dark *){--tw-gradient-via:var(--gray-800)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:via-gray-800\/70:where(.dark,.dark *){--tw-gradient-via:color-mix(in oklab,var(--gray-800)70%,transparent)}}.custom-fields-component .dark\:via-gray-800\/70:where(.dark,.dark *){--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.custom-fields-component .dark\:to-gray-700:where(.dark,.dark *){--tw-gradient-to:var(--gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.custom-fields-component .dark\:to-gray-800:where(.dark,.dark *){--tw-gradient-to:var(--gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.custom-fields-component .dark\:text-gray-100:where(.dark,.dark *){color:var(--gray-100)}.custom-fields-component .dark\:text-gray-200:where(.dark,.dark *){color:var(--gray-200)}.custom-fields-component .dark\:text-gray-300:where(.dark,.dark *){color:var(--gray-300)}.custom-fields-component .dark\:text-gray-400:where(.dark,.dark *){color:var(--gray-400)}.custom-fields-component .dark\:text-gray-500:where(.dark,.dark *){color:var(--gray-500)}.custom-fields-component .dark\:text-neutral-400:where(.dark,.dark *){color:var(--color-neutral-400)}.custom-fields-component .dark\:text-primary-400:where(.dark,.dark *){color:var(--primary-400)}.custom-fields-component .dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.custom-fields-component .dark\:decoration-gray-600:where(.dark,.dark *){-webkit-text-decoration-color:var(--gray-600);text-decoration-color:var(--gray-600)}.custom-fields-component .dark\:ring-primary-500:where(.dark,.dark *){--tw-ring-color:var(--primary-500)}.custom-fields-component .dark\:ring-white\/10:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:ring-white\/10:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .dark\:placeholder\:text-gray-500:where(.dark,.dark *)::placeholder{color:var(--gray-500)}@media (hover:hover){.custom-fields-component .dark\:hover\:bg-danger-500\/10:where(.dark,.dark *):hover{background-color:var(--danger-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:hover\:bg-danger-500\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--danger-500)10%,transparent)}}.custom-fields-component .dark\:hover\:bg-gray-600:where(.dark,.dark *):hover{background-color:var(--gray-600)}.custom-fields-component .dark\:hover\:bg-gray-700:where(.dark,.dark *):hover{background-color:var(--gray-700)}.custom-fields-component .dark\:hover\:bg-gray-800:where(.dark,.dark *):hover,.custom-fields-component .dark\:hover\:bg-gray-800\/50:where(.dark,.dark *):hover{background-color:var(--gray-800)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:hover\:bg-gray-800\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--gray-800)50%,transparent)}}.custom-fields-component .dark\:hover\:bg-primary-500\/10:where(.dark,.dark *):hover{background-color:var(--primary-500)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:hover\:bg-primary-500\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--primary-500)10%,transparent)}}.custom-fields-component .dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.custom-fields-component .dark\:hover\:text-gray-300:where(.dark,.dark *):hover{color:var(--gray-300)}}.custom-fields-component .dark\:disabled\:text-gray-400:where(.dark,.dark *):disabled{color:var(--gray-400)}.custom-fields-component .\[\&_\.fi-badge\]\:ml-auto .fi-badge{margin-left:auto}.custom-fields-component .\[\&\:\:-webkit-scrollbar\]\:w-1\.5::-webkit-scrollbar{width:calc(var(--spacing)*1.5)}.custom-fields-component .\[\&\:\:-webkit-scrollbar-thumb\]\:rounded-full::-webkit-scrollbar-thumb{border-radius:3.40282e+38px}.custom-fields-component .\[\&\:\:-webkit-scrollbar-thumb\]\:bg-gray-300::-webkit-scrollbar-thumb{background-color:var(--gray-300)}.custom-fields-component .dark\:\[\&\:\:-webkit-scrollbar-thumb\]\:bg-gray-600:where(.dark,.dark *)::-webkit-scrollbar-thumb{background-color:var(--gray-600)}.custom-fields-component .fi-color-danger{--color-50:var(--danger-50);--color-100:var(--danger-100);--color-200:var(--danger-200);--color-300:var(--danger-300);--color-400:var(--danger-400);--color-500:var(--danger-500);--color-600:var(--danger-600);--color-700:var(--danger-700);--color-800:var(--danger-800);--color-900:var(--danger-900);--color-950:var(--danger-950)}.custom-fields-component .fi-color-gray{--color-50:var(--gray-50);--color-100:var(--gray-100);--color-200:var(--gray-200);--color-300:var(--gray-300);--color-400:var(--gray-400);--color-500:var(--gray-500);--color-600:var(--gray-600);--color-700:var(--gray-700);--color-800:var(--gray-800);--color-900:var(--gray-900);--color-950:var(--gray-950)}.custom-fields-component .fi-color-info{--color-50:var(--info-50);--color-100:var(--info-100);--color-200:var(--info-200);--color-300:var(--info-300);--color-400:var(--info-400);--color-500:var(--info-500);--color-600:var(--info-600);--color-700:var(--info-700);--color-800:var(--info-800);--color-900:var(--info-900);--color-950:var(--info-950)}.custom-fields-component .fi-color-primary{--color-50:var(--primary-50);--color-100:var(--primary-100);--color-200:var(--primary-200);--color-300:var(--primary-300);--color-400:var(--primary-400);--color-500:var(--primary-500);--color-600:var(--primary-600);--color-700:var(--primary-700);--color-800:var(--primary-800);--color-900:var(--primary-900);--color-950:var(--primary-950)}.custom-fields-component .fi-color-success{--color-50:var(--success-50);--color-100:var(--success-100);--color-200:var(--success-200);--color-300:var(--success-300);--color-400:var(--success-400);--color-500:var(--success-500);--color-600:var(--success-600);--color-700:var(--success-700);--color-800:var(--success-800);--color-900:var(--success-900);--color-950:var(--success-950)}.custom-fields-component .fi-color-warning{--color-50:var(--warning-50);--color-100:var(--warning-100);--color-200:var(--warning-200);--color-300:var(--warning-300);--color-400:var(--warning-400);--color-500:var(--warning-500);--color-600:var(--warning-600);--color-700:var(--warning-700);--color-800:var(--warning-800);--color-900:var(--warning-900);--color-950:var(--warning-950)}.custom-fields-component .fi-bg-color-50{--bg:var(--color-50)}.custom-fields-component .fi-bg-color-100{--bg:var(--color-100)}.custom-fields-component .fi-bg-color-200{--bg:var(--color-200)}.custom-fields-component .fi-bg-color-300{--bg:var(--color-300)}.custom-fields-component .fi-bg-color-400{--bg:var(--color-400)}.custom-fields-component .fi-bg-color-500{--bg:var(--color-500)}.custom-fields-component .fi-bg-color-600{--bg:var(--color-600)}.custom-fields-component .fi-bg-color-700{--bg:var(--color-700)}.custom-fields-component .fi-bg-color-800{--bg:var(--color-800)}.custom-fields-component .fi-bg-color-900{--bg:var(--color-900)}.custom-fields-component .fi-bg-color-950{--bg:var(--color-950)}.custom-fields-component .hover\:fi-bg-color-50{--hover-bg:var(--color-50)}.custom-fields-component .hover\:fi-bg-color-100{--hover-bg:var(--color-100)}.custom-fields-component .hover\:fi-bg-color-200{--hover-bg:var(--color-200)}.custom-fields-component .hover\:fi-bg-color-300{--hover-bg:var(--color-300)}.custom-fields-component .hover\:fi-bg-color-400{--hover-bg:var(--color-400)}.custom-fields-component .hover\:fi-bg-color-500{--hover-bg:var(--color-500)}.custom-fields-component .hover\:fi-bg-color-600{--hover-bg:var(--color-600)}.custom-fields-component .hover\:fi-bg-color-700{--hover-bg:var(--color-700)}.custom-fields-component .hover\:fi-bg-color-800{--hover-bg:var(--color-800)}.custom-fields-component .hover\:fi-bg-color-900{--hover-bg:var(--color-900)}.custom-fields-component .hover\:fi-bg-color-950{--hover-bg:var(--color-950)}.custom-fields-component .dark\:fi-bg-color-50{--dark-bg:var(--color-50)}.custom-fields-component .dark\:fi-bg-color-100{--dark-bg:var(--color-100)}.custom-fields-component .dark\:fi-bg-color-200{--dark-bg:var(--color-200)}.custom-fields-component .dark\:fi-bg-color-300{--dark-bg:var(--color-300)}.custom-fields-component .dark\:fi-bg-color-400{--dark-bg:var(--color-400)}.custom-fields-component .dark\:fi-bg-color-500{--dark-bg:var(--color-500)}.custom-fields-component .dark\:fi-bg-color-600{--dark-bg:var(--color-600)}.custom-fields-component .dark\:fi-bg-color-700{--dark-bg:var(--color-700)}.custom-fields-component .dark\:fi-bg-color-800{--dark-bg:var(--color-800)}.custom-fields-component .dark\:fi-bg-color-900{--dark-bg:var(--color-900)}.custom-fields-component .dark\:fi-bg-color-950{--dark-bg:var(--color-950)}.custom-fields-component .dark\:hover\:fi-bg-color-50{--dark-hover-bg:var(--color-50)}.custom-fields-component .dark\:hover\:fi-bg-color-100{--dark-hover-bg:var(--color-100)}.custom-fields-component .dark\:hover\:fi-bg-color-200{--dark-hover-bg:var(--color-200)}.custom-fields-component .dark\:hover\:fi-bg-color-300{--dark-hover-bg:var(--color-300)}.custom-fields-component .dark\:hover\:fi-bg-color-400{--dark-hover-bg:var(--color-400)}.custom-fields-component .dark\:hover\:fi-bg-color-500{--dark-hover-bg:var(--color-500)}.custom-fields-component .dark\:hover\:fi-bg-color-600{--dark-hover-bg:var(--color-600)}.custom-fields-component .dark\:hover\:fi-bg-color-700{--dark-hover-bg:var(--color-700)}.custom-fields-component .dark\:hover\:fi-bg-color-800{--dark-hover-bg:var(--color-800)}.custom-fields-component .dark\:hover\:fi-bg-color-900{--dark-hover-bg:var(--color-900)}.custom-fields-component .dark\:hover\:fi-bg-color-950{--dark-hover-bg:var(--color-950)}.custom-fields-component .fi-text-color-0{--text:oklch(100% 0 0)}.custom-fields-component .fi-text-color-50{--text:var(--color-50)}.custom-fields-component .fi-text-color-100{--text:var(--color-100)}.custom-fields-component .fi-text-color-200{--text:var(--color-200)}.custom-fields-component .fi-text-color-300{--text:var(--color-300)}.custom-fields-component .fi-text-color-400{--text:var(--color-400)}.custom-fields-component .fi-text-color-500{--text:var(--color-500)}.custom-fields-component .fi-text-color-600{--text:var(--color-600)}.custom-fields-component .fi-text-color-700{--text:var(--color-700)}.custom-fields-component .fi-text-color-800{--text:var(--color-800)}.custom-fields-component .fi-text-color-900{--text:var(--color-900)}.custom-fields-component .fi-text-color-950{--text:var(--color-950)}.custom-fields-component .hover\:fi-text-color-0{--hover-text:oklch(100% 0 0)}.custom-fields-component .hover\:fi-text-color-50{--hover-text:var(--color-50)}.custom-fields-component .hover\:fi-text-color-100{--hover-text:var(--color-100)}.custom-fields-component .hover\:fi-text-color-200{--hover-text:var(--color-200)}.custom-fields-component .hover\:fi-text-color-300{--hover-text:var(--color-300)}.custom-fields-component .hover\:fi-text-color-400{--hover-text:var(--color-400)}.custom-fields-component .hover\:fi-text-color-500{--hover-text:var(--color-500)}.custom-fields-component .hover\:fi-text-color-600{--hover-text:var(--color-600)}.custom-fields-component .hover\:fi-text-color-700{--hover-text:var(--color-700)}.custom-fields-component .hover\:fi-text-color-800{--hover-text:var(--color-800)}.custom-fields-component .hover\:fi-text-color-900{--hover-text:var(--color-900)}.custom-fields-component .hover\:fi-text-color-950{--hover-text:var(--color-950)}.custom-fields-component .dark\:fi-text-color-0{--dark-text:oklch(100% 0 0)}.custom-fields-component .dark\:fi-text-color-50{--dark-text:var(--color-50)}.custom-fields-component .dark\:fi-text-color-100{--dark-text:var(--color-100)}.custom-fields-component .dark\:fi-text-color-200{--dark-text:var(--color-200)}.custom-fields-component .dark\:fi-text-color-300{--dark-text:var(--color-300)}.custom-fields-component .dark\:fi-text-color-400{--dark-text:var(--color-400)}.custom-fields-component .dark\:fi-text-color-500{--dark-text:var(--color-500)}.custom-fields-component .dark\:fi-text-color-600{--dark-text:var(--color-600)}.custom-fields-component .dark\:fi-text-color-700{--dark-text:var(--color-700)}.custom-fields-component .dark\:fi-text-color-800{--dark-text:var(--color-800)}.custom-fields-component .dark\:fi-text-color-900{--dark-text:var(--color-900)}.custom-fields-component .dark\:fi-text-color-950{--dark-text:var(--color-950)}.custom-fields-component .dark\:hover\:fi-text-color-0{--dark-hover-text:oklch(100% 0 0)}.custom-fields-component .dark\:hover\:fi-text-color-50{--dark-hover-text:var(--color-50)}.custom-fields-component .dark\:hover\:fi-text-color-100{--dark-hover-text:var(--color-100)}.custom-fields-component .dark\:hover\:fi-text-color-200{--dark-hover-text:var(--color-200)}.custom-fields-component .dark\:hover\:fi-text-color-300{--dark-hover-text:var(--color-300)}.custom-fields-component .dark\:hover\:fi-text-color-400{--dark-hover-text:var(--color-400)}.custom-fields-component .dark\:hover\:fi-text-color-500{--dark-hover-text:var(--color-500)}.custom-fields-component .dark\:hover\:fi-text-color-600{--dark-hover-text:var(--color-600)}.custom-fields-component .dark\:hover\:fi-text-color-700{--dark-hover-text:var(--color-700)}.custom-fields-component .dark\:hover\:fi-text-color-800{--dark-hover-text:var(--color-800)}.custom-fields-component .dark\:hover\:fi-text-color-900{--dark-hover-text:var(--color-900)}.custom-fields-component .dark\:hover\:fi-text-color-950{--dark-hover-text:var(--color-950)}.custom-fields-component .fi-sr-only{border-width:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.custom-fields-component .fi-prose{--prose-color:var(--color-gray-700);--prose-heading-color:var(--color-gray-950);--prose-strong-color:var(--color-gray-950);--prose-link-color:var(--color-gray-950);--prose-code-color:var(--color-gray-950);--prose-marker-color:var(--color-gray-700)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-prose{--prose-marker-color:color-mix(in oklab,var(--color-gray-700)25%,transparent)}}.custom-fields-component .fi-prose{--prose-link-underline-color:var(--color-primary-400);--prose-th-borders:var(--color-gray-300);--prose-td-borders:var(--color-gray-200);--prose-hr-color:var(--color-gray-950)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-prose{--prose-hr-color:color-mix(in oklab,var(--color-gray-950)5%,transparent)}}.custom-fields-component .fi-prose{--prose-blockquote-border-color:var(--color-gray-300);--prose-pre-bg:var(--color-gray-100)}.custom-fields-component .fi-prose:where(.dark,.dark *){--prose-color:var(--color-gray-300);--prose-heading-color:var(--color-white);--prose-strong-color:var(--color-white);--prose-link-color:var(--color-white);--prose-code-color:var(--color-white);--prose-marker-color:var(--color-gray-300)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-prose:where(.dark,.dark *){--prose-marker-color:color-mix(in oklab,var(--color-gray-300)35%,transparent)}}.custom-fields-component .fi-prose:where(.dark,.dark *){--prose-link-underline-color:var(--color-sky-400);--prose-th-borders:var(--color-gray-600);--prose-td-borders:var(--color-gray-700);--prose-hr-color:oklab(100% 0 5.96046e-8/.1)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-prose:where(.dark,.dark *){--prose-hr-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.custom-fields-component .fi-prose:where(.dark,.dark *){--prose-blockquote-border-color:var(--color-gray-600);--prose-pre-bg:var(--color-gray-900)}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-prose:where(.dark,.dark *){--prose-pre-bg:color-mix(in oklab,var(--color-gray-900)40%,transparent)}}.custom-fields-component .fi-prose{color:var(--prose-color);font-size:var(--text-sm);line-height:1.5}.custom-fields-component .fi-prose img+img{margin-top:0}.custom-fields-component .fi-prose :where(:not(.fi-not-prose,.fi-not-prose *,br))+:where(:not(.fi-not-prose,.fi-not-prose *,br)){margin-top:calc(var(--spacing)*4)}.custom-fields-component .fi-prose p br{margin:0}.custom-fields-component .fi-prose h1:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-code-color);font-size:var(--text-xl);font-weight:var(--font-weight-bold);letter-spacing:-.025em;line-height:1.55556}.custom-fields-component .fi-prose h2:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-code-color);font-size:var(--text-lg);font-weight:var(--font-weight-semibold);letter-spacing:-.025em;line-height:1.55556}.custom-fields-component .fi-prose h3:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-heading-color);font-size:var(--text-base);font-weight:var(--font-weight-semibold);line-height:1.55556}.custom-fields-component .fi-prose h4:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose h5:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose h6:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-heading-color);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);line-height:2}.custom-fields-component .fi-prose :is(h2,h3,h4,h5,h6):where(:not(.fi-not-prose,.fi-not-prose *)){scroll-margin-top:calc(var(--spacing)*32)}@media (min-width:64rem){.custom-fields-component .fi-prose :is(h2,h3,h4,h5,h6):where(:not(.fi-not-prose,.fi-not-prose *)){scroll-margin-top:calc(var(--spacing)*18)}}.custom-fields-component .fi-prose ol:where(:not(.fi-not-prose,.fi-not-prose *)){list-style-type:decimal;padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-prose ul:where(:not(.fi-not-prose,.fi-not-prose *)){list-style-type:disc;padding-inline-start:calc(var(--spacing)*6)}.custom-fields-component .fi-prose ol li:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose ul li:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:calc(var(--spacing)*3)}.custom-fields-component .fi-prose ol li+li:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose ul li+li:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:calc(var(--spacing)*4)}.custom-fields-component .fi-prose ol li:where(:not(.fi-not-prose,.fi-not-prose *))::marker{color:var(--prose-marker-color)}.custom-fields-component .fi-prose ul li:where(:not(.fi-not-prose,.fi-not-prose *))::marker{color:var(--prose-marker-color)}.custom-fields-component .fi-prose a:not(:where(:is(h2,h3,h4,h5,h6) *)):where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-link-color);font-weight:var(--font-weight-semibold);text-decoration:underline;-webkit-text-decoration-color:var(--prose-link-underline-color);text-decoration-color:var(--prose-link-underline-color);text-decoration-thickness:1px;text-underline-offset:3px}.custom-fields-component .fi-prose a:not(:where(:is(h2,h3,h4,h5,h6) *)):where(:not(.fi-not-prose,.fi-not-prose *)) code{font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-prose a:hover:where(:not(.fi-not-prose,.fi-not-prose *)){text-decoration-thickness:2px}.custom-fields-component .fi-prose strong:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-strong-color);font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-code-color);font-family:var(--font-mono);font-variant-ligatures:none;font-weight:var(--font-weight-medium)}.custom-fields-component .fi-prose :where(h2,h3,h4,h5,h6) code:where(:not(.fi-not-prose,.fi-not-prose *)){font-weight:var(--font-weight-semibold)}.custom-fields-component .fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)):after,.custom-fields-component .fi-prose code:where(:not(.fi-not-prose,.fi-not-prose *)):before{content:"`";display:inline}.custom-fields-component .fi-prose pre:where(:not(.fi-not-prose,.fi-not-prose *)){background-color:var(--prose-pre-bg);border-radius:var(--radius-lg);margin-bottom:calc(var(--spacing)*10);margin-top:calc(var(--spacing)*4);padding-inline-end:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*3);padding-top:calc(var(--spacing)*3);padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-prose pre code *+:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:0}.custom-fields-component .fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)):after,.custom-fields-component .fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)):before{content:none}.custom-fields-component .fi-prose pre code:where(:not(.fi-not-prose,.fi-not-prose *)){font-family:var(--font-mono);font-size:var(--text-sm);font-variant-ligatures:none;line-height:2}.custom-fields-component .fi-prose table:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-sm);line-height:1.4;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}.custom-fields-component .fi-prose thead:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-color:var(--prose-th-borders);border-bottom-width:1px}.custom-fields-component .fi-prose thead th:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-heading-color);font-weight:600;padding-inline-end:.6em;padding-bottom:.8em;padding-inline-start:.6em;vertical-align:bottom}.custom-fields-component .fi-prose thead th:first-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:0}.custom-fields-component .fi-prose thead th:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:0}.custom-fields-component .fi-prose tbody tr:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-color:var(--prose-td-borders);border-bottom-width:1px}.custom-fields-component .fi-prose tbody tr:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){border-bottom-width:0}.custom-fields-component .fi-prose tbody td:where(:not(.fi-not-prose,.fi-not-prose *)){vertical-align:baseline}.custom-fields-component .fi-prose tfoot:where(:not(.fi-not-prose,.fi-not-prose *)){border-top-color:var(--prose-th-borders);border-top-width:1px}.custom-fields-component .fi-prose tfoot td:where(:not(.fi-not-prose,.fi-not-prose *)){vertical-align:top}.custom-fields-component .fi-prose tbody td:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose tfoot td:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:.6em;padding-bottom:.8em;padding-top:.8em;padding-inline-start:.6em}.custom-fields-component .fi-prose tbody td:first-child:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose tfoot td:first-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-start:0}.custom-fields-component .fi-prose tbody td:last-child:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose tfoot td:last-child:where(:not(.fi-not-prose,.fi-not-prose *)){padding-inline-end:0}.custom-fields-component .fi-prose td:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose th:where(:not(.fi-not-prose,.fi-not-prose *)){text-align:start}.custom-fields-component .fi-prose td code:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:.8125rem}.custom-fields-component .fi-prose hr:where(:not(.fi-not-prose,.fi-not-prose *)){border-color:var(--prose-hr-color);margin-block:calc(var(--spacing)*8)}.custom-fields-component .fi-prose hr:where(:not(.fi-not-prose,.fi-not-prose *))+h2{margin-top:calc(var(--spacing)*8)}.custom-fields-component .fi-prose blockquote{border-inline-start-color:var(--prose-blockquote-border-color);border-inline-start-width:.25rem;font-style:italic;padding-inline-start:calc(var(--spacing)*4)}.custom-fields-component .fi-prose blockquote p:first-of-type:before{content:open-quote}.custom-fields-component .fi-prose blockquote p:last-of-type:after{content:close-quote}.custom-fields-component .fi-prose figure:where(:not(.fi-not-prose,.fi-not-prose *)) figcaption:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--prose-color);font-size:var(--text-sm);font-style:italic;line-height:var(--text-sm--line-height);margin-top:calc(var(--spacing)*3);text-align:center}@supports (color:color-mix(in lab,red,red)){.custom-fields-component .fi-prose figure:where(:not(.fi-not-prose,.fi-not-prose *)) figcaption:where(:not(.fi-not-prose,.fi-not-prose *)){color:color-mix(in oklab,var(--prose-color)75%,transparent)}}.custom-fields-component .fi-prose :first-child:where(:not(.fi-not-prose,.fi-not-prose *)){margin-top:0}.custom-fields-component .fi-prose :last-child:where(:not(.fi-not-prose,.fi-not-prose *)){margin-bottom:0}.custom-fields-component .fi-prose .color:where(:not(.fi-not-prose,.fi-not-prose *)){color:var(--color)}.custom-fields-component .fi-prose .color:where(:not(.fi-not-prose,.fi-not-prose *)):where(.dark,.dark *){color:var(--dark-color)}.custom-fields-component .fi-prose .lead:where(:not(.fi-not-prose,.fi-not-prose *)){font-size:var(--text-base)}.custom-fields-component .fi-prose a[data-type=mention]:where(:not(.fi-not-prose,.fi-not-prose *)),.custom-fields-component .fi-prose span[data-type=mention]:where(:not(.fi-not-prose,.fi-not-prose *)){display:inline-block;font-weight:var(--font-weight-semibold);margin-block:0;white-space:nowrap}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *)){display:grid;gap:calc(var(--spacing)*4);grid-template-columns:repeat(1,minmax(0,1fr))}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=default]{grid-template-columns:var(--cols)}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=default]>.grid-layout-col{grid-column:var(--col-span)}@media (min-width:40rem){.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=sm]{grid-template-columns:var(--cols)}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=sm]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:48rem){.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=md]{grid-template-columns:var(--cols)}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=md]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:64rem){.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=lg]{grid-template-columns:var(--cols)}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=lg]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:80rem){.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=xl]{grid-template-columns:var(--cols)}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint=xl]>.grid-layout-col{grid-column:var(--col-span)}}@media (min-width:96rem){.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint="2xl"]{grid-template-columns:var(--cols)}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))[data-from-breakpoint="2xl"]>.grid-layout-col{grid-column:var(--col-span)}}.custom-fields-component .fi-prose .grid-layout:where(:not(.fi-not-prose,.fi-not-prose *))>.grid-layout-col{margin-top:0;min-width:0}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-ease{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(1turn)}}@keyframes pulse{50%{opacity:.5}} ================================================ FILE: public/css/relaticle/flowforge/flowforge.css ================================================ /*! tailwindcss v4.1.10 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-font-weight:initial;--tw-leading:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-800:oklch(47% .157 37.304);--color-orange-900:oklch(40.8% .123 38.172);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-100:oklch(96.7% .067 122.328);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-200:oklch(91% .096 180.426);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-900:oklch(38.6% .063 188.416);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-900:oklch(39.8% .07 227.392);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-900:oklch(38% .189 293.745);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-900:oklch(38.1% .176 304.987);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-100:oklch(95.2% .037 318.852);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-900:oklch(40.1% .17 325.612);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-900:oklch(40.8% .153 2.432);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-200:var(--gray-200);--color-gray-300:var(--gray-300);--color-gray-400:var(--gray-400);--color-gray-500:var(--gray-500);--color-gray-600:var(--gray-600);--color-gray-700:var(--gray-700);--color-gray-950:var(--gray-950);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--leading-loose:2;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary-400:var(--primary-400)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.contents{display:contents}.h-\[calc\(100vh-12rem\)\]{height:calc(100vh - 12rem)}.opacity-75{opacity:.75}@media (prefers-color-scheme:dark){.dark\:text-primary-400{color:var(--primary-400)}}}.ff-card{margin-bottom:calc(var(--spacing)*3);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;overflow:hidden}@media (hover:hover){.ff-card:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}@media (prefers-color-scheme:dark){.ff-card{border-color:var(--gray-800);background-color:var(--gray-900)}}.ff-card .ff-card__content{padding:calc(var(--spacing)*3)}.ff-card .ff-card__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-900)}@media (prefers-color-scheme:dark){.ff-card .ff-card__title{color:var(--color-white)}}.ff-card .ff-card__description{margin-top:calc(var(--spacing)*1);-webkit-line-clamp:2;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-500);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}@media (prefers-color-scheme:dark){.ff-card .ff-card__description{color:var(--gray-400)}}.ff-card .ff-card__attributes{margin-top:calc(var(--spacing)*3);gap:calc(var(--spacing)*1.5);flex-wrap:wrap;display:flex}.ff-card.ff-card--interactive{cursor:pointer}.ff-card.ff-card--non-interactive{cursor:default}.ff-badge{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;align-items:center;transition-duration:.15s;display:inline-flex}.ff-badge.ff-badge--sm{padding-inline:calc(var(--spacing)*1.5);padding-block:calc(var(--spacing)*0);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.ff-badge.ff-badge--md{padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.ff-badge.ff-badge--lg{padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.ff-badge.ff-badge--rounded-md{border-radius:var(--radius-md)}.ff-badge.ff-badge--rounded-full{border-radius:3.40282e38px}.ff-badge .ff-badge__label{margin-right:calc(var(--spacing)*.5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.ff-badge .ff-badge__count{margin-left:calc(var(--spacing)*1.5);height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);background-color:#ffffff4d;border-radius:3.40282e38px;justify-content:center;align-items:center;display:flex}@supports (color:color-mix(in lab, red, red)){.ff-badge .ff-badge__count{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.ff-badge .ff-badge__count{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:1;line-height:1}.ff-badge .ff-badge__icon{flex-shrink:0}.ff-badge .ff-badge__icon.ff-badge__icon--sm{margin-right:calc(var(--spacing)*1);height:calc(var(--spacing)*3);width:calc(var(--spacing)*3)}.ff-badge .ff-badge__icon.ff-badge__icon--md{margin-right:calc(var(--spacing)*1.5);height:calc(var(--spacing)*3.5);width:calc(var(--spacing)*3.5)}.ff-badge .ff-badge__icon.ff-badge__icon--lg{margin-right:calc(var(--spacing)*1.5);height:calc(var(--spacing)*4);width:calc(var(--spacing)*4)}.ff-column{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);width:300px;min-width:300px;max-height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}@media (prefers-color-scheme:dark){.ff-column{border-color:var(--gray-700);--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.ff-column .ff-column__header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--gray-200);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*3);justify-content:space-between;align-items:center;display:flex}@media (prefers-color-scheme:dark){.ff-column .ff-column__header{border-color:var(--gray-700)}}.ff-column .ff-column__title-container{align-items:center;display:flex}.ff-column .ff-column__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--gray-700)}@media (prefers-color-scheme:dark){.ff-column .ff-column__title{color:var(--gray-200)}}.ff-column .ff-column__count{margin-left:calc(var(--spacing)*2);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:3.40282e38px;align-items:center;display:inline-flex}.ff-column .ff-column__content{padding:calc(var(--spacing)*3);flex:1;max-height:calc(100vh - 13rem);overflow:hidden auto}.ff-column .ff-column__loader{padding-block:calc(var(--spacing)*3);text-align:center}.ff-column .ff-column__loading-text{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--primary-600)}@media (prefers-color-scheme:dark){.ff-column .ff-column__loading-text{color:var(--primary-400)}}.ff-column .ff-column__count-text{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--gray-400)}.ff-empty-column{border-radius:var(--radius-lg);border-style:var(--tw-border-style);--tw-border-style:dashed;border-style:dashed;border-width:2px;border-color:var(--gray-200);height:100%;min-height:150px;padding:calc(var(--spacing)*3);flex-direction:column;justify-content:center;align-items:center;display:flex}@media (prefers-color-scheme:dark){.ff-empty-column{border-color:var(--gray-800)}}.ff-empty-column .ff-empty-column__icon{margin-bottom:calc(var(--spacing)*2);height:calc(var(--spacing)*10);width:calc(var(--spacing)*10);color:var(--gray-400)}@media (prefers-color-scheme:dark){.ff-empty-column .ff-empty-column__icon{color:var(--gray-600)}}.ff-empty-column .ff-empty-column__text{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--gray-500)}@media (prefers-color-scheme:dark){.ff-empty-column .ff-empty-column__text{color:var(--gray-400)}}.ff-board{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.ff-board .ff-board__content{flex:1;overflow:hidden}.ff-board .ff-board__columns{gap:calc(var(--spacing)*5);height:100%;padding-inline:calc(var(--spacing)*2);padding-bottom:calc(var(--spacing)*4);flex-direction:row;display:flex;overflow:auto hidden}.kanban-color-default{border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);background-color:var(--gray-100);color:var(--gray-800)}@media (hover:hover){.kanban-color-default:hover{background-color:var(--gray-200)}}@media (prefers-color-scheme:dark){.kanban-color-default{border-color:var(--gray-600);background-color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.kanban-color-default{background-color:color-mix(in oklab,var(--gray-700) 60%,transparent)}}.kanban-color-default{color:var(--gray-200)}@media (hover:hover){.kanban-color-default:hover{background-color:var(--gray-700)}}}.kanban-color-white{border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);background-color:var(--color-white);color:var(--gray-800)}@media (hover:hover){.kanban-color-white:hover{background-color:var(--gray-100)}}@media (prefers-color-scheme:dark){.kanban-color-white{border-color:var(--gray-600);background-color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.kanban-color-white{background-color:color-mix(in oklab,var(--gray-700) 60%,transparent)}}.kanban-color-white{color:var(--gray-200)}@media (hover:hover){.kanban-color-white:hover{background-color:var(--gray-700)}}}.kanban-color-slate{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-slate-100);color:var(--color-slate-800)}@media (hover:hover){.kanban-color-slate:hover{background-color:var(--color-slate-200)}}@media (prefers-color-scheme:dark){.kanban-color-slate{border-color:var(--color-slate-600);background-color:#31415899}@supports (color:color-mix(in lab, red, red)){.kanban-color-slate{background-color:color-mix(in oklab,var(--color-slate-700) 60%,transparent)}}.kanban-color-slate{color:var(--color-slate-200)}@media (hover:hover){.kanban-color-slate:hover{background-color:var(--color-slate-700)}}}.kanban-color-gray{border-style:var(--tw-border-style);border-width:1px;border-color:var(--gray-200);background-color:var(--gray-100);color:var(--gray-800)}@media (hover:hover){.kanban-color-gray:hover{background-color:var(--gray-200)}}@media (prefers-color-scheme:dark){.kanban-color-gray{border-color:var(--gray-600);background-color:var(--gray-700)}@supports (color:color-mix(in lab, red, red)){.kanban-color-gray{background-color:color-mix(in oklab,var(--gray-700) 60%,transparent)}}.kanban-color-gray{color:var(--gray-200)}@media (hover:hover){.kanban-color-gray:hover{background-color:var(--gray-700)}}}.kanban-color-zinc{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-200);background-color:var(--color-zinc-100);color:var(--color-zinc-800)}@media (hover:hover){.kanban-color-zinc:hover{background-color:var(--color-zinc-200)}}@media (prefers-color-scheme:dark){.kanban-color-zinc{border-color:var(--color-zinc-600);background-color:#3f3f4699}@supports (color:color-mix(in lab, red, red)){.kanban-color-zinc{background-color:color-mix(in oklab,var(--color-zinc-700) 60%,transparent)}}.kanban-color-zinc{color:var(--color-zinc-200)}@media (hover:hover){.kanban-color-zinc:hover{background-color:var(--color-zinc-700)}}}.kanban-color-neutral{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-neutral-200);background-color:var(--color-neutral-100);color:var(--color-neutral-800)}@media (hover:hover){.kanban-color-neutral:hover{background-color:var(--color-neutral-200)}}@media (prefers-color-scheme:dark){.kanban-color-neutral{border-color:var(--color-neutral-600);background-color:#40404099}@supports (color:color-mix(in lab, red, red)){.kanban-color-neutral{background-color:color-mix(in oklab,var(--color-neutral-700) 60%,transparent)}}.kanban-color-neutral{color:var(--color-neutral-200)}@media (hover:hover){.kanban-color-neutral:hover{background-color:var(--color-neutral-700)}}}.kanban-color-stone{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-stone-200);background-color:var(--color-stone-100);color:var(--color-stone-800)}@media (hover:hover){.kanban-color-stone:hover{background-color:var(--color-stone-200)}}@media (prefers-color-scheme:dark){.kanban-color-stone{border-color:var(--color-stone-600);background-color:#44403b99}@supports (color:color-mix(in lab, red, red)){.kanban-color-stone{background-color:color-mix(in oklab,var(--color-stone-700) 60%,transparent)}}.kanban-color-stone{color:var(--color-stone-200)}@media (hover:hover){.kanban-color-stone:hover{background-color:var(--color-stone-700)}}}.kanban-color-red{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-red-200);background-color:var(--color-red-50);color:var(--color-red-800)}@media (hover:hover){.kanban-color-red:hover{background-color:var(--color-red-100)}}@media (prefers-color-scheme:dark){.kanban-color-red{border-color:#9f071299}@supports (color:color-mix(in lab, red, red)){.kanban-color-red{border-color:color-mix(in oklab,var(--color-red-800) 60%,transparent)}}.kanban-color-red{background-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.kanban-color-red{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.kanban-color-red{color:var(--color-red-200)}@media (hover:hover){.kanban-color-red:hover{background-color:#82181a99}@supports (color:color-mix(in lab, red, red)){.kanban-color-red:hover{background-color:color-mix(in oklab,var(--color-red-900) 60%,transparent)}}}}.kanban-color-orange{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-orange-200);background-color:var(--color-orange-50);color:var(--color-orange-800)}@media (hover:hover){.kanban-color-orange:hover{background-color:var(--color-orange-100)}}@media (prefers-color-scheme:dark){.kanban-color-orange{border-color:#9f2d0099}@supports (color:color-mix(in lab, red, red)){.kanban-color-orange{border-color:color-mix(in oklab,var(--color-orange-800) 60%,transparent)}}.kanban-color-orange{background-color:#7e2a0c66}@supports (color:color-mix(in lab, red, red)){.kanban-color-orange{background-color:color-mix(in oklab,var(--color-orange-900) 40%,transparent)}}.kanban-color-orange{color:var(--color-orange-200)}@media (hover:hover){.kanban-color-orange:hover{background-color:#7e2a0c99}@supports (color:color-mix(in lab, red, red)){.kanban-color-orange:hover{background-color:color-mix(in oklab,var(--color-orange-900) 60%,transparent)}}}}.kanban-color-amber{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-amber-200);background-color:var(--color-amber-50);color:var(--color-amber-800)}@media (hover:hover){.kanban-color-amber:hover{background-color:var(--color-amber-100)}}@media (prefers-color-scheme:dark){.kanban-color-amber{border-color:#953d0099}@supports (color:color-mix(in lab, red, red)){.kanban-color-amber{border-color:color-mix(in oklab,var(--color-amber-800) 60%,transparent)}}.kanban-color-amber{background-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.kanban-color-amber{background-color:color-mix(in oklab,var(--color-amber-900) 40%,transparent)}}.kanban-color-amber{color:var(--color-amber-200)}@media (hover:hover){.kanban-color-amber:hover{background-color:#7b330699}@supports (color:color-mix(in lab, red, red)){.kanban-color-amber:hover{background-color:color-mix(in oklab,var(--color-amber-900) 60%,transparent)}}}}.kanban-color-yellow{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-yellow-200);background-color:var(--color-yellow-50);color:var(--color-yellow-800)}@media (hover:hover){.kanban-color-yellow:hover{background-color:var(--color-yellow-100)}}@media (prefers-color-scheme:dark){.kanban-color-yellow{border-color:#874b0099}@supports (color:color-mix(in lab, red, red)){.kanban-color-yellow{border-color:color-mix(in oklab,var(--color-yellow-800) 60%,transparent)}}.kanban-color-yellow{background-color:#733e0a66}@supports (color:color-mix(in lab, red, red)){.kanban-color-yellow{background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.kanban-color-yellow{color:var(--color-yellow-200)}@media (hover:hover){.kanban-color-yellow:hover{background-color:#733e0a99}@supports (color:color-mix(in lab, red, red)){.kanban-color-yellow:hover{background-color:color-mix(in oklab,var(--color-yellow-900) 60%,transparent)}}}}.kanban-color-lime{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-lime-200);background-color:var(--color-lime-50);color:var(--color-lime-800)}@media (hover:hover){.kanban-color-lime:hover{background-color:var(--color-lime-100)}}@media (prefers-color-scheme:dark){.kanban-color-lime{border-color:#3d630099}@supports (color:color-mix(in lab, red, red)){.kanban-color-lime{border-color:color-mix(in oklab,var(--color-lime-800) 60%,transparent)}}.kanban-color-lime{background-color:#35530e66}@supports (color:color-mix(in lab, red, red)){.kanban-color-lime{background-color:color-mix(in oklab,var(--color-lime-900) 40%,transparent)}}.kanban-color-lime{color:var(--color-lime-200)}@media (hover:hover){.kanban-color-lime:hover{background-color:#35530e99}@supports (color:color-mix(in lab, red, red)){.kanban-color-lime:hover{background-color:color-mix(in oklab,var(--color-lime-900) 60%,transparent)}}}}.kanban-color-green{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-green-200);background-color:var(--color-green-50);color:var(--color-green-800)}@media (hover:hover){.kanban-color-green:hover{background-color:var(--color-green-100)}}@media (prefers-color-scheme:dark){.kanban-color-green{border-color:#01663099}@supports (color:color-mix(in lab, red, red)){.kanban-color-green{border-color:color-mix(in oklab,var(--color-green-800) 60%,transparent)}}.kanban-color-green{background-color:#0d542b66}@supports (color:color-mix(in lab, red, red)){.kanban-color-green{background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.kanban-color-green{color:var(--color-green-200)}@media (hover:hover){.kanban-color-green:hover{background-color:#0d542b99}@supports (color:color-mix(in lab, red, red)){.kanban-color-green:hover{background-color:color-mix(in oklab,var(--color-green-900) 60%,transparent)}}}}.kanban-color-emerald{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-emerald-200);background-color:var(--color-emerald-50);color:var(--color-emerald-800)}@media (hover:hover){.kanban-color-emerald:hover{background-color:var(--color-emerald-100)}}@media (prefers-color-scheme:dark){.kanban-color-emerald{border-color:#005f4699}@supports (color:color-mix(in lab, red, red)){.kanban-color-emerald{border-color:color-mix(in oklab,var(--color-emerald-800) 60%,transparent)}}.kanban-color-emerald{background-color:#004e3b66}@supports (color:color-mix(in lab, red, red)){.kanban-color-emerald{background-color:color-mix(in oklab,var(--color-emerald-900) 40%,transparent)}}.kanban-color-emerald{color:var(--color-emerald-200)}@media (hover:hover){.kanban-color-emerald:hover{background-color:#004e3b99}@supports (color:color-mix(in lab, red, red)){.kanban-color-emerald:hover{background-color:color-mix(in oklab,var(--color-emerald-900) 60%,transparent)}}}}.kanban-color-teal{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-teal-200);background-color:var(--color-teal-50);color:var(--color-teal-800)}@media (hover:hover){.kanban-color-teal:hover{background-color:var(--color-teal-100)}}@media (prefers-color-scheme:dark){.kanban-color-teal{border-color:#005f5a99}@supports (color:color-mix(in lab, red, red)){.kanban-color-teal{border-color:color-mix(in oklab,var(--color-teal-800) 60%,transparent)}}.kanban-color-teal{background-color:#0b4f4a66}@supports (color:color-mix(in lab, red, red)){.kanban-color-teal{background-color:color-mix(in oklab,var(--color-teal-900) 40%,transparent)}}.kanban-color-teal{color:var(--color-teal-200)}@media (hover:hover){.kanban-color-teal:hover{background-color:#0b4f4a99}@supports (color:color-mix(in lab, red, red)){.kanban-color-teal:hover{background-color:color-mix(in oklab,var(--color-teal-900) 60%,transparent)}}}}.kanban-color-cyan{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-cyan-200);background-color:var(--color-cyan-50);color:var(--color-cyan-800)}@media (hover:hover){.kanban-color-cyan:hover{background-color:var(--color-cyan-100)}}@media (prefers-color-scheme:dark){.kanban-color-cyan{border-color:#005f7899}@supports (color:color-mix(in lab, red, red)){.kanban-color-cyan{border-color:color-mix(in oklab,var(--color-cyan-800) 60%,transparent)}}.kanban-color-cyan{background-color:#104e6466}@supports (color:color-mix(in lab, red, red)){.kanban-color-cyan{background-color:color-mix(in oklab,var(--color-cyan-900) 40%,transparent)}}.kanban-color-cyan{color:var(--color-cyan-200)}@media (hover:hover){.kanban-color-cyan:hover{background-color:#104e6499}@supports (color:color-mix(in lab, red, red)){.kanban-color-cyan:hover{background-color:color-mix(in oklab,var(--color-cyan-900) 60%,transparent)}}}}.kanban-color-sky{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-sky-200);background-color:var(--color-sky-50);color:var(--color-sky-800)}@media (hover:hover){.kanban-color-sky:hover{background-color:var(--color-sky-100)}}@media (prefers-color-scheme:dark){.kanban-color-sky{border-color:#00598699}@supports (color:color-mix(in lab, red, red)){.kanban-color-sky{border-color:color-mix(in oklab,var(--color-sky-800) 60%,transparent)}}.kanban-color-sky{background-color:#024a7066}@supports (color:color-mix(in lab, red, red)){.kanban-color-sky{background-color:color-mix(in oklab,var(--color-sky-900) 40%,transparent)}}.kanban-color-sky{color:var(--color-sky-200)}@media (hover:hover){.kanban-color-sky:hover{background-color:#024a7099}@supports (color:color-mix(in lab, red, red)){.kanban-color-sky:hover{background-color:color-mix(in oklab,var(--color-sky-900) 60%,transparent)}}}}.kanban-color-blue{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-blue-200);background-color:var(--color-blue-50);color:var(--color-blue-800)}@media (hover:hover){.kanban-color-blue:hover{background-color:var(--color-blue-100)}}@media (prefers-color-scheme:dark){.kanban-color-blue{border-color:#193cb899}@supports (color:color-mix(in lab, red, red)){.kanban-color-blue{border-color:color-mix(in oklab,var(--color-blue-800) 60%,transparent)}}.kanban-color-blue{background-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.kanban-color-blue{background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.kanban-color-blue{color:var(--color-blue-200)}@media (hover:hover){.kanban-color-blue:hover{background-color:#1c398e99}@supports (color:color-mix(in lab, red, red)){.kanban-color-blue:hover{background-color:color-mix(in oklab,var(--color-blue-900) 60%,transparent)}}}}.kanban-color-indigo{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-indigo-200);background-color:var(--color-indigo-50);color:var(--color-indigo-800)}@media (hover:hover){.kanban-color-indigo:hover{background-color:var(--color-indigo-100)}}@media (prefers-color-scheme:dark){.kanban-color-indigo{border-color:#372aac99}@supports (color:color-mix(in lab, red, red)){.kanban-color-indigo{border-color:color-mix(in oklab,var(--color-indigo-800) 60%,transparent)}}.kanban-color-indigo{background-color:#312c8566}@supports (color:color-mix(in lab, red, red)){.kanban-color-indigo{background-color:color-mix(in oklab,var(--color-indigo-900) 40%,transparent)}}.kanban-color-indigo{color:var(--color-indigo-200)}@media (hover:hover){.kanban-color-indigo:hover{background-color:#312c8599}@supports (color:color-mix(in lab, red, red)){.kanban-color-indigo:hover{background-color:color-mix(in oklab,var(--color-indigo-900) 60%,transparent)}}}}.kanban-color-violet{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-violet-200);background-color:var(--color-violet-50);color:var(--color-violet-800)}@media (hover:hover){.kanban-color-violet:hover{background-color:var(--color-violet-100)}}@media (prefers-color-scheme:dark){.kanban-color-violet{border-color:#5d0ec099}@supports (color:color-mix(in lab, red, red)){.kanban-color-violet{border-color:color-mix(in oklab,var(--color-violet-800) 60%,transparent)}}.kanban-color-violet{background-color:#4d179a66}@supports (color:color-mix(in lab, red, red)){.kanban-color-violet{background-color:color-mix(in oklab,var(--color-violet-900) 40%,transparent)}}.kanban-color-violet{color:var(--color-violet-200)}@media (hover:hover){.kanban-color-violet:hover{background-color:#4d179a99}@supports (color:color-mix(in lab, red, red)){.kanban-color-violet:hover{background-color:color-mix(in oklab,var(--color-violet-900) 60%,transparent)}}}}.kanban-color-purple{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-purple-200);background-color:var(--color-purple-50);color:var(--color-purple-800)}@media (hover:hover){.kanban-color-purple:hover{background-color:var(--color-purple-100)}}@media (prefers-color-scheme:dark){.kanban-color-purple{border-color:#6e11b099}@supports (color:color-mix(in lab, red, red)){.kanban-color-purple{border-color:color-mix(in oklab,var(--color-purple-800) 60%,transparent)}}.kanban-color-purple{background-color:#59168b66}@supports (color:color-mix(in lab, red, red)){.kanban-color-purple{background-color:color-mix(in oklab,var(--color-purple-900) 40%,transparent)}}.kanban-color-purple{color:var(--color-purple-200)}@media (hover:hover){.kanban-color-purple:hover{background-color:#59168b99}@supports (color:color-mix(in lab, red, red)){.kanban-color-purple:hover{background-color:color-mix(in oklab,var(--color-purple-900) 60%,transparent)}}}}.kanban-color-fuchsia{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-fuchsia-200);background-color:var(--color-fuchsia-50);color:var(--color-fuchsia-800)}@media (hover:hover){.kanban-color-fuchsia:hover{background-color:var(--color-fuchsia-100)}}@media (prefers-color-scheme:dark){.kanban-color-fuchsia{border-color:#8a019499}@supports (color:color-mix(in lab, red, red)){.kanban-color-fuchsia{border-color:color-mix(in oklab,var(--color-fuchsia-800) 60%,transparent)}}.kanban-color-fuchsia{background-color:#72137866}@supports (color:color-mix(in lab, red, red)){.kanban-color-fuchsia{background-color:color-mix(in oklab,var(--color-fuchsia-900) 40%,transparent)}}.kanban-color-fuchsia{color:var(--color-fuchsia-200)}@media (hover:hover){.kanban-color-fuchsia:hover{background-color:#72137899}@supports (color:color-mix(in lab, red, red)){.kanban-color-fuchsia:hover{background-color:color-mix(in oklab,var(--color-fuchsia-900) 60%,transparent)}}}}.kanban-color-pink{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-pink-200);background-color:var(--color-pink-50);color:var(--color-pink-800)}@media (hover:hover){.kanban-color-pink:hover{background-color:var(--color-pink-100)}}@media (prefers-color-scheme:dark){.kanban-color-pink{border-color:#a2004c99}@supports (color:color-mix(in lab, red, red)){.kanban-color-pink{border-color:color-mix(in oklab,var(--color-pink-800) 60%,transparent)}}.kanban-color-pink{background-color:#86104366}@supports (color:color-mix(in lab, red, red)){.kanban-color-pink{background-color:color-mix(in oklab,var(--color-pink-900) 40%,transparent)}}.kanban-color-pink{color:var(--color-pink-200)}@media (hover:hover){.kanban-color-pink:hover{background-color:#86104399}@supports (color:color-mix(in lab, red, red)){.kanban-color-pink:hover{background-color:color-mix(in oklab,var(--color-pink-900) 60%,transparent)}}}}.kanban-color-rose{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-rose-200);background-color:var(--color-rose-50);color:var(--color-rose-800)}@media (hover:hover){.kanban-color-rose:hover{background-color:var(--color-rose-100)}}@media (prefers-color-scheme:dark){.kanban-color-rose{border-color:#a3003799}@supports (color:color-mix(in lab, red, red)){.kanban-color-rose{border-color:color-mix(in oklab,var(--color-rose-800) 60%,transparent)}}.kanban-color-rose{background-color:#8b083666}@supports (color:color-mix(in lab, red, red)){.kanban-color-rose{background-color:color-mix(in oklab,var(--color-rose-900) 40%,transparent)}}.kanban-color-rose{color:var(--color-rose-200)}@media (hover:hover){.kanban-color-rose:hover{background-color:#8b083699}@supports (color:color-mix(in lab, red, red)){.kanban-color-rose:hover{background-color:color-mix(in oklab,var(--color-rose-900) 60%,transparent)}}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false} ================================================ FILE: public/fonts/filament/filament/inter/index.css ================================================ @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-cyrillic-ext-wght-normal-IYF56FF6.woff2") format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-cyrillic-wght-normal-JEOLYBOO.woff2") format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-greek-ext-wght-normal-EOVOK2B5.woff2") format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-greek-wght-normal-IRE366VL.woff2") format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-vietnamese-wght-normal-CE5GGD3W.woff2") format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-latin-ext-wght-normal-HA22NDSG.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-latin-wght-normal-NRMW37G5.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD} ================================================ FILE: public/index.php ================================================ handleRequest(Request::capture()); ================================================ FILE: public/js/asmit/resized-column/resized-column.js ================================================ document.addEventListener("alpine:init", () => { Alpine.data("resizedColumn", function (u, c) { return { tableWrapper: null, table: null, column: null, minColumnWidth: 100, maxColumnWidth: 1e3, handleBar: null, tableWrapperContentSelector: ".fi-ta-content-ctn", tableSelector: ".fi-ta-table", tableBodyCellPrefix: "fi-ta-cell-", debounceTime: 500, init() { if ( ((this.column = this.$el), (this.table = this.$el.closest(this.tableSelector)), (this.tableWrapper = this.$el.closest( this.tableWrapperContentSelector )), !this.column || !this.table || !this.tableWrapper) ) return null; this.initializeColumnLayout(), this.onLivewireUpdate(); }, initializeColumnLayout() { this.column.classList.add("relative", "group/column-resize"), this.createHandleBar(); }, createHandleBar() { (this.handleBar = document.createElement("button")), (this.handleBar.type = "button"), this.handleBar.classList.add("column-resize-handle-bar"); let e = this.column.querySelector(".column-resize-handle-bar"); e && e.remove(), this.column.appendChild(this.handleBar), this.handleBar.addEventListener( "mousedown", this.startResize(this.column) ); }, startResize(e) { return (t) => { t.preventDefault(), this.handleBar.classList.add("active"); let i = t.pageX, l = Math.round(e.offsetWidth), n = Math.round(this.table.offsetWidth), o = Math.round(this.tableWrapper.offsetWidth), a = 0, s = (d) => { if (d.pageX === i) return; a = Math.round( Math.min( this.maxColumnWidth, Math.max(this.minColumnWidth, l + (d.pageX - i) - 16) ) ); let h = n - l + a; (this.table.style.width = `${h > o ? h : "auto"}px`), this.applyColumnWidth(e, a), this.$dispatch("column-resized"); }, r = () => { this.handleBar.classList.remove("active"), this.debounce(() => { this.$wire.updateColumnWidth(u, a); }, this.debounceTime)(), document.removeEventListener("mousemove", s), document.removeEventListener("mouseup", r); }; document.addEventListener("mousemove", s), document.addEventListener("mouseup", r); }; }, applyColumnWidth(e, t) { this.setColumnWidthAttribute(e, t); let i = this.tableBodyCellPrefix + c; this.table .querySelectorAll(`.${this.getEscapedSelectorFromClass(i)}`) .forEach((n) => { this.setColumnWidthAttribute(n, t), (n.style.overflow = "hidden"); }); }, setColumnWidthAttribute(e, t) { (e.style.maxWidth = `${t}px`), (e.style.width = `${t}px`), (e.style.minWidth = `${t}px`); }, getEscapedSelectorFromClass(e) { return !e || typeof e != "string" ? "" : e.replace(/\./g, "\\."); }, debounce(e, t) { let i; return function (...n) { clearTimeout(i), (i = setTimeout(() => { clearTimeout(i), e(...n); }, t)); }; }, onLivewireUpdate() { window.Livewire.hook("morph.updated", () => { this.initializeColumnLayout(); }); }, }; }); }); ================================================ FILE: public/js/filament/actions/actions.js ================================================ (()=>{var n=({livewireId:e})=>({actionNestingIndex:null,init(){window.addEventListener("sync-action-modals",t=>{t.detail.id===e&&this.syncActionModals(t.detail.newActionNestingIndex,t.detail.shouldOverlayParentActions??!1)})},syncActionModals(t,i=!1){if(this.actionNestingIndex===t){this.actionNestingIndex!==null&&this.$nextTick(()=>this.openModal());return}let s=this.actionNestingIndex!==null&&t!==null&&t>this.actionNestingIndex;if(this.actionNestingIndex!==null&&!(i&&s)&&this.closeModal(),this.actionNestingIndex=t,this.actionNestingIndex!==null){if(!this.$el.querySelector(`#${this.generateModalId(t)}`)){this.$nextTick(()=>this.openModal());return}this.openModal()}},generateModalId(t){return`fi-${e}-action-`+t},openModal(){let t=this.generateModalId(this.actionNestingIndex);document.dispatchEvent(new CustomEvent("open-modal",{bubbles:!0,composed:!0,detail:{id:t}}))},closeModal(){let t=this.generateModalId(this.actionNestingIndex);document.dispatchEvent(new CustomEvent("close-modal-quietly",{bubbles:!0,composed:!0,detail:{id:t}}))}});document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentActionModals",n)});})(); ================================================ FILE: public/js/filament/filament/app.js ================================================ (()=>{var re=Object.create,K=Object.defineProperty,ne=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty,oe=Object.getOwnPropertyNames,ae=Object.getOwnPropertyDescriptor,se=t=>K(t,"__esModule",{value:!0}),le=(t,n)=>()=>(n||(n={exports:{}},t(n.exports,n)),n.exports),fe=(t,n,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of oe(n))!ie.call(t,a)&&a!=="default"&&K(t,a,{get:()=>n[a],enumerable:!(i=ae(n,a))||i.enumerable});return t},ce=t=>fe(se(K(t!=null?re(ne(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t),ue=le((t,n)=>{(function(i,a,w){if(!i)return;for(var c={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},y={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},v={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},S={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},A,m=1;m<20;++m)c[111+m]="f"+m;for(m=0;m<=9;++m)c[m+96]=m.toString();function P(e,r,s){if(e.addEventListener){e.addEventListener(r,s,!1);return}e.attachEvent("on"+r,s)}function U(e){if(e.type=="keypress"){var r=String.fromCharCode(e.which);return e.shiftKey||(r=r.toLowerCase()),r}return c[e.which]?c[e.which]:y[e.which]?y[e.which]:String.fromCharCode(e.which).toLowerCase()}function F(e,r){return e.sort().join(",")===r.sort().join(",")}function V(e){var r=[];return e.shiftKey&&r.push("shift"),e.altKey&&r.push("alt"),e.ctrlKey&&r.push("ctrl"),e.metaKey&&r.push("meta"),r}function H(e){if(e.preventDefault){e.preventDefault();return}e.returnValue=!1}function B(e){if(e.stopPropagation){e.stopPropagation();return}e.cancelBubble=!0}function E(e){return e=="shift"||e=="ctrl"||e=="alt"||e=="meta"}function X(){if(!A){A={};for(var e in c)e>95&&e<112||c.hasOwnProperty(e)&&(A[c[e]]=e)}return A}function Y(e,r,s){return s||(s=X()[e]?"keydown":"keypress"),s=="keypress"&&r.length&&(s="keydown"),s}function Q(e){return e==="+"?["+"]:(e=e.replace(/\+{2}/g,"+plus"),e.split("+"))}function G(e,r){var s,h,k,M=[];for(s=Q(e),k=0;k1){$(o,b,f,p);return}u=G(o,p),r._callbacks[u.key]=r._callbacks[u.key]||[],I(u.key,u.modifiers,{type:u.action},l,o,d),r._callbacks[u.key][l?"unshift":"push"]({callback:f,modifiers:u.modifiers,action:u.action,seq:l,level:d,combo:o})}r._bindMultiple=function(o,f,p){for(var l=0;l-1||R(r,s.target))return!1;if("composedPath"in e&&typeof e.composedPath=="function"){var h=e.composedPath()[0];h!==e.target&&(r=h)}return r.tagName=="INPUT"||r.tagName=="SELECT"||r.tagName=="TEXTAREA"||r.isContentEditable},g.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},g.addKeycodes=function(e){for(var r in e)e.hasOwnProperty(r)&&(c[r]=e[r]);A=null},g.init=function(){var e=g(a);for(var r in e)r.charAt(0)!=="_"&&(g[r]=(function(s){return function(){return e[s].apply(e,arguments)}})(r))},g.init(),i.Mousetrap=g,typeof n<"u"&&n.exports&&(n.exports=g),typeof define=="function"&&define.amd&&define(function(){return g})})(typeof window<"u"?window:null,typeof window<"u"?document:null)}),T=ce(ue());(function(t){if(t){var n={},i=t.prototype.stopCallback;t.prototype.stopCallback=function(a,w,c,y){var v=this;return v.paused?!0:n[c]||n[y]?!1:i.call(v,a,w,c)},t.prototype.bindGlobal=function(a,w,c){var y=this;if(y.bind(a,w,c),a instanceof Array){for(var v=0;vArray.from(document.querySelectorAll('[aria-modal="true"]')).find(t=>window.getComputedStyle(t).display!=="none"),pe=t=>{t.directive("mousetrap",(n,{modifiers:i,expression:a},{evaluate:w})=>{let c=()=>a?w(a):n.click();i=i.map(y=>y.replace(/--/g," ").replace(/-/g,"+").replace(/\bslash\b/g,"/")),i.includes("global")&&(i=i.filter(y=>y!=="global"),T.default.bindGlobal(i,y=>{let v=J();v&&!v.contains(n)||(y.preventDefault(),c())})),T.default.bind(i,y=>{let v=J();v&&!v.contains(n)||(y.preventDefault(),c())}),document.addEventListener("livewire:navigating",()=>{T.default.unbind(i)},{once:!0})})},W=pe;var j=()=>({isOpen:window.Alpine.$persist(!0).as("isOpen"),isOpenDesktop:window.Alpine.$persist(!0).as("isOpenDesktop"),collapsedGroups:window.Alpine.$persist(null).as("collapsedGroups"),scrollTop:0,init(){this.resizeObserver=null,this.setUpResizeObserver(),document.addEventListener("livewire:navigate",()=>{let t=document.querySelector(".fi-main-sidebar .fi-sidebar-nav");t&&(this.scrollTop=t.scrollTop)}),document.addEventListener("livewire:navigated",()=>{this.setUpResizeObserver(),requestAnimationFrame(()=>{let t=document.querySelector(".fi-main-sidebar .fi-sidebar-nav");t&&this.scrollTop&&(t.scrollTop=this.scrollTop)})})},setUpResizeObserver(){this.resizeObserver&&this.resizeObserver.disconnect();let t=window.innerWidth;this.resizeObserver=new ResizeObserver(()=>{let n=window.innerWidth,i=t>=1024,a=n<1024,w=n>=1024;i&&a?(this.isOpenDesktop=this.isOpen,this.isOpen&&this.close()):!i&&w&&(this.isOpen=this.isOpenDesktop),t=n}),this.resizeObserver.observe(document.body),window.innerWidth<1024?this.isOpen&&(this.isOpenDesktop=!0,this.close()):this.isOpen=this.isOpenDesktop},groupIsCollapsed(t){return this.collapsedGroups.includes(t)},collapseGroup(t){this.collapsedGroups.includes(t)||(this.collapsedGroups=this.collapsedGroups.concat(t))},toggleCollapsedGroup(t){this.collapsedGroups=this.collapsedGroups.includes(t)?this.collapsedGroups.filter(n=>n!==t):this.collapsedGroups.concat(t)},close(){this.isOpen=!1,window.innerWidth>=1024&&(this.isOpenDesktop=!1)},open(){this.isOpen=!0,window.innerWidth>=1024&&(this.isOpenDesktop=!0)}});document.addEventListener("alpine:init",()=>{let t=localStorage.getItem("theme")??getComputedStyle(document.documentElement).getPropertyValue("--default-theme-mode");window.Alpine.store("theme",t==="dark"||t==="system"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),window.addEventListener("theme-changed",n=>{let i=n.detail;localStorage.setItem("theme",i),i==="system"&&(i=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),window.Alpine.store("theme",i)}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",n=>{localStorage.getItem("theme")==="system"&&window.Alpine.store("theme",n.matches?"dark":"light")}),window.Alpine.effect(()=>{window.Alpine.store("theme")==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")})});document.addEventListener("livewire:init",()=>{Livewire.interceptRequest(({request:t,onError:n,onFailure:i})=>{n(({response:a,preventDefault:w})=>{let c=window.filamentErrorNotifications;if(!c)return;try{let S=t?.payload;if(S&&JSON.parse(S).components.length===1){for(let A of JSON.parse(S).components)if(JSON.parse(A.snapshot).data.isFilamentNotificationsComponent)return}}catch{}let y=a?.status??"",v=c[y]??c[""];v.isDisabled!==!0&&(w(),v.isHidden!==!0&&new FilamentNotification().title(v.title).body(v.body).danger().send())}),i(()=>{let a=window.filamentErrorNotifications;if(!a)return;let w=a[""];new FilamentNotification().title(w.title).body(w.body).danger().send()})})});var x=window.history.replaceState,de=window.history.pushState;window.history.replaceState=function(t,n,i){t?.url instanceof URL&&(t.url=t.url.toString());let a=i||t?.url||window.location.href,w=window.location.href;if(a!==w){x.call(window.history,t,n,i);return}try{let c=window.history.state;JSON.stringify(t)!==JSON.stringify(c)&&x.call(window.history,t,n,i)}catch{x.call(window.history,t,n,i)}};window.history.pushState=function(t,n,i){t?.url instanceof URL&&(t.url=t.url.toString()),de.call(window.history,t,n,i)};document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{let t=document.querySelector(".fi-main-sidebar .fi-sidebar-item.fi-active");if((!t||t.offsetParent===null)&&(t=document.querySelector(".fi-main-sidebar .fi-sidebar-group.fi-active")),!t||t.offsetParent===null)return;let n=document.querySelector(".fi-main-sidebar .fi-sidebar-nav");n&&n.scrollTo(0,t.offsetTop-window.innerHeight/2)},10)});window.setUpUnsavedDataChangesAlert=({body:t,livewireComponent:n,$wire:i})=>{window.addEventListener("beforeunload",a=>{window.jsMd5(JSON.stringify(i.data).replace(/\\/g,""))===i.savedDataHash||i?.__instance?.effects?.redirect||(a.preventDefault(),a.returnValue=!0)})};window.setUpSpaModeUnsavedDataChangesAlert=({body:t,resolveLivewireComponentUsing:n,$wire:i})=>{let a=()=>i?.__instance?.effects?.redirect?!1:window.jsMd5(JSON.stringify(i.data).replace(/\\/g,""))!==i.savedDataHash,w=()=>confirm(t);document.addEventListener("livewire:navigate",c=>{if(typeof n()<"u"){if(!a()||w())return;c.preventDefault()}}),window.addEventListener("beforeunload",c=>{a()&&(c.preventDefault(),c.returnValue=!0)})};window.setUpUnsavedActionChangesAlert=({resolveLivewireComponentUsing:t,$wire:n})=>{window.addEventListener("beforeunload",i=>{if(!(typeof t()>"u")&&(n.mountedActions?.length??0)&&!n?.__instance?.effects?.redirect){i.preventDefault(),i.returnValue=!0;return}})};document.addEventListener("alpine:init",()=>{window.Alpine.plugin(W),window.Alpine.store("sidebar",j())});})(); ================================================ FILE: public/js/filament/filament/echo.js ================================================ (()=>{var Ci=Object.create;var he=Object.defineProperty;var Ti=Object.getOwnPropertyDescriptor;var Pi=Object.getOwnPropertyNames;var xi=Object.getPrototypeOf,Oi=Object.prototype.hasOwnProperty;var Ai=(l,h)=>()=>(h||l((h={exports:{}}).exports,h),h.exports);var Ei=(l,h,a,c)=>{if(h&&typeof h=="object"||typeof h=="function")for(let s of Pi(h))!Oi.call(l,s)&&s!==a&&he(l,s,{get:()=>h[s],enumerable:!(c=Ti(h,s))||c.enumerable});return l};var Li=(l,h,a)=>(a=l!=null?Ci(xi(l)):{},Ei(h||!l||!l.__esModule?he(a,"default",{value:l,enumerable:!0}):a,l));var me=Ai((vt,It)=>{(function(h,a){typeof vt=="object"&&typeof It=="object"?It.exports=a():typeof define=="function"&&define.amd?define([],a):typeof vt=="object"?vt.Pusher=a():h.Pusher=a()})(window,function(){return(function(l){var h={};function a(c){if(h[c])return h[c].exports;var s=h[c]={i:c,l:!1,exports:{}};return l[c].call(s.exports,s,s.exports,a),s.l=!0,s.exports}return a.m=l,a.c=h,a.d=function(c,s,f){a.o(c,s)||Object.defineProperty(c,s,{enumerable:!0,get:f})},a.r=function(c){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},a.t=function(c,s){if(s&1&&(c=a(c)),s&8||s&4&&typeof c=="object"&&c&&c.__esModule)return c;var f=Object.create(null);if(a.r(f),Object.defineProperty(f,"default",{enumerable:!0,value:c}),s&2&&typeof c!="string")for(var d in c)a.d(f,d,function(N){return c[N]}.bind(null,d));return f},a.n=function(c){var s=c&&c.__esModule?function(){return c.default}:function(){return c};return a.d(s,"a",s),s},a.o=function(c,s){return Object.prototype.hasOwnProperty.call(c,s)},a.p="",a(a.s=2)})([(function(l,h,a){"use strict";var c=this&&this.__extends||(function(){var b=function(v,y){return b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(w,O){w.__proto__=O}||function(w,O){for(var I in O)O.hasOwnProperty(I)&&(w[I]=O[I])},b(v,y)};return function(v,y){b(v,y);function w(){this.constructor=v}v.prototype=y===null?Object.create(y):(w.prototype=y.prototype,new w)}})();Object.defineProperty(h,"__esModule",{value:!0});var s=256,f=(function(){function b(v){v===void 0&&(v="="),this._paddingCharacter=v}return b.prototype.encodedLength=function(v){return this._paddingCharacter?(v+2)/3*4|0:(v*8+5)/6|0},b.prototype.encode=function(v){for(var y="",w=0;w>>18&63),y+=this._encodeByte(O>>>12&63),y+=this._encodeByte(O>>>6&63),y+=this._encodeByte(O>>>0&63)}var I=v.length-w;if(I>0){var O=v[w]<<16|(I===2?v[w+1]<<8:0);y+=this._encodeByte(O>>>18&63),y+=this._encodeByte(O>>>12&63),I===2?y+=this._encodeByte(O>>>6&63):y+=this._paddingCharacter||"",y+=this._paddingCharacter||""}return y},b.prototype.maxDecodedLength=function(v){return this._paddingCharacter?v/4*3|0:(v*6+7)/8|0},b.prototype.decodedLength=function(v){return this.maxDecodedLength(v.length-this._getPaddingLength(v))},b.prototype.decode=function(v){if(v.length===0)return new Uint8Array(0);for(var y=this._getPaddingLength(v),w=v.length-y,O=new Uint8Array(this.maxDecodedLength(w)),I=0,q=0,M=0,J=0,F=0,z=0,B=0;q>>4,O[I++]=F<<4|z>>>2,O[I++]=z<<6|B,M|=J&s,M|=F&s,M|=z&s,M|=B&s;if(q>>4,M|=J&s,M|=F&s),q>>2,M|=z&s),q>>8&6,y+=51-v>>>8&-75,y+=61-v>>>8&-15,y+=62-v>>>8&3,String.fromCharCode(y)},b.prototype._decodeChar=function(v){var y=s;return y+=(42-v&v-44)>>>8&-s+v-43+62,y+=(46-v&v-48)>>>8&-s+v-47+63,y+=(47-v&v-58)>>>8&-s+v-48+52,y+=(64-v&v-91)>>>8&-s+v-65+0,y+=(96-v&v-123)>>>8&-s+v-97+26,y},b.prototype._getPaddingLength=function(v){var y=0;if(this._paddingCharacter){for(var w=v.length-1;w>=0&&v[w]===this._paddingCharacter;w--)y++;if(v.length<4||y>2)throw new Error("Base64Coder: incorrect padding")}return y},b})();h.Coder=f;var d=new f;function N(b){return d.encode(b)}h.encode=N;function P(b){return d.decode(b)}h.decode=P;var T=(function(b){c(v,b);function v(){return b!==null&&b.apply(this,arguments)||this}return v.prototype._encodeByte=function(y){var w=y;return w+=65,w+=25-y>>>8&6,w+=51-y>>>8&-75,w+=61-y>>>8&-13,w+=62-y>>>8&49,String.fromCharCode(w)},v.prototype._decodeChar=function(y){var w=s;return w+=(44-y&y-46)>>>8&-s+y-45+62,w+=(94-y&y-96)>>>8&-s+y-95+63,w+=(47-y&y-58)>>>8&-s+y-48+52,w+=(64-y&y-91)>>>8&-s+y-65+0,w+=(96-y&y-123)>>>8&-s+y-97+26,w},v})(f);h.URLSafeCoder=T;var S=new T;function C(b){return S.encode(b)}h.encodeURLSafe=C;function x(b){return S.decode(b)}h.decodeURLSafe=x,h.encodedLength=function(b){return d.encodedLength(b)},h.maxDecodedLength=function(b){return d.maxDecodedLength(b)},h.decodedLength=function(b){return d.decodedLength(b)}}),(function(l,h,a){"use strict";Object.defineProperty(h,"__esModule",{value:!0});var c="utf8: invalid string",s="utf8: invalid source encoding";function f(P){for(var T=new Uint8Array(d(P)),S=0,C=0;C>6,T[S++]=128|x&63):x<55296?(T[S++]=224|x>>12,T[S++]=128|x>>6&63,T[S++]=128|x&63):(C++,x=(x&1023)<<10,x|=P.charCodeAt(C)&1023,x+=65536,T[S++]=240|x>>18,T[S++]=128|x>>12&63,T[S++]=128|x>>6&63,T[S++]=128|x&63)}return T}h.encode=f;function d(P){for(var T=0,S=0;S=P.length-1)throw new Error(c);S++,T+=4}else throw new Error(c)}return T}h.encodedLength=d;function N(P){for(var T=[],S=0;S=P.length)throw new Error(s);var b=P[++S];if((b&192)!==128)throw new Error(s);C=(C&31)<<6|b&63,x=128}else if(C<240){if(S>=P.length-1)throw new Error(s);var b=P[++S],v=P[++S];if((b&192)!==128||(v&192)!==128)throw new Error(s);C=(C&15)<<12|(b&63)<<6|v&63,x=2048}else if(C<248){if(S>=P.length-2)throw new Error(s);var b=P[++S],v=P[++S],y=P[++S];if((b&192)!==128||(v&192)!==128||(y&192)!==128)throw new Error(s);C=(C&15)<<18|(b&63)<<12|(v&63)<<6|y&63,x=65536}else throw new Error(s);if(C=55296&&C<=57343)throw new Error(s);if(C>=65536){if(C>1114111)throw new Error(s);C-=65536,T.push(String.fromCharCode(55296|C>>10)),C=56320|C&1023}}T.push(String.fromCharCode(C))}return T.join("")}h.decode=N}),(function(l,h,a){l.exports=a(3).default}),(function(l,h,a){"use strict";a.r(h);var c=(function(){function e(t,n){this.lastId=0,this.prefix=t,this.name=n}return e.prototype.create=function(t){this.lastId++;var n=this.lastId,r=this.prefix+n,i=this.name+"["+n+"]",o=!1,u=function(){o||(t.apply(null,arguments),o=!0)};return this[n]=u,{number:n,id:r,name:i,callback:u}},e.prototype.remove=function(t){delete this[t.number]},e})(),s=new c("_pusher_script_","Pusher.ScriptReceivers"),f={VERSION:"7.6.0",PROTOCOL:7,wsPort:80,wssPort:443,wsPath:"",httpHost:"sockjs.pusher.com",httpPort:80,httpsPort:443,httpPath:"/pusher",stats_host:"stats.pusher.com",authEndpoint:"/pusher/auth",authTransport:"ajax",activityTimeout:12e4,pongTimeout:3e4,unavailableTimeout:1e4,cluster:"mt1",userAuthentication:{endpoint:"/pusher/user-auth",transport:"ajax"},channelAuthorization:{endpoint:"/pusher/auth",transport:"ajax"},cdn_http:"http://js.pusher.com",cdn_https:"https://js.pusher.com",dependency_suffix:""},d=f,N=(function(){function e(t){this.options=t,this.receivers=t.receivers||s,this.loading={}}return e.prototype.load=function(t,n,r){var i=this;if(i.loading[t]&&i.loading[t].length>0)i.loading[t].push(r);else{i.loading[t]=[r];var o=m.createScriptRequest(i.getPath(t,n)),u=i.receivers.create(function(p){if(i.receivers.remove(u),i.loading[t]){var _=i.loading[t];delete i.loading[t];for(var g=function(E){E||o.cleanup()},k=0;k<_.length;k++)_[k](p,g)}});o.send(u)}},e.prototype.getRoot=function(t){var n,r=m.getDocument().location.protocol;return t&&t.useTLS||r==="https:"?n=this.options.cdn_https:n=this.options.cdn_http,n.replace(/\/*$/,"")+"/"+this.options.version},e.prototype.getPath=function(t,n){return this.getRoot(n)+"/"+t+this.options.suffix+".js"},e})(),P=N,T=new c("_pusher_dependencies","Pusher.DependenciesReceivers"),S=new P({cdn_http:d.cdn_http,cdn_https:d.cdn_https,version:d.VERSION,suffix:d.dependency_suffix,receivers:T}),C={baseUrl:"https://pusher.com",urls:{authenticationEndpoint:{path:"/docs/channels/server_api/authenticating_users"},authorizationEndpoint:{path:"/docs/channels/server_api/authorizing-users/"},javascriptQuickStart:{path:"/docs/javascript_quick_start"},triggeringClientEvents:{path:"/docs/client_api_guide/client_events#trigger-events"},encryptedChannelSupport:{fullUrl:"https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support"}}},x=function(e){var t="See:",n=C.urls[e];if(!n)return"";var r;return n.fullUrl?r=n.fullUrl:n.path&&(r=C.baseUrl+n.path),r?t+" "+r:""},b={buildLogSuffix:x},v;(function(e){e.UserAuthentication="user-authentication",e.ChannelAuthorization="channel-authorization"})(v||(v={}));var y=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),w=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),O=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),I=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),q=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),M=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),J=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),F=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),z=(function(e){y(t,e);function t(n){var r=this.constructor,i=e.call(this,n)||this;return Object.setPrototypeOf(i,r.prototype),i}return t})(Error),B=(function(e){y(t,e);function t(n,r){var i=this.constructor,o=e.call(this,r)||this;return o.status=n,Object.setPrototypeOf(o,i.prototype),o}return t})(Error),ke=function(e,t,n,r,i){var o=m.createXHR();o.open("POST",n.endpoint,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");for(var u in n.headers)o.setRequestHeader(u,n.headers[u]);if(n.headersProvider!=null){var p=n.headersProvider();for(var u in p)o.setRequestHeader(u,p[u])}return o.onreadystatechange=function(){if(o.readyState===4)if(o.status===200){var _=void 0,g=!1;try{_=JSON.parse(o.responseText),g=!0}catch{i(new B(200,"JSON returned from "+r.toString()+" endpoint was invalid, yet status code was 200. Data was: "+o.responseText),null)}g&&i(null,_)}else{var k="";switch(r){case v.UserAuthentication:k=b.buildLogSuffix("authenticationEndpoint");break;case v.ChannelAuthorization:k="Clients must be authorized to join private or presence channels. "+b.buildLogSuffix("authorizationEndpoint");break}i(new B(o.status,"Unable to retrieve auth string from "+r.toString()+" endpoint - "+("received status: "+o.status+" from "+n.endpoint+". "+k)),null)}},o.send(t),o},Se=ke;function Ce(e){return Ee(Oe(e))}for(var nt=String.fromCharCode,Z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Te={},ct=0,Pe=Z.length;ct>>6)+nt(128|t&63):nt(224|t>>>12&15)+nt(128|t>>>6&63)+nt(128|t&63)},Oe=function(e){return e.replace(/[^\x00-\x7F]/g,xe)},Ae=function(e){var t=[0,2,1][e.length%3],n=e.charCodeAt(0)<<16|(e.length>1?e.charCodeAt(1):0)<<8|(e.length>2?e.charCodeAt(2):0),r=[Z.charAt(n>>>18),Z.charAt(n>>>12&63),t>=2?"=":Z.charAt(n>>>6&63),t>=1?"=":Z.charAt(n&63)];return r.join("")},Ee=window.btoa||function(e){return e.replace(/[\s\S]{1,3}/g,Ae)},Le=(function(){function e(t,n,r,i){var o=this;this.clear=n,this.timer=t(function(){o.timer&&(o.timer=i(o.timer))},r)}return e.prototype.isRunning=function(){return this.timer!==null},e.prototype.ensureAborted=function(){this.timer&&(this.clear(this.timer),this.timer=null)},e})(),jt=Le,Nt=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})();function Re(e){window.clearTimeout(e)}function Ie(e){window.clearInterval(e)}var Q=(function(e){Nt(t,e);function t(n,r){return e.call(this,setTimeout,Re,n,function(i){return r(),null})||this}return t})(jt),je=(function(e){Nt(t,e);function t(n,r){return e.call(this,setInterval,Ie,n,function(i){return r(),i})||this}return t})(jt),Ne={now:function(){return Date.now?Date.now():new Date().valueOf()},defer:function(e){return new Q(0,e)},method:function(e){for(var t=[],n=1;n0)for(var i=0;i=1002&&e.code<=1004?"backoff":null:e.code===4e3?"tls_only":e.code<4100?"refused":e.code<4200?"backoff":e.code<4300?"retry":"refused"},getCloseError:function(e){return e.code!==1e3&&e.code!==1001?{type:"PusherError",data:{code:e.code,message:e.reason||e.message}}:null}},K=Vt,Cn=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Tn=(function(e){Cn(t,e);function t(n,r){var i=e.call(this)||this;return i.id=n,i.transport=r,i.activityTimeout=r.activityTimeout,i.bindListeners(),i}return t.prototype.handlesActivityChecks=function(){return this.transport.handlesActivityChecks()},t.prototype.send=function(n){return this.transport.send(n)},t.prototype.send_event=function(n,r,i){var o={event:n,data:r};return i&&(o.channel=i),A.debug("Event sent",o),this.send(K.encodeMessage(o))},t.prototype.ping=function(){this.transport.supportsPing()?this.transport.ping():this.send_event("pusher:ping",{})},t.prototype.close=function(){this.transport.close()},t.prototype.bindListeners=function(){var n=this,r={message:function(o){var u;try{u=K.decodeMessage(o)}catch(p){n.emit("error",{type:"MessageParseError",error:p,data:o.data})}if(u!==void 0){switch(A.debug("Event recd",u),u.event){case"pusher:error":n.emit("error",{type:"PusherError",data:u.data});break;case"pusher:ping":n.emit("ping");break;case"pusher:pong":n.emit("pong");break}n.emit("message",u)}},activity:function(){n.emit("activity")},error:function(o){n.emit("error",o)},closed:function(o){i(),o&&o.code&&n.handleCloseEvent(o),n.transport=null,n.emit("closed")}},i=function(){W(r,function(o,u){n.transport.unbind(u,o)})};W(r,function(o,u){n.transport.bind(u,o)})},t.prototype.handleCloseEvent=function(n){var r=K.getCloseAction(n),i=K.getCloseError(n);i&&this.emit("error",i),r&&this.emit(r,{action:r,error:i})},t})(V),Pn=Tn,xn=(function(){function e(t,n){this.transport=t,this.callback=n,this.bindListeners()}return e.prototype.close=function(){this.unbindListeners(),this.transport.close()},e.prototype.bindListeners=function(){var t=this;this.onMessage=function(n){t.unbindListeners();var r;try{r=K.processHandshake(n)}catch(i){t.finish("error",{error:i}),t.transport.close();return}r.action==="connected"?t.finish("connected",{connection:new Pn(r.id,t.transport),activityTimeout:r.activityTimeout}):(t.finish(r.action,{error:r.error}),t.transport.close())},this.onClosed=function(n){t.unbindListeners();var r=K.getCloseAction(n)||"backoff",i=K.getCloseError(n);t.finish(r,{error:i})},this.transport.bind("message",this.onMessage),this.transport.bind("closed",this.onClosed)},e.prototype.unbindListeners=function(){this.transport.unbind("message",this.onMessage),this.transport.unbind("closed",this.onClosed)},e.prototype.finish=function(t,n){this.callback(U({transport:this.transport,action:t},n))},e})(),On=xn,An=(function(){function e(t,n){this.timeline=t,this.options=n||{}}return e.prototype.send=function(t,n){this.timeline.isEmpty()||this.timeline.send(m.TimelineTransport.getAgent(this,t),n)},e})(),En=An,Ln=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Rn=(function(e){Ln(t,e);function t(n,r){var i=e.call(this,function(o,u){A.debug("No callbacks on "+n+" for "+o)})||this;return i.name=n,i.pusher=r,i.subscribed=!1,i.subscriptionPending=!1,i.subscriptionCancelled=!1,i}return t.prototype.authorize=function(n,r){return r(null,{auth:""})},t.prototype.trigger=function(n,r){if(n.indexOf("client-")!==0)throw new w("Event '"+n+"' does not start with 'client-'");if(!this.subscribed){var i=b.buildLogSuffix("triggeringClientEvents");A.warn("Client event triggered before channel 'subscription_succeeded' event . "+i)}return this.pusher.send_event(n,r,this.name)},t.prototype.disconnect=function(){this.subscribed=!1,this.subscriptionPending=!1},t.prototype.handleEvent=function(n){var r=n.event,i=n.data;if(r==="pusher_internal:subscription_succeeded")this.handleSubscriptionSucceededEvent(n);else if(r==="pusher_internal:subscription_count")this.handleSubscriptionCountEvent(n);else if(r.indexOf("pusher_internal:")!==0){var o={};this.emit(r,i,o)}},t.prototype.handleSubscriptionSucceededEvent=function(n){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):this.emit("pusher:subscription_succeeded",n.data)},t.prototype.handleSubscriptionCountEvent=function(n){n.data.subscription_count&&(this.subscriptionCount=n.data.subscription_count),this.emit("pusher:subscription_count",n.data)},t.prototype.subscribe=function(){var n=this;this.subscribed||(this.subscriptionPending=!0,this.subscriptionCancelled=!1,this.authorize(this.pusher.connection.socket_id,function(r,i){r?(n.subscriptionPending=!1,A.error(r.toString()),n.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:r.message},r instanceof B?{status:r.status}:{}))):n.pusher.send_event("pusher:subscribe",{auth:i.auth,channel_data:i.channel_data,channel:n.name})}))},t.prototype.unsubscribe=function(){this.subscribed=!1,this.pusher.send_event("pusher:unsubscribe",{channel:this.name})},t.prototype.cancelSubscription=function(){this.subscriptionCancelled=!0},t.prototype.reinstateSubscription=function(){this.subscriptionCancelled=!1},t})(V),bt=Rn,In=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),jn=(function(e){In(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.authorize=function(n,r){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:n},r)},t})(bt),mt=jn,Nn=(function(){function e(){this.reset()}return e.prototype.get=function(t){return Object.prototype.hasOwnProperty.call(this.members,t)?{id:t,info:this.members[t]}:null},e.prototype.each=function(t){var n=this;W(this.members,function(r,i){t(n.get(i))})},e.prototype.setMyID=function(t){this.myID=t},e.prototype.onSubscription=function(t){this.members=t.presence.hash,this.count=t.presence.count,this.me=this.get(this.myID)},e.prototype.addMember=function(t){return this.get(t.user_id)===null&&this.count++,this.members[t.user_id]=t.user_info,this.get(t.user_id)},e.prototype.removeMember=function(t){var n=this.get(t.user_id);return n&&(delete this.members[t.user_id],this.count--),n},e.prototype.reset=function(){this.members={},this.count=0,this.myID=null,this.me=null},e})(),qn=Nn,Un=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Dn=function(e,t,n,r){function i(o){return o instanceof n?o:new n(function(u){u(o)})}return new(n||(n=Promise))(function(o,u){function p(k){try{g(r.next(k))}catch(E){u(E)}}function _(k){try{g(r.throw(k))}catch(E){u(E)}}function g(k){k.done?o(k.value):i(k.value).then(p,_)}g((r=r.apply(e,t||[])).next())})},Hn=function(e,t){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,u;return u={next:p(0),throw:p(1),return:p(2)},typeof Symbol=="function"&&(u[Symbol.iterator]=function(){return this}),u;function p(g){return function(k){return _([g,k])}}function _(g){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,i&&(o=g[0]&2?i.return:g[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,g[1])).done)return o;switch(i=0,o&&(g=[g[0]&2,o.value]),g[0]){case 0:case 1:o=g;break;case 4:return n.label++,{value:g[1],done:!1};case 5:n.label++,i=g[1],g=[0];continue;case 7:g=n.ops.pop(),n.trys.pop();continue;default:if(o=n.trys,!(o=o.length>0&&o[o.length-1])&&(g[0]===6||g[0]===2)){n=0;continue}if(g[0]===3&&(!o||g[1]>o[0]&&g[1]0&&this.emit("connecting_in",Math.round(n/1e3)),this.retryTimer=new Q(n||0,function(){r.disconnectInternally(),r.connect()})},t.prototype.clearRetryTimer=function(){this.retryTimer&&(this.retryTimer.ensureAborted(),this.retryTimer=null)},t.prototype.setUnavailableTimer=function(){var n=this;this.unavailableTimer=new Q(this.options.unavailableTimeout,function(){n.updateState("unavailable")})},t.prototype.clearUnavailableTimer=function(){this.unavailableTimer&&this.unavailableTimer.ensureAborted()},t.prototype.sendActivityCheck=function(){var n=this;this.stopActivityCheck(),this.connection.ping(),this.activityTimer=new Q(this.options.pongTimeout,function(){n.timeline.error({pong_timed_out:n.options.pongTimeout}),n.retryIn(0)})},t.prototype.resetActivityCheck=function(){var n=this;this.stopActivityCheck(),this.connection&&!this.connection.handlesActivityChecks()&&(this.activityTimer=new Q(this.activityTimeout,function(){n.sendActivityCheck()}))},t.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},t.prototype.buildConnectionCallbacks=function(n){var r=this;return U({},n,{message:function(i){r.resetActivityCheck(),r.emit("message",i)},ping:function(){r.send_event("pusher:pong",{})},activity:function(){r.resetActivityCheck()},error:function(i){r.emit("error",i)},closed:function(){r.abandonConnection(),r.shouldRetry()&&r.retryIn(1e3)}})},t.prototype.buildHandshakeCallbacks=function(n){var r=this;return U({},n,{connected:function(i){r.activityTimeout=Math.min(r.options.activityTimeout,i.activityTimeout,i.connection.activityTimeout||1/0),r.clearUnavailableTimer(),r.setConnection(i.connection),r.socket_id=r.connection.id,r.updateState("connected",{socket_id:r.socket_id})}})},t.prototype.buildErrorCallbacks=function(){var n=this,r=function(i){return function(o){o.error&&n.emit("error",{type:"WebSocketError",error:o.error}),i(o)}};return{tls_only:r(function(){n.usingTLS=!0,n.updateStrategy(),n.retryIn(0)}),refused:r(function(){n.disconnect()}),backoff:r(function(){n.retryIn(1e3)}),retry:r(function(){n.retryIn(0)})}},t.prototype.setConnection=function(n){this.connection=n;for(var r in this.connectionCallbacks)this.connection.bind(r,this.connectionCallbacks[r]);this.resetActivityCheck()},t.prototype.abandonConnection=function(){if(this.connection){this.stopActivityCheck();for(var n in this.connectionCallbacks)this.connection.unbind(n,this.connectionCallbacks[n]);var r=this.connection;return this.connection=null,r}},t.prototype.updateState=function(n,r){var i=this.state;if(this.state=n,i!==n){var o=n;o==="connected"&&(o+=" with new socket ID "+r.socket_id),A.debug("State changed",i+" -> "+o),this.timeline.info({state:n,params:r}),this.emit("state_change",{previous:i,current:n}),this.emit(n,r)}},t.prototype.shouldRetry=function(){return this.state==="connecting"||this.state==="connected"},t})(V),Gn=Vn,Qn=(function(){function e(){this.channels={}}return e.prototype.add=function(t,n){return this.channels[t]||(this.channels[t]=Yn(t,n)),this.channels[t]},e.prototype.all=function(){return Ue(this.channels)},e.prototype.find=function(t){return this.channels[t]},e.prototype.remove=function(t){var n=this.channels[t];return delete this.channels[t],n},e.prototype.disconnect=function(){W(this.channels,function(t){t.disconnect()})},e})(),Kn=Qn;function Yn(e,t){if(e.indexOf("private-encrypted-")===0){if(t.config.nacl)return G.createEncryptedChannel(e,t,t.config.nacl);var n="Tried to subscribe to a private-encrypted- channel but no nacl implementation available",r=b.buildLogSuffix("encryptedChannelSupport");throw new J(n+". "+r)}else{if(e.indexOf("private-")===0)return G.createPrivateChannel(e,t);if(e.indexOf("presence-")===0)return G.createPresenceChannel(e,t);if(e.indexOf("#")===0)throw new O('Cannot create a channel with name "'+e+'".');return G.createChannel(e,t)}}var $n={createChannels:function(){return new Kn},createConnectionManager:function(e,t){return new Gn(e,t)},createChannel:function(e,t){return new bt(e,t)},createPrivateChannel:function(e,t){return new mt(e,t)},createPresenceChannel:function(e,t){return new zn(e,t)},createEncryptedChannel:function(e,t,n){return new Jn(e,t,n)},createTimelineSender:function(e,t){return new En(e,t)},createHandshake:function(e,t){return new On(e,t)},createAssistantToTheTransportManager:function(e,t,n){return new Sn(e,t,n)}},G=$n,Zn=(function(){function e(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return e.prototype.getAssistant=function(t){return G.createAssistantToTheTransportManager(this,t,{minPingDelay:this.options.minPingDelay,maxPingDelay:this.options.maxPingDelay})},e.prototype.isAlive=function(){return this.livesLeft>0},e.prototype.reportDeath=function(){this.livesLeft-=1},e})(),Gt=Zn,tr=(function(){function e(t,n){this.strategies=t,this.loop=!!n.loop,this.failFast=!!n.failFast,this.timeout=n.timeout,this.timeoutLimit=n.timeoutLimit}return e.prototype.isSupported=function(){return zt(this.strategies,j.method("isSupported"))},e.prototype.connect=function(t,n){var r=this,i=this.strategies,o=0,u=this.timeout,p=null,_=function(g,k){k?n(null,k):(o=o+1,r.loop&&(o=o%i.length),o0&&(o=new Q(r.timeout,function(){u.abort(),i(!0)})),u=t.connect(n,function(p,_){p&&o&&o.isRunning()&&!r.failFast||(o&&o.ensureAborted(),i(p,_))}),{abort:function(){o&&o.ensureAborted(),u.abort()},forceMinPriority:function(p){u.forceMinPriority(p)}}},e})(),Y=tr,er=(function(){function e(t){this.strategies=t}return e.prototype.isSupported=function(){return zt(this.strategies,j.method("isSupported"))},e.prototype.connect=function(t,n){return nr(this.strategies,t,function(r,i){return function(o,u){if(i[r].error=o,o){rr(i)&&n(!0);return}rt(i,function(p){p.forceMinPriority(u.transport.priority)}),n(null,u)}})},e})(),kt=er;function nr(e,t,n){var r=Dt(e,function(i,o,u,p){return i.connect(t,n(o,p))});return{abort:function(){rt(r,ir)},forceMinPriority:function(i){rt(r,function(o){o.forceMinPriority(i)})}}}function rr(e){return Me(e,function(t){return!!t.error})}function ir(e){!e.error&&!e.aborted&&(e.abort(),e.aborted=!0)}var or=(function(){function e(t,n,r){this.strategy=t,this.transports=n,this.ttl=r.ttl||1800*1e3,this.usingTLS=r.useTLS,this.timeline=r.timeline}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.usingTLS,i=ar(r),o=[this.strategy];if(i&&i.timestamp+this.ttl>=j.now()){var u=this.transports[i.transport];u&&(this.timeline.info({cached:!0,transport:i.transport,latency:i.latency}),o.push(new Y([u],{timeout:i.latency*2+1e3,failFast:!0})))}var p=j.now(),_=o.pop().connect(t,function g(k,E){k?(Qt(r),o.length>0?(p=j.now(),_=o.pop().connect(t,g)):n(k)):(cr(r,E.transport.name,j.now()-p),n(null,E))});return{abort:function(){_.abort()},forceMinPriority:function(g){t=g,_&&_.forceMinPriority(g)}}},e})(),sr=or;function St(e){return"pusherTransport"+(e?"TLS":"NonTLS")}function ar(e){var t=m.getLocalStorage();if(t)try{var n=t[St(e)];if(n)return JSON.parse(n)}catch{Qt(e)}return null}function cr(e,t,n){var r=m.getLocalStorage();if(r)try{r[St(e)]=ut({timestamp:j.now(),transport:t,latency:n})}catch{}}function Qt(e){var t=m.getLocalStorage();if(t)try{delete t[St(e)]}catch{}}var ur=(function(){function e(t,n){var r=n.delay;this.strategy=t,this.options={delay:r}}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.strategy,i,o=new Q(this.options.delay,function(){i=r.connect(t,n)});return{abort:function(){o.ensureAborted(),i&&i.abort()},forceMinPriority:function(u){t=u,i&&i.forceMinPriority(u)}}},e})(),lt=ur,hr=(function(){function e(t,n,r){this.test=t,this.trueBranch=n,this.falseBranch=r}return e.prototype.isSupported=function(){var t=this.test()?this.trueBranch:this.falseBranch;return t.isSupported()},e.prototype.connect=function(t,n){var r=this.test()?this.trueBranch:this.falseBranch;return r.connect(t,n)},e})(),it=hr,lr=(function(){function e(t){this.strategy=t}return e.prototype.isSupported=function(){return this.strategy.isSupported()},e.prototype.connect=function(t,n){var r=this.strategy.connect(t,function(i,o){o&&r.abort(),n(i,o)});return r},e})(),fr=lr;function ot(e){return function(){return e.isSupported()}}var pr=function(e,t,n){var r={};function i(ce,mi,wi,ki,Si){var ue=n(e,ce,mi,wi,ki,Si);return r[ce]=ue,ue}var o=Object.assign({},t,{hostNonTLS:e.wsHost+":"+e.wsPort,hostTLS:e.wsHost+":"+e.wssPort,httpPath:e.wsPath}),u=Object.assign({},o,{useTLS:!0}),p=Object.assign({},t,{hostNonTLS:e.httpHost+":"+e.httpPort,hostTLS:e.httpHost+":"+e.httpsPort,httpPath:e.httpPath}),_={loop:!0,timeout:15e3,timeoutLimit:6e4},g=new Gt({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),k=new Gt({lives:2,minPingDelay:1e4,maxPingDelay:e.activityTimeout}),E=i("ws","ws",3,o,g),X=i("wss","ws",3,u,g),vi=i("sockjs","sockjs",1,p),ne=i("xhr_streaming","xhr_streaming",1,p,k),yi=i("xdr_streaming","xdr_streaming",1,p,k),re=i("xhr_polling","xhr_polling",1,p),gi=i("xdr_polling","xdr_polling",1,p),ie=new Y([E],_),_i=new Y([X],_),bi=new Y([vi],_),oe=new Y([new it(ot(ne),ne,yi)],_),se=new Y([new it(ot(re),re,gi)],_),ae=new Y([new it(ot(oe),new kt([oe,new lt(se,{delay:4e3})]),se)],_),xt=new it(ot(ae),ae,bi),Ot;return t.useTLS?Ot=new kt([ie,new lt(xt,{delay:2e3})]):Ot=new kt([ie,new lt(_i,{delay:2e3}),new lt(xt,{delay:5e3})]),new sr(new fr(new it(ot(E),Ot,xt)),r,{ttl:18e5,timeline:t.timeline,useTLS:t.useTLS})},dr=pr,vr=(function(){var e=this;e.timeline.info(e.buildTimelineMessage({transport:e.name+(e.options.useTLS?"s":"")})),e.hooks.isInitialized()?e.changeState("initialized"):e.hooks.file?(e.changeState("initializing"),S.load(e.hooks.file,{useTLS:e.options.useTLS},function(t,n){e.hooks.isInitialized()?(e.changeState("initialized"),n(!0)):(t&&e.onError(t),e.onClose(),n(!1))})):e.onClose()}),yr={getRequest:function(e){var t=new window.XDomainRequest;return t.ontimeout=function(){e.emit("error",new I),e.close()},t.onerror=function(n){e.emit("error",n),e.close()},t.onprogress=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText)},t.onload=function(){t.responseText&&t.responseText.length>0&&e.onChunk(200,t.responseText),e.emit("finished",200),e.close()},t},abortRequest:function(e){e.ontimeout=e.onerror=e.onprogress=e.onload=null,e.abort()}},gr=yr,_r=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),br=256*1024,mr=(function(e){_r(t,e);function t(n,r,i){var o=e.call(this)||this;return o.hooks=n,o.method=r,o.url=i,o}return t.prototype.start=function(n){var r=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){r.close()},m.addUnloadListener(this.unloader),this.xhr.open(this.method,this.url,!0),this.xhr.setRequestHeader&&this.xhr.setRequestHeader("Content-Type","application/json"),this.xhr.send(n)},t.prototype.close=function(){this.unloader&&(m.removeUnloadListener(this.unloader),this.unloader=null),this.xhr&&(this.hooks.abortRequest(this.xhr),this.xhr=null)},t.prototype.onChunk=function(n,r){for(;;){var i=this.advanceBuffer(r);if(i)this.emit("chunk",{status:n,data:i});else break}this.isBufferTooLong(r)&&this.emit("buffer_too_long")},t.prototype.advanceBuffer=function(n){var r=n.slice(this.position),i=r.indexOf(` `);return i!==-1?(this.position+=i+1,r.slice(0,i)):null},t.prototype.isBufferTooLong=function(n){return this.position===n.length&&n.length>br},t})(V),wr=mr,Ct;(function(e){e[e.CONNECTING=0]="CONNECTING",e[e.OPEN=1]="OPEN",e[e.CLOSED=3]="CLOSED"})(Ct||(Ct={}));var $=Ct,kr=1,Sr=(function(){function e(t,n){this.hooks=t,this.session=Yt(1e3)+"/"+xr(8),this.location=Cr(n),this.readyState=$.CONNECTING,this.openStream()}return e.prototype.send=function(t){return this.sendRaw(JSON.stringify([t]))},e.prototype.ping=function(){this.hooks.sendHeartbeat(this)},e.prototype.close=function(t,n){this.onClose(t,n,!0)},e.prototype.sendRaw=function(t){if(this.readyState===$.OPEN)try{return m.createSocketRequest("POST",Kt(Tr(this.location,this.session))).start(t),!0}catch{return!1}else return!1},e.prototype.reconnect=function(){this.closeStream(),this.openStream()},e.prototype.onClose=function(t,n,r){this.closeStream(),this.readyState=$.CLOSED,this.onclose&&this.onclose({code:t,reason:n,wasClean:r})},e.prototype.onChunk=function(t){if(t.status===200){this.readyState===$.OPEN&&this.onActivity();var n,r=t.data.slice(0,1);switch(r){case"o":n=JSON.parse(t.data.slice(1)||"{}"),this.onOpen(n);break;case"a":n=JSON.parse(t.data.slice(1)||"[]");for(var i=0;i0&&e.onChunk(n.status,n.responseText);break;case 4:n.responseText&&n.responseText.length>0&&e.onChunk(n.status,n.responseText),e.emit("finished",n.status),e.close();break}},n},abortRequest:function(e){e.onreadystatechange=null,e.abort()}},jr=Ir,Nr={createStreamingSocket:function(e){return this.createSocket(Er,e)},createPollingSocket:function(e){return this.createSocket(Rr,e)},createSocket:function(e,t){return new Or(e,t)},createXHR:function(e,t){return this.createRequest(jr,e,t)},createRequest:function(e,t,n){return new wr(e,t,n)}},$t=Nr;$t.createXDR=function(e,t){return this.createRequest(gr,e,t)};var qr=$t,Ur={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:s,DependenciesReceivers:T,getDefaultStrategy:dr,Transports:_n,transportConnectionInitializer:vr,HTTPFactory:qr,TimelineTransport:Ze,getXHRAPI:function(){return window.XMLHttpRequest},getWebSocketAPI:function(){return window.WebSocket||window.MozWebSocket},setup:function(e){var t=this;window.Pusher=e;var n=function(){t.onDocumentBody(e.ready)};window.JSON?n():S.load("json2",{},n)},getDocument:function(){return document},getProtocol:function(){return this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:Se,jsonp:We}},onDocumentBody:function(e){var t=this;document.body?e():setTimeout(function(){t.onDocumentBody(e)},0)},createJSONPRequest:function(e,t){return new Ke(e,t)},createScriptRequest:function(e){return new Ge(e)},getLocalStorage:function(){try{return window.localStorage}catch{return}},createXHR:function(){return this.getXHRAPI()?this.createXMLHttpRequest():this.createMicrosoftXHR()},createXMLHttpRequest:function(){var e=this.getXHRAPI();return new e},createMicrosoftXHR:function(){return new ActiveXObject("Microsoft.XMLHTTP")},getNetwork:function(){return wn},createWebSocket:function(e){var t=this.getWebSocketAPI();return new t(e)},createSocketRequest:function(e,t){if(this.isXHRSupported())return this.HTTPFactory.createXHR(e,t);if(this.isXDRSupported(t.indexOf("https:")===0))return this.HTTPFactory.createXDR(e,t);throw"Cross-origin HTTP requests are not supported"},isXHRSupported:function(){var e=this.getXHRAPI();return!!e&&new e().withCredentials!==void 0},isXDRSupported:function(e){var t=e?"https:":"http:",n=this.getProtocol();return!!window.XDomainRequest&&n===t},addUnloadListener:function(e){window.addEventListener!==void 0?window.addEventListener("unload",e,!1):window.attachEvent!==void 0&&window.attachEvent("onunload",e)},removeUnloadListener:function(e){window.addEventListener!==void 0?window.removeEventListener("unload",e,!1):window.detachEvent!==void 0&&window.detachEvent("onunload",e)},randomInt:function(e){var t=function(){var n=window.crypto||window.msCrypto,r=n.getRandomValues(new Uint32Array(1))[0];return r/Math.pow(2,32)};return Math.floor(t()*e)}},m=Ur,Tt;(function(e){e[e.ERROR=3]="ERROR",e[e.INFO=6]="INFO",e[e.DEBUG=7]="DEBUG"})(Tt||(Tt={}));var ft=Tt,Dr=(function(){function e(t,n,r){this.key=t,this.session=n,this.events=[],this.options=r||{},this.sent=0,this.uniqueID=0}return e.prototype.log=function(t,n){t<=this.options.level&&(this.events.push(U({},n,{timestamp:j.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},e.prototype.error=function(t){this.log(ft.ERROR,t)},e.prototype.info=function(t){this.log(ft.INFO,t)},e.prototype.debug=function(t){this.log(ft.DEBUG,t)},e.prototype.isEmpty=function(){return this.events.length===0},e.prototype.send=function(t,n){var r=this,i=U({session:this.session,bundle:this.sent+1,key:this.key,lib:"js",version:this.options.version,cluster:this.options.cluster,features:this.options.features,timeline:this.events},this.options.params);return this.events=[],t(i,function(o,u){o||r.sent++,n&&n(o,u)}),!0},e.prototype.generateUniqueID=function(){return this.uniqueID++,this.uniqueID},e})(),Hr=Dr,Mr=(function(){function e(t,n,r,i){this.name=t,this.priority=n,this.transport=r,this.options=i||{}}return e.prototype.isSupported=function(){return this.transport.isSupported({useTLS:this.options.useTLS})},e.prototype.connect=function(t,n){var r=this;if(this.isSupported()){if(this.priority"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Ii(l){if(l===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return l}function ji(l,h){if(h&&(typeof h=="object"||typeof h=="function"))return h;if(h!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Ii(l)}function H(l){var h=Ri();return function(){var c=pt(l),s;if(h){var f=pt(this).constructor;s=Reflect.construct(c,arguments,f)}else s=c.apply(this,arguments);return ji(this,s)}}var Et=(function(){function l(){L(this,l)}return R(l,[{key:"listenForWhisper",value:function(a,c){return this.listen(".client-"+a,c)}},{key:"notification",value:function(a){return this.listen(".Illuminate\\Notifications\\Events\\BroadcastNotificationCreated",a)}},{key:"stopListeningForWhisper",value:function(a,c){return this.stopListening(".client-"+a,c)}}]),l})(),de=(function(){function l(h){L(this,l),this.namespace=h}return R(l,[{key:"format",value:function(a){return[".","\\"].includes(a.charAt(0))?a.substring(1):(this.namespace&&(a=this.namespace+"."+a),a.replace(/\./g,"\\"))}},{key:"setNamespace",value:function(a){this.namespace=a}}]),l})();function Ni(l){try{new l}catch(h){if(h.message.includes("is not a constructor"))return!1}return!0}var Lt=(function(l){D(a,l);var h=H(a);function a(c,s,f){var d;return L(this,a),d=h.call(this),d.name=s,d.pusher=c,d.options=f,d.eventFormatter=new de(d.options.namespace),d.subscribe(),d}return R(a,[{key:"subscribe",value:function(){this.subscription=this.pusher.subscribe(this.name)}},{key:"unsubscribe",value:function(){this.pusher.unsubscribe(this.name)}},{key:"listen",value:function(s,f){return this.on(this.eventFormatter.format(s),f),this}},{key:"listenToAll",value:function(s){var f=this;return this.subscription.bind_global(function(d,N){if(!d.startsWith("pusher:")){var P=f.options.namespace.replace(/\./g,"\\"),T=d.startsWith(P)?d.substring(P.length+1):"."+d;s(T,N)}}),this}},{key:"stopListening",value:function(s,f){return f?this.subscription.unbind(this.eventFormatter.format(s),f):this.subscription.unbind(this.eventFormatter.format(s)),this}},{key:"stopListeningToAll",value:function(s){return s?this.subscription.unbind_global(s):this.subscription.unbind_global(),this}},{key:"subscribed",value:function(s){return this.on("pusher:subscription_succeeded",function(){s()}),this}},{key:"error",value:function(s){return this.on("pusher:subscription_error",function(f){s(f)}),this}},{key:"on",value:function(s,f){return this.subscription.bind(s,f),this}}]),a})(Et),ve=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}}]),a})(Lt),qi=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}}]),a})(Lt),Ui=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this.on("pusher:subscription_succeeded",function(f){s(Object.keys(f.members).map(function(d){return f.members[d]}))}),this}},{key:"joining",value:function(s){return this.on("pusher:member_added",function(f){s(f.info)}),this}},{key:"whisper",value:function(s,f){return this.pusher.channels.channels[this.name].trigger("client-".concat(s),f),this}},{key:"leaving",value:function(s){return this.on("pusher:member_removed",function(f){s(f.info)}),this}}]),a})(ve),ye=(function(l){D(a,l);var h=H(a);function a(c,s,f){var d;return L(this,a),d=h.call(this),d.events={},d.listeners={},d.name=s,d.socket=c,d.options=f,d.eventFormatter=new de(d.options.namespace),d.subscribe(),d}return R(a,[{key:"subscribe",value:function(){this.socket.emit("subscribe",{channel:this.name,auth:this.options.auth||{}})}},{key:"unsubscribe",value:function(){this.unbind(),this.socket.emit("unsubscribe",{channel:this.name,auth:this.options.auth||{}})}},{key:"listen",value:function(s,f){return this.on(this.eventFormatter.format(s),f),this}},{key:"stopListening",value:function(s,f){return this.unbindEvent(this.eventFormatter.format(s),f),this}},{key:"subscribed",value:function(s){return this.on("connect",function(f){s(f)}),this}},{key:"error",value:function(s){return this}},{key:"on",value:function(s,f){var d=this;return this.listeners[s]=this.listeners[s]||[],this.events[s]||(this.events[s]=function(N,P){d.name===N&&d.listeners[s]&&d.listeners[s].forEach(function(T){return T(P)})},this.socket.on(s,this.events[s])),this.listeners[s].push(f),this}},{key:"unbind",value:function(){var s=this;Object.keys(this.events).forEach(function(f){s.unbindEvent(f)})}},{key:"unbindEvent",value:function(s,f){this.listeners[s]=this.listeners[s]||[],f&&(this.listeners[s]=this.listeners[s].filter(function(d){return d!==f})),(!f||this.listeners[s].length===0)&&(this.events[s]&&(this.socket.removeListener(s,this.events[s]),delete this.events[s]),delete this.listeners[s])}}]),a})(Et),ge=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this.socket.emit("client event",{channel:this.name,event:"client-".concat(s),data:f}),this}}]),a})(ye),Di=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this.on("presence:subscribed",function(f){s(f.map(function(d){return d.user_info}))}),this}},{key:"joining",value:function(s){return this.on("presence:joining",function(f){return s(f.user_info)}),this}},{key:"whisper",value:function(s,f){return this.socket.emit("client event",{channel:this.name,event:"client-".concat(s),data:f}),this}},{key:"leaving",value:function(s){return this.on("presence:leaving",function(f){return s(f.user_info)}),this}}]),a})(ge),dt=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"subscribe",value:function(){}},{key:"unsubscribe",value:function(){}},{key:"listen",value:function(s,f){return this}},{key:"listenToAll",value:function(s){return this}},{key:"stopListening",value:function(s,f){return this}},{key:"subscribed",value:function(s){return this}},{key:"error",value:function(s){return this}},{key:"on",value:function(s,f){return this}}]),a})(Et),_e=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this}}]),a})(dt),Hi=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"whisper",value:function(s,f){return this}}]),a})(dt),Mi=(function(l){D(a,l);var h=H(a);function a(){return L(this,a),h.apply(this,arguments)}return R(a,[{key:"here",value:function(s){return this}},{key:"joining",value:function(s){return this}},{key:"whisper",value:function(s,f){return this}},{key:"leaving",value:function(s){return this}}]),a})(_e),Rt=(function(){function l(h){L(this,l),this._defaultOptions={auth:{headers:{}},authEndpoint:"/broadcasting/auth",userAuthentication:{endpoint:"/broadcasting/user-auth",headers:{}},broadcaster:"pusher",csrfToken:null,bearerToken:null,host:null,key:null,namespace:"App.Events"},this.setOptions(h),this.connect()}return R(l,[{key:"setOptions",value:function(a){this.options=at(this._defaultOptions,a);var c=this.csrfToken();return c&&(this.options.auth.headers["X-CSRF-TOKEN"]=c,this.options.userAuthentication.headers["X-CSRF-TOKEN"]=c),c=this.options.bearerToken,c&&(this.options.auth.headers.Authorization="Bearer "+c,this.options.userAuthentication.headers.Authorization="Bearer "+c),a}},{key:"csrfToken",value:function(){var a;return typeof window<"u"&&window.Laravel&&window.Laravel.csrfToken?window.Laravel.csrfToken:this.options.csrfToken?this.options.csrfToken:typeof document<"u"&&typeof document.querySelector=="function"&&(a=document.querySelector('meta[name="csrf-token"]'))?a.getAttribute("content"):null}}]),l})(),fe=(function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){typeof this.options.client<"u"?this.pusher=this.options.client:this.options.Pusher?this.pusher=new this.options.Pusher(this.options.key,this.options):this.pusher=new Pusher(this.options.key,this.options)}},{key:"signin",value:function(){this.pusher.signin()}},{key:"listen",value:function(s,f,d){return this.channel(s).listen(f,d)}},{key:"channel",value:function(s){return this.channels[s]||(this.channels[s]=new Lt(this.pusher,s,this.options)),this.channels[s]}},{key:"privateChannel",value:function(s){return this.channels["private-"+s]||(this.channels["private-"+s]=new ve(this.pusher,"private-"+s,this.options)),this.channels["private-"+s]}},{key:"encryptedPrivateChannel",value:function(s){return this.channels["private-encrypted-"+s]||(this.channels["private-encrypted-"+s]=new qi(this.pusher,"private-encrypted-"+s,this.options)),this.channels["private-encrypted-"+s]}},{key:"presenceChannel",value:function(s){return this.channels["presence-"+s]||(this.channels["presence-"+s]=new Ui(this.pusher,"presence-"+s,this.options)),this.channels["presence-"+s]}},{key:"leave",value:function(s){var f=this,d=[s,"private-"+s,"private-encrypted-"+s,"presence-"+s];d.forEach(function(N,P){f.leaveChannel(N)})}},{key:"leaveChannel",value:function(s){this.channels[s]&&(this.channels[s].unsubscribe(),delete this.channels[s])}},{key:"socketId",value:function(){return this.pusher.connection.socket_id}},{key:"disconnect",value:function(){this.pusher.disconnect()}}]),a})(Rt),pe=(function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){var s=this,f=this.getSocketIO();return this.socket=f(this.options.host,this.options),this.socket.on("reconnect",function(){Object.values(s.channels).forEach(function(d){d.subscribe()})}),this.socket}},{key:"getSocketIO",value:function(){if(typeof this.options.client<"u")return this.options.client;if(typeof io<"u")return io;throw new Error("Socket.io client not found. Should be globally available or passed via options.client")}},{key:"listen",value:function(s,f,d){return this.channel(s).listen(f,d)}},{key:"channel",value:function(s){return this.channels[s]||(this.channels[s]=new ye(this.socket,s,this.options)),this.channels[s]}},{key:"privateChannel",value:function(s){return this.channels["private-"+s]||(this.channels["private-"+s]=new ge(this.socket,"private-"+s,this.options)),this.channels["private-"+s]}},{key:"presenceChannel",value:function(s){return this.channels["presence-"+s]||(this.channels["presence-"+s]=new Di(this.socket,"presence-"+s,this.options)),this.channels["presence-"+s]}},{key:"leave",value:function(s){var f=this,d=[s,"private-"+s,"presence-"+s];d.forEach(function(N){f.leaveChannel(N)})}},{key:"leaveChannel",value:function(s){this.channels[s]&&(this.channels[s].unsubscribe(),delete this.channels[s])}},{key:"socketId",value:function(){return this.socket.id}},{key:"disconnect",value:function(){this.socket.disconnect()}}]),a})(Rt),zi=(function(l){D(a,l);var h=H(a);function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels={},c}return R(a,[{key:"connect",value:function(){}},{key:"listen",value:function(s,f,d){return new dt}},{key:"channel",value:function(s){return new dt}},{key:"privateChannel",value:function(s){return new _e}},{key:"encryptedPrivateChannel",value:function(s){return new Hi}},{key:"presenceChannel",value:function(s){return new Mi}},{key:"leave",value:function(s){}},{key:"leaveChannel",value:function(s){}},{key:"socketId",value:function(){return"fake-socket-id"}},{key:"disconnect",value:function(){}}]),a})(Rt),be=(function(){function l(h){L(this,l),this.options=h,this.connect(),this.options.withoutInterceptors||this.registerInterceptors()}return R(l,[{key:"channel",value:function(a){return this.connector.channel(a)}},{key:"connect",value:function(){if(this.options.broadcaster=="reverb")this.connector=new fe(at(at({},this.options),{cluster:""}));else if(this.options.broadcaster=="pusher")this.connector=new fe(this.options);else if(this.options.broadcaster=="socket.io")this.connector=new pe(this.options);else if(this.options.broadcaster=="null")this.connector=new zi(this.options);else if(typeof this.options.broadcaster=="function"&&Ni(this.options.broadcaster))this.connector=new this.options.broadcaster(this.options);else throw new Error("Broadcaster ".concat(st(this.options.broadcaster)," ").concat(this.options.broadcaster," is not supported."))}},{key:"disconnect",value:function(){this.connector.disconnect()}},{key:"join",value:function(a){return this.connector.presenceChannel(a)}},{key:"leave",value:function(a){this.connector.leave(a)}},{key:"leaveChannel",value:function(a){this.connector.leaveChannel(a)}},{key:"leaveAllChannels",value:function(){for(var a in this.connector.channels)this.leaveChannel(a)}},{key:"listen",value:function(a,c,s){return this.connector.listen(a,c,s)}},{key:"private",value:function(a){return this.connector.privateChannel(a)}},{key:"encryptedPrivate",value:function(a){if(this.connector instanceof pe)throw new Error("Broadcaster ".concat(st(this.options.broadcaster)," ").concat(this.options.broadcaster," does not support encrypted private channels."));return this.connector.encryptedPrivateChannel(a)}},{key:"socketId",value:function(){return this.connector.socketId()}},{key:"registerInterceptors",value:function(){typeof Vue=="function"&&Vue.http&&this.registerVueRequestInterceptor(),typeof axios=="function"&&this.registerAxiosRequestInterceptor(),typeof jQuery=="function"&&this.registerjQueryAjaxSetup(),(typeof Turbo>"u"?"undefined":st(Turbo))==="object"&&this.registerTurboRequestInterceptor()}},{key:"registerVueRequestInterceptor",value:function(){var a=this;Vue.http.interceptors.push(function(c,s){a.socketId()&&c.headers.set("X-Socket-ID",a.socketId()),s()})}},{key:"registerAxiosRequestInterceptor",value:function(){var a=this;axios.interceptors.request.use(function(c){return a.socketId()&&(c.headers["X-Socket-Id"]=a.socketId()),c})}},{key:"registerjQueryAjaxSetup",value:function(){var a=this;typeof jQuery.ajax<"u"&&jQuery.ajaxPrefilter(function(c,s,f){a.socketId()&&f.setRequestHeader("X-Socket-Id",a.socketId())})}},{key:"registerTurboRequestInterceptor",value:function(){var a=this;document.addEventListener("turbo:before-fetch-request",function(c){c.detail.fetchOptions.headers["X-Socket-Id"]=a.socketId()})}}]),l})();var we=Li(me(),1);window.EchoFactory=be;window.Pusher=we.default;})(); /*! Bundled license information: pusher-js/dist/web/pusher.js: (*! * Pusher JavaScript Library v7.6.0 * https://pusher.com/ * * Copyright 2020, Pusher * Released under the MIT licence. *) */ ================================================ FILE: public/js/filament/forms/components/checkbox-list.js ================================================ function c({livewireId:s}){return{areAllCheckboxesChecked:!1,checkboxListOptions:[],search:"",unsubscribeLivewireHook:null,visibleCheckboxListOptions:[],init(){this.checkboxListOptions=Array.from(this.$root.querySelectorAll(".fi-fo-checkbox-list-option")),this.updateVisibleCheckboxListOptions(),this.$nextTick(()=>{this.checkIfAllCheckboxesAreChecked()}),this.unsubscribeLivewireHook=Livewire.interceptMessage(({message:e,onSuccess:t})=>{t(()=>{this.$nextTick(()=>{e.component.id===s&&(this.checkboxListOptions=Array.from(this.$root.querySelectorAll(".fi-fo-checkbox-list-option")),this.updateVisibleCheckboxListOptions(),this.checkIfAllCheckboxesAreChecked())})})}),this.$watch("search",()=>{this.updateVisibleCheckboxListOptions(),this.checkIfAllCheckboxesAreChecked()})},checkIfAllCheckboxesAreChecked(){this.areAllCheckboxesChecked=this.visibleCheckboxListOptions.length===this.visibleCheckboxListOptions.filter(e=>e.querySelector("input[type=checkbox]:checked, input[type=checkbox]:disabled")).length},toggleAllCheckboxes(){this.checkIfAllCheckboxesAreChecked();let e=!this.areAllCheckboxesChecked;this.visibleCheckboxListOptions.forEach(t=>{let i=t.querySelector("input[type=checkbox]");i.disabled||i.checked!==e&&(i.checked=e,i.dispatchEvent(new Event("change")))}),this.areAllCheckboxesChecked=e},updateVisibleCheckboxListOptions(){this.visibleCheckboxListOptions=this.checkboxListOptions.filter(e=>["",null,void 0].includes(this.search)||e.querySelector(".fi-fo-checkbox-list-option-label")?.innerText.toLowerCase().includes(this.search.toLowerCase())?!0:e.querySelector(".fi-fo-checkbox-list-option-description")?.innerText.toLowerCase().includes(this.search.toLowerCase()))},destroy(){this.unsubscribeLivewireHook?.()}}}export{c as default}; ================================================ FILE: public/js/filament/forms/components/code-editor.js ================================================ var Ms=[],Xh=[];(()=>{let O="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(O=Xh[i])e=i+1;else return!0;if(e==t)return!1}}function gh(O){return O>=127462&&O<=127487}var Ph=8205;function Th(O,e,t=!0,i=!0){return(t?bh:Ug)(O,e,i)}function bh(O,e,t){if(e==O.length)return e;e&&yh(O.charCodeAt(e))&&xh(O.charCodeAt(e-1))&&e--;let i=Ls(O,e);for(e+=Sh(i);e=0&&gh(Ls(O,s));)n++,s-=2;if(n%2==0)break;e+=2}else break}return e}function Ug(O,e,t){for(;e>0;){let i=bh(O,e-2,t);if(i=56320&&O<57344}function xh(O){return O>=55296&&O<56320}function Sh(O){return O<65536?1:2}var E=class O{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=NO(this,e,t);let r=[];return this.decompose(0,e,r,2),i.length&&i.decompose(0,i.length,r,3),this.decompose(t,this.length,r,1),DO.from(r,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=NO(this,e,t);let i=[];return this.decompose(e,t,i,0),DO.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),r=new $O(this),n=new $O(e);for(let s=t,a=t;;){if(r.next(s),n.next(s),s=0,r.lineBreak!=n.lineBreak||r.done!=n.done||r.value!=n.value)return!1;if(a+=r.value.length,r.done||a>=i)return!0}}iter(e=1){return new $O(this,e)}iterRange(e,t=this.length){return new Dr(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let r=this.line(e).from;i=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Ir(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?O.empty:e.length<=32?new Ae(e):DO.from(Ae.split(e,[]))}},Ae=class O extends E{constructor(e,t=Wg(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,r){for(let n=0;;n++){let s=this.text[n],a=r+s.length;if((t?i:a)>=e)return new Is(r,a,i,s);r=a+1,i++}}decompose(e,t,i,r){let n=e<=0&&t>=this.length?this:new O(kh(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(r&1){let s=i.pop(),a=Mr(n.text,s.text.slice(),0,n.length);if(a.length<=32)i.push(new O(a,s.length+n.length));else{let o=a.length>>1;i.push(new O(a.slice(0,o)),new O(a.slice(o)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof O))return super.replace(e,t,i);[e,t]=NO(this,e,t);let r=Mr(this.text,Mr(i.text,kh(this.text,0,e)),t),n=this.length+i.length-(t-e);return r.length<=32?new O(r,n):DO.from(O.split(r,[]),n)}sliceString(e,t=this.length,i=` `){[e,t]=NO(this,e,t);let r="";for(let n=0,s=0;n<=t&&se&&s&&(r+=i),en&&(r+=a.slice(Math.max(0,e-n),t-n)),n=o+1}return r}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],r=-1;for(let n of e)i.push(n),r+=n.length+1,i.length==32&&(t.push(new O(i,r)),i=[],r=-1);return r>-1&&t.push(new O(i,r)),t}},DO=class O extends E{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,r){for(let n=0;;n++){let s=this.children[n],a=r+s.length,o=i+s.lines-1;if((t?o:a)>=e)return s.lineInner(e,t,i,r);r=a+1,i=o+1}}decompose(e,t,i,r){for(let n=0,s=0;s<=t&&n=s){let l=r&((s<=e?1:0)|(o>=t?2:0));s>=e&&o<=t&&!l?i.push(a):a.decompose(e-s,t-s,i,l)}s=o+1}}replace(e,t,i){if([e,t]=NO(this,e,t),i.lines=n&&t<=a){let o=s.replace(e-n,t-n,i),l=this.lines-s.lines+o.lines;if(o.lines>4&&o.lines>l>>6){let c=this.children.slice();return c[r]=o,new O(c,this.length-(t-e)+i.length)}return super.replace(n,a,o)}n=a+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=` `){[e,t]=NO(this,e,t);let r="";for(let n=0,s=0;ne&&n&&(r+=i),es&&(r+=a.sliceString(e-s,t-s,i)),s=o+1}return r}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof O))return 0;let i=0,[r,n,s,a]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;r+=t,n+=t){if(r==s||n==a)return i;let o=this.children[r],l=e.children[n];if(o!=l)return i+o.scanIdentical(l,t);i+=o.length+1}}static from(e,t=e.reduce((i,r)=>i+r.length+1,-1)){let i=0;for(let u of e)i+=u.lines;if(i<32){let u=[];for(let Q of e)Q.flatten(u);return new Ae(u,t)}let r=Math.max(32,i>>5),n=r<<1,s=r>>1,a=[],o=0,l=-1,c=[];function h(u){let Q;if(u.lines>n&&u instanceof O)for(let $ of u.children)h($);else u.lines>s&&(o>s||!o)?(f(),a.push(u)):u instanceof Ae&&o&&(Q=c[c.length-1])instanceof Ae&&u.lines+Q.lines<=32?(o+=u.lines,l+=u.length+1,c[c.length-1]=new Ae(Q.text.concat(u.text),Q.length+1+u.length)):(o+u.lines>r&&f(),o+=u.lines,l+=u.length+1,c.push(u))}function f(){o!=0&&(a.push(c.length==1?c[0]:O.from(c,l)),l=-1,o=c.length=0)}for(let u of e)h(u);return f(),a.length==1?a[0]:new O(a,t)}};E.empty=new Ae([""],0);function Wg(O){let e=-1;for(let t of O)e+=t.length+1;return e}function Mr(O,e,t=0,i=1e9){for(let r=0,n=0,s=!0;n=t&&(o>i&&(a=a.slice(0,i-r)),r0?1:(e instanceof Ae?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,r=this.nodes[i],n=this.offsets[i],s=n>>1,a=r instanceof Ae?r.text.length:r.children.length;if(s==(t>0?a:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((n&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=` `,this;e--}else if(r instanceof Ae){let o=r.text[s+(t<0?-1:0)];if(this.offsets[i]+=t,o.length>Math.max(0,e))return this.value=e==0?o:t>0?o.slice(e):o.slice(0,o.length-e),this;e-=o.length}else{let o=r.children[s+(t<0?-1:0)];e>o.length?(e-=o.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(o),this.offsets.push(t>0?1:(o instanceof Ae?o.text.length:o.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},Dr=class{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new $O(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:r}=this.cursor.next(e);return this.pos+=(r.length+e)*t,this.value=r.length<=i?r:t<0?r.slice(r.length-i):r.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Ir=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:r}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=r,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(E.prototype[Symbol.iterator]=function(){return this.iter()},$O.prototype[Symbol.iterator]=Dr.prototype[Symbol.iterator]=Ir.prototype[Symbol.iterator]=function(){return this});var Is=class{constructor(e,t,i,r){this.from=e,this.to=t,this.number=i,this.text=r}get length(){return this.to-this.from}};function NO(O,e,t){return e=Math.max(0,Math.min(O.length,e)),[e,Math.max(e,Math.min(O.length,t))]}function fe(O,e,t=!0,i=!0){return Th(O,e,t,i)}function jg(O){return O>=56320&&O<57344}function Cg(O){return O>=55296&&O<56320}function Se(O,e){let t=O.charCodeAt(e);if(!Cg(t)||e+1==O.length)return t;let i=O.charCodeAt(e+1);return jg(i)?(t-55296<<10)+(i-56320)+65536:t}function Ri(O){return O<=65535?String.fromCharCode(O):(O-=65536,String.fromCharCode((O>>10)+55296,(O&1023)+56320))}function Me(O){return O<65536?1:2}var Bs=/\r\n?|\n/,pe=(function(O){return O[O.Simple=0]="Simple",O[O.TrackDel=1]="TrackDel",O[O.TrackBefore=2]="TrackBefore",O[O.TrackAfter=3]="TrackAfter",O})(pe||(pe={})),vt=class O{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return n+(e-r);n+=a}else{if(i!=pe.Simple&&l>=e&&(i==pe.TrackDel&&re||i==pe.TrackBefore&&re))return null;if(l>e||l==e&&t<0&&!a)return e==r||t<0?n:n+o;n+=o}r=l}if(e>r)throw new RangeError(`Position ${e} is out of range for changeset of length ${r}`);return n}touchesRange(e,t=e){for(let i=0,r=0;i=0&&r<=t&&a>=e)return rt?"cover":!0;r=a}return!1}toString(){let e="";for(let t=0;t=0?":"+r:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new O(e)}static create(e){return new O(e)}},Ze=class O extends vt{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Ns(this,(t,i,r,n,s)=>e=e.replace(r,r+(i-t),s),!1),e}mapDesc(e,t=!1){return Fs(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let r=0,n=0;r=0){t[r]=a,t[r+1]=s;let o=r>>1;for(;i.length0&&Mt(i,t,n.text),n.forward(c),a+=c}let l=e[s++];for(;a>1].toJSON()))}return e}static of(e,t,i){let r=[],n=[],s=0,a=null;function o(c=!1){if(!c&&!r.length)return;sf||h<0||f>t)throw new RangeError(`Invalid change range ${h} to ${f} (in doc of length ${t})`);let Q=u?typeof u=="string"?E.of(u.split(i||Bs)):u:E.empty,$=Q.length;if(h==f&&$==0)return;hs&&ye(r,h-s,-1),ye(r,f-h,$),Mt(n,r,Q),s=f}}return l(e),o(!a),a}static empty(e){return new O(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],i=[];for(let r=0;ra&&typeof s!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(n.length==1)t.push(n[0],0);else{for(;i.length=0&&t<=0&&t==O[r+1]?O[r]+=e:r>=0&&e==0&&O[r]==0?O[r+1]+=t:i?(O[r]+=e,O[r+1]+=t):O.push(e,t)}function Mt(O,e,t){if(t.length==0)return;let i=e.length-2>>1;if(i>1])),!(t||s==O.sections.length||O.sections[s+1]<0);)a=O.sections[s++],o=O.sections[s++];e(r,l,n,c,h),r=l,n=c}}}function Fs(O,e,t,i=!1){let r=[],n=i?[]:null,s=new pO(O),a=new pO(e);for(let o=-1;;){if(s.done&&a.len||a.done&&s.len)throw new Error("Mismatched change set lengths");if(s.ins==-1&&a.ins==-1){let l=Math.min(s.len,a.len);ye(r,l,-1),s.forward(l),a.forward(l)}else if(a.ins>=0&&(s.ins<0||o==s.i||s.off==0&&(a.len=0&&o=0){let l=0,c=s.len;for(;c;)if(a.ins==-1){let h=Math.min(c,a.len);l+=h,c-=h,a.forward(h)}else if(a.ins==0&&a.leno||s.ins>=0&&s.len>o)&&(a||i.length>l),n.forward2(o),s.forward(o)}}}}var pO=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?E.empty:e[t]}textBit(e){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length&&!e?E.empty:t[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},MO=class O{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,t=-1){let i,r;return this.empty?i=r=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),r=e.mapPos(this.to,-1)),i==this.from&&r==this.to?this:new O(i,r,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return S.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return S.range(this.anchor,i)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return S.range(e.anchor,e.head)}static create(e,t,i){return new O(e,t,i)}},S=class O{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:O.create(this.ranges.map(i=>i.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new O(e.ranges.map(t=>MO.fromJSON(t)),e.main)}static single(e,t=e){return new O([O.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,r=0;re?8:0)|n)}static normalized(e,t=0){let i=e[t];e.sort((r,n)=>r.from-n.from),t=e.indexOf(i);for(let r=1;rn.head?O.range(o,a):O.range(a,o))}}return new O(e,t)}};function Rh(O,e){for(let t of O.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}var sa=0,Z=class O{constructor(e,t,i,r,n){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=r,this.id=sa++,this.default=e([]),this.extensions=typeof n=="function"?n(this):n}get reader(){return this}static define(e={}){return new O(e.combine||(t=>t),e.compareInput||((t,i)=>t===i),e.compare||(e.combine?(t,i)=>t===i:aa),!!e.static,e.enables)}of(e){return new IO([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new IO(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new IO(e,this,2,t)}from(e,t){return t||(t=i=>i),this.compute([e],i=>t(i.field(e)))}};function aa(O,e){return O==e||O.length==e.length&&O.every((t,i)=>t===e[i])}var IO=class{constructor(e,t,i,r){this.dependencies=e,this.facet=t,this.type=i,this.value=r,this.id=sa++}dynamicSlot(e){var t;let i=this.value,r=this.facet.compareInput,n=this.id,s=e[n]>>1,a=this.type==2,o=!1,l=!1,c=[];for(let h of this.dependencies)h=="doc"?o=!0:h=="selection"?l=!0:(((t=e[h.id])!==null&&t!==void 0?t:1)&1)==0&&c.push(e[h.id]);return{create(h){return h.values[s]=i(h),1},update(h,f){if(o&&f.docChanged||l&&(f.docChanged||f.selection)||Hs(h,c)){let u=i(h);if(a?!wh(u,h.values[s],r):!r(u,h.values[s]))return h.values[s]=u,1}return 0},reconfigure:(h,f)=>{let u,Q=f.config.address[n];if(Q!=null){let $=Fr(f,Q);if(this.dependencies.every(p=>p instanceof Z?f.facet(p)===h.facet(p):p instanceof ce?f.field(p,!1)==h.field(p,!1):!0)||(a?wh(u=i(h),$,r):r(u=i(h),$)))return h.values[s]=$,0}else u=i(h);return h.values[s]=u,1}}}};function wh(O,e,t){if(O.length!=e.length)return!1;for(let i=0;iO[o.id]),r=t.map(o=>o.type),n=i.filter(o=>!(o&1)),s=O[e.id]>>1;function a(o){let l=[];for(let c=0;ci===r),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(Er).find(i=>i.field==this);return(t?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:i=>(i.values[t]=this.create(i),1),update:(i,r)=>{let n=i.values[t],s=this.updateF(n,r);return this.compareF(n,s)?0:(i.values[t]=s,1)},reconfigure:(i,r)=>{let n=i.facet(Er),s=r.facet(Er),a;return(a=n.find(o=>o.field==this))&&a!=s.find(o=>o.field==this)?(i.values[t]=a.create(i),1):r.config.address[this.id]!=null?(i.values[t]=r.field(this),0):(i.values[t]=this.create(i),1)}}}init(e){return[this,Er.of({field:this,create:e})]}get extension(){return this}},uO={lowest:4,low:3,default:2,high:1,highest:0};function wi(O){return e=>new Br(e,O)}var ze={highest:wi(uO.highest),high:wi(uO.high),default:wi(uO.default),low:wi(uO.low),lowest:wi(uO.lowest)},Br=class{constructor(e,t){this.inner=e,this.prec=t}},FO=class O{of(e){return new vi(this,e)}reconfigure(e){return O.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},vi=class{constructor(e,t){this.compartment=e,this.inner=t}},Nr=class O{constructor(e,t,i,r,n,s){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=r,this.staticValues=n,this.facets=s,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,i){let r=[],n=Object.create(null),s=new Map;for(let f of Eg(e,t,s))f instanceof ce?r.push(f):(n[f.facet.id]||(n[f.facet.id]=[])).push(f);let a=Object.create(null),o=[],l=[];for(let f of r)a[f.id]=l.length<<1,l.push(u=>f.slot(u));let c=i?.config.facets;for(let f in n){let u=n[f],Q=u[0].facet,$=c&&c[f]||[];if(u.every(p=>p.type==0))if(a[Q.id]=o.length<<1|1,aa($,u))o.push(i.facet(Q));else{let p=Q.combine(u.map(m=>m.value));o.push(i&&Q.compare(p,i.facet(Q))?i.facet(Q):p)}else{for(let p of u)p.type==0?(a[p.id]=o.length<<1|1,o.push(p.value)):(a[p.id]=l.length<<1,l.push(m=>p.dynamicSlot(m)));a[Q.id]=l.length<<1,l.push(p=>Gg(p,Q,u))}}let h=l.map(f=>f(a));return new O(e,s,h,a,o,n)}};function Eg(O,e,t){let i=[[],[],[],[],[]],r=new Map;function n(s,a){let o=r.get(s);if(o!=null){if(o<=a)return;let l=i[o].indexOf(s);l>-1&&i[o].splice(l,1),s instanceof vi&&t.delete(s.compartment)}if(r.set(s,a),Array.isArray(s))for(let l of s)n(l,a);else if(s instanceof vi){if(t.has(s.compartment))throw new RangeError("Duplicate use of compartment in extensions");let l=e.get(s.compartment)||s.inner;t.set(s.compartment,l),n(l,a)}else if(s instanceof Br)n(s.inner,s.prec);else if(s instanceof ce)i[a].push(s),s.provides&&n(s.provides,a);else if(s instanceof IO)i[a].push(s),s.facet.extensions&&n(s.facet.extensions,uO.default);else{let l=s.extension;if(!l)throw new Error(`Unrecognized extension value in extension set (${s}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);n(l,a)}}return n(O,uO.default),i.reduce((s,a)=>s.concat(a))}function Zi(O,e){if(e&1)return 2;let t=e>>1,i=O.status[t];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;O.status[t]=4;let r=O.computeSlot(O,O.config.dynamicSlots[t]);return O.status[t]=2|r}function Fr(O,e){return e&1?O.config.staticValues[e>>1]:O.values[e>>1]}var Vh=Z.define(),Ks=Z.define({combine:O=>O.some(e=>e),static:!0}),qh=Z.define({combine:O=>O.length?O[0]:void 0,static:!0}),zh=Z.define(),Uh=Z.define(),Wh=Z.define(),jh=Z.define({combine:O=>O.length?O[0]:!1}),qe=class{constructor(e,t){this.type=e,this.value=t}static define(){return new Js}},Js=class{of(e){return new qe(this,e)}},ea=class{constructor(e){this.map=e}of(e){return new V(this,e)}},V=class O{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new O(this.type,t)}is(e){return this.type==e}static define(e={}){return new ea(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let r of e){let n=r.map(t);n&&i.push(n)}return i}};V.reconfigure=V.define();V.appendConfig=V.define();var Qe=class O{constructor(e,t,i,r,n,s){this.startState=e,this.changes=t,this.selection=i,this.effects=r,this.annotations=n,this.scrollIntoView=s,this._doc=null,this._state=null,i&&Rh(i,t.newLength),n.some(a=>a.type==O.time)||(this.annotations=n.concat(O.time.of(Date.now())))}static create(e,t,i,r,n,s){return new O(e,t,i,r,n,s)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(O.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}};Qe.time=qe.define();Qe.userEvent=qe.define();Qe.addToHistory=qe.define();Qe.remote=qe.define();function Ag(O,e){let t=[];for(let i=0,r=0;;){let n,s;if(i=O[i]))n=O[i++],s=O[i++];else if(r=0;r--){let n=i[r](O);n instanceof Qe?O=n:Array.isArray(n)&&n.length==1&&n[0]instanceof Qe?O=n[0]:O=Gh(e,BO(n),!1)}return O}function Mg(O){let e=O.startState,t=e.facet(Wh),i=O;for(let r=t.length-1;r>=0;r--){let n=t[r](O);n&&Object.keys(n).length&&(i=Ch(i,ta(e,n,O.changes.newLength),!0))}return i==O?O:Qe.create(e,O.changes,O.selection,i.effects,i.annotations,i.scrollIntoView)}var Dg=[];function BO(O){return O==null?Dg:Array.isArray(O)?O:[O]}var ee=(function(O){return O[O.Word=0]="Word",O[O.Space=1]="Space",O[O.Other=2]="Other",O})(ee||(ee={})),Ig=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,Oa;try{Oa=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function Bg(O){if(Oa)return Oa.test(O);for(let e=0;e"\x80"&&(t.toUpperCase()!=t.toLowerCase()||Ig.test(t)))return!0}return!1}function Ng(O){return e=>{if(!/\S/.test(e))return ee.Space;if(Bg(e))return ee.Word;for(let t=0;t-1)return ee.Word;return ee.Other}}var I=class O{constructor(e,t,i,r,n,s){this.config=e,this.doc=t,this.selection=i,this.values=r,this.status=e.statusTemplate.slice(),this.computeSlot=n,s&&(s._state=this);for(let a=0;ar.set(l,o)),t=null),r.set(a.value.compartment,a.value.extension)):a.is(V.reconfigure)?(t=null,i=a.value):a.is(V.appendConfig)&&(t=null,i=BO(i).concat(a.value));let n;t?n=e.startState.values.slice():(t=Nr.resolve(i,r,this),n=new O(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(o,l)=>l.reconfigure(o,this),null).values);let s=e.startState.facet(Ks)?e.newSelection:e.newSelection.asSingle();new O(t,e.newDoc,s,n,(a,o)=>o.update(a,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:S.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),r=this.changes(i.changes),n=[i.range],s=BO(i.effects);for(let a=1;as.spec.fromJSON(a,o)))}}return O.create({doc:e.doc,selection:S.fromJSON(e.selection),extensions:t.extensions?r.concat([t.extensions]):r})}static create(e={}){let t=Nr.resolve(e.extensions||[],new Map),i=e.doc instanceof E?e.doc:E.of((e.doc||"").split(t.staticFacet(O.lineSeparator)||Bs)),r=e.selection?e.selection instanceof S?e.selection:S.single(e.selection.anchor,e.selection.head):S.single(0);return Rh(r,i.length),t.staticFacet(Ks)||(r=r.asSingle()),new O(t,i,r,t.dynamicSlots.map(()=>null),(n,s)=>s.create(n),null)}get tabSize(){return this.facet(O.tabSize)}get lineBreak(){return this.facet(O.lineSeparator)||` `}get readOnly(){return this.facet(jh)}phrase(e,...t){for(let i of this.facet(O.phrases))if(Object.prototype.hasOwnProperty.call(i,e)){e=i[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(i,r)=>{if(r=="$")return"$";let n=+(r||1);return!n||n>t.length?i:t[n-1]})),e}languageDataAt(e,t,i=-1){let r=[];for(let n of this.facet(Vh))for(let s of n(this,t,i))Object.prototype.hasOwnProperty.call(s,e)&&r.push(s[e]);return r}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return Ng(t.length?t[0]:"")}wordAt(e){let{text:t,from:i,length:r}=this.doc.lineAt(e),n=this.charCategorizer(e),s=e-i,a=e-i;for(;s>0;){let o=fe(t,s,!1);if(n(t.slice(o,s))!=ee.Word)break;s=o}for(;aO.length?O[0]:4});I.lineSeparator=qh;I.readOnly=jh;I.phrases=Z.define({compare(O,e){let t=Object.keys(O),i=Object.keys(e);return t.length==i.length&&t.every(r=>O[r]==e[r])}});I.languageData=Vh;I.changeFilter=zh;I.transactionFilter=Uh;I.transactionExtender=Wh;FO.reconfigure=V.define();function xe(O,e,t={}){let i={};for(let r of O)for(let n of Object.keys(r)){let s=r[n],a=i[n];if(a===void 0)i[n]=s;else if(!(a===s||s===void 0))if(Object.hasOwnProperty.call(t,n))i[n]=t[n](a,s);else throw new Error("Config merge conflict for field "+n)}for(let r in e)i[r]===void 0&&(i[r]=e[r]);return i}var tt=class{eq(e){return this==e}range(e,t=e){return Yi.create(e,t,this)}};tt.prototype.startSide=tt.prototype.endSide=0;tt.prototype.point=!1;tt.prototype.mapMode=pe.TrackDel;function oa(O,e){return O==e||O.constructor==e.constructor&&O.eq(e)}var Yi=class O{constructor(e,t,i){this.from=e,this.to=t,this.value=i}static create(e,t,i){return new O(e,t,i)}};function ia(O,e){return O.from-e.from||O.value.startSide-e.value.startSide}var ra=class O{constructor(e,t,i,r){this.from=e,this.to=t,this.value=i,this.maxPoint=r}get length(){return this.to[this.to.length-1]}findIndex(e,t,i,r=0){let n=i?this.to:this.from;for(let s=r,a=n.length;;){if(s==a)return s;let o=s+a>>1,l=n[o]-e||(i?this.value[o].endSide:this.value[o].startSide)-t;if(o==s)return l>=0?s:a;l>=0?a=o:s=o+1}}between(e,t,i,r){for(let n=this.findIndex(t,-1e9,!0),s=this.findIndex(i,1e9,!1,n);nu||f==u&&l.startSide>0&&l.endSide<=0)continue;(u-f||l.endSide-l.startSide)<0||(s<0&&(s=f),l.point&&(a=Math.max(a,u-f)),i.push(l),r.push(f-s),n.push(u-s))}return{mapped:i.length?new O(r,n,i,a):null,pos:s}}},M=class O{constructor(e,t,i,r){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this.maxPoint=r}static create(e,t,i,r){return new O(e,t,i,r)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:i=!1,filterFrom:r=0,filterTo:n=this.length}=e,s=e.filter;if(t.length==0&&!s)return this;if(i&&(t=t.slice().sort(ia)),this.isEmpty)return t.length?O.of(t):this;let a=new Hr(this,null,-1).goto(0),o=0,l=[],c=new Le;for(;a.value||o=0){let h=t[o++];c.addInner(h.from,h.to,h.value)||l.push(h)}else a.rangeIndex==1&&a.chunkIndexthis.chunkEnd(a.chunkIndex)||na.to||n=n&&e<=n+s.length&&s.between(n,e-n,t-n,i)===!1)return}this.nextLayer.between(e,t,i)}}iter(e=0){return _i.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return _i.from(e).goto(t)}static compare(e,t,i,r,n=-1){let s=e.filter(h=>h.maxPoint>0||!h.isEmpty&&h.maxPoint>=n),a=t.filter(h=>h.maxPoint>0||!h.isEmpty&&h.maxPoint>=n),o=Zh(s,a,i),l=new QO(s,o,n),c=new QO(a,o,n);i.iterGaps((h,f,u)=>vh(l,h,c,f,u,r)),i.empty&&i.length==0&&vh(l,0,c,0,0,r)}static eq(e,t,i=0,r){r==null&&(r=999999999);let n=e.filter(c=>!c.isEmpty&&t.indexOf(c)<0),s=t.filter(c=>!c.isEmpty&&e.indexOf(c)<0);if(n.length!=s.length)return!1;if(!n.length)return!0;let a=Zh(n,s),o=new QO(n,a,0).goto(i),l=new QO(s,a,0).goto(i);for(;;){if(o.to!=l.to||!na(o.active,l.active)||o.point&&(!l.point||!oa(o.point,l.point)))return!1;if(o.to>r)return!0;o.next(),l.next()}}static spans(e,t,i,r,n=-1){let s=new QO(e,null,n).goto(t),a=t,o=s.openStart;for(;;){let l=Math.min(s.to,i);if(s.point){let c=s.activeForPoint(s.to),h=s.pointFroma&&(r.span(a,l,s.active,o),o=s.openEnd(l));if(s.to>i)return o+(s.point&&s.to>i?1:0);a=s.to,s.next()}}static of(e,t=!1){let i=new Le;for(let r of e instanceof Yi?[e]:t?Fg(e):e)i.add(r.from,r.to,r.value);return i.finish()}static join(e){if(!e.length)return O.empty;let t=e[e.length-1];for(let i=e.length-2;i>=0;i--)for(let r=e[i];r!=O.empty;r=r.nextLayer)t=new O(r.chunkPos,r.chunk,t,Math.max(r.maxPoint,t.maxPoint));return t}};M.empty=new M([],[],null,-1);function Fg(O){if(O.length>1)for(let e=O[0],t=1;t0)return O.slice().sort(ia);e=i}return O}M.empty.nextLayer=M.empty;var Le=class O{finishChunk(e){this.chunks.push(new ra(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new O)).add(e,t,i)}addInner(e,t,i){let r=e-this.lastTo||i.startSide-this.last.endSide;if(r<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return r<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=t,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let i=t.value.length-1;return this.last=t.value[i],this.lastFrom=t.from[i]+e,this.lastTo=t.to[i]+e,!0}finish(){return this.finishInner(M.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=M.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}};function Zh(O,e,t){let i=new Map;for(let n of O)for(let s=0;s=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&r.push(new Hr(s,t,i,n));return r.length==1?r[0]:new O(r)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let i=this.heap.length>>1;i>=0;i--)Ds(this.heap,i);return this.next(),this}forward(e,t){for(let i of this.heap)i.forward(e,t);for(let i=this.heap.length>>1;i>=0;i--)Ds(this.heap,i);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),Ds(this.heap,0)}}};function Ds(O,e){for(let t=O[e];;){let i=(e<<1)+1;if(i>=O.length)break;let r=O[i];if(i+1=0&&(r=O[i+1],i++),t.compare(r)<0)break;O[i]=t,O[e]=r,e=i}}var QO=class{constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=_i.from(e,t,i)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){Ar(this.active,e),Ar(this.activeTo,e),Ar(this.activeRank,e),this.minActive=Yh(this.active,this.activeTo)}addActive(e){let t=0,{value:i,to:r,rank:n}=this.cursor;for(;t0;)t++;Lr(this.active,t,i),Lr(this.activeTo,t,r),Lr(this.activeRank,t,n),e&&Lr(e,t,this.cursor.from),this.minActive=Yh(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let r=this.minActive;if(r>-1&&(this.activeTo[r]-this.cursor.from||this.active[r].endSide-this.cursor.startSide)<0){if(this.activeTo[r]>e){this.to=this.activeTo[r],this.endSide=this.active[r].endSide;break}this.removeActive(r),i&&Ar(i,r)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let n=this.cursor.value;if(!n.point)this.addActive(i),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&i[r]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&t.push(this.active[i]);return t.reverse()}openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)t++;return t}};function vh(O,e,t,i,r,n){O.goto(e),t.goto(i);let s=i+r,a=i,o=i-e,l=!!n.boundChange;for(let c=!1;;){let h=O.to+o-t.to,f=h||O.endSide-t.endSide,u=f<0?O.to+o:t.to,Q=Math.min(u,s);if(O.point||t.point?(O.point&&t.point&&oa(O.point,t.point)&&na(O.activeForPoint(O.to),t.activeForPoint(t.to))||n.comparePoint(a,Q,O.point,t.point),c=!1):(c&&n.boundChange(a),Q>a&&!na(O.active,t.active)&&n.compareRange(a,Q,O.active,t.active),l&&Qs)break;a=u,f<=0&&O.next(),f>=0&&t.next()}}function na(O,e){if(O.length!=e.length)return!1;for(let t=0;t=e;i--)O[i+1]=O[i];O[e]=t}function Yh(O,e){let t=-1,i=1e9;for(let r=0;r=e)return r;if(r==O.length)break;n+=O.charCodeAt(r)==9?t-n%t:1,r=fe(O,r)}return i===!0?-1:O.length}var Eh=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),la=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Ah=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Ot=class{constructor(e,t){this.rules=[];let{finish:i}=t||{};function r(s){return/^@/.test(s)?[s]:s.split(/,\s*/)}function n(s,a,o,l){let c=[],h=/^@(\w+)\b/.exec(s[0]),f=h&&h[1]=="keyframes";if(h&&a==null)return o.push(s[0]+";");for(let u in a){let Q=a[u];if(/&/.test(u))n(u.split(/,\s*/).map($=>s.map(p=>$.replace(/&/,p))).reduce(($,p)=>$.concat(p)),Q,o);else if(Q&&typeof Q=="object"){if(!h)throw new RangeError("The value of a property ("+u+") should be a primitive value.");n(r(u),Q,c,f)}else Q!=null&&c.push(u.replace(/_.*/,"").replace(/[A-Z]/g,$=>"-"+$.toLowerCase())+": "+Q+";")}(c.length||f)&&o.push((i&&!h&&!l?s.map(i):s).join(", ")+" {"+c.join(" ")+"}")}for(let s in e)n(r(s),e[s],this.rules)}getRules(){return this.rules.join(` `)}static newName(){let e=Ah[Eh]||1;return Ah[Eh]=e+1,"\u037C"+e.toString(36)}static mount(e,t,i){let r=e[la],n=i&&i.nonce;r?n&&r.setNonce(n):r=new ca(e,n),r.mount(Array.isArray(t)?t:[t],e)}},Lh=new Map,ca=class{constructor(e,t){let i=e.ownerDocument||e,r=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&r.CSSStyleSheet){let n=Lh.get(i);if(n)return e[la]=n;this.sheet=new r.CSSStyleSheet,Lh.set(i,this)}else this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[la]=this}mount(e,t){let i=this.sheet,r=0,n=0;for(let s=0;s-1&&(this.modules.splice(o,1),n--,o=-1),o==-1){if(this.modules.splice(n++,0,a),i)for(let l=0;l",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Hg=typeof navigator<"u"&&/Mac/.test(navigator.platform),Kg=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for($e=0;$e<10;$e++)Yt[48+$e]=Yt[96+$e]=String($e);var $e;for($e=1;$e<=24;$e++)Yt[$e+111]="F"+$e;var $e;for($e=65;$e<=90;$e++)Yt[$e]=String.fromCharCode($e+32),HO[$e]=String.fromCharCode($e);var $e;for(Jr in Yt)HO.hasOwnProperty(Jr)||(HO[Jr]=Yt[Jr]);var Jr;function Mh(O){var e=Hg&&O.metaKey&&O.shiftKey&&!O.ctrlKey&&!O.altKey||Kg&&O.shiftKey&&O.key&&O.key.length==1||O.key=="Unidentified",t=!e&&O.key||(O.shiftKey?HO:Yt)[O.keyCode]||O.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}function N(){var O=arguments[0];typeof O=="string"&&(O=document.createElement(O));var e=1,t=arguments[1];if(t&&typeof t=="object"&&t.nodeType==null&&!Array.isArray(t)){for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var r=t[i];typeof r=="string"?O.setAttribute(i,r):r!=null&&(O[i]=r)}e++}for(;e2),v={mac:Nh||/Mac/.test(Ye.platform),windows:/Win/.test(Ye.platform),linux:/Linux|X11/.test(Ye.platform),ie:Rn,ie_version:_f?ga.documentMode||6:Sa?+Sa[1]:Pa?+Pa[1]:0,gecko:Ih,gecko_version:Ih?+(/Firefox\/(\d+)/.exec(Ye.userAgent)||[0,0])[1]:0,chrome:!!ha,chrome_version:ha?+ha[1]:0,ios:Nh,android:/Android\b/.test(Ye.userAgent),webkit:Bh,webkit_version:Bh?+(/\bAppleWebKit\/(\d+)/.exec(Ye.userAgent)||[0,0])[1]:0,safari:Xa,safari_version:Xa?+(/\bVersion\/(\d+(\.\d+)?)/.exec(Ye.userAgent)||[0,0])[1]:0,tabSize:ga.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function uo(O,e){for(let t in O)t=="class"&&e.class?e.class+=" "+O.class:t=="style"&&e.style?e.style+=";"+O.style:e[t]=O[t];return e}var $n=Object.create(null);function Qo(O,e,t){if(O==e)return!0;O||(O=$n),e||(e=$n);let i=Object.keys(O),r=Object.keys(e);if(i.length-(t&&i.indexOf(t)>-1?1:0)!=r.length-(t&&r.indexOf(t)>-1?1:0))return!1;for(let n of i)if(n!=t&&(r.indexOf(n)==-1||O[n]!==e[n]))return!1;return!0}function Jg(O,e){for(let t=O.attributes.length-1;t>=0;t--){let i=O.attributes[t].name;e[i]==null&&O.removeAttribute(i)}for(let t in e){let i=e[t];t=="style"?O.style.cssText=i:O.getAttribute(t)!=i&&O.setAttribute(t,i)}}function Fh(O,e,t){let i=!1;if(e)for(let r in e)t&&r in t||(i=!0,r=="style"?O.style.cssText="":O.removeAttribute(r));if(t)for(let r in t)e&&e[r]==t[r]||(i=!0,r=="style"?O.style.cssText=t[r]:O.setAttribute(r,t[r]));return i}function eP(O){let e=Object.create(null);for(let t=0;t0?3e8:-4e8:t>0?1e8:-1e8,new PO(e,t,t,i,e.widget||null,!1)}static replace(e){let t=!!e.block,i,r;if(e.isBlockGap)i=-5e8,r=4e8;else{let{start:n,end:s}=Rf(e,t);i=(n?t?-3e8:-1:5e8)-1,r=(s?t?2e8:1:-6e8)+1}return new PO(e,i,r,t,e.widget||null,!0)}static line(e){return new Ii(e)}static set(e,t=!1){return M.of(e,t)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};Y.none=M.empty;var Di=class O extends Y{constructor(e){let{start:t,end:i}=Rf(e);super(t?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?uo(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||$n}eq(e){return this==e||e instanceof O&&this.tagName==e.tagName&&Qo(this.attrs,e.attrs)}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}};Di.prototype.point=!1;var Ii=class O extends Y{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof O&&this.spec.class==e.spec.class&&Qo(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}};Ii.prototype.mapMode=pe.TrackBefore;Ii.prototype.point=!0;var PO=class O extends Y{constructor(e,t,i,r,n,s){super(t,i,n,e),this.block=r,this.isReplace=s,this.mapMode=r?t<=0?pe.TrackBefore:pe.TrackAfter:pe.TrackDel}get type(){return this.startSide!=this.endSide?Te.WidgetRange:this.startSide<=0?Te.WidgetBefore:Te.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof O&&tP(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}};PO.prototype.point=!0;function Rf(O,e=!1){let{inclusiveStart:t,inclusiveEnd:i}=O;return t==null&&(t=O.inclusive),i==null&&(i=O.inclusive),{start:t??e,end:i??e}}function tP(O,e){return O==e||!!(O&&e&&O.compare(e))}function Oi(O,e,t,i=0){let r=t.length-1;r>=0&&t[r]+i>=O?t[r]=Math.max(t[r],e):t.push(O,e)}var pn=class O extends tt{constructor(e,t){super(),this.tagName=e,this.attributes=t}eq(e){return e==this||e instanceof O&&this.tagName==e.tagName&&Qo(this.attributes,e.attributes)}static create(e){return new O(e.tagName,e.attributes||$n)}static set(e,t=!1){return M.of(e,t)}};pn.prototype.startSide=pn.prototype.endSide=-1;function Bi(O){let e;return O.nodeType==11?e=O.getSelection?O:O.ownerDocument:e=O,e.getSelection()}function Ta(O,e){return e?O==e||O.contains(e.nodeType!=1?e.parentNode:e):!1}function cn(O,e){if(!e.anchorNode)return!1;try{return Ta(O,e.anchorNode)}catch{return!1}}function hn(O){return O.nodeType==3?Ni(O,0,O.nodeValue.length).getClientRects():O.nodeType==1?O.getClientRects():[]}function Wi(O,e,t,i){return t?Hh(O,e,t,i,-1)||Hh(O,e,t,i,1):!1}function Nt(O){for(var e=0;;e++)if(O=O.previousSibling,!O)return e}function mn(O){return O.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(O.nodeName)}function Hh(O,e,t,i,r){for(;;){if(O==t&&e==i)return!0;if(e==(r<0?0:Rt(O))){if(O.nodeName=="DIV")return!1;let n=O.parentNode;if(!n||n.nodeType!=1)return!1;e=Nt(O)+(r<0?0:1),O=n}else if(O.nodeType==1){if(O=O.childNodes[e+(r<0?-1:0)],O.nodeType==1&&O.contentEditable=="false")return!1;e=r<0?Rt(O):0}else return!1}}function Rt(O){return O.nodeType==3?O.nodeValue.length:O.childNodes.length}function gn(O,e){let t=e?O.left:O.right;return{left:t,right:t,top:O.top,bottom:O.bottom}}function OP(O){let e=O.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:O.innerWidth,top:0,bottom:O.innerHeight}}function Vf(O,e){let t=e.width/O.offsetWidth,i=e.height/O.offsetHeight;return(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.width-O.offsetWidth)<1)&&(t=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-O.offsetHeight)<1)&&(i=1),{scaleX:t,scaleY:i}}function iP(O,e,t,i,r,n,s,a){let o=O.ownerDocument,l=o.defaultView||window;for(let c=O,h=!1;c&&!h;)if(c.nodeType==1){let f,u=c==o.body,Q=1,$=1;if(u)f=OP(l);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(h=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let g=c.getBoundingClientRect();({scaleX:Q,scaleY:$}=Vf(c,g)),f={left:g.left,right:g.left+c.clientWidth*Q,top:g.top,bottom:g.top+c.clientHeight*$}}let p=0,m=0;if(r=="nearest")e.top0&&e.bottom>f.bottom+m&&(m=e.bottom-f.bottom+s)):e.bottom>f.bottom&&(m=e.bottom-f.bottom+s,t<0&&e.top-m0&&e.right>f.right+p&&(p=e.right-f.right+n)):e.right>f.right&&(p=e.right-f.right+n,t<0&&e.leftf.bottom||e.leftf.right)&&(e={left:Math.max(e.left,f.left),right:Math.min(e.right,f.right),top:Math.max(e.top,f.top),bottom:Math.min(e.bottom,f.bottom)}),c=c.assignedSlot||c.parentNode}else if(c.nodeType==11)c=c.host;else break}function rP(O){let e=O.ownerDocument,t,i;for(let r=O.parentNode;r&&!(r==e.body||t&&i);)if(r.nodeType==1)!i&&r.scrollHeight>r.clientHeight&&(i=r),!t&&r.scrollWidth>r.clientWidth&&(t=r),r=r.assignedSlot||r.parentNode;else if(r.nodeType==11)r=r.host;else break;return{x:t,y:i}}var ba=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchorOffset,t?Rt(t):0),i,Math.min(e.focusOffset,i?Rt(i):0))}set(e,t,i,r){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this.focusOffset=r}},mO=null;v.safari&&v.safari_version>=26&&(mO=!1);function qf(O){if(O.setActive)return O.setActive();if(mO)return O.focus(mO);let e=[];for(let t=O;t&&(e.push(t,t.scrollTop,t.scrollLeft),t!=t.ownerDocument);t=t.parentNode);if(O.focus(mO==null?{get preventScroll(){return mO={preventScroll:!0},!0}}:void 0),!mO){mO=!1;for(let t=0;tMath.max(1,O.scrollHeight-O.clientHeight-4)}function Uf(O,e){for(let t=O,i=e;;){if(t.nodeType==3&&i>0)return{node:t,offset:i};if(t.nodeType==1&&i>0){if(t.contentEditable=="false")return null;t=t.childNodes[i-1],i=Rt(t)}else if(t.parentNode&&!mn(t))i=Nt(t),t=t.parentNode;else return null}}function Wf(O,e){for(let t=O,i=e;;){if(t.nodeType==3&&i=t){if(a.level==i)return s;(n<0||(r!=0?r<0?a.fromt:e[n].level>a.level))&&(n=s)}}if(n<0)throw new RangeError("Index out of range");return n}};function Gf(O,e){if(O.length!=e.length)return!1;for(let t=0;t=0;$-=3)if(Pt[$+1]==-u){let p=Pt[$+2],m=p&2?r:p&4?p&1?n:r:0;m&&(re[h]=re[Pt[$]]=m),a=$;break}}else{if(Pt.length==189)break;Pt[a++]=h,Pt[a++]=f,Pt[a++]=o}else if((Q=re[h])==2||Q==1){let $=Q==r;o=$?0:1;for(let p=a-3;p>=0;p-=3){let m=Pt[p+2];if(m&2)break;if($)Pt[p+2]|=2;else{if(m&4)break;Pt[p+2]|=4}}}}}function fP(O,e,t,i){for(let r=0,n=i;r<=t.length;r++){let s=r?t[r-1].to:O,a=ro;)Q==p&&(Q=t[--$].from,p=$?t[$-1].to:O),re[--Q]=u;o=c}else n=l,o++}}}function xa(O,e,t,i,r,n,s){let a=i%2?2:1;if(i%2==r%2)for(let o=e,l=0;oo&&s.push(new ct(o,$.from,u));let p=$.direction==SO!=!(u%2);ka(O,p?i+1:i,r,$.inner,$.from,$.to,s),o=$.to}Q=$.to}else{if(Q==t||(c?re[Q]!=a:re[Q]==a))break;Q++}f?xa(O,o,Q,i+1,r,f,s):oe;){let c=!0,h=!1;if(!l||o>n[l-1].to){let $=re[o-1];$!=a&&(c=!1,h=$==16)}let f=!c&&a==1?[]:null,u=c?i:i+1,Q=o;e:for(;;)if(l&&Q==n[l-1].to){if(h)break e;let $=n[--l];if(!c)for(let p=$.from,m=l;;){if(p==e)break e;if(m&&n[m-1].to==p)p=n[--m].from;else{if(re[p-1]==a)break e;break}}if(f)f.push($);else{$.tore.length;)re[re.length]=256;let i=[],r=e==SO?0:1;return ka(O,r,r,t,0,O.length,i),i}function Ef(O){return[new ct(0,O,0)]}var Af="";function uP(O,e,t,i,r){var n;let s=i.head-O.from,a=ct.find(e,s,(n=i.bidiLevel)!==null&&n!==void 0?n:-1,i.assoc),o=e[a],l=o.side(r,t);if(s==l){let f=a+=r?1:-1;if(f<0||f>=e.length)return null;o=e[a=f],s=o.side(!r,t),l=o.side(r,t)}let c=fe(O.text,s,o.forward(r,t));(co.to)&&(c=l),Af=O.text.slice(Math.min(s,c),Math.max(s,c));let h=a==(r?e.length-1:0)?null:e[a+(r?1:-1)];return h&&c==l&&h.level+(r?0:1)O.some(e=>e)}),Hf=Z.define({combine:O=>O.some(e=>e)}),Kf=Z.define(),ji=class O{constructor(e,t="nearest",i="nearest",r=5,n=5,s=!1){this.range=e,this.y=t,this.x=i,this.yMargin=r,this.xMargin=n,this.isSnapshot=s}map(e){return e.empty?this:new O(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new O(S.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},en=V.define({map:(O,e)=>O.map(e)}),Jf=V.define();function Xe(O,e,t){let i=O.facet(If);i.length?i[0](e):window.onerror&&window.onerror(String(e),t,void 0,void 0,e)||(t?console.error(t+":",e):console.error(e))}var _t=Z.define({combine:O=>O.length?O[0]:!0}),$P=0,KO=Z.define({combine(O){return O.filter((e,t)=>{for(let i=0;i{let o=[];return s&&o.push(Fi.of(l=>{let c=l.plugin(a);return c?s(c):Y.none})),n&&o.push(n(a)),o})}static fromClass(e,t){return O.define((i,r)=>new e(i,r),t)}},Ci=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(i){if(Xe(t.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){Xe(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{this.value.destroy()}catch(i){Xe(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},ed=Z.define(),go=Z.define(),Fi=Z.define(),td=Z.define(),Od=Z.define(),Ji=Z.define(),id=Z.define();function Jh(O,e){let t=O.state.facet(id);if(!t.length)return t;let i=t.map(n=>n instanceof Function?n(O):n),r=[];return M.spans(i,e.from,e.to,{point(){},span(n,s,a,o){let l=n-e.from,c=s-e.from,h=r;for(let f=a.length-1;f>=0;f--,o--){let u=a[f].spec.bidiIsolate,Q;if(u==null&&(u=QP(e.text,l,c)),o>0&&h.length&&(Q=h[h.length-1]).to==l&&Q.direction==u)Q.to=c,h=Q.inner;else{let $={from:l,to:c,direction:u,inner:[]};h.push($),h=$.inner}}}}),r}var rd=Z.define();function Po(O){let e=0,t=0,i=0,r=0;for(let n of O.state.facet(rd)){let s=n(O);s&&(s.left!=null&&(e=Math.max(e,s.left)),s.right!=null&&(t=Math.max(t,s.right)),s.top!=null&&(i=Math.max(i,s.top)),s.bottom!=null&&(r=Math.max(r,s.bottom)))}return{left:e,right:t,top:i,bottom:r}}var Vi=Z.define(),ht=class O{constructor(e,t,i,r){this.fromA=e,this.toA=t,this.fromB=i,this.toB=r}join(e){return new O(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let t=e.length,i=this;for(;t>0;t--){let r=e[t-1];if(!(r.fromA>i.toA)){if(r.toAr.push(new ht(n,s,a,o))),this.changedRanges=r}static create(e,t,i){return new O(e,t,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},pP=[],de=class{constructor(e,t,i=0){this.dom=e,this.length=t,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return pP}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let t=this.domAttrs;t&&Jg(this.dom,t)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,t=this.posAtStart){let i=t;for(let r of this.children){if(r==e)return i;i+=r.length+r.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,t){return null}domPosFor(e,t){let i=Nt(this.dom),r=this.length?e>0:t>0;return new St(this.parent.dom,i+(r?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof ni)return e;return null}static get(e){return e.cmTile}},ri=class extends de{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let t=this.dom,i=null,r,n=e?.node==t?e:null,s=0;for(let a of this.children){if(a.sync(e),s+=a.length+a.breakAfter,r=i?i.nextSibling:t.firstChild,n&&r!=a.dom&&(n.written=!0),a.dom.parentNode==t)for(;r&&r!=a.dom;)r=ef(r);else t.insertBefore(a.dom,r);i=a.dom}for(r=i?i.nextSibling:t.firstChild,n&&r&&(n.written=!0);r;)r=ef(r);this.length=s}};function ef(O){let e=O.nextSibling;return O.parentNode.removeChild(O),e}var ni=class extends ri{constructor(e,t){super(t),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let t=de.get(e);if(t&&this.owns(t))return t;e=e.parentNode}}blockTiles(e){for(let t=[],i=this,r=0,n=0;;)if(r==i.children.length){if(!t.length)return;i=i.parent,i.breakAfter&&n++,r=t.pop()}else{let s=i.children[r++];if(s instanceof It)t.push(r),i=s,r=0;else{let a=n+s.length,o=e(s,n);if(o!==void 0)return o;n=a+s.breakAfter}}}resolveBlock(e,t){let i,r=-1,n,s=-1;if(this.blockTiles((a,o)=>{let l=o+a.length;if(e>=o&&e<=l){if(a.isWidget()&&t>=-1&&t<=1){if(a.flags&32)return!0;a.flags&16&&(i=void 0)}(oe||e==o&&(t>1?a.length:a.covers(-1)))&&(!n||!a.isWidget()&&n.isWidget())&&(n=a,s=e-o)}}),!i&&!n)throw new Error("No tile at position "+e);return i&&t<0||!n?{tile:i,offset:r}:{tile:n,offset:s}}},It=class O extends ri{constructor(e,t){super(e),this.wrapper=t}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,t){let i=new O(t||document.createElement(e.tagName),e);return t||(i.flags|=4),i}},si=class O extends ri{constructor(e,t){super(e),this.attrs=t}isLine(){return!0}static start(e,t,i){let r=new O(t||document.createElement("div"),e);return(!t||!i)&&(r.flags|=4),r}get domAttrs(){return this.attrs}resolveInline(e,t,i){let r=null,n=-1,s=null,a=-1;function o(c,h){for(let f=0,u=0;f=h&&(Q.isComposite()?o(Q,h-u):(!s||s.isHidden&&(t>0||i&&gP(s,Q)))&&($>h||Q.flags&32)?(s=Q,a=h-u):(ui&&(e=i);let r=e,n=e,s=0;e==0&&t<0||e==i&&t>=0?v.chrome||v.gecko||(e?(r--,s=1):n=0)?0:a.length-1];return v.safari&&!s&&o.width==0&&(o=Array.prototype.find.call(a,l=>l.width)||o),s?gn(o,s<0):o||null}static of(e,t){let i=new O(t||document.createTextNode(e),e);return t||(i.flags|=2),i}},XO=class O extends de{constructor(e,t,i,r){super(e,t,r),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,t){return this.coordsInWidget(e,t,!1)}coordsInWidget(e,t,i){let r=this.widget.coordsAt(this.dom,e,t);if(r)return r;if(i)return gn(this.dom.getBoundingClientRect(),this.length?e==0:t<=0);{let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let a=this.flags&16?!0:this.flags&32?!1:e>0;for(let o=a?n.length-1:0;s=n[o],!(e>0?o==0:o==n.length-1||s.top0;)if(r.isComposite())if(s){if(!e)break;i&&i.break(),e--,s=!1}else if(n==r.children.length){if(!e&&!a.length)break;i&&i.leave(r),s=!!r.breakAfter,{tile:r,index:n}=a.pop(),n++}else{let o=r.children[n],l=o.breakAfter;(t>0?o.length<=e:o.length=0;a--){let o=t.marks[a],l=r.lastChild;if(l instanceof Ue&&l.mark.eq(o.mark))l.dom!=o.dom&&l.setDOM(fa(o.dom)),r=l;else{if(this.cache.reused.get(o)){let h=de.get(o.dom);h&&h.setDOM(fa(o.dom))}let c=Ue.of(o.mark,o.dom);r.append(c),r=c}this.cache.reused.set(o,2)}let n=de.get(e.text);n&&this.cache.reused.set(n,2);let s=new gO(e.text,e.text.nodeValue);s.flags|=8,r.append(s)}addInlineWidget(e,t,i){let r=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);r||this.flushBuffer();let n=this.ensureMarks(t,i);!r&&!(e.flags&16)&&n.append(this.getBuffer(1)),n.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,t,i){this.flushBuffer(),this.ensureMarks(t,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let t=this.afterWidget||this.lastBlock;t.length+=e,this.pos+=e}addLineStart(e,t){var i;e||(e=nd);let r=si.start(e,t||((i=this.cache.find(si))===null||i===void 0?void 0:i.dom),!!t);this.getBlockPos().append(this.lastBlock=this.curLine=r)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,t){var i;let r=this.curLine;for(let n=e.length-1;n>=0;n--){let s=e[n],a;if(t>0&&(a=r.lastChild)&&a instanceof Ue&&a.mark.eq(s))r=a,t--;else{let o=Ue.of(s,(i=this.cache.find(Ue,l=>l.mark.eq(s)))===null||i===void 0?void 0:i.dom);r.append(o),r=o,t=0}}return r}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!tf(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(v.ios&&tf(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(da,0,32)||new XO(da.toDOM(),0,da,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let t=new va(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-t.rank||this.wrappers[i-1].to-t.to)<0;)i--;this.wrappers.splice(i,0,t)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let i of this.wrappers){let r=t.lastChild;if(i.froms.wrapper.eq(i.wrapper)))===null||e===void 0?void 0:e.dom);t.append(n),t=n}}return t}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let t=2|(e<0?16:32),i=this.cache.find(ai,void 0,1);return i&&(i.flags=t),i||new ai(t)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},_a=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:r,lineBreak:n,done:s}=this.cursor.next(this.skipCount);if(this.skipCount=0,s)throw new Error("Ran out of text content when drawing inline views");this.text=r;let a=this.textOff=Math.min(e,r.length);return n?null:r.slice(0,a)}let t=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,t);return this.textOff=t,i}},Sn=[XO,si,gO,Ue,ai,It,ni];for(let O=0;O[]),this.index=Sn.map(()=>0),this.reused=new Map}add(e){let t=e.constructor.bucket,i=this.buckets[t];i.length<6?i.push(e):i[this.index[t]=(this.index[t]+1)%6]=e}find(e,t,i=2){let r=e.bucket,n=this.buckets[r],s=this.index[r];for(let a=n.length-1;a>=0;a--){let o=(a+s)%n.length,l=n[o];if((!t||t(l))&&!this.reused.has(l))return n.splice(o,1),o{if(this.cache.add(s),s.isComposite())return!1},enter:s=>this.cache.add(s),leave:()=>{},break:()=>{}}}run(e,t){let i=t&&this.getCompositionContext(t.text);for(let r=0,n=0,s=0;;){let a=sr){let l=o-r;this.preserve(l,!s,!a),r=o,n+=l}if(!a)break;this.forward(a.fromA,a.toA),t&&a.fromA<=t.range.fromA&&a.toA>=t.range.toA?(this.emit(n,t.range.fromB),this.builder.addComposition(t,i),this.text.skip(t.range.toB-t.range.fromB),this.emit(t.range.toB,a.toB)):this.emit(n,a.toB),n=a.toB,r=a.toA}return this.builder.curLine&&this.builder.endLine(),this.builder.root}preserve(e,t,i){let r=XP(this.old),n=this.openMarks;this.old.advance(e,i?1:-1,{skip:(s,a,o)=>{if(s.isWidget())if(this.openWidget)this.builder.continueWidget(o-a);else{let l=o>0||a{s.isLine()?this.builder.addLineStart(s.attrs,this.cache.maybeReuse(s)):(this.cache.add(s),s instanceof Ue&&r.unshift(s.mark)),this.openWidget=!1},leave:s=>{s.isLine()?r.length&&(r.length=n=0):s instanceof Ue&&(r.shift(),n=Math.min(n,r.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,t){let i=null,r=this.builder,n=0,s=M.spans(this.decorations,e,t,{point:(a,o,l,c,h,f)=>{if(l instanceof PO){if(this.disallowBlockEffectsFor[f]){if(l.block)throw new RangeError("Block decorations may not be specified via plugins");if(o>this.view.state.doc.lineAt(a).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(n=c.length,h>c.length)r.continueWidget(o-a);else{let u=l.widget||(l.block?Ft.block:Ft.inline),Q=PP(l),$=this.cache.findWidget(u,o-a,Q)||XO.of(u,this.view,o-a,Q);l.block?(l.startSide>0&&r.addLineStartIfNotCovered(i),r.addBlockWidget($)):(r.ensureLine(i),r.addInlineWidget($,c,h))}i=null}else i=SP(i,l);o>a&&this.text.skip(o-a)},span:(a,o,l,c)=>{for(let h=a;hn,this.openMarks=s}forward(e,t){t-e<=10?this.old.advance(t-e,1,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(t-e-10,-1),this.old.advance(5,1,this.reuseWalker))}getCompositionContext(e){let t=[],i=null;for(let r=e.parentNode;;r=r.parentNode){let n=de.get(r);if(r==this.view.contentDOM)break;n instanceof Ue?t.push(n):n?.isLine()?i=n:r.nodeName=="DIV"&&!i&&r!=this.view.contentDOM?i=new si(r,nd):t.push(Ue.of(new Di({tagName:r.nodeName.toLowerCase(),attributes:eP(r)}),r))}return{line:i,marks:t}}};function tf(O,e){let t=i=>{for(let r of i.children)if((e?r.isText():r.length)||t(r))return!0;return!1};return t(O)}function PP(O){let e=O.isReplace?(O.startSide<0?64:0)|(O.endSide>0?128:0):O.startSide>0?32:16;return O.block&&(e|=256),e}var nd={class:"cm-line"};function SP(O,e){let t=e.spec.attributes,i=e.spec.class;return!t&&!i||(O||(O={class:"cm-line"}),t&&uo(t,O),i&&(O.class+=" "+i)),O}function XP(O){let e=[];for(let t=O.parents.length;t>1;t--){let i=t==O.parents.length?O.tile:O.parents[t].tile;i instanceof Ue&&e.push(i.mark)}return e}function fa(O){let e=de.get(O);return e&&e.setDOM(O.cloneNode()),O}var Ft=class extends _e{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};Ft.inline=new Ft("span");Ft.block=new Ft("div");var da=new class extends _e{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},Xn=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=Y.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new ni(e,e.contentDOM),this.updateInner([new ht(0,0,0,e.state.doc.length)],null)}update(e){var t;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:c,toA:h})=>hthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let r=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((t=this.domChanged)===null||t===void 0)&&t.newSel?r=this.domChanged.newSel.head:!vP(e.changes,this.hasComposition)&&!e.selectionSet&&(r=e.state.selection.main.head));let n=r>-1?bP(this.view,e.changes,r):null;if(this.domChanged=null,this.hasComposition){let{from:c,to:h}=this.hasComposition;i=new ht(c,h,e.changes.mapPos(c,-1),e.changes.mapPos(h,1)).addToSet(i.slice())}this.hasComposition=n?{from:n.range.fromB,to:n.range.toB}:null,(v.ie||v.chrome)&&!n&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let s=this.decorations,a=this.blockWrappers;this.updateDeco();let o=kP(s,this.decorations,e.changes);o.length&&(i=ht.extendWithRanges(i,o));let l=wP(a,this.blockWrappers,e.changes);return l.length&&(i=ht.extendWithRanges(i,l)),n&&!i.some(c=>c.fromA<=n.range.fromA&&c.toA>=n.range.toA)&&(i=n.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,n),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(t||e.length){let s=this.tile,a=new Va(this.view,s,this.blockWrappers,this.decorations,this.dynamicDecorationMap);this.tile=a.run(e,t),qa(s,a.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let n=v.chrome||v.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(n),n&&(n.written||i.selectionRange.focusNode!=n.node||!this.tile.dom.contains(n.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let r=[];if(this.view.viewport.from||this.view.viewport.to-1)&&cn(i,this.view.observer.selectionRange)&&!(r&&i.contains(r));if(!(n||t||s))return;let a=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,l,c;if(o.empty?c=l=this.inlineDOMNearPos(o.anchor,o.assoc||1):(c=this.inlineDOMNearPos(o.head,o.head==o.from?1:-1),l=this.inlineDOMNearPos(o.anchor,o.anchor==o.from?1:-1)),v.gecko&&o.empty&&!this.hasComposition&&TP(l)){let f=document.createTextNode("");this.view.observer.ignore(()=>l.node.insertBefore(f,l.node.childNodes[l.offset]||null)),l=c=new St(f,0),a=!0}let h=this.view.observer.selectionRange;(a||!h.focusNode||(!Wi(l.node,l.offset,h.anchorNode,h.anchorOffset)||!Wi(c.node,c.offset,h.focusNode,h.focusOffset))&&!this.suppressWidgetCursorChange(h,o))&&(this.view.observer.ignore(()=>{v.android&&v.chrome&&i.contains(h.focusNode)&&ZP(h.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let f=Bi(this.view.root);if(f)if(o.empty){if(v.gecko){let u=yP(l.node,l.offset);if(u&&u!=3){let Q=(u==1?Uf:Wf)(l.node,l.offset);Q&&(l=new St(Q.node,Q.offset))}}f.collapse(l.node,l.offset),o.bidiLevel!=null&&f.caretBidiLevel!==void 0&&(f.caretBidiLevel=o.bidiLevel)}else if(f.extend){f.collapse(l.node,l.offset);try{f.extend(c.node,c.offset)}catch{}}else{let u=document.createRange();o.anchor>o.head&&([l,c]=[c,l]),u.setEnd(c.node,c.offset),u.setStart(l.node,l.offset),f.removeAllRanges(),f.addRange(u)}s&&this.view.root.activeElement==i&&(i.blur(),r&&r.focus())}),this.view.observer.setSelectionRange(l,c)),this.impreciseAnchor=l.precise?null:new St(h.anchorNode,h.anchorOffset),this.impreciseHead=c.precise?null:new St(h.focusNode,h.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&Wi(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,i=Bi(e.root),{anchorNode:r,anchorOffset:n}=e.observer.selectionRange;if(!i||!t.empty||!t.assoc||!i.modify)return;let s=this.lineAt(t.head,t.assoc);if(!s)return;let a=s.posAtStart;if(t.head==a||t.head==a+s.length)return;let o=this.coordsAt(t.head,-1),l=this.coordsAt(t.head,1);if(!o||!l||o.bottom>l.top)return;let c=this.domAtPos(t.head+t.assoc,t.assoc);i.collapse(c.node,c.offset),i.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let h=e.observer.selectionRange;e.docView.posFromDOM(h.anchorNode,h.anchorOffset)!=t.from&&i.collapse(r,n)}posFromDOM(e,t){let i=this.tile.nearest(e);if(!i)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let r=i.posAtStart;if(i.isComposite()){let n;if(e==i.dom)n=i.dom.childNodes[t];else{let s=Rt(e)==0?0:t==0?-1:1;for(;;){let a=e.parentNode;if(a==i.dom)break;s==0&&a.firstChild!=a.lastChild&&(e==a.firstChild?s=-1:s=1),e=a}s<0?n=e:n=e.nextSibling}if(n==i.dom.firstChild)return r;for(;n&&!de.get(n);)n=n.nextSibling;if(!n)return r+i.length;for(let s=0,a=r;;s++){let o=i.children[s];if(o.dom==n)return a;a+=o.length+o.breakAfter}}else return i.isText()?e==i.dom?r+t:r+(t?i.length:0):r}domAtPos(e,t){let{tile:i,offset:r}=this.tile.resolveBlock(e,t);return i.isWidget()?i.domPosFor(e,t):i.domIn(r,t)}inlineDOMNearPos(e,t){let i,r=-1,n=!1,s,a=-1,o=!1;return this.tile.blockTiles((l,c)=>{if(l.isWidget()){if(l.flags&32&&c>=e)return!0;l.flags&16&&(n=!0)}else{let h=c+l.length;if(c<=e&&(i=l,r=e-c,n=h=e&&!s&&(s=l,a=e-c,o=c>e),c>e&&s)return!0}}),!i&&!s?this.domAtPos(e,t):(n&&s?i=null:o&&i&&(s=null),i&&t<0||!s?i.domIn(r,t):s.domIn(a,t))}coordsAt(e,t){let{tile:i,offset:r}=this.tile.resolveBlock(e,t);return i.isWidget()?i.widget instanceof Gi?null:i.coordsInWidget(r,t,!0):i.coordsIn(r,t)}lineAt(e,t){let{tile:i}=this.tile.resolveBlock(e,t);return i.isLine()?i:null}coordsForChar(e){let{tile:t,offset:i}=this.tile.resolveBlock(e,1);if(!t.isLine())return null;function r(n,s){if(n.isComposite())for(let a of n.children){if(a.length>=s){let o=r(a,s);if(o)return o}if(s-=a.length,s<0)break}else if(n.isText()&&sMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,a=-1,o=this.view.textDirection==H.LTR,l=0,c=(h,f,u)=>{for(let Q=0;Qr);Q++){let $=h.children[Q],p=f+$.length,m=$.dom.getBoundingClientRect(),{height:g}=m;if(u&&!Q&&(l+=m.top-u.top),$ instanceof It)p>i&&c($,f,m);else if(f>=i&&(l>0&&t.push(-l),t.push(g+l),l=0,s)){let P=$.dom.lastChild,y=P?hn(P):[];if(y.length){let X=y[y.length-1],x=o?X.right-m.left:m.right-X.left;x>a&&(a=x,this.minWidth=n,this.minWidthFrom=f,this.minWidthTo=p)}}u&&Q==h.children.length-1&&(l+=u.bottom-m.bottom),f=p+$.breakAfter}};return c(this.tile,0,null),t}textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return getComputedStyle(t.dom).direction=="rtl"?H.RTL:H.LTR}measureTextSize(){let e=this.tile.blockTiles(s=>{if(s.isLine()&&s.children.length&&s.length<=20){let a=0,o;for(let l of s.children){if(!l.isText()||/[^ -~]/.test(l.text))return;let c=hn(l.dom);if(c.length!=1)return;a+=c[0].width,o=c[0].height}if(a)return{lineHeight:s.dom.getBoundingClientRect().height,charWidth:a/s.length,textHeight:o}}});if(e)return e;let t=document.createElement("div"),i,r,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(t);let s=hn(t.firstChild)[0];i=t.getBoundingClientRect().height,r=s&&s.width?s.width/27:7,n=s&&s.height?s.height:i,t.remove()}),{lineHeight:i,charWidth:r,textHeight:n}}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,r=0;;r++){let n=r==t.viewports.length?null:t.viewports[r],s=n?n.from-1:this.view.state.doc.length;if(s>i){let a=(t.lineBlockAt(s).bottom-t.lineBlockAt(i).top)/this.view.scaleY;e.push(Y.replace({widget:new Gi(a),block:!0,inclusive:!0,isBlockGap:!0}).range(i,s))}if(!n)break;i=n.to+1}return Y.set(e)}updateDeco(){let e=1,t=this.view.state.facet(Fi).map(n=>(this.dynamicDecorationMap[e++]=typeof n=="function")?n(this.view):n),i=!1,r=this.view.state.facet(Od).map((n,s)=>{let a=typeof n=="function";return a&&(i=!0),a?n(this.view):n});for(r.length&&(this.dynamicDecorationMap[e++]=i,t.push(M.join(r))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof n=="function"?n(this.view):n)}scrollIntoView(e){if(e.isSnapshot){let l=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=l.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let l of this.view.state.facet(Kf))try{if(l(this.view,e.range,e))return!0}catch(c){Xe(this.view.state,c,"scroll handler")}let{range:t}=e,i=this.coordsAt(t.head,t.empty?t.assoc:t.head>t.anchor?-1:1),r;if(!i)return;!t.empty&&(r=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(i={left:Math.min(i.left,r.left),top:Math.min(i.top,r.top),right:Math.max(i.right,r.right),bottom:Math.max(i.bottom,r.bottom)});let n=Po(this.view),s={left:i.left-n.left,top:i.top-n.top,right:i.right+n.right,bottom:i.bottom+n.bottom},{offsetWidth:a,offsetHeight:o}=this.view.scrollDOM;iP(this.view.scrollDOM,s,t.headi.isWidget()||i.children.some(t);return t(this.tile.resolveBlock(e,1).tile)}destroy(){qa(this.tile)}};function qa(O,e){let t=e?.get(O);if(t!=1){t==null&&O.destroy();for(let i of O.children)qa(i,e)}}function TP(O){return O.node.nodeType==1&&O.node.firstChild&&(O.offset==0||O.node.childNodes[O.offset-1].contentEditable=="false")&&(O.offset==O.node.childNodes.length||O.node.childNodes[O.offset].contentEditable=="false")}function sd(O,e){let t=O.observer.selectionRange;if(!t.focusNode)return null;let i=Uf(t.focusNode,t.focusOffset),r=Wf(t.focusNode,t.focusOffset),n=i||r;if(r&&i&&r.node!=i.node){let a=de.get(r.node);if(!a||a.isText()&&a.text!=r.node.nodeValue)n=r;else if(O.docView.lastCompositionAfterCursor){let o=de.get(i.node);!o||o.isText()&&o.text!=i.node.nodeValue||(n=r)}}if(O.docView.lastCompositionAfterCursor=n!=i,!n)return null;let s=e-n.offset;return{from:s,to:s+n.node.nodeValue.length,node:n.node}}function bP(O,e,t){let i=sd(O,t);if(!i)return null;let{node:r,from:n,to:s}=i,a=r.nodeValue;if(/[\n\r]/.test(a)||O.state.doc.sliceString(i.from,i.to)!=a)return null;let o=e.invertedDesc;return{range:new ht(o.mapPos(n),o.mapPos(s),n,s),text:r}}function yP(O,e){return O.nodeType!=1?0:(e&&O.childNodes[e-1].contentEditable=="false"?1:0)|(e{ie.from&&(t=!0)}),t}var Gi=class extends _e{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function YP(O,e,t=1){let i=O.charCategorizer(e),r=O.doc.lineAt(e),n=e-r.from;if(r.length==0)return S.cursor(e);n==0?t=1:n==r.length&&(t=-1);let s=n,a=n;t<0?s=fe(r.text,n,!1):a=fe(r.text,n);let o=i(r.text.slice(s,a));for(;s>0;){let l=fe(r.text,s,!1);if(i(r.text.slice(l,s))!=o)break;s=l}for(;aO.defaultLineHeight*1.5){let a=O.viewState.heightOracle.textHeight,o=Math.floor((r-t.top-(O.defaultLineHeight-a)*.5)/a);n+=o*O.viewState.heightOracle.lineLength}let s=O.state.sliceDoc(t.from,t.to);return t.from+Kr(s,n,O.state.tabSize)}function Ua(O,e,t){let i=O.lineBlockAt(e);if(Array.isArray(i.type)){let r;for(let n of i.type){if(n.from>e)break;if(!(n.toe)return n;(!r||n.type==Te.Text&&(r.type!=n.type||(t<0?n.frome)))&&(r=n)}}return r||i}return i}function RP(O,e,t,i){let r=Ua(O,e.head,e.assoc||-1),n=!i||r.type!=Te.Text||!(O.lineWrapping||r.widgetLineBreaks)?null:O.coordsAtPos(e.assoc<0&&e.head>r.from?e.head-1:e.head);if(n){let s=O.dom.getBoundingClientRect(),a=O.textDirectionAt(r.from),o=O.posAtCoords({x:t==(a==H.LTR)?s.right-1:s.left+1,y:(n.top+n.bottom)/2});if(o!=null)return S.cursor(o,t?-1:1)}return S.cursor(t?r.to:r.from,t?-1:1)}function Of(O,e,t,i){let r=O.state.doc.lineAt(e.head),n=O.bidiSpans(r),s=O.textDirectionAt(r.from);for(let a=e,o=null;;){let l=uP(r,n,s,a,t),c=Af;if(!l){if(r.number==(t?O.state.doc.lines:1))return a;c=` `,r=O.state.doc.line(r.number+(t?1:-1)),n=O.bidiSpans(r),l=O.visualLineSide(r,!t)}if(o){if(!o(c))return a}else{if(!i)return l;o=i(c)}a=l}}function VP(O,e,t){let i=O.state.charCategorizer(e),r=i(t);return n=>{let s=i(n);return r==ee.Space&&(r=s),r==s}}function qP(O,e,t,i){let r=e.head,n=t?1:-1;if(r==(t?O.state.doc.length:0))return S.cursor(r,e.assoc);let s=e.goalColumn,a,o=O.contentDOM.getBoundingClientRect(),l=O.coordsAtPos(r,e.assoc||-1),c=O.documentTop;if(l)s==null&&(s=l.left-o.left),a=n<0?l.top:l.bottom;else{let u=O.viewState.lineBlockAt(r);s==null&&(s=Math.min(o.right-o.left,O.defaultCharacterWidth*(r-u.from))),a=(n<0?u.top:u.bottom)+c}let h=o.left+s,f=i??O.viewState.heightOracle.textHeight>>1;for(let u=0;;u+=10){let Q=a+(f+u)*n,$=Wa(O,{x:h,y:Q},!1,n);return S.cursor($.pos,$.assoc,void 0,s)}}function Ei(O,e,t){for(;;){let i=0;for(let r of O)r.between(e-1,e+1,(n,s,a)=>{if(e>n&&er(O)),t.from,e.head>t.from?-1:1);return i==t.from?t:S.cursor(i,iO.viewState.docHeight)return new rt(O.state.doc.length,-1);if(l=O.elementAtHeight(o),i==null)break;if(l.type==Te.Text){let f=O.docView.coordsAt(i<0?l.from:l.to,i);if(f&&(i<0?f.top<=o+n:f.bottom>=o+n))break}let h=O.viewState.heightOracle.textHeight/2;o=i>0?l.bottom+h:l.top-h}if(O.viewport.from>=l.to||O.viewport.to<=l.from){if(t)return null;if(l.type==Te.Text){let h=_P(O,r,l,s,a);return new rt(h,h==l.from?1:-1)}}if(l.type!=Te.Text)return o<(l.top+l.bottom)/2?new rt(l.from,1):new rt(l.to,-1);let c=O.docView.lineAt(l.from,2);return(!c||c.length!=l.length)&&(c=O.docView.lineAt(l.from,-2)),od(O,c,l.from,s,a)}function od(O,e,t,i,r){let n=-1,s=null,a=1e9,o=1e9,l=r,c=r,h=(f,u)=>{for(let Q=0;Qi?$.left-i:$.rightr?$.top-r:$.bottom=l&&(l=Math.min($.top,l),c=Math.max($.bottom,c),m=0),(n<0||(m-o||p-a)<0)&&(n>=0&&o&&a=l+2?o=0:(n=u,a=p,o=m,s=$))}};if(e.isText()){for(let u=0;u(s.left+s.right)/2==(rf(O,n+t)==H.LTR)?new rt(t+fe(e.text,n),-1):new rt(t+n,1)}else{if(!e.length)return new rt(t,1);for(let $=0;$(s.left+s.right)/2==(rf(O,n+t)==H.LTR)?new rt(u+f.length,-1):new rt(u,1)}}function rf(O,e){let t=O.state.doc.lineAt(e);return O.bidiSpans(t)[ct.find(O.bidiSpans(t),e-t.from,-1,1)].dir}var qi="\uFFFF",ja=class{constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparator=t.state.facet(I.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=qi}readRange(e,t){if(!e)return this;let i=e.parentNode;for(let r=e;;){this.findPointBefore(i,r);let n=this.text.length;this.readNode(r);let s=de.get(r),a=r.nextSibling;if(a==t){s?.breakAfter&&!a&&i!=this.view.contentDOM&&this.lineBreak();break}let o=de.get(a);(s&&o?s.breakAfter:(s?s.breakAfter:mn(r))||mn(a)&&(r.nodeName!="BR"||s?.isWidget())&&this.text.length>n)&&!UP(a,t)&&this.lineBreak(),r=a}return this.findPointBefore(i,t),this}readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,t.length));for(let i=0,r=this.lineSeparator?null:/\r\n?|\n/g;;){let n=-1,s=1,a;if(this.lineSeparator?(n=t.indexOf(this.lineSeparator,i),s=this.lineSeparator.length):(a=r.exec(t))&&(n=a.index,s=a[0].length),this.append(t.slice(i,n<0?t.length:n)),n<0)break;if(this.lineBreak(),s>1)for(let o of this.points)o.node==e&&o.pos>this.text.length&&(o.pos-=s-1);i=n+s}}readNode(e){let t=de.get(e),i=t&&t.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let r=i.iter();!r.next().done;)r.lineBreak?this.lineBreak():this.append(r.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==t&&(i.pos=this.text.length)}findPointInside(e,t){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(zP(e,i.node,i.offset)?t:0))}};function zP(O,e,t){for(;;){if(!e||t-1;let{impreciseHead:n,impreciseAnchor:s}=e.docView;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=ld(e.docView.tile,t,i,0))){let a=n||s?[]:jP(e),o=new ja(a,e);o.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=o.text,this.newSel=CP(a,this.bounds.from)}else{let a=e.observer.selectionRange,o=n&&n.node==a.focusNode&&n.offset==a.focusOffset||!Ta(e.contentDOM,a.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(a.focusNode,a.focusOffset),l=s&&s.node==a.anchorNode&&s.offset==a.anchorOffset||!Ta(e.contentDOM,a.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(a.anchorNode,a.anchorOffset),c=e.viewport;if((v.ios||v.chrome)&&e.state.selection.main.empty&&o!=l&&(c.from>0||c.to-1&&e.state.selection.ranges.length>1?this.newSel=e.state.selection.replaceRange(S.range(l,o)):this.newSel=S.single(l,o)}}};function ld(O,e,t,i){if(O.isComposite()){let r=-1,n=-1,s=-1,a=-1;for(let o=0,l=i,c=i;ot)return ld(h,e,t,l);if(f>=e&&r==-1&&(r=o,n=l),l>t&&h.dom.parentNode==O.dom){s=o,a=c;break}c=f,l=f+h.breakAfter}return{from:n,to:a<0?i+O.length:a,startDOM:(r?O.children[r-1].dom.nextSibling:null)||O.dom.firstChild,endDOM:s=0?O.children[s].dom:null}}else return O.isText()?{from:i,to:i+O.length,startDOM:O.dom,endDOM:O.dom.nextSibling}:null}function cd(O,e){let t,{newSel:i}=e,r=O.state.selection.main,n=O.inputState.lastKeyTime>Date.now()-100?O.inputState.lastKeyCode:-1;if(e.bounds){let{from:s,to:a}=e.bounds,o=r.from,l=null;(n===8||v.android&&e.text.length=r.from&&t.to<=r.to&&(t.from!=r.from||t.to!=r.to)&&r.to-r.from-(t.to-t.from)<=4?t={from:r.from,to:r.to,insert:O.state.doc.slice(r.from,t.from).append(t.insert).append(O.state.doc.slice(t.to,r.to))}:O.state.doc.lineAt(r.from).toDate.now()-50?t={from:r.from,to:r.to,insert:O.state.toText(O.inputState.insertingText)}:v.chrome&&t&&t.from==t.to&&t.from==r.head&&t.insert.toString()==` `&&O.lineWrapping&&(i&&(i=S.single(i.main.anchor-1,i.main.head-1)),t={from:r.from,to:r.to,insert:E.of([" "])}),t)return So(O,t,i,n);if(i&&!i.main.eq(r)){let s=!1,a="select";return O.inputState.lastSelectionTime>Date.now()-50&&(O.inputState.lastSelectionOrigin=="select"&&(s=!0),a=O.inputState.lastSelectionOrigin,a=="select.pointer"&&(i=ad(O.state.facet(Ji).map(o=>o(O)),i))),O.dispatch({selection:i,scrollIntoView:s,userEvent:a}),!0}else return!1}function So(O,e,t,i=-1){if(v.ios&&O.inputState.flushIOSKey(e))return!0;let r=O.state.selection.main;if(v.android&&(e.to==r.to&&(e.from==r.from||e.from==r.from-1&&O.state.sliceDoc(e.from,r.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&ii(O.contentDOM,"Enter",13)||(e.from==r.from-1&&e.to==r.to&&e.insert.length==0||i==8&&e.insert.lengthr.head)&&ii(O.contentDOM,"Backspace",8)||e.from==r.from&&e.to==r.to+1&&e.insert.length==0&&ii(O.contentDOM,"Delete",46)))return!0;let n=e.insert.toString();O.inputState.composing>=0&&O.inputState.composing++;let s,a=()=>s||(s=WP(O,e,t));return O.state.facet(Bf).some(o=>o(O,e.from,e.to,n,a))||O.dispatch(a()),!0}function WP(O,e,t){let i,r=O.state,n=r.selection.main,s=-1;if(e.from==e.to&&e.fromn.to){let o=e.fromh(O)),l,o);e.from==c&&(s=c)}if(s>-1)i={changes:e,selection:S.cursor(e.from+e.insert.length,-1)};else if(e.from>=n.from&&e.to<=n.to&&e.to-e.from>=(n.to-n.from)/3&&(!t||t.main.empty&&t.main.from==e.from+e.insert.length)&&O.inputState.composing<0){let o=n.frome.to?r.sliceDoc(e.to,n.to):"";i=r.replaceSelection(O.state.toText(o+e.insert.sliceString(0,void 0,O.state.lineBreak)+l))}else{let o=r.changes(e),l=t&&t.main.to<=o.newLength?t.main:void 0;if(r.selection.ranges.length>1&&(O.inputState.composing>=0||O.inputState.compositionPendingChange)&&e.to<=n.to+10&&e.to>=n.to-10){let c=O.state.sliceDoc(e.from,e.to),h,f=t&&sd(O,t.main.head);if(f){let Q=e.insert.length-(e.to-e.from);h={from:f.from,to:f.to-Q}}else h=O.state.doc.lineAt(n.head);let u=n.to-e.to;i=r.changeByRange(Q=>{if(Q.from==n.from&&Q.to==n.to)return{changes:o,range:l||Q.map(o)};let $=Q.to-u,p=$-c.length;if(O.state.sliceDoc(p,$)!=c||$>=h.from&&p<=h.to)return{range:Q};let m=r.changes({from:p,to:$,insert:e.insert}),g=Q.to-n.to;return{changes:m,range:l?S.range(Math.max(0,l.anchor+g),Math.max(0,l.head+g)):Q.map(m)}})}else i={changes:o,selection:l&&r.selection.replaceRange(l)}}let a="input.type";return(O.composing||O.inputState.compositionPendingChange&&O.inputState.compositionEndedAt>Date.now()-50)&&(O.inputState.compositionPendingChange=!1,a+=".compose",O.inputState.compositionFirstChange&&(a+=".start",O.inputState.compositionFirstChange=!1)),r.update(i,{userEvent:a,scrollIntoView:!0})}function hd(O,e,t,i){let r=Math.min(O.length,e.length),n=0;for(;n0&&a>0&&O.charCodeAt(s-1)==e.charCodeAt(a-1);)s--,a--;if(i=="end"){let o=Math.max(0,n-Math.min(s,a));t-=s+o-n}if(s=s?n-t:0;n-=o,a=n+(a-s),s=n}else if(a=a?n-t:0;n-=o,s=n+(s-a),a=n}return{from:n,toA:s,toB:a}}function jP(O){let e=[];if(O.root.activeElement!=O.contentDOM)return e;let{anchorNode:t,anchorOffset:i,focusNode:r,focusOffset:n}=O.observer.selectionRange;return t&&(e.push(new Tn(t,i)),(r!=t||n!=i)&&e.push(new Tn(r,n))),e}function CP(O,e){if(O.length==0)return null;let t=O[0].pos,i=O.length==2?O[1].pos:t;return t>-1&&i>-1?S.single(t+e,i+e):null}var Ga=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,v.safari&&e.contentDOM.addEventListener("input",()=>null),v.gecko&&eS(e.contentDOM.ownerDocument)}handleEvent(e){!IP(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,t){let i=this.handlers[e];if(i){for(let r of i.observers)r(this.view,t);for(let r of i.handlers){if(t.defaultPrevented)break;if(r(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=GP(e),i=this.handlers,r=this.view.contentDOM;for(let n in t)if(n!="scroll"){let s=!t[n].handlers.length,a=i[n];a&&s!=!a.handlers.length&&(r.removeEventListener(n,this.handleEvent),a=null),a||r.addEventListener(n,this.handleEvent,{passive:s})}for(let n in i)n!="scroll"&&!t[n]&&r.removeEventListener(n,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&dd.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),v.android&&v.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let t;return v.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&((t=fd.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||EP.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(this.pendingIOSKey=t||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let t=this.pendingIOSKey;return!t||t.key=="Enter"&&e&&e.from0?!0:v.safari&&!v.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function nf(O,e){return(t,i)=>{try{return e.call(O,i,t)}catch(r){Xe(t.state,r)}}}function GP(O){let e=Object.create(null);function t(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of O){let r=i.spec,n=r&&r.plugin.domEventHandlers,s=r&&r.plugin.domEventObservers;if(n)for(let a in n){let o=n[a];o&&t(a).handlers.push(nf(i.value,o))}if(s)for(let a in s){let o=s[a];o&&t(a).observers.push(nf(i.value,o))}}for(let i in ft)t(i).handlers.push(ft[i]);for(let i in nt)t(i).observers.push(nt[i]);return e}var fd=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],EP="dthko",dd=[16,17,18,20,91,92,224,225],tn=6;function On(O){return Math.max(0,O)*.7+8}function AP(O,e){return Math.max(Math.abs(O.clientX-e.clientX),Math.abs(O.clientY-e.clientY))}var Ea=class{constructor(e,t,i,r){this.view=e,this.startEvent=t,this.style=i,this.mustSelect=r,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=rP(e.contentDOM),this.atoms=e.state.facet(Ji).map(s=>s(e));let n=e.contentDOM.ownerDocument;n.addEventListener("mousemove",this.move=this.move.bind(this)),n.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(I.allowMultipleSelections)&&LP(e,t),this.dragging=DP(e,t)&&$d(t)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&AP(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let t=0,i=0,r=0,n=0,s=this.view.win.innerWidth,a=this.view.win.innerHeight;this.scrollParents.x&&({left:r,right:s}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:n,bottom:a}=this.scrollParents.y.getBoundingClientRect());let o=Po(this.view);e.clientX-o.left<=r+tn?t=-On(r-e.clientX):e.clientX+o.right>=s-tn&&(t=On(e.clientX-s)),e.clientY-o.top<=n+tn?i=-On(n-e.clientY):e.clientY+o.bottom>=a-tn&&(i=On(e.clientY-a)),this.setScrollSpeed(t,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:t}=this,i=ad(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!i.eq(t.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(t=>t.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function LP(O,e){let t=O.state.facet(Lf);return t.length?t[0](e):v.mac?e.metaKey:e.ctrlKey}function MP(O,e){let t=O.state.facet(Mf);return t.length?t[0](e):v.mac?!e.altKey:!e.ctrlKey}function DP(O,e){let{main:t}=O.state.selection;if(t.empty)return!1;let i=Bi(O.root);if(!i||i.rangeCount==0)return!0;let r=i.getRangeAt(0).getClientRects();for(let n=0;n=e.clientX&&s.top<=e.clientY&&s.bottom>=e.clientY)return!0}return!1}function IP(O,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target,i;t!=O.contentDOM;t=t.parentNode)if(!t||t.nodeType==11||(i=de.get(t))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(e))return!1;return!0}var ft=Object.create(null),nt=Object.create(null),ud=v.ie&&v.ie_version<15||v.ios&&v.webkit_version<604;function BP(O){let e=O.dom.parentNode;if(!e)return;let t=e.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.focus(),setTimeout(()=>{O.focus(),t.remove(),Qd(O,t.value)},50)}function Vn(O,e,t){for(let i of O.facet(e))t=i(t,O);return t}function Qd(O,e){e=Vn(O.state,po,e);let{state:t}=O,i,r=1,n=t.toText(e),s=n.lines==t.selection.ranges.length;if(Aa!=null&&t.selection.ranges.every(o=>o.empty)&&Aa==n.toString()){let o=-1;i=t.changeByRange(l=>{let c=t.doc.lineAt(l.from);if(c.from==o)return{range:l};o=c.from;let h=t.toText((s?n.line(r++).text:e)+t.lineBreak);return{changes:{from:c.from,insert:h},range:S.cursor(l.from+h.length)}})}else s?i=t.changeByRange(o=>{let l=n.line(r++);return{changes:{from:o.from,to:o.to,insert:l.text},range:S.cursor(o.from+l.length)}}):i=t.replaceSelection(n);O.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}nt.scroll=O=>{O.inputState.lastScrollTop=O.scrollDOM.scrollTop,O.inputState.lastScrollLeft=O.scrollDOM.scrollLeft};ft.keydown=(O,e)=>(O.inputState.setSelectionOrigin("select"),e.keyCode==27&&O.inputState.tabFocusMode!=0&&(O.inputState.tabFocusMode=Date.now()+2e3),!1);nt.touchstart=(O,e)=>{O.inputState.lastTouchTime=Date.now(),O.inputState.setSelectionOrigin("select.pointer")};nt.touchmove=O=>{O.inputState.setSelectionOrigin("select.pointer")};ft.mousedown=(O,e)=>{if(O.observer.flush(),O.inputState.lastTouchTime>Date.now()-2e3)return!1;let t=null;for(let i of O.state.facet(Df))if(t=i(O,e),t)break;if(!t&&e.button==0&&(t=FP(O,e)),t){let i=!O.hasFocus;O.inputState.startMouseSelection(new Ea(O,e,t,i)),i&&O.observer.ignore(()=>{qf(O.contentDOM);let n=O.root.activeElement;n&&!n.contains(O.contentDOM)&&n.blur()});let r=O.inputState.mouseSelection;if(r)return r.start(e),r.dragging===!1}else O.inputState.setSelectionOrigin("select.pointer");return!1};function sf(O,e,t,i){if(i==1)return S.cursor(e,t);if(i==2)return YP(O.state,e,t);{let r=O.docView.lineAt(e,t),n=O.state.doc.lineAt(r?r.posAtEnd:e),s=r?r.posAtStart:n.from,a=r?r.posAtEnd:n.to;return aDate.now()-400&&Math.abs(e.clientX-O.clientX)<2&&Math.abs(e.clientY-O.clientY)<2?(of+1)%3:1}function FP(O,e){let t=O.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),i=$d(e),r=O.state.selection;return{update(n){n.docChanged&&(t.pos=n.changes.mapPos(t.pos),r=r.map(n.changes))},get(n,s,a){let o=O.posAndSideAtCoords({x:n.clientX,y:n.clientY},!1),l,c=sf(O,o.pos,o.assoc,i);if(t.pos!=o.pos&&!s){let h=sf(O,t.pos,t.assoc,i),f=Math.min(h.from,c.from),u=Math.max(h.to,c.to);c=f1&&(l=HP(r,o.pos))?l:a?r.addRange(c):S.create([c])}}}function HP(O,e){for(let t=0;t=e)return S.create(O.ranges.slice(0,t).concat(O.ranges.slice(t+1)),O.mainIndex==t?0:O.mainIndex-(O.mainIndex>t?1:0))}return null}ft.dragstart=(O,e)=>{let{selection:{main:t}}=O.state;if(e.target.draggable){let r=O.docView.tile.nearest(e.target);if(r&&r.isWidget()){let n=r.posAtStart,s=n+r.length;(n>=t.to||s<=t.from)&&(t=S.range(n,s))}}let{inputState:i}=O;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=t,e.dataTransfer&&(e.dataTransfer.setData("Text",Vn(O.state,mo,O.state.sliceDoc(t.from,t.to))),e.dataTransfer.effectAllowed="copyMove"),!1};ft.dragend=O=>(O.inputState.draggedContent=null,!1);function cf(O,e,t,i){if(t=Vn(O.state,po,t),!t)return;let r=O.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:n}=O.inputState,s=i&&n&&MP(O,e)?{from:n.from,to:n.to}:null,a={from:r,insert:t},o=O.state.changes(s?[s,a]:a);O.focus(),O.dispatch({changes:o,selection:{anchor:o.mapPos(r,-1),head:o.mapPos(r,1)},userEvent:s?"move.drop":"input.drop"}),O.inputState.draggedContent=null}ft.drop=(O,e)=>{if(!e.dataTransfer)return!1;if(O.state.readOnly)return!0;let t=e.dataTransfer.files;if(t&&t.length){let i=Array(t.length),r=0,n=()=>{++r==t.length&&cf(O,e,i.filter(s=>s!=null).join(O.state.lineBreak),!1)};for(let s=0;s{/[\x00-\x08\x0e-\x1f]{2}/.test(a.result)||(i[s]=a.result),n()},a.readAsText(t[s])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return cf(O,e,i,!0),!0}return!1};ft.paste=(O,e)=>{if(O.state.readOnly)return!0;O.observer.flush();let t=ud?null:e.clipboardData;return t?(Qd(O,t.getData("text/plain")||t.getData("text/uri-list")),!0):(BP(O),!1)};function KP(O,e){let t=O.dom.parentNode;if(!t)return;let i=t.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),O.focus()},50)}function JP(O){let e=[],t=[],i=!1;for(let r of O.selection.ranges)r.empty||(e.push(O.sliceDoc(r.from,r.to)),t.push(r));if(!e.length){let r=-1;for(let{from:n}of O.selection.ranges){let s=O.doc.lineAt(n);s.number>r&&(e.push(s.text),t.push({from:s.from,to:Math.min(O.doc.length,s.to+1)})),r=s.number}i=!0}return{text:Vn(O,mo,e.join(O.lineBreak)),ranges:t,linewise:i}}var Aa=null;ft.copy=ft.cut=(O,e)=>{let{text:t,ranges:i,linewise:r}=JP(O.state);if(!t&&!r)return!1;Aa=r?t:null,e.type=="cut"&&!O.state.readOnly&&O.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let n=ud?null:e.clipboardData;return n?(n.clearData(),n.setData("text/plain",t),!0):(KP(O,t),!1)};var pd=qe.define();function md(O,e){let t=[];for(let i of O.facet(Nf)){let r=i(O,e);r&&t.push(r)}return t.length?O.update({effects:t,annotations:pd.of(!0)}):null}function gd(O){setTimeout(()=>{let e=O.hasFocus;if(e!=O.inputState.notifiedFocused){let t=md(O.state,e);t?O.dispatch(t):O.update([])}},10)}nt.focus=O=>{O.inputState.lastFocusTime=Date.now(),!O.scrollDOM.scrollTop&&(O.inputState.lastScrollTop||O.inputState.lastScrollLeft)&&(O.scrollDOM.scrollTop=O.inputState.lastScrollTop,O.scrollDOM.scrollLeft=O.inputState.lastScrollLeft),gd(O)};nt.blur=O=>{O.observer.clearSelectionRange(),gd(O)};nt.compositionstart=nt.compositionupdate=O=>{O.observer.editContext||(O.inputState.compositionFirstChange==null&&(O.inputState.compositionFirstChange=!0),O.inputState.composing<0&&(O.inputState.composing=0))};nt.compositionend=O=>{O.observer.editContext||(O.inputState.composing=-1,O.inputState.compositionEndedAt=Date.now(),O.inputState.compositionPendingKey=!0,O.inputState.compositionPendingChange=O.observer.pendingRecords().length>0,O.inputState.compositionFirstChange=null,v.chrome&&v.android?O.observer.flushSoon():O.inputState.compositionPendingChange?Promise.resolve().then(()=>O.observer.flush()):setTimeout(()=>{O.inputState.composing<0&&O.docView.hasComposition&&O.update([])},50))};nt.contextmenu=O=>{O.inputState.lastContextMenu=Date.now()};ft.beforeinput=(O,e)=>{var t,i;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(O.inputState.insertingText=e.data,O.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&O.observer.editContext){let n=(t=e.dataTransfer)===null||t===void 0?void 0:t.getData("text/plain"),s=e.getTargetRanges();if(n&&s.length){let a=s[0],o=O.posAtDOM(a.startContainer,a.startOffset),l=O.posAtDOM(a.endContainer,a.endOffset);return So(O,{from:o,to:l,insert:O.state.toText(n)},null),!0}}let r;if(v.chrome&&v.android&&(r=fd.find(n=>n.inputType==e.inputType))&&(O.observer.delayAndroidKey(r.key,r.keyCode),r.key=="Backspace"||r.key=="Delete")){let n=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var s;(((s=window.visualViewport)===null||s===void 0?void 0:s.height)||0)>n+10&&O.hasFocus&&(O.contentDOM.blur(),O.focus())},100)}return v.ios&&e.inputType=="deleteContentForward"&&O.observer.flushSoon(),v.safari&&e.inputType=="insertText"&&O.inputState.composing>=0&&setTimeout(()=>nt.compositionend(O,e),20),!1};var hf=new Set;function eS(O){hf.has(O)||(hf.add(O),O.addEventListener("copy",()=>{}),O.addEventListener("cut",()=>{}))}var ff=["pre-wrap","normal","pre-line","break-spaces"],oi=!1;function df(){oi=!1}var La=class{constructor(e){this.lineWrapping=e,this.doc=E.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((t-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return ff.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let i=0;i-1,o=Math.round(t)!=Math.round(this.lineHeight)||this.lineWrapping!=a;if(this.lineWrapping=a,this.lineHeight=t,this.charWidth=i,this.textHeight=r,this.lineLength=n,o){this.heightSamples={};for(let l=0;l0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>fn&&(oi=!0),this.height=e)}replace(e,t,i){return O.of(i)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,i,r){let n=this,s=i.doc;for(let a=r.length-1;a>=0;a--){let{fromA:o,toA:l,fromB:c,toB:h}=r[a],f=n.lineAt(o,oe.ByPosNoHeight,i.setDoc(t),0,0),u=f.to>=l?f:n.lineAt(l,oe.ByPosNoHeight,i,0,0);for(h+=u.to-l,l=u.to;a>0&&f.from<=r[a-1].toA;)o=r[a-1].fromA,c=r[a-1].fromB,a--,on*2){let a=e[t-1];a.break?e.splice(--t,1,a.left,null,a.right):e.splice(--t,1,a.left,a.right),i+=1+a.break,r-=a.size}else if(n>r*2){let a=e[i];a.break?e.splice(i,1,a.left,null,a.right):e.splice(i,1,a.left,a.right),i+=2+a.break,n-=a.size}else break;else if(r=n&&s(this.lineAt(0,oe.ByPos,i,r,n))}setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,t=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(t)}updateHeight(e,t=0,i=!1,r){return r&&r.from<=t&&r.more&&this.setMeasuredHeight(r),this.outdated=!1,this}toString(){return`block(${this.length})`}},it=class O extends yn{constructor(e,t,i){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,t){return new lt(t,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,t,i){let r=i[0];return i.length==1&&(r instanceof O||r instanceof Bt&&r.flags&4)&&Math.abs(this.length-r.length)<10?(r instanceof Bt?r=new O(r.length,this.height,this.spaceAbove):r.height=this.height,this.outdated||(r.outdated=!1),r):De.of(i)}updateHeight(e,t=0,i=!1,r){return r&&r.from<=t&&r.more?this.setMeasuredHeight(r):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},Bt=class O extends De{constructor(e){super(e,0)}heightMetrics(e,t){let i=e.doc.lineAt(t).number,r=e.doc.lineAt(t+this.length).number,n=r-i+1,s,a=0;if(e.lineWrapping){let o=Math.min(this.height,e.lineHeight*n);s=o/n,this.length>n+1&&(a=(this.height-o)/(this.length-n-1))}else s=this.height/n;return{firstLine:i,lastLine:r,perLine:s,perChar:a}}blockAt(e,t,i,r){let{firstLine:n,lastLine:s,perLine:a,perChar:o}=this.heightMetrics(t,r);if(t.lineWrapping){let l=r+(e0){let n=i[i.length-1];n instanceof O?i[i.length-1]=new O(n.length+r):i.push(null,new O(r-1))}if(e>0){let n=i[0];n instanceof O?i[0]=new O(e+n.length):i.unshift(new O(e-1),null)}return De.of(i)}decomposeLeft(e,t){t.push(new O(e-1),null)}decomposeRight(e,t){t.push(null,new O(this.length-e-1))}updateHeight(e,t=0,i=!1,r){let n=t+this.length;if(r&&r.from<=t+this.length&&r.more){let s=[],a=Math.max(t,r.from),o=-1;for(r.from>t&&s.push(new O(r.from-t-1).updateHeight(e,t));a<=n&&r.more;){let c=e.doc.lineAt(a).length;s.length&&s.push(null);let h=r.heights[r.index++],f=0;h<0&&(f=-h,h=r.heights[r.index++]),o==-1?o=h:Math.abs(h-o)>=fn&&(o=-2);let u=new it(c,h,f);u.outdated=!1,s.push(u),a+=c+1}a<=n&&s.push(null,new O(n-a).updateHeight(e,a));let l=De.of(s);return(o<0||Math.abs(l.height-this.height)>=fn||Math.abs(o-this.heightMetrics(e,t).perLine)>=fn)&&(oi=!0),bn(this,l)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Da=class extends De{constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,t,i,r){let n=i+this.left.height;return ea))return l;let c=t==oe.ByPosNoHeight?oe.ByPosNoHeight:oe.ByPos;return o?l.join(this.right.lineAt(a,c,i,s,a)):this.left.lineAt(a,c,i,r,n).join(l)}forEachLine(e,t,i,r,n,s){let a=r+this.left.height,o=n+this.left.length+this.break;if(this.break)e=o&&this.right.forEachLine(e,t,i,a,o,s);else{let l=this.lineAt(o,oe.ByPos,i,r,n);e=e&&l.from<=t&&s(l),t>l.to&&this.right.forEachLine(l.to+1,t,i,a,o,s)}}replace(e,t,i){let r=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-r,t-r,i));let n=[];e>0&&this.decomposeLeft(e,n);let s=n.length;for(let a of i)n.push(a);if(e>0&&uf(n,s-1),t=i&&t.push(null)),e>i&&this.right.decomposeLeft(e-i,t)}decomposeRight(e,t){let i=this.left.length,r=i+this.break;if(e>=r)return this.right.decomposeRight(e-r,t);e2*t.size||t.size>2*e.size?De.of(this.break?[e,null,t]:[e,t]):(this.left=bn(this.left,e),this.right=bn(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,i=!1,r){let{left:n,right:s}=this,a=t+n.length+this.break,o=null;return r&&r.from<=t+n.length&&r.more?o=n=n.updateHeight(e,t,i,r):n.updateHeight(e,t,i),r&&r.from<=a+s.length&&r.more?o=s=s.updateHeight(e,a,i,r):s.updateHeight(e,a,i),o?this.balanced(n,s):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function uf(O,e){let t,i;O[e]==null&&(t=O[e-1])instanceof Bt&&(i=O[e+1])instanceof Bt&&O.splice(e-1,3,new Bt(t.length+1+i.length))}var OS=5,Ia=class O{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let i=Math.min(t,this.lineEnd),r=this.nodes[this.nodes.length-1];r instanceof it?r.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new it(i-this.pos,-1,0)),this.writtenTo=i,t>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,i){if(e=OS)&&this.addLineDeco(r,n,s)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new it(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,t){let i=new Bt(t-e);return this.oracle.doc.lineAt(e).to==t&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof it)return e;let t=new it(0,-1,0);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,i){let r=this.ensureLine();r.length+=i,r.collapsed+=i,r.widgetHeight=Math.max(r.widgetHeight,e),r.breaks+=t,this.writtenTo=this.pos=this.pos+i}finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(t instanceof it)&&!this.isCovered?this.nodes.push(new it(0,-1,0)):(this.writtenToc.clientHeight||c.scrollWidth>c.clientWidth)&&h.overflow!="visible"){let f=c.getBoundingClientRect();n=Math.max(n,f.left),s=Math.min(s,f.right),a=Math.max(a,f.top),o=Math.min(l==O.parentNode?r.innerHeight:o,f.bottom)}l=h.position=="absolute"||h.position=="fixed"?c.offsetParent:c.parentNode}else if(l.nodeType==11)l=l.host;else break;return{left:n-t.left,right:Math.max(n,s)-t.left,top:a-(t.top+e),bottom:Math.max(a,o)-(t.top+e)}}function nS(O){let e=O.getBoundingClientRect(),t=O.ownerDocument.defaultView||window;return e.left0&&e.top0}function sS(O,e){let t=O.getBoundingClientRect();return{left:0,right:t.right-t.left,top:e,bottom:t.bottom-(t.top+e)}}var Ai=class{constructor(e,t,i,r){this.from=e,this.to=t,this.size=i,this.displaySize=r}static same(e,t){if(e.length!=t.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new La(t),this.stateDeco=e.facet(Fi).filter(i=>typeof i!="function"),this.heightMap=De.empty().applyChanges(this.stateDeco,E.empty,this.heightOracle.setDoc(e.doc),[new ht(0,0,0,e.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Y.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let i=0;i<=1;i++){let r=i?t.head:t.anchor;if(!e.some(({from:n,to:s})=>r>=n&&r<=s)){let{from:n,to:s}=this.lineBlockAt(r);e.push(new JO(n,s))}}return this.viewports=e.sort((i,r)=>i.from-r.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?Qf:new Fa(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(zi(e,this.scaler))})}update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Fi).filter(c=>typeof c!="function");let r=e.changedRanges,n=ht.extendWithRanges(r,iS(i,this.stateDeco,e?e.changes:Ze.empty(this.state.doc.length))),s=this.heightMap.height,a=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);df(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),n),(this.heightMap.height!=s||oi)&&(e.flags|=2),a?(this.scrollAnchorPos=e.changes.mapPos(a.from,-1),this.scrollAnchorHeight=a.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=s);let o=n.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.heado.to)||!this.viewportIsAppropriate(o))&&(o=this.getViewport(0,t));let l=o.from!=this.viewport.from||o.to!=this.viewport.to;this.viewport=o,e.flags|=this.updateForViewport(),(l||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&e.selectionSet&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(Hf)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let t=e.contentDOM,i=window.getComputedStyle(t),r=this.heightOracle,n=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?H.RTL:H.LTR;let s=this.heightOracle.mustRefreshForWrapping(n),a=t.getBoundingClientRect(),o=s||this.mustMeasureContent||this.contentDOMHeight!=a.height;this.contentDOMHeight=a.height,this.mustMeasureContent=!1;let l=0,c=0;if(a.width&&a.height){let{scaleX:y,scaleY:X}=Vf(t,a);(y>.005&&Math.abs(this.scaleX-y)>.005||X>.005&&Math.abs(this.scaleY-X)>.005)&&(this.scaleX=y,this.scaleY=X,l|=16,s=o=!0)}let h=(parseInt(i.paddingTop)||0)*this.scaleY,f=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=h||this.paddingBottom!=f)&&(this.paddingTop=h,this.paddingBottom=f,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(r.lineWrapping&&(o=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let u=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=u&&(this.scrollAnchorHeight=-1,this.scrollTop=u),this.scrolledToBottom=zf(e.scrollDOM);let Q=(this.printing?sS:rS)(t,this.paddingTop),$=Q.top-this.pixelViewport.top,p=Q.bottom-this.pixelViewport.bottom;this.pixelViewport=Q;let m=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(m!=this.inView&&(this.inView=m,m&&(o=!0)),!this.inView&&!this.scrollTarget&&!nS(e.dom))return 0;let g=a.width;if((this.contentDOMWidth!=g||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=a.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),o){let y=e.docView.measureVisibleLineHeights(this.viewport);if(r.mustRefreshForHeights(y)&&(s=!0),s||r.lineWrapping&&Math.abs(g-this.contentDOMWidth)>r.charWidth){let{lineHeight:X,charWidth:x,textHeight:k}=e.docView.measureTextSize();s=X>0&&r.refresh(n,X,x,k,Math.max(5,g/x),y),s&&(e.docView.minWidth=0,l|=16)}$>0&&p>0?c=Math.max($,p):$<0&&p<0&&(c=Math.min($,p)),df();for(let X of this.viewports){let x=X.from==this.viewport.from?y:e.docView.measureVisibleLineHeights(X);this.heightMap=(s?De.empty().applyChanges(this.stateDeco,E.empty,this.heightOracle,[new ht(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(r,0,s,new Ma(X.from,x))}oi&&(l|=2)}let P=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return P&&(l&2&&(l|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),l|=this.updateForViewport()),(l&2||P)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(s?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),r=this.heightMap,n=this.heightOracle,{visibleTop:s,visibleBottom:a}=this,o=new JO(r.lineAt(s-i*1e3,oe.ByHeight,n,0,0).from,r.lineAt(a+(1-i)*1e3,oe.ByHeight,n,0,0).to);if(t){let{head:l}=t.range;if(lo.to){let c=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),h=r.lineAt(l,oe.ByPos,n,0,0),f;t.y=="center"?f=(h.top+h.bottom)/2-c/2:t.y=="start"||t.y=="nearest"&&l=a+Math.max(10,Math.min(i,250)))&&r>s-2*1e3&&n>1,s=r<<1;if(this.defaultTextDirection!=H.LTR&&!i)return[];let a=[],o=(c,h,f,u)=>{if(h-cc&&mm.from>=f.from&&m.to<=f.to&&Math.abs(m.from-c)m.fromg));if(!p){if(hP.from<=h&&P.to>=h)){let P=t.moveToLineBoundary(S.cursor(h),!1,!0).head;P>c&&(h=P)}let m=this.gapSize(f,c,h,u),g=i||m<2e6?m:2e6;p=new Ai(c,h,m,g)}a.push(p)},l=c=>{if(c.length2e6)for(let x of e)x.from>=c.from&&x.fromc.from&&o(c.from,u,c,h),Qt.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let i=[];M.spans(t,this.viewport.from,this.viewport.to,{span(n,s){i.push({from:n,to:s})},point(){}},20);let r=0;if(i.length!=this.visibleRanges.length)r=12;else for(let n=0;n=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||zi(this.heightMap.lineAt(e,oe.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||zi(this.heightMap.lineAt(this.scaler.fromDOM(e),oe.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return zi(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},JO=class{constructor(e,t){this.from=e,this.to=t}};function aS(O,e,t){let i=[],r=O,n=0;return M.spans(t,O,e,{span(){},point(s,a){s>r&&(i.push({from:r,to:s}),n+=s-r),r=a}},20),r=1)return e[e.length-1].to;let i=Math.floor(O*t);for(let r=0;;r++){let{from:n,to:s}=e[r],a=s-n;if(i<=a)return n+i;i-=a}}function nn(O,e){let t=0;for(let{from:i,to:r}of O.ranges){if(e<=r){t+=e-i;break}t+=r-i}return t/O.total}function oS(O,e){for(let t of O)if(e(t))return t}var Qf={toDOM(O){return O},fromDOM(O){return O},scale:1,eq(O){return O==this}},Fa=class O{constructor(e,t,i){let r=0,n=0,s=0;this.viewports=i.map(({from:a,to:o})=>{let l=t.lineAt(a,oe.ByPos,e,0,0).top,c=t.lineAt(o,oe.ByPos,e,0,0).bottom;return r+=c-l,{from:a,to:o,top:l,bottom:c,domTop:0,domBottom:0}}),this.scale=(7e6-r)/(t.height-r);for(let a of this.viewports)a.domTop=s+(a.top-n)*this.scale,s=a.domBottom=a.domTop+(a.bottom-a.top),n=a.bottom}toDOM(e){for(let t=0,i=0,r=0;;t++){let n=tt.from==e.viewports[i].from&&t.to==e.viewports[i].to):!1}};function zi(O,e){if(e.scale==1)return O;let t=e.toDOM(O.top),i=e.toDOM(O.bottom);return new lt(O.from,O.length,t,i-t,Array.isArray(O._content)?O._content.map(r=>zi(r,e)):O._content)}var sn=Z.define({combine:O=>O.join(" ")}),Ha=Z.define({combine:O=>O.indexOf(!0)>-1}),Ka=Ot.newName(),Pd=Ot.newName(),Sd=Ot.newName(),Xd={"&light":"."+Pd,"&dark":"."+Sd};function Ja(O,e,t){return new Ot(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,r=>{if(r=="&")return O;if(!t||!t[r])throw new RangeError(`Unsupported selector: ${r}`);return t[r]}):O+" "+i}})}var lS=Ja("."+Ka,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Xd),cS={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Qa=v.ie&&v.ie_version<=11,eo=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new ba,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let i of t)this.queue.push(i);(v.ie&&v.ie_version<=11||v.ios&&e.composing)&&t.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&v.android&&e.constructor.EDIT_CONTEXT!==!1&&!(v.chrome&&v.chrome_version<126)&&(this.editContext=new to(e),e.state.facet(_t)&&(e.contentDOM.editContext=this.editContext.editContext)),Qa&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var t;((t=this.view.docView)===null||t===void 0?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,i)=>t!=e[i]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,r=this.selectionRange;if(i.state.facet(_t)?i.root.activeElement!=this.dom:!cn(this.dom,r))return;let n=r.anchorNode&&i.docView.tile.nearest(r.anchorNode);if(n&&n.isWidget()&&n.widget.ignoreEvent(e)){t||(this.selectionChanged=!1);return}(v.ie&&v.ie_version<=11||v.android&&v.chrome)&&!i.state.selection.main.empty&&r.focusNode&&Wi(r.focusNode,r.focusOffset,r.anchorNode,r.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=Bi(e.root);if(!t)return!1;let i=v.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&hS(this.view,t)||t;if(!i||this.selectionRange.eq(i))return!1;let r=cn(this.dom,i);return r&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let n=this.delayedAndroidKey;n&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=n.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&n.force&&ii(this.dom,n.key,n.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(r)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,i=-1,r=!1;for(let n of e){let s=this.readMutation(n);s&&(s.typeOver&&(r=!0),t==-1?{from:t,to:i}=s:(t=Math.min(s.from,t),i=Math.max(s.to,i)))}return{from:t,to:i,typeOver:r}}readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),r=this.selectionChanged&&cn(this.dom,this.selectionRange);if(e<0&&!r)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let n=new Ca(this.view,e,t,i);return this.view.docView.domChanged={newSel:n.newSel?n.newSel.main:null},n}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.readChange();if(!t)return this.view.requestMeasure(),!1;let i=this.view.state,r=cd(this.view,t);return this.view.state==i&&(t.domChanged||t.newSel&&!t.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),r}readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t.isWidget())return null;if(t.markDirty(e.type=="attributes"),e.type=="childList"){let i=$f(t,e.previousSibling||e.target.previousSibling,-1),r=$f(t,e.nextSibling||e.target.nextSibling,1);return{from:i?t.posAfter(i):t.posAtStart,to:r?t.posBefore(r):t.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(_t)!=e.state.facet(_t)&&(e.view.contentDOM.editContext=e.state.facet(_t)?this.editContext.editContext:null))}destroy(){var e,t,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(t=this.gapIntersection)===null||t===void 0||t.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let r of this.scrollTargets)r.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function $f(O,e,t){for(;e;){let i=de.get(e);if(i&&i.parent==O)return i;let r=e.parentNode;e=r!=O.dom?r:t>0?e.nextSibling:e.previousSibling}return null}function pf(O,e){let t=e.startContainer,i=e.startOffset,r=e.endContainer,n=e.endOffset,s=O.docView.domAtPos(O.state.selection.main.anchor,1);return Wi(s.node,s.offset,r,n)&&([t,i,r,n]=[r,n,t,i]),{anchorNode:t,anchorOffset:i,focusNode:r,focusOffset:n}}function hS(O,e){if(e.getComposedRanges){let r=e.getComposedRanges(O.root)[0];if(r)return pf(O,r)}let t=null;function i(r){r.preventDefault(),r.stopImmediatePropagation(),t=r.getTargetRanges()[0]}return O.contentDOM.addEventListener("beforeinput",i,!0),O.dom.ownerDocument.execCommand("indent"),O.contentDOM.removeEventListener("beforeinput",i,!0),t?pf(O,t):null}var to=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let r=e.state.selection.main,{anchor:n,head:s}=r,a=this.toEditorPos(i.updateRangeStart),o=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:a,drifted:!1});let l=o-a>i.text.length;a==this.from&&nthis.to&&(o=n);let c=hd(e.state.sliceDoc(a,o),i.text,(l?r.from:r.to)-a,l?"end":null);if(!c){let f=S.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(r)||e.dispatch({selection:f,userEvent:"select"});return}let h={from:c.from+a,to:c.toA+a,insert:E.of(i.text.slice(c.from,c.toB).split(` `))};if((v.mac||v.android)&&h.from==s-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:a,to:o,insert:E.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!e.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);So(e,h,S.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),h.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(t.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(t.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let r=[],n=null;for(let s=this.toEditorPos(i.rangeStart),a=this.toEditorPos(i.rangeEnd);s{let r=[];for(let n of i.getTextFormats()){let s=n.underlineStyle,a=n.underlineThickness;if(!/none/i.test(s)&&!/none/i.test(a)){let o=this.toEditorPos(n.rangeStart),l=this.toEditorPos(n.rangeEnd);if(o{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)t.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let r=Bi(i.root);r&&r.rangeCount&&this.editContext.updateSelectionBounds(r.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,i=!1,r=this.pendingContextChange;return e.changes.iterChanges((n,s,a,o,l)=>{if(i)return;let c=l.length-(s-n);if(r&&s>=r.to)if(r.from==n&&r.to==s&&r.insert.eq(l)){r=this.pendingContextChange=null,t+=c,this.to+=c;return}else r=null,this.revertPending(e.state);if(n+=t,s+=t,s<=this.from)this.from+=c,this.to+=c;else if(nthis.to||this.to-this.from+l.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(n),this.toContextPos(s),l.toString()),this.to+=c}t+=c}),r&&!i&&this.revertPending(e.state),!i}update(e){let t=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(r=>!r.isUserEvent("input.type")&&r.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),r=this.toContextPos(t.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=r)&&this.editContext.updateSelection(i,r)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to1e4*3)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},T=class O{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:i}=e;this.dispatchTransactions=e.dispatchTransactions||i&&(r=>r.forEach(n=>i(n,this)))||(r=>this.update(r)),this.dispatch=this.dispatch.bind(this),this._root=e.root||nP(e.parent)||document,this.viewState=new xn(e.state||I.create(e)),e.scrollTo&&e.scrollTo.is(en)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(KO).map(r=>new Ci(r));for(let r of this.plugins)r.update(this);this.observer=new eo(this),this.inputState=new Ga(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Xn(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...e){let t=e.length==1&&e[0]instanceof Qe?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,i=!1,r,n=this.state;for(let f of e){if(f.startState!=n)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");n=f.state}if(this.destroyed){this.viewState.state=n;return}let s=this.hasFocus,a=0,o=null;e.some(f=>f.annotation(pd))?(this.inputState.notifiedFocused=s,a=1):s!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=s,o=md(n,s),o||(a=1));let l=this.observer.delayedAndroidKey,c=null;if(l?(this.observer.clearDelayedAndroidKey(),c=this.observer.readChange(),(c&&!this.state.doc.eq(n.doc)||!this.state.selection.eq(n.selection))&&(c=null)):this.observer.clear(),n.facet(I.phrases)!=this.state.facet(I.phrases))return this.setState(n);r=Pn.create(this,n,e),r.flags|=a;let h=this.viewState.scrollTarget;try{this.updateState=2;for(let f of e){if(h&&(h=h.map(f.changes)),f.scrollIntoView){let{main:u}=f.state.selection;h=new ji(u.empty?u:S.cursor(u.head,u.head>u.anchor?-1:1))}for(let u of f.effects)u.is(en)&&(h=u.value.clip(this.state))}this.viewState.update(r,h),this.bidiCache=kn.update(this.bidiCache,r.changes),r.empty||(this.updatePlugins(r),this.inputState.update(r)),t=this.docView.update(r),this.state.facet(Vi)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(t,e.some(f=>f.isUserEvent("select.pointer")))}finally{this.updateState=0}if(r.startState.facet(sn)!=r.state.facet(sn)&&(this.viewState.mustMeasureContent=!0),(t||i||h||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!r.empty)for(let f of this.state.facet(wa))try{f(r)}catch(u){Xe(this.state,u,"update listener")}(o||c)&&Promise.resolve().then(()=>{o&&this.state==o.startState&&this.dispatch(o),c&&!cd(this,c)&&l.force&&ii(this.contentDOM,l.key,l.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let t=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new xn(e),this.plugins=e.facet(KO).map(i=>new Ci(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Xn(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(KO),i=e.state.facet(KO);if(t!=i){let r=[];for(let n of i){let s=t.indexOf(n);if(s<0)r.push(new Ci(n));else{let a=this.plugins[s];a.mustUpdate=e,r.push(a)}}for(let n of this.plugins)n.mustUpdate!=e&&n.destroy(this);this.plugins=r,this.pluginMap.clear()}else for(let r of this.plugins)r.mustUpdate=e;for(let r=0;r-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,i=this.scrollDOM,r=i.scrollTop*this.scaleY,{scrollAnchorPos:n,scrollAnchorHeight:s}=this.viewState;Math.abs(r-this.viewState.scrollTop)>1&&(s=-1),this.viewState.scrollAnchorHeight=-1;try{for(let a=0;;a++){if(s<0)if(zf(i))n=-1,s=this.viewState.heightMap.height;else{let u=this.viewState.scrollAnchorAt(r);n=u.from,s=u.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(a>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];o&4||([this.measureRequests,l]=[l,this.measureRequests]);let c=l.map(u=>{try{return u.read(this)}catch(Q){return Xe(this.state,Q),mf}}),h=Pn.create(this,this.state,[]),f=!1;h.flags|=o,t?t.flags|=o:t=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),f=this.docView.update(h),f&&this.docViewUpdate());for(let u=0;u1||Q<-1){r=r+Q,i.scrollTop=r/this.scaleY,s=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let a of this.state.facet(wa))a(t)}get themeClasses(){return Ka+" "+(this.state.facet(Ha)?Sd:Pd)+" "+this.state.facet(sn)}updateAttrs(){let e=gf(this,ed,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(_t)?"true":"false",class:"cm-content",style:`${v.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),gf(this,go,t);let i=this.observer.ignore(()=>{let r=Fh(this.contentDOM,this.contentAttrs,t),n=Fh(this.dom,this.editorAttrs,e);return r||n});return this.editorAttrs=e,this.contentAttrs=t,i}showAnnouncements(e){let t=!0;for(let i of e)for(let r of i.effects)if(r.is(O.announce)){t&&(this.announceDOM.textContent=""),t=!1;let n=this.announceDOM.appendChild(document.createElement("div"));n.textContent=r.value}}mountStyles(){this.styleModules=this.state.facet(Vi);let e=this.state.facet(O.cspNonce);Ot.mount(this.root,this.styleModules.concat(lS).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let t=0;ti.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,i){return ua(this,e,Of(this,e,t,i))}moveByGroup(e,t){return ua(this,e,Of(this,e,t,i=>VP(this,e.head,i)))}visualLineSide(e,t){let i=this.bidiSpans(e),r=this.textDirectionAt(e.from),n=i[t?i.length-1:0];return S.cursor(n.side(t,r)+e.from,n.forward(!t,r)?1:-1)}moveToLineBoundary(e,t,i=!0){return RP(this,e,t,i)}moveVertically(e,t,i){return ua(this,e,qP(this,e,t,i))}domAtPos(e,t=1){return this.docView.domAtPos(e,t)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){this.readMeasured();let i=Wa(this,e,t);return i&&i.pos}posAndSideAtCoords(e,t=!0){return this.readMeasured(),Wa(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let i=this.docView.coordsAt(e,t);if(!i||i.left==i.right)return i;let r=this.state.doc.lineAt(e),n=this.bidiSpans(r),s=n[ct.find(n,e-r.from,-1,t)];return gn(i,s.dir==H.LTR==t>0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Ff)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>fS)return Ef(e.length);let t=this.textDirectionAt(e.from),i;for(let n of this.bidiCache)if(n.from==e.from&&n.dir==t&&(n.fresh||Gf(n.isolates,i=Jh(this,e))))return n.order;i||(i=Jh(this,e));let r=dP(e.text,t,i);return this.bidiCache.push(new kn(e.from,e.to,t,i,!0,r)),r}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||v.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{qf(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){return en.of(new ji(typeof e=="number"?S.cursor(e):e,t.y,t.x,t.yMargin,t.xMargin))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,i=this.viewState.scrollAnchorAt(e);return en.of(new ji(S.cursor(i.from),"start","start",i.top-e,t,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return he.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return he.define(()=>({}),{eventObservers:e})}static theme(e,t){let i=Ot.newName(),r=[sn.of(i),Vi.of(Ja(`.${i}`,e))];return t&&t.dark&&r.push(Ha.of(!0)),r}static baseTheme(e){return ze.lowest(Vi.of(Ja("."+Ka,e,Xd)))}static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),r=i&&de.get(i)||de.get(e);return((t=r?.root)===null||t===void 0?void 0:t.view)||null}};T.styleModule=Vi;T.inputHandler=Bf;T.clipboardInputFilter=po;T.clipboardOutputFilter=mo;T.scrollHandler=Kf;T.focusChangeEffect=Nf;T.perLineTextDirection=Ff;T.exceptionSink=If;T.updateListener=wa;T.editable=_t;T.mouseSelectionStyle=Df;T.dragMovesSelection=Mf;T.clickAddsSelectionRange=Lf;T.decorations=Fi;T.blockWrappers=td;T.outerDecorations=Od;T.atomicRanges=Ji;T.bidiIsolatedRanges=id;T.scrollMargins=rd;T.darkTheme=Ha;T.cspNonce=Z.define({combine:O=>O.length?O[0]:""});T.contentAttributes=go;T.editorAttributes=ed;T.lineWrapping=T.contentAttributes.of({class:"cm-lineWrapping"});T.announce=V.define();var fS=4096,mf={},kn=class O{constructor(e,t,i,r,n,s){this.from=e,this.to=t,this.dir=i,this.isolates=r,this.fresh=n,this.order=s}static update(e,t){if(t.empty&&!e.some(n=>n.fresh))return e;let i=[],r=e.length?e[e.length-1].dir:H.LTR;for(let n=Math.max(0,e.length-10);n=0;r--){let n=i[r],s=typeof n=="function"?n(O):n;s&&uo(s,t)}return t}var dS=v.mac?"mac":v.windows?"win":v.linux?"linux":"key";function uS(O,e){let t=O.split(/-(?!$)/),i=t[t.length-1];i=="Space"&&(i=" ");let r,n,s,a;for(let o=0;oi.concat(r),[]))),t}function bd(O,e,t){return yd(Td(O.state),e,O,t)}var Dt=null,$S=4e3;function pS(O,e=dS){let t=Object.create(null),i=Object.create(null),r=(s,a)=>{let o=i[s];if(o==null)i[s]=a;else if(o!=a)throw new Error("Key binding "+s+" is used both as a regular binding and as a multi-stroke prefix")},n=(s,a,o,l,c)=>{var h,f;let u=t[s]||(t[s]=Object.create(null)),Q=a.split(/ (?!$)/).map(m=>uS(m,e));for(let m=1;m{let y=Dt={view:P,prefix:g,scope:s};return setTimeout(()=>{Dt==y&&(Dt=null)},$S),!0}]})}let $=Q.join(" ");r($,!1);let p=u[$]||(u[$]={preventDefault:!1,stopPropagation:!1,run:((f=(h=u._any)===null||h===void 0?void 0:h.run)===null||f===void 0?void 0:f.slice())||[]});o&&p.run.push(o),l&&(p.preventDefault=!0),c&&(p.stopPropagation=!0)};for(let s of O){let a=s.scope?s.scope.split(" "):["editor"];if(s.any)for(let l of a){let c=t[l]||(t[l]=Object.create(null));c._any||(c._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:h}=s;for(let f in c)c[f].run.push(u=>h(u,Oo))}let o=s[e]||s.key;if(o)for(let l of a)n(l,o,s.run,s.preventDefault,s.stopPropagation),s.shift&&n(l,"Shift-"+o,s.shift,s.preventDefault,s.stopPropagation)}return t}var Oo=null;function yd(O,e,t,i){Oo=e;let r=Mh(e),n=Se(r,0),s=Me(n)==r.length&&r!=" ",a="",o=!1,l=!1,c=!1;Dt&&Dt.view==t&&Dt.scope==i&&(a=Dt.prefix+" ",dd.indexOf(e.keyCode)<0&&(l=!0,Dt=null));let h=new Set,f=p=>{if(p){for(let m of p.run)if(!h.has(m)&&(h.add(m),m(t)))return p.stopPropagation&&(c=!0),!0;p.preventDefault&&(p.stopPropagation&&(c=!0),l=!0)}return!1},u=O[i],Q,$;return u&&(f(u[a+an(r,e,!s)])?o=!0:s&&(e.altKey||e.metaKey||e.ctrlKey)&&!(v.windows&&e.ctrlKey&&e.altKey)&&!(v.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(Q=Yt[e.keyCode])&&Q!=r?(f(u[a+an(Q,e,!0)])||e.shiftKey&&($=HO[e.keyCode])!=r&&$!=Q&&f(u[a+an($,e,!1)]))&&(o=!0):s&&e.shiftKey&&f(u[a+an(r,e,!0)])&&(o=!0),!o&&f(u._any)&&(o=!0)),l&&(o=!0),o&&c&&e.stopPropagation(),Oo=null,o}var Hi=class O{constructor(e,t,i,r,n){this.className=e,this.left=t,this.top=i,this.width=r,this.height=n}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,i){if(i.empty){let r=e.coordsAtPos(i.head,i.assoc||1);if(!r)return[];let n=xd(e);return[new O(t,r.left-n.left,r.top-n.top,null,r.bottom-r.top)]}else return mS(e,t,i)}};function xd(O){let e=O.scrollDOM.getBoundingClientRect();return{left:(O.textDirection==H.LTR?e.left:e.right-O.scrollDOM.clientWidth*O.scaleX)-O.scrollDOM.scrollLeft*O.scaleX,top:e.top-O.scrollDOM.scrollTop*O.scaleY}}function Sf(O,e,t,i){let r=O.coordsAtPos(e,t*2);if(!r)return i;let n=O.dom.getBoundingClientRect(),s=(r.top+r.bottom)/2,a=O.posAtCoords({x:n.left+1,y:s}),o=O.posAtCoords({x:n.right-1,y:s});return a==null||o==null?i:{from:Math.max(i.from,Math.min(a,o)),to:Math.min(i.to,Math.max(a,o))}}function mS(O,e,t){if(t.to<=O.viewport.from||t.from>=O.viewport.to)return[];let i=Math.max(t.from,O.viewport.from),r=Math.min(t.to,O.viewport.to),n=O.textDirection==H.LTR,s=O.contentDOM,a=s.getBoundingClientRect(),o=xd(O),l=s.querySelector(".cm-line"),c=l&&window.getComputedStyle(l),h=a.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),f=a.right-(c?parseInt(c.paddingRight):0),u=Ua(O,i,1),Q=Ua(O,r,-1),$=u.type==Te.Text?u:null,p=Q.type==Te.Text?Q:null;if($&&(O.lineWrapping||u.widgetLineBreaks)&&($=Sf(O,i,1,$)),p&&(O.lineWrapping||Q.widgetLineBreaks)&&(p=Sf(O,r,-1,p)),$&&p&&$.from==p.from&&$.to==p.to)return g(P(t.from,t.to,$));{let X=$?P(t.from,null,$):y(u,!1),x=p?P(null,t.to,p):y(Q,!0),k=[];return($||u).to<(p||Q).from-($&&p?1:0)||u.widgetLineBreaks>1&&X.bottom+O.defaultLineHeight/2q&&B.from=we)break;Je>ae&&G(Math.max(Pe,ae),X==null&&Pe<=q,Math.min(Je,we),x==null&&Je>=K,mt.dir)}if(ae=Ee.to+1,ae>=we)break}return ie.length==0&&G(q,X==null,K,x==null,O.textDirection),{top:j,bottom:A,horizontal:ie}}function y(X,x){let k=a.top+(x?X.top:X.bottom);return{top:k,bottom:k,horizontal:[]}}}function gS(O,e){return O.constructor==e.constructor&&O.eq(e)}var io=class{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(dn)!=e.state.facet(dn)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let t=0,i=e.facet(dn);for(;t!gS(t,this.drawn[i]))){let t=this.dom.firstChild,i=0;for(let r of e)r.update&&t&&r.constructor&&this.drawn[i].constructor&&r.update(t,this.drawn[i])?(t=t.nextSibling,i++):this.dom.insertBefore(r.draw(),t);for(;t;){let r=t.nextSibling;t.remove(),t=r}this.drawn=e,v.safari&&v.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},dn=Z.define();function kd(O){return[he.define(e=>new io(e,O)),dn.of(O)]}var Ki=Z.define({combine(O){return xe(O,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(e,t)=>Math.min(e,t),drawRangeCursor:(e,t)=>e||t})}});function wd(O={}){return[Ki.of(O),PS,SS,XS,Hf.of(!0)]}function Zd(O){return O.startState.facet(Ki)!=O.state.facet(Ki)}var PS=kd({above:!0,markers(O){let{state:e}=O,t=e.facet(Ki),i=[];for(let r of e.selection.ranges){let n=r==e.selection.main;if(r.empty||t.drawRangeCursor){let s=n?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",a=r.empty?r:S.cursor(r.head,r.head>r.anchor?-1:1);for(let o of Hi.forRange(O,s,a))i.push(o)}}return i},update(O,e){O.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let t=Zd(O);return t&&Xf(O.state,e),O.docChanged||O.selectionSet||t},mount(O,e){Xf(e.state,O)},class:"cm-cursorLayer"});function Xf(O,e){e.style.animationDuration=O.facet(Ki).cursorBlinkRate+"ms"}var SS=kd({above:!1,markers(O){return O.state.selection.ranges.map(e=>e.empty?[]:Hi.forRange(O,"cm-selectionBackground",e)).reduce((e,t)=>e.concat(t))},update(O,e){return O.docChanged||O.selectionSet||O.viewportChanged||Zd(O)},class:"cm-selectionLayer"}),XS=ze.highest(T.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),vd=V.define({map(O,e){return O==null?null:e.mapPos(O)}}),Ui=ce.define({create(){return null},update(O,e){return O!=null&&(O=e.changes.mapPos(O)),e.effects.reduce((t,i)=>i.is(vd)?i.value:t,O)}}),TS=he.fromClass(class{constructor(O){this.view=O,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(O){var e;let t=O.state.field(Ui);t==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(O.startState.field(Ui)!=t||O.docChanged||O.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:O}=this,e=O.state.field(Ui),t=e!=null&&O.coordsAtPos(e);if(!t)return null;let i=O.scrollDOM.getBoundingClientRect();return{left:t.left-i.left+O.scrollDOM.scrollLeft*O.scaleX,top:t.top-i.top+O.scrollDOM.scrollTop*O.scaleY,height:t.bottom-t.top}}drawCursor(O){if(this.cursor){let{scaleX:e,scaleY:t}=this.view;O?(this.cursor.style.left=O.left/e+"px",this.cursor.style.top=O.top/t+"px",this.cursor.style.height=O.height/t+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(O){this.view.state.field(Ui)!=O&&this.view.dispatch({effects:vd.of(O)})}},{eventObservers:{dragover(O){this.setDropPos(this.view.posAtCoords({x:O.clientX,y:O.clientY}))},dragleave(O){(O.target==this.view.contentDOM||!this.view.contentDOM.contains(O.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Yd(){return[Ui,TS]}function Tf(O,e,t,i,r){e.lastIndex=0;for(let n=O.iterRange(t,i),s=t,a;!n.next().done;s+=n.value.length)if(!n.lineBreak)for(;a=e.exec(n.value);)r(s+a.index,a)}function bS(O,e){let t=O.visibleRanges;if(t.length==1&&t[0].from==O.viewport.from&&t[0].to==O.viewport.to)return t;let i=[];for(let{from:r,to:n}of t)r=Math.max(O.state.doc.lineAt(r).from,r-e),n=Math.min(O.state.doc.lineAt(n).to,n+e),i.length&&i[i.length-1].to>=r?i[i.length-1].to=n:i.push({from:r,to:n});return i}var ro=class{constructor(e){let{regexp:t,decoration:i,decorate:r,boundary:n,maxLength:s=1e3}=e;if(!t.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=t,r)this.addMatch=(a,o,l,c)=>r(c,l,l+a[0].length,a,o);else if(typeof i=="function")this.addMatch=(a,o,l,c)=>{let h=i(a,o,l);h&&c(l,l+a[0].length,h)};else if(i)this.addMatch=(a,o,l,c)=>c(l,l+a[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=n,this.maxLength=s}createDeco(e){let t=new Le,i=t.add.bind(t);for(let{from:r,to:n}of bS(e,this.maxLength))Tf(e.state.doc,this.regexp,r,n,(s,a)=>this.addMatch(a,e,s,i));return t.finish()}updateDeco(e,t){let i=1e9,r=-1;return e.docChanged&&e.changes.iterChanges((n,s,a,o)=>{o>=e.view.viewport.from&&a<=e.view.viewport.to&&(i=Math.min(a,i),r=Math.max(o,r))}),e.viewportMoved||r-i>1e3?this.createDeco(e.view):r>-1?this.updateRange(e.view,t.map(e.changes),i,r):t}updateRange(e,t,i,r){for(let n of e.visibleRanges){let s=Math.max(n.from,i),a=Math.min(n.to,r);if(a>=s){let o=e.state.doc.lineAt(s),l=o.too.from;s--)if(this.boundary.test(o.text[s-1-o.from])){c=s;break}for(;af.push(m.range($,p));if(o==l)for(this.regexp.lastIndex=c-o.from;(u=this.regexp.exec(o.text))&&u.indexthis.addMatch(p,e,$,Q));t=t.update({filterFrom:c,filterTo:h,filter:($,p)=>$h,add:f})}}return t}},no=/x/.unicode!=null?"gu":"g",yS=new RegExp(`[\0-\b -\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,no),xS={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},$a=null;function kS(){var O;if($a==null&&typeof document<"u"&&document.body){let e=document.body.style;$a=((O=e.tabSize)!==null&&O!==void 0?O:e.MozTabSize)!=null}return $a||!1}var un=Z.define({combine(O){let e=xe(O,{render:null,specialChars:yS,addSpecialChars:null});return(e.replaceTabs=!kS())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,no)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,no)),e}});function _d(O={}){return[un.of(O),wS()]}var bf=null;function wS(){return bf||(bf=he.fromClass(class{constructor(O){this.view=O,this.decorations=Y.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(O.state.facet(un)),this.decorations=this.decorator.createDeco(O)}makeDecorator(O){return new ro({regexp:O.specialChars,decoration:(e,t,i)=>{let{doc:r}=t.state,n=Se(e[0],0);if(n==9){let s=r.lineAt(i),a=t.state.tabSize,o=ve(s.text,a,i-s.from);return Y.replace({widget:new ao((a-o%a)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[n]||(this.decorationCache[n]=Y.replace({widget:new so(O,n)}))},boundary:O.replaceTabs?void 0:/[^]/})}update(O){let e=O.state.facet(un);O.startState.facet(un)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(O.view)):this.decorations=this.decorator.updateDeco(O,this.decorations)}},{decorations:O=>O.decorations}))}var ZS="\u2022";function vS(O){return O>=32?ZS:O==10?"\u2424":String.fromCharCode(9216+O)}var so=class extends _e{constructor(e,t){super(),this.options=e,this.code=t}eq(e){return e.code==this.code}toDOM(e){let t=vS(this.code),i=e.state.phrase("Control character")+" "+(xS[this.code]||"0x"+this.code.toString(16)),r=this.options.render&&this.options.render(this.code,i,t);if(r)return r;let n=document.createElement("span");return n.textContent=t,n.title=i,n.setAttribute("aria-label",i),n.className="cm-specialChar",n}ignoreEvent(){return!1}},ao=class extends _e{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function Rd(){return _S}var YS=Y.line({class:"cm-activeLine"}),_S=he.fromClass(class{constructor(O){this.decorations=this.getDeco(O)}update(O){(O.docChanged||O.selectionSet)&&(this.decorations=this.getDeco(O.view))}getDeco(O){let e=-1,t=[];for(let i of O.state.selection.ranges){let r=O.lineBlockAt(i.head);r.from>e&&(t.push(YS.range(r.from)),e=r.from)}return Y.set(t)}},{decorations:O=>O.decorations});var oo=2e3;function RS(O,e,t){let i=Math.min(e.line,t.line),r=Math.max(e.line,t.line),n=[];if(e.off>oo||t.off>oo||e.col<0||t.col<0){let s=Math.min(e.off,t.off),a=Math.max(e.off,t.off);for(let o=i;o<=r;o++){let l=O.doc.line(o);l.length<=a&&n.push(S.range(l.from+s,l.to+a))}}else{let s=Math.min(e.col,t.col),a=Math.max(e.col,t.col);for(let o=i;o<=r;o++){let l=O.doc.line(o),c=Kr(l.text,s,O.tabSize,!0);if(c<0)n.push(S.cursor(l.to));else{let h=Kr(l.text,a,O.tabSize);n.push(S.range(l.from+c,l.from+h))}}}return n}function VS(O,e){let t=O.coordsAtPos(O.viewport.from);return t?Math.round(Math.abs((t.left-e)/O.defaultCharacterWidth)):-1}function yf(O,e){let t=O.posAtCoords({x:e.clientX,y:e.clientY},!1),i=O.state.doc.lineAt(t),r=t-i.from,n=r>oo?-1:r==i.length?VS(O,e.clientX):ve(i.text,O.state.tabSize,t-i.from);return{line:i.number,col:n,off:r}}function qS(O,e){let t=yf(O,e),i=O.state.selection;return t?{update(r){if(r.docChanged){let n=r.changes.mapPos(r.startState.doc.line(t.line).from),s=r.state.doc.lineAt(n);t={line:s.number,col:t.col,off:Math.min(t.off,s.length)},i=i.map(r.changes)}},get(r,n,s){let a=yf(O,r);if(!a)return i;let o=RS(O.state,t,a);return o.length?s?S.create(o.concat(i.ranges)):S.create(o):i}}:null}function Vd(O){let e=O?.eventFilter||(t=>t.altKey&&t.button==0);return T.mouseSelectionStyle.of((t,i)=>e(i)?qS(t,i):null)}var zS={Alt:[18,O=>!!O.altKey],Control:[17,O=>!!O.ctrlKey],Shift:[16,O=>!!O.shiftKey],Meta:[91,O=>!!O.metaKey]},US={style:"cursor: crosshair"};function qd(O={}){let[e,t]=zS[O.key||"Alt"],i=he.fromClass(class{constructor(r){this.view=r,this.isDown=!1}set(r){this.isDown!=r&&(this.isDown=r,this.view.update([]))}},{eventObservers:{keydown(r){this.set(r.keyCode==e||t(r))},keyup(r){(r.keyCode==e||!t(r))&&this.set(!1)},mousemove(r){this.set(t(r))}}});return[i,T.contentAttributes.of(r=>{var n;return!((n=r.plugin(i))===null||n===void 0)&&n.isDown?US:null})]}var on="-10000px",wn=class{constructor(e,t,i,r){this.facet=t,this.createTooltipView=i,this.removeTooltipView=r,this.input=e.state.facet(t),this.tooltips=this.input.filter(s=>s);let n=null;this.tooltipViews=this.tooltips.map(s=>n=i(s,n))}update(e,t){var i;let r=e.state.facet(this.facet),n=r.filter(o=>o);if(r===this.input){for(let o of this.tooltipViews)o.update&&o.update(e);return!1}let s=[],a=t?[]:null;for(let o=0;ot[l]=o),t.length=a.length),this.input=r,this.tooltips=n,this.tooltipViews=s,!0}};function WS(O){let e=O.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var pa=Z.define({combine:O=>{var e,t,i;return{position:v.ios?"absolute":((e=O.find(r=>r.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((t=O.find(r=>r.parent))===null||t===void 0?void 0:t.parent)||null,tooltipSpace:((i=O.find(r=>r.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||WS}}}),xf=new WeakMap,Xo=he.fromClass(class{constructor(O){this.view=O,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=O.state.facet(pa);this.position=e.position,this.parent=e.parent,this.classes=O.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new wn(O,er,(t,i)=>this.createTooltip(t,i),t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()}),this.above=this.manager.tooltips.map(t=>!!t.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),O.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let O of this.manager.tooltipViews)this.intersectionObserver.observe(O.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(O){O.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(O,this.above);e&&this.observeIntersection();let t=e||O.geometryChanged,i=O.state.facet(pa);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let r of this.manager.tooltipViews)r.dom.style.position=this.position;t=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let r of this.manager.tooltipViews)this.container.appendChild(r.dom);t=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);t&&this.maybeMeasure()}createTooltip(O,e){let t=O.create(this.view),i=e?e.dom:null;if(t.dom.classList.add("cm-tooltip"),O.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let r=document.createElement("div");r.className="cm-tooltip-arrow",t.dom.appendChild(r)}return t.dom.style.position=this.position,t.dom.style.top=on,t.dom.style.left="0px",this.container.insertBefore(t.dom,i),t.mount&&t.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(t.dom),t}destroy(){var O,e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(O=i.destroy)===null||O===void 0||O.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(t=this.intersectionObserver)===null||t===void 0||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let O=1,e=1,t=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:n}=this.manager.tooltipViews[0];if(v.safari){let s=n.getBoundingClientRect();t=Math.abs(s.top+1e4)>1||Math.abs(s.left)>1}else t=!!n.offsetParent&&n.offsetParent!=this.container.ownerDocument.body}if(t||this.position=="absolute")if(this.parent){let n=this.parent.getBoundingClientRect();n.width&&n.height&&(O=n.width/this.parent.offsetWidth,e=n.height/this.parent.offsetHeight)}else({scaleX:O,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),r=Po(this.view);return{visible:{left:i.left+r.left,top:i.top+r.top,right:i.right-r.right,bottom:i.bottom-r.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((n,s)=>{let a=this.manager.tooltipViews[s];return a.getCoords?a.getCoords(n.pos):this.view.coordsAtPos(n.pos)}),size:this.manager.tooltipViews.map(({dom:n})=>n.getBoundingClientRect()),space:this.view.state.facet(pa).tooltipSpace(this.view),scaleX:O,scaleY:e,makeAbsolute:t}}writeMeasure(O){var e;if(O.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let a of this.manager.tooltipViews)a.dom.style.position="absolute"}let{visible:t,space:i,scaleX:r,scaleY:n}=O,s=[];for(let a=0;a=Math.min(t.bottom,i.bottom)||h.rightMath.min(t.right,i.right)+.1)){c.style.top=on;continue}let u=o.arrow?l.dom.querySelector(".cm-tooltip-arrow"):null,Q=u?7:0,$=f.right-f.left,p=(e=xf.get(l))!==null&&e!==void 0?e:f.bottom-f.top,m=l.offset||CS,g=this.view.textDirection==H.LTR,P=f.width>i.right-i.left?g?i.left:i.right-f.width:g?Math.max(i.left,Math.min(h.left-(u?14:0)+m.x,i.right-$)):Math.min(Math.max(i.left,h.left-$+(u?14:0)-m.x),i.right-$),y=this.above[a];!o.strictSide&&(y?h.top-p-Q-m.yi.bottom)&&y==i.bottom-h.bottom>h.top-i.top&&(y=this.above[a]=!y);let X=(y?h.top-i.top:i.bottom-h.bottom)-Q;if(XP&&j.topx&&(x=y?j.top-p-2-Q:j.bottom+Q+2);if(this.position=="absolute"?(c.style.top=(x-O.parent.top)/n+"px",kf(c,(P-O.parent.left)/r)):(c.style.top=x/n+"px",kf(c,P/r)),u){let j=h.left+(g?m.x:-m.x)-(P+14-7);u.style.left=j/r+"px"}l.overlap!==!0&&s.push({left:P,top:x,right:k,bottom:x+p}),c.classList.toggle("cm-tooltip-above",y),c.classList.toggle("cm-tooltip-below",!y),l.positioned&&l.positioned(O.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let O of this.manager.tooltipViews)O.dom.style.top=on}},{eventObservers:{scroll(){this.maybeMeasure()}}});function kf(O,e){let t=parseInt(O.style.left,10);(isNaN(t)||Math.abs(e-t)>1)&&(O.style.left=e+"px")}var jS=T.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),CS={x:0,y:0},er=Z.define({enables:[Xo,jS]}),Zn=Z.define({combine:O=>O.reduce((e,t)=>e.concat(t),[])}),vn=class O{static create(e){return new O(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new wn(e,Zn,(t,i)=>this.createHostedView(t,i),t=>t.dom.remove())}createHostedView(e,t){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,t?t.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let t of this.manager.tooltipViews)t.mount&&t.mount(e);this.mounted=!0}positioned(e){for(let t of this.manager.tooltipViews)t.positioned&&t.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let t of this.manager.tooltipViews)(e=t.destroy)===null||e===void 0||e.call(t)}passProp(e){let t;for(let i of this.manager.tooltipViews){let r=i[e];if(r!==void 0){if(t===void 0)t=r;else if(t!==r)return}}return t}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},GS=er.compute([Zn],O=>{let e=O.facet(Zn);return e.length===0?null:{pos:Math.min(...e.map(t=>t.pos)),end:Math.max(...e.map(t=>{var i;return(i=t.end)!==null&&i!==void 0?i:t.pos})),create:vn.create,above:e[0].above,arrow:e.some(t=>t.arrow)}}),lo=class{constructor(e,t,i,r,n){this.view=e,this.source=t,this.field=i,this.setHover=r,this.hoverTime=n,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;ea.bottom||t.xa.right+e.defaultCharacterWidth)return;let o=e.bidiSpans(e.state.doc.lineAt(r)).find(c=>c.from<=r&&c.to>=r),l=o&&o.dir==H.RTL?-1:1;n=t.x{this.pending==a&&(this.pending=null,o&&!(Array.isArray(o)&&!o.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(o)?o:[o])}))},o=>Xe(e.state,o,"hover tooltip"))}else s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])})}get tooltip(){let e=this.view.plugin(Xo),t=e?e.manager.tooltips.findIndex(i=>i.create==vn.create):-1;return t>-1?e.manager.tooltipViews[t]:null}mousemove(e){var t,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:r,tooltip:n}=this;if(r.length&&n&&!ES(n.dom,e)||this.pending){let{pos:s}=r[0]||this.pending,a=(i=(t=r[0])===null||t===void 0?void 0:t.end)!==null&&i!==void 0?i:s;(s==a?this.view.posAtCoords(this.lastMove)!=s:!AS(this.view,s,a,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:t}=this;if(t.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let t=i=>{e.removeEventListener("mouseleave",t),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",t)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},ln=4;function ES(O,e){let{left:t,right:i,top:r,bottom:n}=O.getBoundingClientRect(),s;if(s=O.querySelector(".cm-tooltip-arrow")){let a=s.getBoundingClientRect();r=Math.min(a.top,r),n=Math.max(a.bottom,n)}return e.clientX>=t-ln&&e.clientX<=i+ln&&e.clientY>=r-ln&&e.clientY<=n+ln}function AS(O,e,t,i,r,n){let s=O.scrollDOM.getBoundingClientRect(),a=O.documentTop+O.documentPadding.top+O.contentHeight;if(s.left>i||s.rightr||Math.min(s.bottom,a)=e&&o<=t}function zd(O,e={}){let t=V.define(),i=ce.define({create(){return[]},update(r,n){if(r.length&&(e.hideOnChange&&(n.docChanged||n.selection)?r=[]:e.hideOn&&(r=r.filter(s=>!e.hideOn(n,s))),n.docChanged)){let s=[];for(let a of r){let o=n.changes.mapPos(a.pos,-1,pe.TrackDel);if(o!=null){let l=Object.assign(Object.create(null),a);l.pos=o,l.end!=null&&(l.end=n.changes.mapPos(l.end)),s.push(l)}}r=s}for(let s of n.effects)s.is(t)&&(r=s.value),s.is(LS)&&(r=[]);return r},provide:r=>Zn.from(r)});return{active:i,extension:[i,he.define(r=>new lo(r,O,i,t,e.hoverTime||300)),GS]}}function To(O,e){let t=O.plugin(Xo);if(!t)return null;let i=t.manager.tooltips.indexOf(e);return i<0?null:t.manager.tooltipViews[i]}var LS=V.define();var wf=Z.define({combine(O){let e,t;for(let i of O)e=e||i.topContainer,t=t||i.bottomContainer;return{topContainer:e,bottomContainer:t}}});function bO(O,e){let t=O.plugin(Ud),i=t?t.specs.indexOf(e):-1;return i>-1?t.panels[i]:null}var Ud=he.fromClass(class{constructor(O){this.input=O.state.facet(TO),this.specs=this.input.filter(t=>t),this.panels=this.specs.map(t=>t(O));let e=O.state.facet(wf);this.top=new ei(O,!0,e.topContainer),this.bottom=new ei(O,!1,e.bottomContainer),this.top.sync(this.panels.filter(t=>t.top)),this.bottom.sync(this.panels.filter(t=>!t.top));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(O){let e=O.state.facet(wf);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new ei(O.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new ei(O.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let t=O.state.facet(TO);if(t!=this.input){let i=t.filter(o=>o),r=[],n=[],s=[],a=[];for(let o of i){let l=this.specs.indexOf(o),c;l<0?(c=o(O.view),a.push(c)):(c=this.panels[l],c.update&&c.update(O)),r.push(c),(c.top?n:s).push(c)}this.specs=i,this.panels=r,this.top.sync(n),this.bottom.sync(s);for(let o of a)o.dom.classList.add("cm-panel"),o.mount&&o.mount()}else for(let i of this.panels)i.update&&i.update(O)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:O=>T.scrollMargins.of(e=>{let t=e.plugin(O);return t&&{top:t.top.scrollMargin(),bottom:t.bottom.scrollMargin()}})}),ei=class{constructor(e,t,i){this.view=e,this.top=t,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let t of this.panels)t.destroy&&e.indexOf(t)<0&&t.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let e=this.dom.firstChild;for(let t of this.panels)if(t.dom.parentNode==this.dom){for(;e!=t.dom;)e=Zf(e);e=e.nextSibling}else this.dom.insertBefore(t.dom,e);for(;e;)e=Zf(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function Zf(O){let e=O.nextSibling;return O.remove(),e}var TO=Z.define({enables:Ud});var Ie=class extends tt{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};Ie.prototype.elementClass="";Ie.prototype.toDOM=void 0;Ie.prototype.mapMode=pe.TrackBefore;Ie.prototype.startSide=Ie.prototype.endSide=-1;Ie.prototype.point=!0;var Qn=Z.define(),MS=Z.define(),DS={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>M.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},Li=Z.define();function bo(O){return[Wd(),Li.of({...DS,...O})]}var co=Z.define({combine:O=>O.some(e=>e)});function Wd(O){let e=[IS];return O&&O.fixed===!1&&e.push(co.of(!0)),e}var IS=he.fromClass(class{constructor(O){this.view=O,this.domAfter=null,this.prevViewport=O.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=O.state.facet(Li).map(e=>new Yn(O,e)),this.fixed=!O.state.facet(co);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),O.scrollDOM.insertBefore(this.dom,O.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(O){if(this.updateGutters(O)){let e=this.prevViewport,t=O.view.viewport,i=Math.min(e.to,t.to)-Math.max(e.from,t.from);this.syncGutters(i<(t.to-t.from)*.8)}if(O.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(co)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=O.view.viewport}syncGutters(O){let e=this.dom.nextSibling;O&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let t=M.iter(this.view.state.facet(Qn),this.view.viewport.from),i=[],r=this.gutters.map(n=>new fo(n,this.view.viewport,-this.view.documentPadding.top));for(let n of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(n.type)){let s=!0;for(let a of n.type)if(a.type==Te.Text&&s){ho(t,i,a.from);for(let o of r)o.line(this.view,a,i);s=!1}else if(a.widget)for(let o of r)o.widget(this.view,a)}else if(n.type==Te.Text){ho(t,i,n.from);for(let s of r)s.line(this.view,n,i)}else if(n.widget)for(let s of r)s.widget(this.view,n);for(let n of r)n.finish();O&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(O){let e=O.startState.facet(Li),t=O.state.facet(Li),i=O.docChanged||O.heightChanged||O.viewportChanged||!M.eq(O.startState.facet(Qn),O.state.facet(Qn),O.view.viewport.from,O.view.viewport.to);if(e==t)for(let r of this.gutters)r.update(O)&&(i=!0);else{i=!0;let r=[];for(let n of t){let s=e.indexOf(n);s<0?r.push(new Yn(this.view,n)):(this.gutters[s].update(O),r.push(this.gutters[s]))}for(let n of this.gutters)n.dom.remove(),r.indexOf(n)<0&&n.destroy();for(let n of r)n.config.side=="after"?this.getDOMAfter().appendChild(n.dom):this.dom.appendChild(n.dom);this.gutters=r}return i}destroy(){for(let O of this.gutters)O.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:O=>T.scrollMargins.of(e=>{let t=e.plugin(O);if(!t||t.gutters.length==0||!t.fixed)return null;let i=t.dom.offsetWidth*e.scaleX,r=t.domAfter?t.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==H.LTR?{left:i,right:r}:{right:i,left:r}})});function vf(O){return Array.isArray(O)?O:[O]}function ho(O,e,t){for(;O.value&&O.from<=t;)O.from==t&&e.push(O.value),O.next()}var fo=class{constructor(e,t,i){this.gutter=e,this.height=i,this.i=0,this.cursor=M.iter(e.markers,t.from)}addElement(e,t,i){let{gutter:r}=this,n=(t.top-this.height)/e.scaleY,s=t.height/e.scaleY;if(this.i==r.elements.length){let a=new _n(e,s,n,i);r.elements.push(a),r.dom.appendChild(a.dom)}else r.elements[this.i].update(e,s,n,i);this.height=t.bottom,this.i++}line(e,t,i){let r=[];ho(this.cursor,r,t.from),i.length&&(r=r.concat(i));let n=this.gutter.config.lineMarker(e,t,r);n&&r.unshift(n);let s=this.gutter;r.length==0&&!s.config.renderEmptyElements||this.addElement(e,t,r)}widget(e,t){let i=this.gutter.config.widgetMarker(e,t.widget,t),r=i?[i]:null;for(let n of e.state.facet(MS)){let s=n(e,t.widget,t);s&&(r||(r=[])).push(s)}r&&this.addElement(e,t,r)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}},Yn=class{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in t.domEventHandlers)this.dom.addEventListener(i,r=>{let n=r.target,s;if(n!=this.dom&&this.dom.contains(n)){for(;n.parentNode!=this.dom;)n=n.parentNode;let o=n.getBoundingClientRect();s=(o.top+o.bottom)/2}else s=r.clientY;let a=e.lineBlockAtHeight(s-e.documentTop);t.domEventHandlers[i](e,a,r)&&r.preventDefault()});this.markers=vf(t.markers(e)),t.initialSpacer&&(this.spacer=new _n(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=vf(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let r=this.config.updateSpacer(this.spacer.markers[0],e);r!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[r])}let i=e.view.viewport;return!M.eq(this.markers,t,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},_n=class{constructor(e,t,i,r){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,i,r)}update(e,t,i,r){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),BS(this.markers,r)||this.setMarkers(e,r)}setMarkers(e,t){let i="cm-gutterElement",r=this.dom.firstChild;for(let n=0,s=0;;){let a=s,o=nn(a,o,l)||s(a,o,l):s}return i}})}}),Mi=class extends Ie{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function ma(O,e){return O.state.facet(ti).formatNumber(e,O.state)}var HS=Li.compute([ti],O=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(NS)},lineMarker(e,t,i){return i.some(r=>r.toDOM)?null:new Mi(ma(e,e.state.doc.lineAt(t.from).number))},widgetMarker:(e,t,i)=>{for(let r of e.state.facet(FS)){let n=r(e,t,i);if(n)return n}return null},lineMarkerChange:e=>e.startState.facet(ti)!=e.state.facet(ti),initialSpacer(e){return new Mi(ma(e,Yf(e.state.doc.lines)))},updateSpacer(e,t){let i=ma(t.view,Yf(t.view.state.doc.lines));return i==e.number?e:new Mi(i)},domEventHandlers:O.facet(ti).domEventHandlers,side:"before"}));function jd(O={}){return[ti.of(O),Wd(),HS]}function Yf(O){let e=9;for(;e{let e=[],t=-1;for(let i of O.selection.ranges){let r=O.doc.lineAt(i.head).from;r>t&&(t=r,e.push(KS.range(r)))}return M.of(e)});function Cd(){return JS}var eX=0,We=class{constructor(e,t){this.from=e,this.to=t}},R=class{constructor(e={}){this.id=eX++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=ue.match(e)),t=>{let i=e(t);return i===void 0?null:[this,i]}}};R.closedBy=new R({deserialize:O=>O.split(" ")});R.openedBy=new R({deserialize:O=>O.split(" ")});R.group=new R({deserialize:O=>O.split(" ")});R.isolate=new R({deserialize:O=>{if(O&&O!="rtl"&&O!="ltr"&&O!="auto")throw new RangeError("Invalid value for isolate: "+O);return O||"auto"}});R.contextHash=new R({perNode:!0});R.lookAhead=new R({perNode:!0});R.mounted=new R({perNode:!0});var Ht=class{constructor(e,t,i,r=!1){this.tree=e,this.overlay=t,this.parser=i,this.bracketed=r}static get(e){return e&&e.props&&e.props[R.mounted.id]}},tX=Object.create(null),ue=class O{constructor(e,t,i,r=0){this.name=e,this.props=t,this.id=i,this.flags=r}static define(e){let t=e.props&&e.props.length?Object.create(null):tX,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),r=new O(e.name||"",t,e.id,i);if(e.props){for(let n of e.props)if(Array.isArray(n)||(n=n(r)),n){if(n[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[n[0].id]=n[1]}}return r}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(R.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let i in e)for(let r of i.split(" "))t[r]=e[i];return i=>{for(let r=i.prop(R.group),n=-1;n<(r?r.length:0);n++){let s=t[n<0?i.name:r[n]];if(s)return s}}}};ue.none=new ue("",Object.create(null),0,8);var Kt=class O{constructor(e){this.types=e;for(let t=0;t0;for(let o=this.cursor(s|C.IncludeAnonymous);;){let l=!1;if(o.from<=n&&o.to>=r&&(!a&&o.type.isAnonymous||t(o)!==!1)){if(o.firstChild())continue;l=!0}for(;l&&i&&(a||!o.type.isAnonymous)&&i(o),!o.nextSibling();){if(!o.parent())return;l=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:qo(ue.none,this.children,this.positions,0,this.children.length,0,this.length,(t,i,r)=>new O(this.type,t,i,r,this.propValues),e.makeTree||((t,i,r)=>new O(ue.none,t,i,r)))}static build(e){return iX(e)}};D.empty=new D(ue.none,[],[],0);var yo=class O{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new O(this.buffer,this.index)}},Jt=class O{constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}get type(){return ue.none}toString(){let e=[];for(let t=0;t0));o=s[o+3]);return a}slice(e,t,i){let r=this.buffer,n=new Uint16Array(t-e),s=0;for(let a=e,o=0;a=e&&te;case 1:return t<=e&&i>e;case 2:return i>e;case 4:return!0}}function tr(O,e,t,i){for(var r;O.from==O.to||(t<1?O.from>=e:O.from>e)||(t>-1?O.to<=e:O.to0?o.length:-1;e!=c;e+=t){let h=o[e],f=l[e]+a.from;if(!(!(n&C.EnterBracketed&&h instanceof D&&((s=Ht.get(h))===null||s===void 0?void 0:s.overlay)===null&&(f>=i||f+h.length<=i))&&!Bd(r,i,f,f+h.length))){if(h instanceof Jt){if(n&C.ExcludeBuffers)continue;let u=h.findChild(0,h.buffer.length,t,i-f,r);if(u>-1)return new yO(new ko(a,h,e,f),null,u)}else if(n&C.IncludeAnonymous||!h.type.isAnonymous||Vo(h)){let u;if(!(n&C.IgnoreMounts)&&(u=Ht.get(h))&&!u.overlay)return new O(u.tree,f,e,a);let Q=new O(h,f,e,a);return n&C.IncludeAnonymous||!Q.type.isAnonymous?Q:Q.nextChild(t<0?h.children.length-1:0,t,i,r,n)}}}if(n&C.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+t:e=t<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,i=0){let r;if(!(i&C.IgnoreOverlays)&&(r=Ht.get(this._tree))&&r.overlay){let n=e-this.from,s=i&C.EnterBracketed&&r.bracketed;for(let{from:a,to:o}of r.overlay)if((t>0||s?a<=n:a=n:o>n))return new O(r.tree,r.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Ed(O,e,t,i){let r=O.cursor(),n=[];if(!r.firstChild())return n;if(t!=null){for(let s=!1;!s;)if(s=r.type.is(t),!r.nextSibling())return n}for(;;){if(i!=null&&r.type.is(i))return n;if(r.type.is(e)&&n.push(r.node),!r.nextSibling())return i==null?n:[]}}function xo(O,e,t=e.length-1){for(let i=O;t>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[t]&&e[t]!=i.name)return!1;t--}}return!0}var ko=class{constructor(e,t,i,r){this.parent=e,this.buffer=t,this.index=i,this.start=r}},yO=class O extends Un{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,t,i){let{buffer:r}=this.context,n=r.findChild(this.index+4,r.buffer[this.index+3],e,t-this.context.start,i);return n<0?null:new O(this.context,this,n)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,i=0){if(i&C.ExcludeBuffers)return null;let{buffer:r}=this.context,n=r.findChild(this.index+4,r.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return n<0?null:new O(this.context,this,n)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new O(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new O(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:i}=this.context,r=this.index+4,n=i.buffer[this.index+3];if(n>r){let s=i.buffer[this.index+1];e.push(i.slice(r,n,s)),t.push(0)}return new D(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Nd(O){if(!O.length)return null;let e=0,t=O[0];for(let n=1;nt.from||s.to=e){let a=new je(s.tree,s.overlay[0].from+n.from,-1,n);(r||(r=[i])).push(tr(a,e,t,!1))}}return r?Nd(r):i}var li=class{get name(){return this.type.name}constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=t&~C.EnterBracketed,e instanceof je)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:i,buffer:r}=this.buffer;return this.type=t||r.set.types[r.buffer[e]],this.from=i+r.buffer[e+1],this.to=i+r.buffer[e+2],!0}yield(e){return e?e instanceof je?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,i,this.mode));let{buffer:r}=this.buffer,n=r.findChild(this.index+4,r.buffer[this.index+3],e,t-this.buffer.start,i);return n<0?!1:(this.stack.push(this.index),this.yieldBuf(n))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,i=this.mode){return this.buffer?i&C.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&C.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&C.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,i=this.stack.length-1;if(e<0){let r=i<0?0:this.stack[i]+4;if(this.index!=r)return this.yieldBuf(t.findChild(r,this.index,-1,0,4))}else{let r=t.buffer[this.index+3];if(r<(i<0?t.buffer.length:t.buffer[this.stack[i]+3]))return this.yieldBuf(r)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,i,{buffer:r}=this;if(r){if(e>0){if(this.index-1)for(let n=t+e,s=e<0?-1:i._tree.children.length;n!=s;n+=e){let a=i._tree.children[n];if(this.mode&C.IncludeAnonymous||a instanceof Jt||!a.type.isAnonymous||Vo(a))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let s=e;s;s=s._parent)if(s.index==r){if(r==this.index)return s;t=s,i=n+1;break e}r=this.stack[--n]}for(let r=i;r=0;n--){if(n<0)return xo(this._tree,e,r);let s=i[t.buffer[this.stack[n]]];if(!s.isAnonymous){if(e[r]&&e[r]!=s.name)return!1;r--}}return!0}};function Vo(O){return O.children.some(e=>e instanceof Jt||!e.type.isAnonymous||Vo(e))}function iX(O){var e;let{buffer:t,nodeSet:i,maxBufferLength:r=1024,reused:n=[],minRepeatType:s=i.types.length}=O,a=Array.isArray(t)?new yo(t,t.length):t,o=i.types,l=0,c=0;function h(X,x,k,j,A,ie){let{id:G,start:q,end:K,size:B}=a,ae=c,we=l;if(B<0)if(a.next(),B==-1){let Zt=n[G];k.push(Zt),j.push(q-X);return}else if(B==-3){l=G;return}else if(B==-4){c=G;return}else throw new RangeError(`Unrecognized record size: ${B}`);let Ee=o[G],mt,Pe,Je=q-X;if(K-q<=r&&(Pe=p(a.pos-x,A))){let Zt=new Uint16Array(Pe.size-Pe.skip),et=a.pos-Pe.size,gt=Zt.length;for(;a.pos>et;)gt=m(Pe.start,Zt,gt);mt=new Jt(Zt,K-Pe.start,i),Je=Pe.start-X}else{let Zt=a.pos-B;a.next();let et=[],gt=[],dO=G>=s?G:-1,LO=0,Gr=K;for(;a.pos>Zt;)dO>=0&&a.id==dO&&a.size>=0?(a.end<=Gr-r&&(Q(et,gt,q,LO,a.end,Gr,dO,ae,we),LO=et.length,Gr=a.end),a.next()):ie>2500?f(q,Zt,et,gt):h(q,Zt,et,gt,dO,ie+1);if(dO>=0&&LO>0&&LO-1&&LO>0){let mh=u(Ee,we);mt=qo(Ee,et,gt,0,et.length,0,K-q,mh,mh)}else mt=$(Ee,et,gt,K-q,ae-K,we)}k.push(mt),j.push(Je)}function f(X,x,k,j){let A=[],ie=0,G=-1;for(;a.pos>x;){let{id:q,start:K,end:B,size:ae}=a;if(ae>4)a.next();else{if(G>-1&&K=0;B-=3)q[ae++]=A[B],q[ae++]=A[B+1]-K,q[ae++]=A[B+2]-K,q[ae++]=ae;k.push(new Jt(q,A[2]-K,i)),j.push(K-X)}}function u(X,x){return(k,j,A)=>{let ie=0,G=k.length-1,q,K;if(G>=0&&(q=k[G])instanceof D){if(!G&&q.type==X&&q.length==A)return q;(K=q.prop(R.lookAhead))&&(ie=j[G]+q.length+K)}return $(X,k,j,A,ie,x)}}function Q(X,x,k,j,A,ie,G,q,K){let B=[],ae=[];for(;X.length>j;)B.push(X.pop()),ae.push(x.pop()+k-A);X.push($(i.types[G],B,ae,ie-A,q-ie,K)),x.push(A-k)}function $(X,x,k,j,A,ie,G){if(ie){let q=[R.contextHash,ie];G=G?[q].concat(G):[q]}if(A>25){let q=[R.lookAhead,A];G=G?[q].concat(G):[q]}return new D(X,x,k,j,G)}function p(X,x){let k=a.fork(),j=0,A=0,ie=0,G=k.end-r,q={size:0,start:0,skip:0};e:for(let K=k.pos-X;k.pos>K;){let B=k.size;if(k.id==x&&B>=0){q.size=j,q.start=A,q.skip=ie,ie+=4,j+=4,k.next();continue}let ae=k.pos-B;if(B<0||ae=s?4:0,Ee=k.start;for(k.next();k.pos>ae;){if(k.size<0)if(k.size==-3||k.size==-4)we+=4;else break e;else k.id>=s&&(we+=4);k.next()}A=Ee,j+=B,ie+=we}return(x<0||j==X)&&(q.size=j,q.start=A,q.skip=ie),q.size>4?q:void 0}function m(X,x,k){let{id:j,start:A,end:ie,size:G}=a;if(a.next(),G>=0&&j4){let K=a.pos-(G-4);for(;a.pos>K;)k=m(X,x,k)}x[--k]=q,x[--k]=ie-X,x[--k]=A-X,x[--k]=j}else G==-3?l=j:G==-4&&(c=j);return k}let g=[],P=[];for(;a.pos>0;)h(O.start||0,O.bufferStart||0,g,P,-1,0);let y=(e=O.length)!==null&&e!==void 0?e:g.length?P[0]+g[0].length:0;return new D(o[O.topID],g.reverse(),P.reverse(),y)}var Ad=new WeakMap;function zn(O,e){if(!O.isAnonymous||e instanceof Jt||e.type!=O)return 1;let t=Ad.get(e);if(t==null){t=1;for(let i of e.children){if(i.type!=O||!(i instanceof D)){t=1;break}t+=zn(O,i)}Ad.set(e,t)}return t}function qo(O,e,t,i,r,n,s,a,o){let l=0;for(let Q=i;Q=c)break;x+=k}if(P==y+1){if(x>c){let k=Q[y];u(k.children,k.positions,0,k.children.length,$[y]+g);continue}h.push(Q[y])}else{let k=$[P-1]+Q[P-1].length-X;h.push(qo(O,Q,$,y,P,X,k,null,o))}f.push(X+g-n)}}return u(e,t,i,r,0),(a||o)(h,f,s)}var Tt=class{constructor(){this.map=new WeakMap}setBuffer(e,t,i){let r=this.map.get(e);r||this.map.set(e,r=new Map),r.set(t,i)}getBuffer(e,t){let i=this.map.get(e);return i&&i.get(t)}set(e,t){e instanceof yO?this.setBuffer(e.context.buffer,e.index,t):e instanceof je&&this.map.set(e.tree,t)}get(e){return e instanceof yO?this.getBuffer(e.context.buffer,e.index):e instanceof je?this.map.get(e.tree):void 0}cursorSet(e,t){e.buffer?this.setBuffer(e.buffer.buffer,e.index,t):this.map.set(e.tree,t)}cursorGet(e){return e.buffer?this.getBuffer(e.buffer.buffer,e.index):this.map.get(e.tree)}},Vt=class O{constructor(e,t,i,r,n=!1,s=!1){this.from=e,this.to=t,this.tree=i,this.offset=r,this.open=(n?1:0)|(s?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],i=!1){let r=[new O(0,e.length,e,0,!1,i)];for(let n of t)n.to>e.length&&r.push(n);return r}static applyChanges(e,t,i=128){if(!t.length)return e;let r=[],n=1,s=e.length?e[0]:null;for(let a=0,o=0,l=0;;a++){let c=a=i)for(;s&&s.from=f.from||h<=f.to||l){let u=Math.max(f.from,o)-l,Q=Math.min(f.to,h)-l;f=u>=Q?null:new O(u,Q,f.tree,f.offset+l,a>0,!!c)}if(f&&r.push(f),s.to>h)break;s=nnew We(r.from,r.to)):[new We(0,0)]:[new We(0,e.length)],this.createParse(e,t||[],i)}parse(e,t,i){let r=this.startParse(e,t,i);for(;;){let n=r.advance();if(n)return n}}},Zo=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}};function xO(O){return(e,t,i,r)=>new _o(e,O,t,i,r)}var Wn=class{constructor(e,t,i,r,n,s){this.parser=e,this.parse=t,this.overlay=i,this.bracketed=r,this.target=n,this.from=s}};function Ld(O){if(!O.length||O.some(e=>e.from>=e.to))throw new RangeError("Invalid inner parse ranges given: "+JSON.stringify(O))}var vo=class{constructor(e,t,i,r,n,s,a,o){this.parser=e,this.predicate=t,this.mounts=i,this.index=r,this.start=n,this.bracketed=s,this.target=a,this.prev=o,this.depth=0,this.ranges=[]}},Yo=new R({perNode:!0}),_o=class{constructor(e,t,i,r,n){this.nest=t,this.input=i,this.fragments=r,this.ranges=n,this.inner=[],this.innerDone=0,this.baseTree=null,this.stoppedAt=null,this.baseParse=e}advance(){if(this.baseParse){let i=this.baseParse.advance();if(!i)return null;if(this.baseParse=null,this.baseTree=i,this.startInner(),this.stoppedAt!=null)for(let r of this.inner)r.parse.stopAt(this.stoppedAt)}if(this.innerDone==this.inner.length){let i=this.baseTree;return this.stoppedAt!=null&&(i=new D(i.type,i.children,i.positions,i.length,i.propValues.concat([[Yo,this.stoppedAt]]))),i}let e=this.inner[this.innerDone],t=e.parse.advance();if(t){this.innerDone++;let i=Object.assign(Object.create(null),e.target.props);i[R.mounted.id]=new Ht(t,e.overlay,e.parser,e.bracketed),e.target.props=i}return null}get parsedPos(){if(this.baseParse)return 0;let e=this.input.length;for(let t=this.innerDone;t=this.stoppedAt)a=!1;else if(e.hasNode(r)){if(t){let l=t.mounts.find(c=>c.frag.from<=r.from&&c.frag.to>=r.to&&c.mount.overlay);if(l)for(let c of l.mount.overlay){let h=c.from+l.pos,f=c.to+l.pos;h>=r.from&&f<=r.to&&!t.ranges.some(u=>u.fromh)&&t.ranges.push({from:h,to:f})}}a=!1}else if(i&&(s=rX(i.ranges,r.from,r.to)))a=s!=2;else if(!r.type.isAnonymous&&(n=this.nest(r,this.input))&&(r.fromnew We(h.from-r.from,h.to-r.from)):null,!!n.bracketed,r.tree,c.length?c[0].from:r.from)),n.overlay?c.length&&(i={ranges:c,depth:0,prev:i}):a=!1}}else if(t&&(o=t.predicate(r))&&(o===!0&&(o=new We(r.from,r.to)),o.from=0&&t.ranges[l].to==o.from?t.ranges[l]={from:t.ranges[l].from,to:o.to}:t.ranges.push(o)}if(a&&r.firstChild())t&&t.depth++,i&&i.depth++;else for(;!r.nextSibling();){if(!r.parent())break e;if(t&&!--t.depth){let l=Dd(this.ranges,t.ranges);l.length&&(Ld(l),this.inner.splice(t.index,0,new Wn(t.parser,t.parser.startParse(this.input,Id(t.mounts,l),l),t.ranges.map(c=>new We(c.from-t.start,c.to-t.start)),t.bracketed,t.target,l[0].from))),t=t.prev}i&&!--i.depth&&(i=i.prev)}}}};function rX(O,e,t){for(let i of O){if(i.from>=t)break;if(i.to>e)return i.from<=e&&i.to>=t?2:1}return 0}function Md(O,e,t,i,r,n){if(e=e&&t.enter(i,1,C.IgnoreOverlays|C.ExcludeBuffers)||t.next(!1)||(this.done=!0)}hasNode(e){if(this.moveTo(e.from),!this.done&&this.cursor.from+this.offset==e.from&&this.cursor.tree)for(let t=this.cursor.tree;;){if(t==e.tree)return!0;if(t.children.length&&t.positions[0]==0&&t.children[0]instanceof D)t=t.children[0];else break}return!1}},Ro=class{constructor(e){var t;if(this.fragments=e,this.curTo=0,this.fragI=0,e.length){let i=this.curFrag=e[0];this.curTo=(t=i.tree.prop(Yo))!==null&&t!==void 0?t:i.to,this.inner=new jn(i.tree,-i.offset)}else this.curFrag=this.inner=null}hasNode(e){for(;this.curFrag&&e.from>=this.curTo;)this.nextFrag();return this.curFrag&&this.curFrag.from<=e.from&&this.curTo>=e.to&&this.inner.hasNode(e)}nextFrag(){var e;if(this.fragI++,this.fragI==this.fragments.length)this.curFrag=this.inner=null;else{let t=this.curFrag=this.fragments[this.fragI];this.curTo=(e=t.tree.prop(Yo))!==null&&e!==void 0?e:t.to,this.inner=new jn(t.tree,-t.offset)}}findMounts(e,t){var i;let r=[];if(this.inner){this.inner.cursor.moveTo(e,1);for(let n=this.inner.cursor.node;n;n=n.parent){let s=(i=n.tree)===null||i===void 0?void 0:i.prop(R.mounted);if(s&&s.parser==t)for(let a=this.fragI;a=n.to)break;o.tree==this.curFrag.tree&&r.push({frag:o,pos:n.from-o.offset,mount:s})}}}return r}};function Dd(O,e){let t=null,i=e;for(let r=1,n=0;r=a)break;o.to<=s||(t||(i=t=e.slice()),o.froma&&t.splice(n+1,0,new We(a,o.to))):o.to>a?t[n--]=new We(a,o.to):t.splice(n--,1))}}return i}function sX(O,e,t,i){let r=0,n=0,s=!1,a=!1,o=-1e9,l=[];for(;;){let c=r==O.length?1e9:s?O[r].to:O[r].from,h=n==e.length?1e9:a?e[n].to:e[n].from;if(s!=a){let f=Math.max(o,t),u=Math.min(c,h,i);fnew We(f.from+i,f.to+i)),h=sX(e,c,o,l);for(let f=0,u=o;;f++){let Q=f==h.length,$=Q?l:h[f].from;if($>u&&t.push(new Vt(u,$,r.tree,-s,n.from>=u||n.openStart,n.to<=$||n.openEnd)),Q)break;u=h[f].to}}else t.push(new Vt(o,l,r.tree,-s,n.from>=s||n.openStart,n.to<=a||n.openEnd))}return t}var aX=0,Be=class O{constructor(e,t,i,r){this.name=e,this.set=t,this.base=i,this.modified=r,this.id=aX++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let i=typeof e=="string"?e:"?";if(e instanceof O&&(t=e),t?.base)throw new Error("Can not derive from a modified tag");let r=new O(i,[],null,[]);if(r.set.push(r),t)for(let n of t.set)r.set.push(n);return r}static defineModifier(e){let t=new An(e);return i=>i.modified.indexOf(t)>-1?i:An.get(i.base||i,i.modified.concat(t).sort((r,n)=>r.id-n.id))}},oX=0,An=class O{constructor(e){this.name=e,this.instances=[],this.id=oX++}static get(e,t){if(!t.length)return e;let i=t[0].instances.find(a=>a.base==e&&lX(t,a.modified));if(i)return i;let r=[],n=new Be(e.name,r,e,t);for(let a of t)a.instances.push(n);let s=cX(t);for(let a of e.set)if(!a.modified.length)for(let o of s)r.push(O.get(a,o));return n}};function lX(O,e){return O.length==e.length&&O.every((t,i)=>t==e[i])}function cX(O){let e=[[]];for(let t=0;ti.length-t.length)}function F(O){let e=Object.create(null);for(let t in O){let i=O[t];Array.isArray(i)||(i=[i]);for(let r of t.split(" "))if(r){let n=[],s=2,a=r;for(let h=0;;){if(a=="..."&&h>0&&h+3==r.length){s=1;break}let f=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(a);if(!f)throw new RangeError("Invalid path: "+r);if(n.push(f[0]=="*"?"":f[0][0]=='"'?JSON.parse(f[0]):f[0]),h+=f[0].length,h==r.length)break;let u=r[h++];if(h==r.length&&u=="!"){s=0;break}if(u!="/")throw new RangeError("Invalid path: "+r);a=r.slice(h)}let o=n.length-1,l=n[o];if(!l)throw new RangeError("Invalid path: "+r);let c=new wO(i,s,o>0?n.slice(0,o):null);e[l]=c.sort(e[l])}}return Kd.add(e)}var Kd=new R({combine(O,e){let t,i,r;for(;O||e;){if(!O||e&&O.depth>=e.depth?(r=e,e=e.next):(r=O,O=O.next),t&&t.mode==r.mode&&!r.context&&!t.context)continue;let n=new wO(r.tags,r.mode,r.context);t?t.next=n:i=n,t=n}return i}}),wO=class{constructor(e,t,i,r){this.tags=e,this.mode=t,this.context=i,this.next=r}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let s=r;for(let a of n)for(let o of a.set){let l=t[o.id];if(l){s=s?s+" "+l:l;break}}return s},scope:i}}function hX(O,e){let t=null;for(let i of O){let r=i.style(e);r&&(t=t?t+" "+r:r)}return t}function Jd(O,e,t,i=0,r=O.length){let n=new Uo(i,Array.isArray(e)?e:[e],t);n.highlightRange(O.cursor(),i,r,"",n.highlighters),n.flush(r)}var Uo=class{constructor(e,t,i){this.at=e,this.highlighters=t,this.span=i,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,i,r,n){let{type:s,from:a,to:o}=e;if(a>=i||o<=t)return;s.isTop&&(n=this.highlighters.filter(u=>!u.scope||u.scope(s)));let l=r,c=fX(e)||wO.empty,h=hX(n,c.tags);if(h&&(l&&(l+=" "),l+=h,c.mode==1&&(r+=(r?" ":"")+h)),this.startSpan(Math.max(t,a),l),c.opaque)return;let f=e.tree&&e.tree.prop(R.mounted);if(f&&f.overlay){let u=e.node.enter(f.overlay[0].from+a,1),Q=this.highlighters.filter(p=>!p.scope||p.scope(f.tree.type)),$=e.firstChild();for(let p=0,m=a;;p++){let g=p=P||!e.nextSibling())););if(!g||P>i)break;m=g.to+a,m>t&&(this.highlightRange(u.cursor(),Math.max(t,g.from+a),Math.min(i,m),"",Q),this.startSpan(Math.min(i,m),l))}$&&e.parent()}else if(e.firstChild()){f&&(r="");do if(!(e.to<=t)){if(e.from>=i)break;this.highlightRange(e,t,i,r,n),this.startSpan(Math.min(i,e.to),l)}while(e.nextSibling());e.parent()}}};function fX(O){let e=O.type.prop(Kd);for(;e&&e.context&&!O.matchContext(e.context);)e=e.next;return e||null}var w=Be.define,Cn=w(),tO=w(),Fd=w(tO),Hd=w(tO),OO=w(),Gn=w(OO),zo=w(OO),xt=w(),kO=w(xt),bt=w(),yt=w(),Wo=w(),Or=w(Wo),En=w(),d={comment:Cn,lineComment:w(Cn),blockComment:w(Cn),docComment:w(Cn),name:tO,variableName:w(tO),typeName:Fd,tagName:w(Fd),propertyName:Hd,attributeName:w(Hd),className:w(tO),labelName:w(tO),namespace:w(tO),macroName:w(tO),literal:OO,string:Gn,docString:w(Gn),character:w(Gn),attributeValue:w(Gn),number:zo,integer:w(zo),float:w(zo),bool:w(OO),regexp:w(OO),escape:w(OO),color:w(OO),url:w(OO),keyword:bt,self:w(bt),null:w(bt),atom:w(bt),unit:w(bt),modifier:w(bt),operatorKeyword:w(bt),controlKeyword:w(bt),definitionKeyword:w(bt),moduleKeyword:w(bt),operator:yt,derefOperator:w(yt),arithmeticOperator:w(yt),logicOperator:w(yt),bitwiseOperator:w(yt),compareOperator:w(yt),updateOperator:w(yt),definitionOperator:w(yt),typeOperator:w(yt),controlOperator:w(yt),punctuation:Wo,separator:w(Wo),bracket:Or,angleBracket:w(Or),squareBracket:w(Or),paren:w(Or),brace:w(Or),content:xt,heading:kO,heading1:w(kO),heading2:w(kO),heading3:w(kO),heading4:w(kO),heading5:w(kO),heading6:w(kO),contentSeparator:w(xt),list:w(xt),quote:w(xt),emphasis:w(xt),strong:w(xt),link:w(xt),monospace:w(xt),strikethrough:w(xt),inserted:w(),deleted:w(),changed:w(),invalid:w(),meta:En,documentMeta:w(En),annotation:w(En),processingInstruction:w(En),definition:Be.defineModifier("definition"),constant:Be.defineModifier("constant"),function:Be.defineModifier("function"),standard:Be.defineModifier("standard"),local:Be.defineModifier("local"),special:Be.defineModifier("special")};for(let O in d){let e=d[O];e instanceof Be&&(e.name=O)}var a_=jo([{tag:d.link,class:"tok-link"},{tag:d.heading,class:"tok-heading"},{tag:d.emphasis,class:"tok-emphasis"},{tag:d.strong,class:"tok-strong"},{tag:d.keyword,class:"tok-keyword"},{tag:d.atom,class:"tok-atom"},{tag:d.bool,class:"tok-bool"},{tag:d.url,class:"tok-url"},{tag:d.labelName,class:"tok-labelName"},{tag:d.inserted,class:"tok-inserted"},{tag:d.deleted,class:"tok-deleted"},{tag:d.literal,class:"tok-literal"},{tag:d.string,class:"tok-string"},{tag:d.number,class:"tok-number"},{tag:[d.regexp,d.escape,d.special(d.string)],class:"tok-string2"},{tag:d.variableName,class:"tok-variableName"},{tag:d.local(d.variableName),class:"tok-variableName tok-local"},{tag:d.definition(d.variableName),class:"tok-variableName tok-definition"},{tag:d.special(d.variableName),class:"tok-variableName2"},{tag:d.definition(d.propertyName),class:"tok-propertyName tok-definition"},{tag:d.typeName,class:"tok-typeName"},{tag:d.namespace,class:"tok-namespace"},{tag:d.className,class:"tok-className"},{tag:d.macroName,class:"tok-macroName"},{tag:d.propertyName,class:"tok-propertyName"},{tag:d.operator,class:"tok-operator"},{tag:d.comment,class:"tok-comment"},{tag:d.meta,class:"tok-meta"},{tag:d.invalid,class:"tok-invalid"},{tag:d.punctuation,class:"tok-punctuation"}]);var Co,iO=new R;function or(O){return Z.define({combine:O?e=>e.concat(O):void 0})}var Dn=new R,Re=class{constructor(e,t,i=[],r=""){this.data=e,this.name=r,I.prototype.hasOwnProperty("tree")||Object.defineProperty(I.prototype,"tree",{get(){return U(this)}}),this.parser=t,this.extension=[rO.of(this),I.languageData.of((n,s,a)=>{let o=eu(n,s,a),l=o.type.prop(iO);if(!l)return[];let c=n.facet(l),h=o.type.prop(Dn);if(h){let f=o.resolve(s-o.from,a);for(let u of h)if(u.test(f,n)){let Q=n.facet(u.facet);return u.type=="replace"?Q:Q.concat(c)}}return c})].concat(i)}isActiveAt(e,t,i=-1){return eu(e,t,i).type.prop(iO)==this.data}findRegions(e){let t=e.facet(rO);if(t?.data==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let i=[],r=(n,s)=>{if(n.prop(iO)==this.data){i.push({from:s,to:s+n.length});return}let a=n.prop(R.mounted);if(a){if(a.tree.prop(iO)==this.data){if(a.overlay)for(let o of a.overlay)i.push({from:o.from+s,to:o.to+s});else i.push({from:s,to:s+n.length});return}else if(a.overlay){let o=i.length;if(r(a.tree,a.overlay[0].from+s),i.length>o)return}}for(let o=0;oi.isTop?t:void 0)]}),e.name)}configure(e,t){return new O(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function U(O){let e=O.field(Re.state,!1);return e?e.tree:D.empty}var Lo=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-i,t-i)}},ir=null,nr=class O{constructor(e,t,i=[],r,n,s,a,o){this.parser=e,this.state=t,this.fragments=i,this.tree=r,this.treeLen=n,this.viewport=s,this.skipped=a,this.scheduleOn=o,this.parse=null,this.tempSkipped=[]}static create(e,t,i){return new O(e,t,[],D.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Lo(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=D.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let r=Date.now()+e;e=()=>Date.now()>r}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(Vt.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=ir;ir=this;try{return e()}finally{ir=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=tu(e,t.from,t.to);return e}changes(e,t){let{fragments:i,tree:r,treeLen:n,viewport:s,skipped:a}=this;if(this.takeTree(),!e.empty){let o=[];if(e.iterChangedRanges((l,c,h,f)=>o.push({fromA:l,toA:c,fromB:h,toB:f})),i=Vt.applyChanges(i,o),r=D.empty,n=0,s={from:e.mapPos(s.from,-1),to:e.mapPos(s.to,1)},this.skipped.length){a=[];for(let l of this.skipped){let c=e.mapPos(l.from,1),h=e.mapPos(l.to,-1);ce.from&&(this.fragments=tu(this.fragments,r,n),this.skipped.splice(i--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends eO{createParse(t,i,r){let n=r[0].from,s=r[r.length-1].to;return{parsedPos:n,advance(){let o=ir;if(o){for(let l of r)o.tempSkipped.push(l);e&&(o.scheduleOn=o.scheduleOn?Promise.all([o.scheduleOn,e]):e)}return this.parsedPos=s,new D(ue.none,[],[],s-n)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return ir}};function tu(O,e,t){return Vt.applyChanges(O,[{fromA:e,toA:t,fromB:e,toB:t}])}var sr=class O{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,i)||t.takeTree(),new O(t)}static init(e){let t=Math.min(3e3,e.doc.length),i=nr.create(e.facet(rO).parser,e,{from:0,to:t});return i.work(20,t)||i.takeTree(),new O(i)}};Re.state=ce.define({create:sr.init,update(O,e){for(let t of e.effects)if(t.is(Re.setState))return t.value;return e.startState.facet(rO)!=e.state.facet(rO)?sr.init(e.state):O.apply(e)}});var au=O=>{let e=setTimeout(()=>O(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(au=O=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(O,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});var Go=typeof navigator<"u"&&(!((Co=navigator.scheduling)===null||Co===void 0)&&Co.isInputPending)?()=>navigator.scheduling.isInputPending():null,dX=he.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Re.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Re.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=au(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEndr+1e3,o=n.context.work(()=>Go&&Go()||Date.now()>s,r+(a?0:1e5));this.chunkBudget-=Date.now()-t,(o||this.chunkBudget<=0)&&(n.context.takeTree(),this.view.dispatch({effects:Re.setState.of(new sr(n.context))})),this.chunkBudget>0&&!(o&&!a)&&this.scheduleWork(),this.checkAsyncSchedule(n.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>Xe(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),rO=Z.define({combine(O){return O.length?O[0]:null},enables:O=>[Re.state,dX,T.contentAttributes.compute([O],e=>{let t=e.facet(O);return t&&t.name?{"data-language":t.name}:{}})]}),J=class{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}},ar=class O{constructor(e,t,i,r,n,s=void 0){this.name=e,this.alias=t,this.extensions=i,this.filename=r,this.loadFunc=n,this.support=s,this.loading=null}load(){return this.loading||(this.loading=this.loadFunc().then(e=>this.support=e,e=>{throw this.loading=null,e}))}static of(e){let{load:t,support:i}=e;if(!t){if(!i)throw new RangeError("Must pass either 'load' or 'support' to LanguageDescription.of");t=()=>Promise.resolve(i)}return new O(e.name,(e.alias||[]).concat(e.name).map(r=>r.toLowerCase()),e.extensions||[],e.filename,t,i)}static matchFilename(e,t){for(let r of e)if(r.filename&&r.filename.test(t))return r;let i=/\.([^.]+)$/.exec(t);if(i){for(let r of e)if(r.extensions.indexOf(i[1])>-1)return r}return null}static matchLanguageName(e,t,i=!0){t=t.toLowerCase();for(let r of e)if(r.alias.some(n=>n==t))return r;if(i)for(let r of e)for(let n of r.alias){let s=t.indexOf(n);if(s>-1&&(n.length>2||!/\w/.test(t[s-1])&&!/\w/.test(t[s+n.length])))return r}return null}},uX=Z.define(),nO=Z.define({combine:O=>{if(!O.length)return" ";let e=O[0];if(!e||/\S/.test(e)||Array.from(e).some(t=>t!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(O[0]));return e}});function lr(O){let e=O.facet(nO);return e.charCodeAt(0)==9?O.tabSize*e.length:e.length}function hi(O,e){let t="",i=O.tabSize,r=O.facet(nO)[0];if(r==" "){for(;e>=i;)t+=" ",e-=i;r=" "}for(let n=0;n=e?QX(O,t,e):null}var ZO=class{constructor(e,t={}){this.state=e,this.options=t,this.unit=lr(e)}lineAt(e,t=1){let i=this.state.doc.lineAt(e),{simulateBreak:r,simulateDoubleBreak:n}=this.options;return r!=null&&r>=i.from&&r<=i.to?n&&r==e?{text:"",from:e}:(t<0?r-1&&(n+=s-this.countColumn(i,i.search(/\S|$/))),n}countColumn(e,t=e.length){return ve(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:i,from:r}=this.lineAt(e,t),n=this.options.overrideIndentation;if(n){let s=n(r);if(s>-1)return s}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},se=new R;function QX(O,e,t){let i=e.resolveStack(t),r=e.resolveInner(t,-1).resolve(t,0).enterUnfinishedNodesBefore(t);if(r!=i.node){let n=[];for(let s=r;s&&!(s.fromi.node.to||s.from==i.node.from&&s.type==i.node.type);s=s.parent)n.push(s);for(let s=n.length-1;s>=0;s--)i={node:n[s],next:i}}return ou(i,O,t)}function ou(O,e,t){for(let i=O;i;i=i.next){let r=pX(i.node);if(r)return r(Mo.create(e,t,i))}return 0}function $X(O){return O.pos==O.options.simulateBreak&&O.options.simulateDoubleBreak}function pX(O){let e=O.type.prop(se);if(e)return e;let t=O.firstChild,i;if(t&&(i=t.type.prop(R.closedBy))){let r=O.lastChild,n=r&&i.indexOf(r.name)>-1;return s=>lu(s,!0,1,void 0,n&&!$X(s)?r.from:void 0)}return O.parent==null?mX:null}function mX(){return 0}var Mo=class O extends ZO{constructor(e,t,i){super(e.state,e.options),this.base=e,this.pos=t,this.context=i}get node(){return this.context.node}static create(e,t,i){return new O(e,t,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(t.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(gX(i,e))break;t=this.state.doc.lineAt(i.from)}return this.lineIndent(t.from)}continue(){return ou(this.context.next,this.base,this.pos)}};function gX(O,e){for(let t=e;t;t=t.parent)if(O==t)return!0;return!1}function PX(O){let e=O.node,t=e.childAfter(e.from),i=e.lastChild;if(!t)return null;let r=O.options.simulateBreak,n=O.state.doc.lineAt(t.from),s=r==null||r<=n.from?n.to:Math.min(n.to,r);for(let a=t.to;;){let o=e.childAfter(a);if(!o||o==i)return null;if(!o.type.isSkipped){if(o.from>=s)return null;let l=/^ */.exec(n.text.slice(t.to-n.from))[0].length;return{from:t.from,to:t.to+l}}a=o.to}}function be({closing:O,align:e=!0,units:t=1}){return i=>lu(i,e,t,O)}function lu(O,e,t,i,r){let n=O.textAfter,s=n.match(/^\s*/)[0].length,a=i&&n.slice(s,s+i.length)==i||r==O.pos+s,o=e?PX(O):null;return o?a?O.column(o.from):O.column(o.to):O.baseIndent+(a?0:O.unit*t)}var sO=O=>O.baseIndent;function le({except:O,units:e=1}={}){return t=>{let i=O&&O.test(t.textAfter);return t.baseIndent+(i?0:e*t.unit)}}var SX=200;function cu(){return I.transactionFilter.of(O=>{if(!O.docChanged||!O.isUserEvent("input.type")&&!O.isUserEvent("input.complete"))return O;let e=O.startState.languageDataAt("indentOnInput",O.startState.selection.main.head);if(!e.length)return O;let t=O.newDoc,{head:i}=O.newSelection.main,r=t.lineAt(i);if(i>r.from+SX)return O;let n=t.sliceString(r.from,i);if(!e.some(l=>l.test(n)))return O;let{state:s}=O,a=-1,o=[];for(let{head:l}of s.selection.ranges){let c=s.doc.lineAt(l);if(c.from==a)continue;a=c.from;let h=In(s,c.from);if(h==null)continue;let f=/^\s*/.exec(c.text)[0],u=hi(s,h);f!=u&&o.push({from:c.from,to:c.from+f.length,insert:u})}return o.length?[O,{changes:o,sequential:!0}]:O})}var Ho=Z.define(),te=new R;function me(O){let e=O.firstChild,t=O.lastChild;return e&&e.tot)continue;if(n&&a.from=e&&l.to>t&&(n=l)}}return n}function TX(O){let e=O.lastChild;return e&&e.to==O.to&&e.type.isError}function Ln(O,e,t){for(let i of O.facet(Ho)){let r=i(O,e,t);if(r)return r}return XX(O,e,t)}function hu(O,e){let t=e.mapPos(O.from,1),i=e.mapPos(O.to,-1);return t>=i?void 0:{from:t,to:i}}var Bn=V.define({map:hu}),cr=V.define({map:hu});function fu(O){let e=[];for(let{head:t}of O.state.selection.ranges)e.some(i=>i.from<=t&&i.to>=t)||e.push(O.lineBlockAt(t));return e}var vO=ce.define({create(){return Y.none},update(O,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((t,i)=>O=Ou(O,t,i)),O=O.map(e.changes);for(let t of e.effects)if(t.is(Bn)&&!bX(O,t.value.from,t.value.to)){let{preparePlaceholder:i}=e.state.facet(Ko),r=i?Y.replace({widget:new Do(i(e.state,t.value))}):iu;O=O.update({add:[r.range(t.value.from,t.value.to)]})}else t.is(cr)&&(O=O.update({filter:(i,r)=>t.value.from!=i||t.value.to!=r,filterFrom:t.value.from,filterTo:t.value.to}));return e.selection&&(O=Ou(O,e.selection.main.head)),O},provide:O=>T.decorations.from(O),toJSON(O,e){let t=[];return O.between(0,e.doc.length,(i,r)=>{t.push(i,r)}),t},fromJSON(O){if(!Array.isArray(O)||O.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let t=0;t{re&&(i=!0)}),i?O.update({filterFrom:e,filterTo:t,filter:(r,n)=>r>=t||n<=e}):O}function Mn(O,e,t){var i;let r=null;return(i=O.field(vO,!1))===null||i===void 0||i.between(e,t,(n,s)=>{(!r||r.from>n)&&(r={from:n,to:s})}),r}function bX(O,e,t){let i=!1;return O.between(e,e,(r,n)=>{r==e&&n==t&&(i=!0)}),i}function du(O,e){return O.field(vO,!1)?e:e.concat(V.appendConfig.of($u()))}var yX=O=>{for(let e of fu(O)){let t=Ln(O.state,e.from,e.to);if(t)return O.dispatch({effects:du(O.state,[Bn.of(t),uu(O,t)])}),!0}return!1},xX=O=>{if(!O.state.field(vO,!1))return!1;let e=[];for(let t of fu(O)){let i=Mn(O.state,t.from,t.to);i&&e.push(cr.of(i),uu(O,i,!1))}return e.length&&O.dispatch({effects:e}),e.length>0};function uu(O,e,t=!0){let i=O.state.doc.lineAt(e.from).number,r=O.state.doc.lineAt(e.to).number;return T.announce.of(`${O.state.phrase(t?"Folded lines":"Unfolded lines")} ${i} ${O.state.phrase("to")} ${r}.`)}var kX=O=>{let{state:e}=O,t=[];for(let i=0;i{let e=O.state.field(vO,!1);if(!e||!e.size)return!1;let t=[];return e.between(0,O.state.doc.length,(i,r)=>{t.push(cr.of({from:i,to:r}))}),O.dispatch({effects:t}),!0};var Qu=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:yX},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:xX},{key:"Ctrl-Alt-[",run:kX},{key:"Ctrl-Alt-]",run:wX}],ZX={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},Ko=Z.define({combine(O){return xe(O,ZX)}});function $u(O){let e=[vO,YX];return O&&e.push(Ko.of(O)),e}function pu(O,e){let{state:t}=O,i=t.facet(Ko),r=s=>{let a=O.lineBlockAt(O.posAtDOM(s.target)),o=Mn(O.state,a.from,a.to);o&&O.dispatch({effects:cr.of(o)}),s.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(O,r,e);let n=document.createElement("span");return n.textContent=i.placeholderText,n.setAttribute("aria-label",t.phrase("folded code")),n.title=t.phrase("unfold"),n.className="cm-foldPlaceholder",n.onclick=r,n}var iu=Y.replace({widget:new class extends _e{toDOM(O){return pu(O,null)}}}),Do=class extends _e{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return pu(e,this.value)}},vX={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},rr=class extends Ie{constructor(e,t){super(),this.config=e,this.open=t}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let t=document.createElement("span");return t.textContent=this.open?this.config.openText:this.config.closedText,t.title=e.state.phrase(this.open?"Fold line":"Unfold line"),t}};function mu(O={}){let e={...vX,...O},t=new rr(e,!0),i=new rr(e,!1),r=he.fromClass(class{constructor(s){this.from=s.viewport.from,this.markers=this.buildMarkers(s)}update(s){(s.docChanged||s.viewportChanged||s.startState.facet(rO)!=s.state.facet(rO)||s.startState.field(vO,!1)!=s.state.field(vO,!1)||U(s.startState)!=U(s.state)||e.foldingChanged(s))&&(this.markers=this.buildMarkers(s.view))}buildMarkers(s){let a=new Le;for(let o of s.viewportLineBlocks){let l=Mn(s.state,o.from,o.to)?i:Ln(s.state,o.from,o.to)?t:null;l&&a.add(o.from,o.from,l)}return a.finish()}}),{domEventHandlers:n}=e;return[r,bo({class:"cm-foldGutter",markers(s){var a;return((a=s.plugin(r))===null||a===void 0?void 0:a.markers)||M.empty},initialSpacer(){return new rr(e,!1)},domEventHandlers:{...n,click:(s,a,o)=>{if(n.click&&n.click(s,a,o))return!0;let l=Mn(s.state,a.from,a.to);if(l)return s.dispatch({effects:cr.of(l)}),!0;let c=Ln(s.state,a.from,a.to);return c?(s.dispatch({effects:Bn.of(c)}),!0):!1}}}),$u()]}var YX=T.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),ci=class O{constructor(e,t){this.specs=e;let i;function r(a){let o=Ot.newName();return(i||(i=Object.create(null)))["."+o]=a,o}let n=typeof t.all=="string"?t.all:t.all?r(t.all):void 0,s=t.scope;this.scope=s instanceof Re?a=>a.prop(iO)==s.data:s?a=>a==s:void 0,this.style=jo(e.map(a=>({tag:a.tag,class:a.class||r(Object.assign({},a,{tag:null}))})),{all:n}).style,this.module=i?new Ot(i):null,this.themeType=t.themeType}static define(e,t){return new O(e,t||{})}},Io=Z.define(),gu=Z.define({combine(O){return O.length?[O[0]]:null}});function Eo(O){let e=O.facet(Io);return e.length?e:O.facet(gu)}function Nn(O,e){let t=[_X],i;return O instanceof ci&&(O.module&&t.push(T.styleModule.of(O.module)),i=O.themeType),e?.fallback?t.push(gu.of(O)):i?t.push(Io.computeN([T.darkTheme],r=>r.facet(T.darkTheme)==(i=="dark")?[O]:[])):t.push(Io.of(O)),t}var Bo=class{constructor(e){this.markCache=Object.create(null),this.tree=U(e.state),this.decorations=this.buildDeco(e,Eo(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=U(e.state),i=Eo(e.state),r=i!=Eo(e.startState),{viewport:n}=e.view,s=e.changes.mapPos(this.decoratedTo,1);t.length=n.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=s):(t!=this.tree||e.viewportChanged||r)&&(this.tree=t,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=n.to)}buildDeco(e,t){if(!t||!this.tree.length)return Y.none;let i=new Le;for(let{from:r,to:n}of e.visibleRanges)Jd(this.tree,t,(s,a,o)=>{i.add(s,a,this.markCache[o]||(this.markCache[o]=Y.mark({class:o})))},r,n);return i.finish()}},_X=ze.high(he.fromClass(Bo,{decorations:O=>O.decorations})),Pu=ci.define([{tag:d.meta,color:"#404740"},{tag:d.link,textDecoration:"underline"},{tag:d.heading,textDecoration:"underline",fontWeight:"bold"},{tag:d.emphasis,fontStyle:"italic"},{tag:d.strong,fontWeight:"bold"},{tag:d.strikethrough,textDecoration:"line-through"},{tag:d.keyword,color:"#708"},{tag:[d.atom,d.bool,d.url,d.contentSeparator,d.labelName],color:"#219"},{tag:[d.literal,d.inserted],color:"#164"},{tag:[d.string,d.deleted],color:"#a11"},{tag:[d.regexp,d.escape,d.special(d.string)],color:"#e40"},{tag:d.definition(d.variableName),color:"#00f"},{tag:d.local(d.variableName),color:"#30a"},{tag:[d.typeName,d.namespace],color:"#085"},{tag:d.className,color:"#167"},{tag:[d.special(d.variableName),d.macroName],color:"#256"},{tag:d.definition(d.propertyName),color:"#00c"},{tag:d.comment,color:"#940"},{tag:d.invalid,color:"#f00"}]),RX=T.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Su=1e4,Xu="()[]{}",Tu=Z.define({combine(O){return xe(O,{afterCursor:!0,brackets:Xu,maxScanDistance:Su,renderMatch:zX})}}),VX=Y.mark({class:"cm-matchingBracket"}),qX=Y.mark({class:"cm-nonmatchingBracket"});function zX(O){let e=[],t=O.matched?VX:qX;return e.push(t.range(O.start.from,O.start.to)),O.end&&e.push(t.range(O.end.from,O.end.to)),e}var UX=ce.define({create(){return Y.none},update(O,e){if(!e.docChanged&&!e.selection)return O;let t=[],i=e.state.facet(Tu);for(let r of e.state.selection.ranges){if(!r.empty)continue;let n=dt(e.state,r.head,-1,i)||r.head>0&&dt(e.state,r.head-1,1,i)||i.afterCursor&&(dt(e.state,r.head,1,i)||r.headT.decorations.from(O)}),WX=[UX,RX];function bu(O={}){return[Tu.of(O),WX]}var hr=new R;function No(O,e,t){let i=O.prop(e<0?R.openedBy:R.closedBy);if(i)return i;if(O.name.length==1){let r=t.indexOf(O.name);if(r>-1&&r%2==(e<0?1:0))return[t[r+e]]}return null}function Fo(O){let e=O.type.prop(hr);return e?e(O.node):O}function dt(O,e,t,i={}){let r=i.maxScanDistance||Su,n=i.brackets||Xu,s=U(O),a=s.resolveInner(e,t);for(let o=a;o;o=o.parent){let l=No(o.type,t,n);if(l&&o.from0?e>=c.from&&ec.from&&e<=c.to))return jX(O,e,t,o,c,l,n)}}return CX(O,e,t,s,a.type,r,n)}function jX(O,e,t,i,r,n,s){let a=i.parent,o={from:r.from,to:r.to},l=0,c=a?.cursor();if(c&&(t<0?c.childBefore(i.from):c.childAfter(i.to)))do if(t<0?c.to<=i.from:c.from>=i.to){if(l==0&&n.indexOf(c.type.name)>-1&&c.from0)return null;let l={from:t<0?e-1:e,to:t>0?e+1:e},c=O.doc.iterRange(e,t>0?O.doc.length:0),h=0;for(let f=0;!c.next().done&&f<=n;){let u=c.value;t<0&&(f+=u.length);let Q=e+f*t;for(let $=t>0?0:u.length-1,p=t>0?u.length:-1;$!=p;$+=t){let m=s.indexOf(u[$]);if(!(m<0||i.resolveInner(Q+$,1).type!=r))if(m%2==0==t>0)h++;else{if(h==1)return{start:l,end:{from:Q+$,to:Q+$+1},matched:m>>1==o>>1};h--}}t>0&&(f+=u.length)}return c.done?{start:l,matched:!1}:null}var GX=Object.create(null),ru=[ue.none];var nu=[],su=Object.create(null),EX=Object.create(null);for(let[O,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])EX[O]=AX(GX,e);function Ao(O,e){nu.indexOf(O)>-1||(nu.push(O),console.warn(e))}function AX(O,e){let t=[];for(let a of e.split(" ")){let o=[];for(let l of a.split(".")){let c=O[l]||d[l];c?typeof c=="function"?o.length?o=o.map(c):Ao(l,`Modifier ${l} used at start of tag`):o.length?Ao(l,`Tag ${l} used as modifier`):o=Array.isArray(c)?c:[c]:Ao(l,`Unknown highlighting tag ${l}`)}for(let l of o)t.push(l)}if(!t.length)return 0;let i=e.replace(/ /g,"_"),r=i+" "+t.map(a=>a.id),n=su[r];if(n)return n.id;let s=su[r]=ue.define({id:ru.length,name:i,props:[F({[i]:t})]});return ru.push(s),s.id}var Q_={rtl:Y.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:H.RTL}),ltr:Y.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:H.LTR}),auto:Y.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var LX=O=>{let{state:e}=O,t=e.doc.lineAt(e.selection.main.from),i=nl(O.state,t.from);return i.line?MX(O):i.block?IX(O):!1};function rl(O,e){return({state:t,dispatch:i})=>{if(t.readOnly)return!1;let r=O(e,t);return r?(i(t.update(r)),!0):!1}}var MX=rl(FX,0);var DX=rl(Ru,0);var IX=rl((O,e)=>Ru(O,e,NX(e)),0);function nl(O,e){let t=O.languageDataAt("commentTokens",e,1);return t.length?t[0]:{}}var fr=50;function BX(O,{open:e,close:t},i,r){let n=O.sliceDoc(i-fr,i),s=O.sliceDoc(r,r+fr),a=/\s*$/.exec(n)[0].length,o=/^\s*/.exec(s)[0].length,l=n.length-a;if(n.slice(l-e.length,l)==e&&s.slice(o,o+t.length)==t)return{open:{pos:i-a,margin:a&&1},close:{pos:r+o,margin:o&&1}};let c,h;r-i<=2*fr?c=h=O.sliceDoc(i,r):(c=O.sliceDoc(i,i+fr),h=O.sliceDoc(r-fr,r));let f=/^\s*/.exec(c)[0].length,u=/\s*$/.exec(h)[0].length,Q=h.length-u-t.length;return c.slice(f,f+e.length)==e&&h.slice(Q,Q+t.length)==t?{open:{pos:i+f+e.length,margin:/\s/.test(c.charAt(f+e.length))?1:0},close:{pos:r-u-t.length,margin:/\s/.test(h.charAt(Q-1))?1:0}}:null}function NX(O){let e=[];for(let t of O.selection.ranges){let i=O.doc.lineAt(t.from),r=t.to<=i.to?i:O.doc.lineAt(t.to);r.from>i.from&&r.from==t.to&&(r=t.to==i.to+1?i:O.doc.lineAt(t.to-1));let n=e.length-1;n>=0&&e[n].to>i.from?e[n].to=r.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:r.to})}return e}function Ru(O,e,t=e.selection.ranges){let i=t.map(n=>nl(e,n.from).block);if(!i.every(n=>n))return null;let r=t.map((n,s)=>BX(e,i[s],n.from,n.to));if(O!=2&&!r.every(n=>n))return{changes:e.changes(t.map((n,s)=>r[s]?[]:[{from:n.from,insert:i[s].open+" "},{from:n.to,insert:" "+i[s].close}]))};if(O!=1&&r.some(n=>n)){let n=[];for(let s=0,a;sr&&(n==s||s>h.from)){r=h.from;let f=/^\s*/.exec(h.text)[0].length,u=f==h.length,Q=h.text.slice(f,f+l.length)==l?f:-1;fn.comment<0&&(!n.empty||n.single))){let n=[];for(let{line:a,token:o,indent:l,empty:c,single:h}of i)(h||!c)&&n.push({from:a.from+l,insert:o+" "});let s=e.changes(n);return{changes:s,selection:e.selection.map(s,1)}}else if(O!=1&&i.some(n=>n.comment>=0)){let n=[];for(let{line:s,comment:a,token:o}of i)if(a>=0){let l=s.from+a,c=l+o.length;s.text[c-s.from]==" "&&c++,n.push({from:l,to:c})}return{changes:n}}return null}var el=qe.define(),HX=qe.define(),KX=Z.define(),Vu=Z.define({combine(O){return xe(O,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(i,r)=>e(i,r)||t(i,r)})}}),qu=ce.define({create(){return YO.empty},update(O,e){let t=e.state.facet(Vu),i=e.annotation(el);if(i){let o=ut.fromTransaction(e,i.selection),l=i.side,c=l==0?O.undone:O.done;return o?c=Hn(c,c.length,t.minDepth,o):c=ju(c,e.startState.selection),new YO(l==0?i.rest:c,l==0?c:i.rest)}let r=e.annotation(HX);if((r=="full"||r=="before")&&(O=O.isolate()),e.annotation(Qe.addToHistory)===!1)return e.changes.empty?O:O.addMapping(e.changes.desc);let n=ut.fromTransaction(e),s=e.annotation(Qe.time),a=e.annotation(Qe.userEvent);return n?O=O.addChanges(n,s,a,t,e):e.selection&&(O=O.addSelection(e.startState.selection,s,a,t.newGroupDelay)),(r=="full"||r=="after")&&(O=O.isolate()),O},toJSON(O){return{done:O.done.map(e=>e.toJSON()),undone:O.undone.map(e=>e.toJSON())}},fromJSON(O){return new YO(O.done.map(ut.fromJSON),O.undone.map(ut.fromJSON))}});function zu(O={}){return[qu,Vu.of(O),T.domEventHandlers({beforeinput(e,t){let i=e.inputType=="historyUndo"?Uu:e.inputType=="historyRedo"?tl:null;return i?(e.preventDefault(),i(t)):!1}})]}function Kn(O,e){return function({state:t,dispatch:i}){if(!e&&t.readOnly)return!1;let r=t.field(qu,!1);if(!r)return!1;let n=r.pop(O,t,e);return n?(i(n),!0):!1}}var Uu=Kn(0,!1),tl=Kn(1,!1),JX=Kn(0,!0),eT=Kn(1,!0);var ut=class O{constructor(e,t,i,r,n){this.changes=e,this.effects=t,this.mapped=i,this.startSelection=r,this.selectionsAfter=n}setSelAfter(e){return new O(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,t,i;return{changes:(e=this.changes)===null||e===void 0?void 0:e.toJSON(),mapped:(t=this.mapped)===null||t===void 0?void 0:t.toJSON(),startSelection:(i=this.startSelection)===null||i===void 0?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map(r=>r.toJSON())}}static fromJSON(e){return new O(e.changes&&Ze.fromJSON(e.changes),[],e.mapped&&vt.fromJSON(e.mapped),e.startSelection&&S.fromJSON(e.startSelection),e.selectionsAfter.map(S.fromJSON))}static fromTransaction(e,t){let i=st;for(let r of e.startState.facet(KX)){let n=r(e);n.length&&(i=i.concat(n))}return!i.length&&e.changes.empty?null:new O(e.changes.invert(e.startState.doc),i,void 0,t||e.startState.selection,st)}static selection(e){return new O(void 0,st,void 0,void 0,e)}};function Hn(O,e,t,i){let r=e+1>t+20?e-t-1:0,n=O.slice(r,e);return n.push(i),n}function tT(O,e){let t=[],i=!1;return O.iterChangedRanges((r,n)=>t.push(r,n)),e.iterChangedRanges((r,n,s,a)=>{for(let o=0;o=l&&s<=c&&(i=!0)}}),i}function OT(O,e){return O.ranges.length==e.ranges.length&&O.ranges.filter((t,i)=>t.empty!=e.ranges[i].empty).length===0}function Wu(O,e){return O.length?e.length?O.concat(e):O:e}var st=[],iT=200;function ju(O,e){if(O.length){let t=O[O.length-1],i=t.selectionsAfter.slice(Math.max(0,t.selectionsAfter.length-iT));return i.length&&i[i.length-1].eq(e)?O:(i.push(e),Hn(O,O.length-1,1e9,t.setSelAfter(i)))}else return[ut.selection([e])]}function rT(O){let e=O[O.length-1],t=O.slice();return t[O.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),t}function Jo(O,e){if(!O.length)return O;let t=O.length,i=st;for(;t;){let r=nT(O[t-1],e,i);if(r.changes&&!r.changes.empty||r.effects.length){let n=O.slice(0,t);return n[t-1]=r,n}else e=r.mapped,t--,i=r.selectionsAfter}return i.length?[ut.selection(i)]:st}function nT(O,e,t){let i=Wu(O.selectionsAfter.length?O.selectionsAfter.map(a=>a.map(e)):st,t);if(!O.changes)return ut.selection(i);let r=O.changes.map(e),n=e.mapDesc(O.changes,!0),s=O.mapped?O.mapped.composeDesc(n):n;return new ut(r,V.mapEffects(O.effects,e),s,O.startSelection.map(n),i)}var sT=/^(input\.type|delete)($|\.)/,YO=class O{constructor(e,t,i=0,r=void 0){this.done=e,this.undone=t,this.prevTime=i,this.prevUserEvent=r}isolate(){return this.prevTime?new O(this.done,this.undone):this}addChanges(e,t,i,r,n){let s=this.done,a=s[s.length-1];return a&&a.changes&&!a.changes.empty&&e.changes&&(!i||sT.test(i))&&(!a.selectionsAfter.length&&t-this.prevTime0&&t-this.prevTimet.empty?O.moveByChar(t,e):Jn(t,e))}function ke(O){return O.textDirectionAt(O.state.selection.main.head)==H.LTR}var Eu=O=>Gu(O,!ke(O)),Au=O=>Gu(O,ke(O));function Lu(O,e){return $t(O,t=>t.empty?O.moveByGroup(t,e):Jn(t,e))}var aT=O=>Lu(O,!ke(O)),oT=O=>Lu(O,ke(O));var b_=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function lT(O,e,t){if(e.type.prop(t))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(O.sliceDoc(e.from,e.to)))||e.firstChild}function es(O,e,t){let i=U(O).resolveInner(e.head),r=t?R.closedBy:R.openedBy;for(let o=e.head;;){let l=t?i.childAfter(o):i.childBefore(o);if(!l)break;lT(O,l,r)?i=l:o=t?l.to:l.from}let n=i.type.prop(r),s,a;return n&&(s=t?dt(O,i.from,1):dt(O,i.to,-1))&&s.matched?a=t?s.end.to:s.end.from:a=t?i.to:i.from,S.cursor(a,t?-1:1)}var cT=O=>$t(O,e=>es(O.state,e,!ke(O))),hT=O=>$t(O,e=>es(O.state,e,ke(O)));function Mu(O,e){return $t(O,t=>{if(!t.empty)return Jn(t,e);let i=O.moveVertically(t,e);return i.head!=t.head?i:O.moveToLineBoundary(t,e)})}var Du=O=>Mu(O,!1),Iu=O=>Mu(O,!0);function Bu(O){let e=O.scrollDOM.clientHeights.empty?O.moveVertically(s,e,t.height):Jn(s,e));if(r.eq(i.selection))return!1;let n;if(t.selfScroll){let s=O.coordsAtPos(i.selection.main.head),a=O.scrollDOM.getBoundingClientRect(),o=a.top+t.marginTop,l=a.bottom-t.marginBottom;s&&s.top>o&&s.bottomNu(O,!1),Ol=O=>Nu(O,!0);function aO(O,e,t){let i=O.lineBlockAt(e.head),r=O.moveToLineBoundary(e,t);if(r.head==e.head&&r.head!=(t?i.to:i.from)&&(r=O.moveToLineBoundary(e,t,!1)),!t&&r.head==i.from&&i.length){let n=/^\s*/.exec(O.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;n&&e.head!=i.from+n&&(r=S.cursor(i.from+n))}return r}var fT=O=>$t(O,e=>aO(O,e,!0)),dT=O=>$t(O,e=>aO(O,e,!1)),uT=O=>$t(O,e=>aO(O,e,!ke(O))),QT=O=>$t(O,e=>aO(O,e,ke(O))),$T=O=>$t(O,e=>S.cursor(O.lineBlockAt(e.head).from,1)),pT=O=>$t(O,e=>S.cursor(O.lineBlockAt(e.head).to,-1));function mT(O,e,t){let i=!1,r=fi(O.selection,n=>{let s=dt(O,n.head,-1)||dt(O,n.head,1)||n.head>0&&dt(O,n.head-1,1)||n.headmT(O,e,!1);function at(O,e){let t=fi(O.state.selection,i=>{let r=e(i);return S.range(i.anchor,r.head,r.goalColumn,r.bidiLevel||void 0)});return t.eq(O.state.selection)?!1:(O.dispatch(Qt(O.state,t)),!0)}function Fu(O,e){return at(O,t=>O.moveByChar(t,e))}var Hu=O=>Fu(O,!ke(O)),Ku=O=>Fu(O,ke(O));function Ju(O,e){return at(O,t=>O.moveByGroup(t,e))}var PT=O=>Ju(O,!ke(O)),ST=O=>Ju(O,ke(O));var XT=O=>at(O,e=>es(O.state,e,!ke(O))),TT=O=>at(O,e=>es(O.state,e,ke(O)));function eQ(O,e){return at(O,t=>O.moveVertically(t,e))}var tQ=O=>eQ(O,!1),OQ=O=>eQ(O,!0);function iQ(O,e){return at(O,t=>O.moveVertically(t,e,Bu(O).height))}var xu=O=>iQ(O,!1),ku=O=>iQ(O,!0),bT=O=>at(O,e=>aO(O,e,!0)),yT=O=>at(O,e=>aO(O,e,!1)),xT=O=>at(O,e=>aO(O,e,!ke(O))),kT=O=>at(O,e=>aO(O,e,ke(O))),wT=O=>at(O,e=>S.cursor(O.lineBlockAt(e.head).from)),ZT=O=>at(O,e=>S.cursor(O.lineBlockAt(e.head).to)),wu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:0})),!0),Zu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:O.doc.length})),!0),vu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:O.selection.main.anchor,head:0})),!0),Yu=({state:O,dispatch:e})=>(e(Qt(O,{anchor:O.selection.main.anchor,head:O.doc.length})),!0),vT=({state:O,dispatch:e})=>(e(O.update({selection:{anchor:0,head:O.doc.length},userEvent:"select"})),!0),YT=({state:O,dispatch:e})=>{let t=ts(O).map(({from:i,to:r})=>S.range(i,Math.min(r+1,O.doc.length)));return e(O.update({selection:S.create(t),userEvent:"select"})),!0},_T=({state:O,dispatch:e})=>{let t=fi(O.selection,i=>{let r=U(O),n=r.resolveStack(i.from,1);if(i.empty){let s=r.resolveStack(i.from,-1);s.node.from>=n.node.from&&s.node.to<=n.node.to&&(n=s)}for(let s=n;s;s=s.next){let{node:a}=s;if((a.from=i.to||a.to>i.to&&a.from<=i.from)&&s.next)return S.range(a.to,a.from)}return i});return t.eq(O.selection)?!1:(e(Qt(O,t)),!0)};function rQ(O,e){let{state:t}=O,i=t.selection,r=t.selection.ranges.slice();for(let n of t.selection.ranges){let s=t.doc.lineAt(n.head);if(e?s.to0)for(let a=n;;){let o=O.moveVertically(a,e);if(o.heads.to){r.some(l=>l.head==o.head)||r.push(o);break}else{if(o.head==a.head)break;a=o}}}return r.length==i.ranges.length?!1:(O.dispatch(Qt(t,S.create(r,r.length-1))),!0)}var RT=O=>rQ(O,!1),VT=O=>rQ(O,!0),qT=({state:O,dispatch:e})=>{let t=O.selection,i=null;return t.ranges.length>1?i=S.create([t.main]):t.main.empty||(i=S.create([S.cursor(t.main.head)])),i?(e(Qt(O,i)),!0):!1};function dr(O,e){if(O.state.readOnly)return!1;let t="delete.selection",{state:i}=O,r=i.changeByRange(n=>{let{from:s,to:a}=n;if(s==a){let o=e(n);os&&(t="delete.forward",o=Fn(O,o,!0)),s=Math.min(s,o),a=Math.max(a,o)}else s=Fn(O,s,!1),a=Fn(O,a,!0);return s==a?{range:n}:{changes:{from:s,to:a},range:S.cursor(s,sr(O)))i.between(e,e,(r,n)=>{re&&(e=t?n:r)});return e}var nQ=(O,e,t)=>dr(O,i=>{let r=i.from,{state:n}=O,s=n.doc.lineAt(r),a,o;if(t&&!e&&r>s.from&&rnQ(O,!1,!0);var sQ=O=>nQ(O,!0,!1),aQ=(O,e)=>dr(O,t=>{let i=t.head,{state:r}=O,n=r.doc.lineAt(i),s=r.charCategorizer(i);for(let a=null;;){if(i==(e?n.to:n.from)){i==t.head&&n.number!=(e?r.doc.lines:1)&&(i+=e?1:-1);break}let o=fe(n.text,i-n.from,e)+n.from,l=n.text.slice(Math.min(i,o)-n.from,Math.max(i,o)-n.from),c=s(l);if(a!=null&&c!=a)break;(l!=" "||i!=t.head)&&(a=c),i=o}return i}),oQ=O=>aQ(O,!1),zT=O=>aQ(O,!0);var UT=O=>dr(O,e=>{let t=O.lineBlockAt(e.head).to;return e.headdr(O,e=>{let t=O.moveToLineBoundary(e,!1).head;return e.head>t?t:Math.max(0,e.head-1)}),jT=O=>dr(O,e=>{let t=O.moveToLineBoundary(e,!0).head;return e.head{if(O.readOnly)return!1;let t=O.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:E.of(["",""])},range:S.cursor(i.from)}));return e(O.update(t,{scrollIntoView:!0,userEvent:"input"})),!0},GT=({state:O,dispatch:e})=>{if(O.readOnly)return!1;let t=O.changeByRange(i=>{if(!i.empty||i.from==0||i.from==O.doc.length)return{range:i};let r=i.from,n=O.doc.lineAt(r),s=r==n.from?r-1:fe(n.text,r-n.from,!1)+n.from,a=r==n.to?r+1:fe(n.text,r-n.from,!0)+n.from;return{changes:{from:s,to:a,insert:O.doc.slice(r,a).append(O.doc.slice(s,r))},range:S.cursor(a)}});return t.changes.empty?!1:(e(O.update(t,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function ts(O){let e=[],t=-1;for(let i of O.selection.ranges){let r=O.doc.lineAt(i.from),n=O.doc.lineAt(i.to);if(!i.empty&&i.to==n.from&&(n=O.doc.lineAt(i.to-1)),t>=r.number){let s=e[e.length-1];s.to=n.to,s.ranges.push(i)}else e.push({from:r.from,to:n.to,ranges:[i]});t=n.number+1}return e}function lQ(O,e,t){if(O.readOnly)return!1;let i=[],r=[];for(let n of ts(O)){if(t?n.to==O.doc.length:n.from==0)continue;let s=O.doc.lineAt(t?n.to+1:n.from-1),a=s.length+1;if(t){i.push({from:n.to,to:s.to},{from:n.from,insert:s.text+O.lineBreak});for(let o of n.ranges)r.push(S.range(Math.min(O.doc.length,o.anchor+a),Math.min(O.doc.length,o.head+a)))}else{i.push({from:s.from,to:n.from},{from:n.to,insert:O.lineBreak+s.text});for(let o of n.ranges)r.push(S.range(o.anchor-a,o.head-a))}}return i.length?(e(O.update({changes:i,scrollIntoView:!0,selection:S.create(r,O.selection.mainIndex),userEvent:"move.line"})),!0):!1}var ET=({state:O,dispatch:e})=>lQ(O,e,!1),AT=({state:O,dispatch:e})=>lQ(O,e,!0);function cQ(O,e,t){if(O.readOnly)return!1;let i=[];for(let n of ts(O))t?i.push({from:n.from,insert:O.doc.slice(n.from,n.to)+O.lineBreak}):i.push({from:n.to,insert:O.lineBreak+O.doc.slice(n.from,n.to)});let r=O.changes(i);return e(O.update({changes:r,selection:O.selection.map(r,t?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var LT=({state:O,dispatch:e})=>cQ(O,e,!1),MT=({state:O,dispatch:e})=>cQ(O,e,!0),DT=O=>{if(O.state.readOnly)return!1;let{state:e}=O,t=e.changes(ts(e).map(({from:r,to:n})=>(r>0?r--:n{let n;if(O.lineWrapping){let s=O.lineBlockAt(r.head),a=O.coordsAtPos(r.head,r.assoc||1);a&&(n=s.bottom+O.documentTop-a.bottom+O.defaultLineHeight/2)}return O.moveVertically(r,!0,n)}).map(t);return O.dispatch({changes:t,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function IT(O,e){if(/\(\)|\[\]|\{\}/.test(O.sliceDoc(e-1,e+1)))return{from:e,to:e};let t=U(O).resolveInner(e),i=t.childBefore(e),r=t.childAfter(e),n;return i&&r&&i.to<=e&&r.from>=e&&(n=i.type.prop(R.closedBy))&&n.indexOf(r.name)>-1&&O.doc.lineAt(i.to).from==O.doc.lineAt(r.from).from&&!/\S/.test(O.sliceDoc(i.to,r.from))?{from:i.to,to:r.from}:null}var _u=hQ(!1),BT=hQ(!0);function hQ(O){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=e.changeByRange(r=>{let{from:n,to:s}=r,a=e.doc.lineAt(n),o=!O&&n==s&&IT(e,n);O&&(n=s=(s<=a.to?a:e.doc.lineAt(s)).to);let l=new ZO(e,{simulateBreak:n,simulateDoubleBreak:!!o}),c=In(l,n);for(c==null&&(c=ve(/^\s*/.exec(e.doc.lineAt(n).text)[0],e.tabSize));sa.from&&n{let r=[];for(let s=i.from;s<=i.to;){let a=O.doc.lineAt(s);a.number>t&&(i.empty||i.to>a.from)&&(e(a,r,i),t=a.number),s=a.to+1}let n=O.changes(r);return{changes:r,range:S.range(n.mapPos(i.anchor,1),n.mapPos(i.head,1))}})}var NT=({state:O,dispatch:e})=>{if(O.readOnly)return!1;let t=Object.create(null),i=new ZO(O,{overrideIndentation:n=>{let s=t[n];return s??-1}}),r=sl(O,(n,s,a)=>{let o=In(i,n.from);if(o==null)return;/\S/.test(n.text)||(o=0);let l=/^\s*/.exec(n.text)[0],c=hi(O,o);(l!=c||a.fromO.readOnly?!1:(e(O.update(sl(O,(t,i)=>{i.push({from:t.from,insert:O.facet(nO)})}),{userEvent:"input.indent"})),!0),dQ=({state:O,dispatch:e})=>O.readOnly?!1:(e(O.update(sl(O,(t,i)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let n=ve(r,O.tabSize),s=0,a=hi(O,Math.max(0,n-lr(O)));for(;s(O.setTabFocusMode(),!0);var HT=[{key:"Ctrl-b",run:Eu,shift:Hu,preventDefault:!0},{key:"Ctrl-f",run:Au,shift:Ku},{key:"Ctrl-p",run:Du,shift:tQ},{key:"Ctrl-n",run:Iu,shift:OQ},{key:"Ctrl-a",run:$T,shift:wT},{key:"Ctrl-e",run:pT,shift:ZT},{key:"Ctrl-d",run:sQ},{key:"Ctrl-h",run:il},{key:"Ctrl-k",run:UT},{key:"Ctrl-Alt-h",run:oQ},{key:"Ctrl-o",run:CT},{key:"Ctrl-t",run:GT},{key:"Ctrl-v",run:Ol}],KT=[{key:"ArrowLeft",run:Eu,shift:Hu,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:aT,shift:PT,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:uT,shift:xT,preventDefault:!0},{key:"ArrowRight",run:Au,shift:Ku,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:oT,shift:ST,preventDefault:!0},{mac:"Cmd-ArrowRight",run:QT,shift:kT,preventDefault:!0},{key:"ArrowUp",run:Du,shift:tQ,preventDefault:!0},{mac:"Cmd-ArrowUp",run:wu,shift:vu},{mac:"Ctrl-ArrowUp",run:yu,shift:xu},{key:"ArrowDown",run:Iu,shift:OQ,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Zu,shift:Yu},{mac:"Ctrl-ArrowDown",run:Ol,shift:ku},{key:"PageUp",run:yu,shift:xu},{key:"PageDown",run:Ol,shift:ku},{key:"Home",run:dT,shift:yT,preventDefault:!0},{key:"Mod-Home",run:wu,shift:vu},{key:"End",run:fT,shift:bT,preventDefault:!0},{key:"Mod-End",run:Zu,shift:Yu},{key:"Enter",run:_u,shift:_u},{key:"Mod-a",run:vT},{key:"Backspace",run:il,shift:il,preventDefault:!0},{key:"Delete",run:sQ,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:oQ,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:zT,preventDefault:!0},{mac:"Mod-Backspace",run:WT,preventDefault:!0},{mac:"Mod-Delete",run:jT,preventDefault:!0}].concat(HT.map(O=>({mac:O.key,run:O.run,shift:O.shift}))),uQ=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:cT,shift:XT},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:hT,shift:TT},{key:"Alt-ArrowUp",run:ET},{key:"Shift-Alt-ArrowUp",run:LT},{key:"Alt-ArrowDown",run:AT},{key:"Shift-Alt-ArrowDown",run:MT},{key:"Mod-Alt-ArrowUp",run:RT},{key:"Mod-Alt-ArrowDown",run:VT},{key:"Escape",run:qT},{key:"Mod-Enter",run:BT},{key:"Alt-l",mac:"Ctrl-l",run:YT},{key:"Mod-i",run:_T,preventDefault:!0},{key:"Mod-[",run:dQ},{key:"Mod-]",run:fQ},{key:"Mod-Alt-\\",run:NT},{key:"Shift-Mod-k",run:DT},{key:"Shift-Mod-\\",run:gT},{key:"Mod-/",run:LX},{key:"Alt-A",run:DX},{key:"Ctrl-m",mac:"Shift-Alt-m",run:FT}].concat(KT),QQ={key:"Tab",run:fQ,shift:dQ};var $Q=typeof String.prototype.normalize=="function"?O=>O.normalize("NFKD"):O=>O,lO=class{constructor(e,t,i=0,r=e.length,n,s){this.test=s,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,r),this.bufferStart=i,this.normalize=n?a=>n($Q(a)):$Q,this.query=this.normalize(t)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Se(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let t=Ri(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=Me(e);let r=this.normalize(t);if(r.length)for(let n=0,s=i;;n++){let a=r.charCodeAt(n),o=this.match(a,s,this.bufferPos+this.bufferStart);if(n==r.length-1){if(o)return this.value=o,this;break}s==i&&nthis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let t=this.matchPos<=this.to&&this.re.exec(this.curLine);if(t){let i=this.curLineStart+t.index,r=i+t[0].length;if(this.matchPos=as(this.text,r+(i==r?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,r,t)))return this.value={from:i,to:r,match:t},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||r.to<=t){let a=new O(t,e.sliceString(t,i));return al.set(e,a),a}if(r.from==t&&r.to==i)return r;let{text:n,from:s}=r;return s>t&&(n=e.sliceString(t,s)+n,s=t),r.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=this.re.exec(this.flat.text);if(t&&!t[0]&&t.index==e&&(this.re.lastIndex=e+1,t=this.re.exec(this.flat.text)),t){let i=this.flat.from+t.index,r=i+t[0].length;if((this.flat.to>=this.to||t.index+t[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,r,t)))return this.value={from:i,to:r,match:t},this.matchPos=as(this.text,r+(i==r?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=ns.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(rs.prototype[Symbol.iterator]=ss.prototype[Symbol.iterator]=function(){return this});function JT(O){try{return new RegExp(O,dl),!0}catch{return!1}}function as(O,e){if(e>=O.length)return e;let t=O.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}function ol(O){let e=String(O.state.doc.lineAt(O.state.selection.main.head).number),t=N("input",{class:"cm-textfield",name:"line",value:e}),i=N("form",{class:"cm-gotoLine",onkeydown:n=>{n.keyCode==27?(n.preventDefault(),O.dispatch({effects:ur.of(!1)}),O.focus()):n.keyCode==13&&(n.preventDefault(),r())},onsubmit:n=>{n.preventDefault(),r()}},N("label",O.state.phrase("Go to line"),": ",t)," ",N("button",{class:"cm-button",type:"submit"},O.state.phrase("go")),N("button",{name:"close",onclick:()=>{O.dispatch({effects:ur.of(!1)}),O.focus()},"aria-label":O.state.phrase("close"),type:"button"},["\xD7"]));function r(){let n=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(t.value);if(!n)return;let{state:s}=O,a=s.doc.lineAt(s.selection.main.head),[,o,l,c,h]=n,f=c?+c.slice(1):0,u=l?+l:a.number;if(l&&h){let p=u/100;o&&(p=p*(o=="-"?-1:1)+a.number/s.doc.lines),u=Math.round(s.doc.lines*p)}else l&&o&&(u=u*(o=="-"?-1:1)+a.number);let Q=s.doc.line(Math.max(1,Math.min(s.doc.lines,u))),$=S.cursor(Q.from+Math.max(0,Math.min(f,Q.length)));O.dispatch({effects:[ur.of(!1),T.scrollIntoView($.from,{y:"center"})],selection:$}),O.focus()}return{dom:i}}var ur=V.define(),pQ=ce.define({create(){return!0},update(O,e){for(let t of e.effects)t.is(ur)&&(O=t.value);return O},provide:O=>TO.from(O,e=>e?ol:null)}),e1=O=>{let e=bO(O,ol);if(!e){let t=[ur.of(!0)];O.state.field(pQ,!1)==null&&t.push(V.appendConfig.of([pQ,t1])),O.dispatch({effects:t}),e=bO(O,ol)}return e&&e.dom.querySelector("input").select(),!0},t1=T.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px",position:"relative","& label":{fontSize:"80%"},"& [name=close]":{position:"absolute",top:"0",bottom:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:"0"}}}),O1={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},SQ=Z.define({combine(O){return xe(O,O1,{highlightWordAroundCursor:(e,t)=>e||t,minSelectionLength:Math.min,maxMatches:Math.min})}});function XQ(O){let e=[a1,s1];return O&&e.push(SQ.of(O)),e}var i1=Y.mark({class:"cm-selectionMatch"}),r1=Y.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function mQ(O,e,t,i){return(t==0||O(e.sliceDoc(t-1,t))!=ee.Word)&&(i==e.doc.length||O(e.sliceDoc(i,i+1))!=ee.Word)}function n1(O,e,t,i){return O(e.sliceDoc(t,t+1))==ee.Word&&O(e.sliceDoc(i-1,i))==ee.Word}var s1=he.fromClass(class{constructor(O){this.decorations=this.getDeco(O)}update(O){(O.selectionSet||O.docChanged||O.viewportChanged)&&(this.decorations=this.getDeco(O.view))}getDeco(O){let e=O.state.facet(SQ),{state:t}=O,i=t.selection;if(i.ranges.length>1)return Y.none;let r=i.main,n,s=null;if(r.empty){if(!e.highlightWordAroundCursor)return Y.none;let o=t.wordAt(r.head);if(!o)return Y.none;s=t.charCategorizer(r.head),n=t.sliceDoc(o.from,o.to)}else{let o=r.to-r.from;if(o200)return Y.none;if(e.wholeWords){if(n=t.sliceDoc(r.from,r.to),s=t.charCategorizer(r.head),!(mQ(s,t,r.from,r.to)&&n1(s,t,r.from,r.to)))return Y.none}else if(n=t.sliceDoc(r.from,r.to),!n)return Y.none}let a=[];for(let o of O.visibleRanges){let l=new lO(t.doc,n,o.from,o.to);for(;!l.next().done;){let{from:c,to:h}=l.value;if((!s||mQ(s,t,c,h))&&(r.empty&&c<=r.from&&h>=r.to?a.push(r1.range(c,h)):(c>=r.to||h<=r.from)&&a.push(i1.range(c,h)),a.length>e.maxMatches))return Y.none}}return Y.set(a)}},{decorations:O=>O.decorations}),a1=T.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),o1=({state:O,dispatch:e})=>{let{selection:t}=O,i=S.create(t.ranges.map(r=>O.wordAt(r.head)||S.cursor(r.head)),t.mainIndex);return i.eq(t)?!1:(e(O.update({selection:i})),!0)};function l1(O,e){let{main:t,ranges:i}=O.selection,r=O.wordAt(t.head),n=r&&r.from==t.from&&r.to==t.to;for(let s=!1,a=new lO(O.doc,e,i[i.length-1].to);;)if(a.next(),a.done){if(s)return null;a=new lO(O.doc,e,0,Math.max(0,i[i.length-1].from-1)),s=!0}else{if(s&&i.some(o=>o.from==a.value.from))continue;if(n){let o=O.wordAt(a.value.from);if(!o||o.from!=a.value.from||o.to!=a.value.to)continue}return a.value}}var c1=({state:O,dispatch:e})=>{let{ranges:t}=O.selection;if(t.some(n=>n.from===n.to))return o1({state:O,dispatch:e});let i=O.sliceDoc(t[0].from,t[0].to);if(O.selection.ranges.some(n=>O.sliceDoc(n.from,n.to)!=i))return!1;let r=l1(O,i);return r?(e(O.update({selection:O.selection.addRange(S.range(r.from,r.to),!1),effects:T.scrollIntoView(r.to)})),!0):!1},Qi=Z.define({combine(O){return xe(O,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new fl(e),scrollToMatch:e=>T.scrollIntoView(e)})}});var os=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||JT(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(t,i)=>i=="n"?` `:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new cl(this):new ll(this)}getCursor(e,t=0,i){let r=e.doc?e:I.create({doc:e});return i==null&&(i=r.doc.length),this.regexp?ui(this,r,t,i):di(this,r,t,i)}},ls=class{constructor(e){this.spec=e}};function di(O,e,t,i){return new lO(e.doc,O.unquoted,t,i,O.caseSensitive?void 0:r=>r.toLowerCase(),O.wholeWord?h1(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}function h1(O,e){return(t,i,r,n)=>((n>t||n+r.length=t)return null;r.push(i.value)}return r}highlight(e,t,i,r){let n=di(this.spec,e,Math.max(0,t-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!n.next().done;)r(n.value.from,n.value.to)}};function ui(O,e,t,i){return new rs(e.doc,O.search,{ignoreCase:!O.caseSensitive,test:O.wholeWord?f1(e.charCategorizer(e.selection.main.head)):void 0},t,i)}function cs(O,e){return O.slice(fe(O,e,!1),e)}function hs(O,e){return O.slice(e,fe(O,e))}function f1(O){return(e,t,i)=>!i[0].length||(O(cs(i.input,i.index))!=ee.Word||O(hs(i.input,i.index))!=ee.Word)&&(O(hs(i.input,i.index+i[0].length))!=ee.Word||O(cs(i.input,i.index+i[0].length))!=ee.Word)}var cl=class extends ls{nextMatch(e,t,i){let r=ui(this.spec,e,i,e.doc.length).next();return r.done&&(r=ui(this.spec,e,0,t).next()),r.done?null:r.value}prevMatchInRange(e,t,i){for(let r=1;;r++){let n=Math.max(t,i-r*1e4),s=ui(this.spec,e,n,i),a=null;for(;!s.next().done;)a=s.value;if(a&&(n==t||a.from>n+10))return a;if(n==t)return null}}prevMatch(e,t,i){return this.prevMatchInRange(e,0,t)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(t,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let r=i.length;r>0;r--){let n=+i.slice(0,r);if(n>0&&n=t)return null;r.push(i.value)}return r}highlight(e,t,i,r){let n=ui(this.spec,e,Math.max(0,t-250),Math.min(i+250,e.doc.length));for(;!n.next().done;)r(n.value.from,n.value.to)}},$r=V.define(),ul=V.define(),oO=ce.define({create(O){return new Qr(hl(O).create(),null)},update(O,e){for(let t of e.effects)t.is($r)?O=new Qr(t.value.create(),O.panel):t.is(ul)&&(O=new Qr(O.query,t.value?Ql:null));return O},provide:O=>TO.from(O,e=>e.panel)});var Qr=class{constructor(e,t){this.query=e,this.panel=t}},d1=Y.mark({class:"cm-searchMatch"}),u1=Y.mark({class:"cm-searchMatch cm-searchMatch-selected"}),Q1=he.fromClass(class{constructor(O){this.view=O,this.decorations=this.highlight(O.state.field(oO))}update(O){let e=O.state.field(oO);(e!=O.startState.field(oO)||O.docChanged||O.selectionSet||O.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:O,panel:e}){if(!e||!O.spec.valid)return Y.none;let{view:t}=this,i=new Le;for(let r=0,n=t.visibleRanges,s=n.length;rn[r+1].from-500;)o=n[++r].to;O.highlight(t.state,a,o,(l,c)=>{let h=t.state.selection.ranges.some(f=>f.from==l&&f.to==c);i.add(l,c,h?u1:d1)})}return i.finish()}},{decorations:O=>O.decorations});function pr(O){return e=>{let t=e.state.field(oO,!1);return t&&t.query.spec.valid?O(e,t):yQ(e)}}var fs=pr((O,{query:e})=>{let{to:t}=O.state.selection.main,i=e.nextMatch(O.state,t,t);if(!i)return!1;let r=S.single(i.from,i.to),n=O.state.facet(Qi);return O.dispatch({selection:r,effects:[$l(O,i),n.scrollToMatch(r.main,O)],userEvent:"select.search"}),bQ(O),!0}),ds=pr((O,{query:e})=>{let{state:t}=O,{from:i}=t.selection.main,r=e.prevMatch(t,i,i);if(!r)return!1;let n=S.single(r.from,r.to),s=O.state.facet(Qi);return O.dispatch({selection:n,effects:[$l(O,r),s.scrollToMatch(n.main,O)],userEvent:"select.search"}),bQ(O),!0}),$1=pr((O,{query:e})=>{let t=e.matchAll(O.state,1e3);return!t||!t.length?!1:(O.dispatch({selection:S.create(t.map(i=>S.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),p1=({state:O,dispatch:e})=>{let t=O.selection;if(t.ranges.length>1||t.main.empty)return!1;let{from:i,to:r}=t.main,n=[],s=0;for(let a=new lO(O.doc,O.sliceDoc(i,r));!a.next().done;){if(n.length>1e3)return!1;a.value.from==i&&(s=n.length),n.push(S.range(a.value.from,a.value.to))}return e(O.update({selection:S.create(n,s),userEvent:"select.search.matches"})),!0},gQ=pr((O,{query:e})=>{let{state:t}=O,{from:i,to:r}=t.selection.main;if(t.readOnly)return!1;let n=e.nextMatch(t,i,i);if(!n)return!1;let s=n,a=[],o,l,c=[];s.from==i&&s.to==r&&(l=t.toText(e.getReplacement(s)),a.push({from:s.from,to:s.to,insert:l}),s=e.nextMatch(t,s.from,s.to),c.push(T.announce.of(t.phrase("replaced match on line $",t.doc.lineAt(i).number)+".")));let h=O.state.changes(a);return s&&(o=S.single(s.from,s.to).map(h),c.push($l(O,s)),c.push(t.facet(Qi).scrollToMatch(o.main,O))),O.dispatch({changes:h,selection:o,effects:c,userEvent:"input.replace"}),!0}),m1=pr((O,{query:e})=>{if(O.state.readOnly)return!1;let t=e.matchAll(O.state,1e9).map(r=>{let{from:n,to:s}=r;return{from:n,to:s,insert:e.getReplacement(r)}});if(!t.length)return!1;let i=O.state.phrase("replaced $ matches",t.length)+".";return O.dispatch({changes:t,effects:T.announce.of(i),userEvent:"input.replace.all"}),!0});function Ql(O){return O.state.facet(Qi).createPanel(O)}function hl(O,e){var t,i,r,n,s;let a=O.selection.main,o=a.empty||a.to>a.from+100?"":O.sliceDoc(a.from,a.to);if(e&&!o)return e;let l=O.facet(Qi);return new os({search:((t=e?.literal)!==null&&t!==void 0?t:l.literal)?o:o.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:l.caseSensitive,literal:(r=e?.literal)!==null&&r!==void 0?r:l.literal,regexp:(n=e?.regexp)!==null&&n!==void 0?n:l.regexp,wholeWord:(s=e?.wholeWord)!==null&&s!==void 0?s:l.wholeWord})}function TQ(O){let e=bO(O,Ql);return e&&e.dom.querySelector("[main-field]")}function bQ(O){let e=TQ(O);e&&e==O.root.activeElement&&e.select()}var yQ=O=>{let e=O.state.field(oO,!1);if(e&&e.panel){let t=TQ(O);if(t&&t!=O.root.activeElement){let i=hl(O.state,e.query.spec);i.valid&&O.dispatch({effects:$r.of(i)}),t.focus(),t.select()}}else O.dispatch({effects:[ul.of(!0),e?$r.of(hl(O.state,e.query.spec)):V.appendConfig.of(P1)]});return!0},xQ=O=>{let e=O.state.field(oO,!1);if(!e||!e.panel)return!1;let t=bO(O,Ql);return t&&t.dom.contains(O.root.activeElement)&&O.focus(),O.dispatch({effects:ul.of(!1)}),!0},kQ=[{key:"Mod-f",run:yQ,scope:"editor search-panel"},{key:"F3",run:fs,shift:ds,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:fs,shift:ds,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:xQ,scope:"editor search-panel"},{key:"Mod-Shift-l",run:p1},{key:"Mod-Alt-g",run:e1},{key:"Mod-d",run:c1,preventDefault:!0}],fl=class{constructor(e){this.view=e;let t=this.query=e.state.field(oO).query.spec;this.commit=this.commit.bind(this),this.searchField=N("input",{value:t.search,placeholder:Ne(e,"Find"),"aria-label":Ne(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=N("input",{value:t.replace,placeholder:Ne(e,"Replace"),"aria-label":Ne(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=N("input",{type:"checkbox",name:"case",form:"",checked:t.caseSensitive,onchange:this.commit}),this.reField=N("input",{type:"checkbox",name:"re",form:"",checked:t.regexp,onchange:this.commit}),this.wordField=N("input",{type:"checkbox",name:"word",form:"",checked:t.wholeWord,onchange:this.commit});function i(r,n,s){return N("button",{class:"cm-button",name:r,onclick:n,type:"button"},s)}this.dom=N("div",{onkeydown:r=>this.keydown(r),class:"cm-search"},[this.searchField,i("next",()=>fs(e),[Ne(e,"next")]),i("prev",()=>ds(e),[Ne(e,"previous")]),i("select",()=>$1(e),[Ne(e,"all")]),N("label",null,[this.caseField,Ne(e,"match case")]),N("label",null,[this.reField,Ne(e,"regexp")]),N("label",null,[this.wordField,Ne(e,"by word")]),...e.state.readOnly?[]:[N("br"),this.replaceField,i("replace",()=>gQ(e),[Ne(e,"replace")]),i("replaceAll",()=>m1(e),[Ne(e,"replace all")])],N("button",{name:"close",onclick:()=>xQ(e),"aria-label":Ne(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new os({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:$r.of(e)}))}keydown(e){bd(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?ds:fs)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),gQ(this.view))}update(e){for(let t of e.transactions)for(let i of t.effects)i.is($r)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(Qi).top}};function Ne(O,e){return O.state.phrase(e)}var Os=30,is=/[\s\.,:;?!]/;function $l(O,{from:e,to:t}){let i=O.state.doc.lineAt(e),r=O.state.doc.lineAt(t).to,n=Math.max(i.from,e-Os),s=Math.min(r,t+Os),a=O.state.sliceDoc(n,s);if(n!=i.from){for(let o=0;oa.length-Os;o--)if(!is.test(a[o-1])&&is.test(a[o])){a=a.slice(0,o);break}}return T.announce.of(`${O.state.phrase("current match")}. ${a} ${O.state.phrase("on line")} ${i.number}.`)}var g1=T.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),P1=[oO,ze.low(Q1),g1];var $i=class{constructor(e,t,i,r){this.state=e,this.pos=t,this.explicit=i,this.view=r,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let t=U(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),i=Math.max(t.from,this.pos-250),r=t.text.slice(i-t.from,this.pos-t.from),n=r.search(zQ(e,!1));return n<0?null:{from:i+n,to:this.pos,text:r.slice(n)}}get aborted(){return this.abortListeners==null}addEventListener(e,t,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(t),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function wQ(O){let e=Object.keys(O).join(""),t=/\w/.test(e);return t&&(e=e.replace(/\w/g,"")),`[${t?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function S1(O){let e=Object.create(null),t=Object.create(null);for(let{label:r}of O){e[r[0]]=!0;for(let n=1;ntypeof r=="string"?{label:r}:r),[t,i]=e.every(r=>/^\w+$/.test(r.label))?[/\w*$/,/\w+$/]:S1(e);return r=>{let n=r.matchBefore(i);return n||r.explicit?{from:n?n.from:r.pos,options:e,validFor:t}:null}}function cO(O,e){return t=>{for(let i=U(t.state).resolveInner(t.pos,-1);i;i=i.parent){if(O.indexOf(i.name)>-1)return null;if(i.type.isTop)break}return e(t)}}var Qs=class{constructor(e,t,i,r){this.completion=e,this.source=t,this.match=i,this.score=r}};function RO(O){return O.selection.main.from}function zQ(O,e){var t;let{source:i}=O,r=e&&i[0]!="^",n=i[i.length-1]!="$";return!r&&!n?O:new RegExp(`${r?"^":""}(?:${i})${n?"$":""}`,(t=O.flags)!==null&&t!==void 0?t:O.ignoreCase?"i":"")}var Zl=qe.define();function X1(O,e,t,i){let{main:r}=O.selection,n=t-r.from,s=i-r.from;return{...O.changeByRange(a=>{if(a!=r&&t!=i&&O.sliceDoc(a.from+n,a.from+s)!=O.sliceDoc(t,i))return{range:a};let o=O.toText(e);return{changes:{from:a.from+n,to:i==r.from?a.to:a.from+s,insert:o},range:S.cursor(a.from+n+o.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}var ZQ=new WeakMap;function T1(O){if(!Array.isArray(O))return O;let e=ZQ.get(O);return e||ZQ.set(O,e=zt(O)),e}var $s=V.define(),mr=V.define(),Pl=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&X<=57||X>=97&&X<=122?2:X>=65&&X<=90?1:0:(x=Ri(X))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!g||k==1&&p||y==0&&k!=0)&&(t[h]==X||i[h]==X&&(f=!0)?s[h++]=g:s.length&&(m=!1)),y=k,g+=Me(X)}return h==o&&s[0]==0&&m?this.result(-100+(f?-200:0),s,e):u==o&&Q==0?this.ret(-200-e.length+($==e.length?0:-100),[0,$]):a>-1?this.ret(-700-e.length,[a,a+this.pattern.length]):u==o?this.ret(-900-e.length,[Q,$]):h==o?this.result(-100+(f?-200:0)+-700+(m?0:-1100),s,e):t.length==2?null:this.result((r[0]?-700:0)+-200+-1100,r,e)}result(e,t,i){let r=[],n=0;for(let s of t){let a=s+(this.astral?Me(Se(i,s)):1);n&&r[n-1]==s?r[n-1]=a:(r[n++]=s,r[n++]=a)}return this.ret(e-i.length,r)}},Sl=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:b1,filterStrict:!1,compareCompletions:(e,t)=>(e.sortText||e.label).localeCompare(t.sortText||t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>i=>vQ(e(i),t(i)),optionClass:(e,t)=>i=>vQ(e(i),t(i)),addToOptions:(e,t)=>e.concat(t),filterStrict:(e,t)=>e||t})}});function vQ(O,e){return O?e?O+" "+e:O:e}function b1(O,e,t,i,r,n){let s=O.textDirection==H.RTL,a=s,o=!1,l="top",c,h,f=e.left-r.left,u=r.right-e.right,Q=i.right-i.left,$=i.bottom-i.top;if(a&&f=$||g>e.top?c=t.bottom-e.top:(l="bottom",c=e.bottom-t.top)}let p=(e.bottom-e.top)/n.offsetHeight,m=(e.right-e.left)/n.offsetWidth;return{style:`${l}: ${c/p}px; max-width: ${h/m}px`,class:"cm-completionInfo-"+(o?s?"left-narrow":"right-narrow":a?"left":"right")}}function y1(O){let e=O.addToOptions.slice();return O.icons&&e.push({render(t){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),t.type&&i.classList.add(...t.type.split(/\s+/g).map(r=>"cm-completionIcon-"+r)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(t,i,r,n){let s=document.createElement("span");s.className="cm-completionLabel";let a=t.displayLabel||t.label,o=0;for(let l=0;lo&&s.appendChild(document.createTextNode(a.slice(o,c)));let f=s.appendChild(document.createElement("span"));f.appendChild(document.createTextNode(a.slice(c,h))),f.className="cm-completionMatchedText",o=h}return ot.position-i.position).map(t=>t.render)}function pl(O,e,t){if(O<=t)return{from:0,to:O};if(e<0&&(e=0),e<=O>>1){let r=Math.floor(e/t);return{from:r*t,to:(r+1)*t}}let i=Math.floor((O-e)/t);return{from:O-(i+1)*t,to:O-i*t}}var Xl=class{constructor(e,t,i){this.view=e,this.stateField=t,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:o=>this.placeInfo(o),key:this},this.space=null,this.currentClass="";let r=e.state.field(t),{options:n,selected:s}=r.open,a=e.state.facet(ge);this.optionContent=y1(a),this.optionClass=a.optionClass,this.tooltipClass=a.tooltipClass,this.range=pl(n.length,s,a.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",o=>{let{options:l}=e.state.field(t).open;for(let c=o.target,h;c&&c!=this.dom;c=c.parentNode)if(c.nodeName=="LI"&&(h=/-(\d+)$/.exec(c.id))&&+h[1]{let l=e.state.field(this.stateField,!1);l&&l.tooltip&&e.state.facet(ge).closeOnBlur&&o.relatedTarget!=e.contentDOM&&e.dispatch({effects:mr.of(null)})}),this.showOptions(n,r.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var t;let i=e.state.field(this.stateField),r=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=r){let{options:n,selected:s,disabled:a}=i.open;(!r.open||r.open.options!=n)&&(this.range=pl(n.length,s,e.state.facet(ge).maxRenderedOptions),this.showOptions(n,i.id)),this.updateSel(),a!=((t=r.open)===null||t===void 0?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!a)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of t.split(" "))i&&this.dom.classList.add(i);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;(t.selected>-1&&t.selected=this.range.to)&&(this.range=pl(t.options.length,t.selected,this.view.state.facet(ge).maxRenderedOptions),this.showOptions(t.options,e.id));let i=this.updateSelectedOption(t.selected);if(i){this.destroyInfo();let{completion:r}=t.options[t.selected],{info:n}=r;if(!n)return;let s=typeof n=="string"?document.createTextNode(n):n(r);if(!s)return;"then"in s?s.then(a=>{a&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(a,r)}).catch(a=>Xe(this.view.state,a,"completion info")):(this.addInfoPane(s,r),i.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,t){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",i.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:r,destroy:n}=e;i.appendChild(r),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let i=this.list.firstChild,r=this.range.from;i;i=i.nextSibling,r++)i.nodeName!="LI"||!i.id?r--:r==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),t=i):i.hasAttribute("aria-selected")&&(i.removeAttribute("aria-selected"),i.removeAttribute("aria-describedby"));return t&&k1(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),r=e.getBoundingClientRect(),n=this.space;if(!n){let s=this.dom.ownerDocument.documentElement;n={left:0,top:0,right:s.clientWidth,bottom:s.clientHeight}}return r.top>Math.min(n.bottom,t.bottom)-10||r.bottom{s.target==r&&s.preventDefault()});let n=null;for(let s=i.from;si.from||i.from==0))if(n=f,typeof l!="string"&&l.header)r.appendChild(l.header(l));else{let u=r.appendChild(document.createElement("completion-section"));u.textContent=f}}let c=r.appendChild(document.createElement("li"));c.id=t+"-"+s,c.setAttribute("role","option");let h=this.optionClass(a);h&&(c.className=h);for(let f of this.optionContent){let u=f(a,this.view.state,this.view,o);u&&c.appendChild(u)}}return i.from&&r.classList.add("cm-completionListIncompleteTop"),i.tonew Xl(t,O,e)}function k1(O,e){let t=O.getBoundingClientRect(),i=e.getBoundingClientRect(),r=t.height/O.offsetHeight;i.topt.bottom&&(O.scrollTop+=(i.bottom-t.bottom)/r)}function YQ(O){return(O.boost||0)*100+(O.apply?10:0)+(O.info?5:0)+(O.type?1:0)}function w1(O,e){let t=[],i=null,r=null,n=c=>{t.push(c);let{section:h}=c.completion;if(h){i||(i=[]);let f=typeof h=="string"?h:h.name;i.some(u=>u.name==f)||i.push(typeof h=="string"?{name:f}:h)}},s=e.facet(ge);for(let c of O)if(c.hasResult()){let h=c.result.getMatch;if(c.result.filter===!1)for(let f of c.result.options)n(new Qs(f,c.source,h?h(f):[],1e9-t.length));else{let f=e.sliceDoc(c.from,c.to),u,Q=s.filterStrict?new Sl(f):new Pl(f);for(let $ of c.result.options)if(u=Q.match($.label)){let p=$.displayLabel?h?h($,u.matched):[]:u.matched,m=u.score+($.boost||0);if(n(new Qs($,c.source,p,m)),typeof $.section=="object"&&$.section.rank==="dynamic"){let{name:g}=$.section;r||(r=Object.create(null)),r[g]=Math.max(m,r[g]||-1e9)}}}}if(i){let c=Object.create(null),h=0,f=(u,Q)=>(u.rank==="dynamic"&&Q.rank==="dynamic"?r[Q.name]-r[u.name]:0)||(typeof u.rank=="number"?u.rank:1e9)-(typeof Q.rank=="number"?Q.rank:1e9)||(u.namef.score-h.score||l(h.completion,f.completion))){let h=c.completion;!o||o.label!=h.label||o.detail!=h.detail||o.type!=null&&h.type!=null&&o.type!=h.type||o.apply!=h.apply||o.boost!=h.boost?a.push(c):YQ(c.completion)>YQ(o)&&(a[a.length-1]=c),o=c.completion}return a}var Tl=class O{constructor(e,t,i,r,n,s){this.options=e,this.attrs=t,this.tooltip=i,this.timestamp=r,this.selected=n,this.disabled=s}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new O(this.options,_Q(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,i,r,n,s){if(r&&!s&&e.some(l=>l.isPending))return r.setDisabled();let a=w1(e,t);if(!a.length)return r&&e.some(l=>l.isPending)?r.setDisabled():null;let o=t.facet(ge).selectOnOpen?0:-1;if(r&&r.selected!=o&&r.selected!=-1){let l=r.options[r.selected].completion;for(let c=0;cc.hasResult()?Math.min(l,c.from):l,1e8),create:V1,above:n.aboveCursor},r?r.timestamp:Date.now(),o,!1)}map(e){return new O(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new O(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},bl=class O{constructor(e,t,i){this.active=e,this.id=t,this.open=i}static start(){return new O(_1,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:t}=e,i=t.facet(ge),n=(i.override||t.languageDataAt("autocomplete",RO(t)).map(T1)).map(o=>(this.active.find(c=>c.source==o)||new qt(o,this.active.some(c=>c.state!=0)?1:0)).update(e,i));n.length==this.active.length&&n.every((o,l)=>o==this.active[l])&&(n=this.active);let s=this.open,a=e.effects.some(o=>o.is(vl));s&&e.docChanged&&(s=s.map(e.changes)),e.selection||n.some(o=>o.hasResult()&&e.changes.touchesRange(o.from,o.to))||!Z1(n,this.active)||a?s=Tl.build(n,t,this.id,s,i,a):s&&s.disabled&&!n.some(o=>o.isPending)&&(s=null),!s&&n.every(o=>!o.isPending)&&n.some(o=>o.hasResult())&&(n=n.map(o=>o.hasResult()?new qt(o.source,0):o));for(let o of e.effects)o.is(WQ)&&(s=s&&s.setSelected(o.value,this.id));return n==this.active&&s==this.open?this:new O(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?v1:Y1}};function Z1(O,e){if(O==e)return!0;for(let t=0,i=0;;){for(;t-1&&(t["aria-activedescendant"]=O+"-"+e),t}var _1=[];function UQ(O,e){if(O.isUserEvent("input.complete")){let i=O.annotation(Zl);if(i&&e.activateOnCompletion(i))return 12}let t=O.isUserEvent("input.type");return t&&e.activateOnTyping?5:t?1:O.isUserEvent("delete.backward")?2:O.selection?8:O.docChanged?16:0}var qt=class O{constructor(e,t,i=!1){this.source=e,this.state=t,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,t){let i=UQ(e,t),r=this;(i&8||i&16&&this.touches(e))&&(r=new O(r.source,0)),i&4&&r.state==0&&(r=new O(this.source,1)),r=r.updateFor(e,i);for(let n of e.effects)if(n.is($s))r=new O(r.source,1,n.value);else if(n.is(mr))r=new O(r.source,0);else if(n.is(vl))for(let s of n.value)s.source==r.source&&(r=s);return r}updateFor(e,t){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(RO(e.state))}},ps=class O extends qt{constructor(e,t,i,r,n,s){super(e,3,t),this.limit=i,this.result=r,this.from=n,this.to=s}hasResult(){return!0}updateFor(e,t){var i;if(!(t&3))return this.map(e.changes);let r=this.result;r.map&&!e.changes.empty&&(r=r.map(r,e.changes));let n=e.changes.mapPos(this.from),s=e.changes.mapPos(this.to,1),a=RO(e.state);if(a>s||!r||t&2&&(RO(e.startState)==this.from||at.map(e))}}),WQ=V.define(),Ce=ce.define({create(){return bl.start()},update(O,e){return O.update(e)},provide:O=>[er.from(O,e=>e.tooltip),T.contentAttributes.from(O,e=>e.attrs)]});function Yl(O,e){let t=e.completion.apply||e.completion.label,i=O.state.field(Ce).active.find(r=>r.source==e.source);return i instanceof ps?(typeof t=="string"?O.dispatch({...X1(O.state,t,i.from,i.to),annotations:Zl.of(e.completion)}):t(O,e.completion,i.from,i.to),!0):!1}var V1=x1(Ce,Yl);function us(O,e="option"){return t=>{let i=t.state.field(Ce,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+r*(O?1:-1):O?0:s-1;return a<0?a=e=="page"?0:s-1:a>=s&&(a=e=="page"?s-1:0),t.dispatch({effects:WQ.of(a)}),!0}}var q1=O=>{let e=O.state.field(Ce,!1);return O.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampO.state.field(Ce,!1)?(O.dispatch({effects:$s.of(!0)}),!0):!1,z1=O=>{let e=O.state.field(Ce,!1);return!e||!e.active.some(t=>t.state!=0)?!1:(O.dispatch({effects:mr.of(null)}),!0)},yl=class{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}},U1=50,W1=1e3,j1=he.fromClass(class{constructor(O){this.view=O,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of O.state.field(Ce).active)e.isPending&&this.startQuery(e)}update(O){let e=O.state.field(Ce),t=O.state.facet(ge);if(!O.selectionSet&&!O.docChanged&&O.startState.field(Ce)==e)return;let i=O.transactions.some(n=>{let s=UQ(n,t);return s&8||(n.selection||n.docChanged)&&!(s&3)});for(let n=0;nU1&&Date.now()-s.time>W1){for(let a of s.context.abortListeners)try{a()}catch(o){Xe(this.view.state,o)}s.context.abortListeners=null,this.running.splice(n--,1)}else s.updates.push(...O.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),O.transactions.some(n=>n.effects.some(s=>s.is($s)))&&(this.pendingStart=!0);let r=this.pendingStart?50:t.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(n=>n.isPending&&!this.running.some(s=>s.active.source==n.source))?setTimeout(()=>this.startUpdate(),r):-1,this.composing!=0)for(let n of O.transactions)n.isUserEvent("input.type")?this.composing=2:this.composing==2&&n.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:O}=this.view,e=O.field(Ce);for(let t of e.active)t.isPending&&!this.running.some(i=>i.active.source==t.source)&&this.startQuery(t);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(ge).updateSyncTime))}startQuery(O){let{state:e}=this.view,t=RO(e),i=new $i(e,t,O.explicit,this.view),r=new yl(O,i);this.running.push(r),Promise.resolve(O.source(i)).then(n=>{r.context.aborted||(r.done=n||null,this.scheduleAccept())},n=>{this.view.dispatch({effects:mr.of(null)}),Xe(this.view.state,n)})}scheduleAccept(){this.running.every(O=>O.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(ge).updateSyncTime))}accept(){var O;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],t=this.view.state.facet(ge),i=this.view.state.field(Ce);for(let r=0;ra.source==n.active.source);if(s&&s.isPending)if(n.done==null){let a=new qt(n.active.source,0);for(let o of n.updates)a=a.update(o,t);a.isPending||e.push(a)}else this.startQuery(s)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:vl.of(e)})}},{eventHandlers:{blur(O){let e=this.view.state.field(Ce,!1);if(e&&e.tooltip&&this.view.state.facet(ge).closeOnBlur){let t=e.open&&To(this.view,e.open.tooltip);(!t||!t.dom.contains(O.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:mr.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:$s.of(!1)}),20),this.composing=0}}}),C1=typeof navigator=="object"&&/Win/.test(navigator.platform),G1=ze.highest(T.domEventHandlers({keydown(O,e){let t=e.state.field(Ce,!1);if(!t||!t.open||t.open.disabled||t.open.selected<0||O.key.length>1||O.ctrlKey&&!(C1&&O.altKey)||O.metaKey)return!1;let i=t.open.options[t.open.selected],r=t.active.find(s=>s.source==i.source),n=i.completion.commitCharacters||r.result.commitCharacters;return n&&n.indexOf(O.key)>-1&&Yl(e,i),!1}})),jQ=T.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}}),xl=class{constructor(e,t,i,r){this.field=e,this.line=t,this.from=i,this.to=r}},kl=class O{constructor(e,t,i){this.field=e,this.from=t,this.to=i}map(e){let t=e.mapPos(this.from,-1,pe.TrackDel),i=e.mapPos(this.to,1,pe.TrackDel);return t==null||i==null?null:new O(this.field,t,i)}},wl=class O{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let i=[],r=[t],n=e.doc.lineAt(t),s=/^\s*/.exec(n.text)[0];for(let o of this.lines){if(i.length){let l=s,c=/^\t*/.exec(o)[0].length;for(let h=0;hnew kl(o.field,r[o.line]+o.from,r[o.line]+o.to));return{text:i,ranges:a}}static parse(e){let t=[],i=[],r=[],n;for(let s of e.split(/\r\n?|\n/)){for(;n=/[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(s);){let a=n[1]?+n[1]:null,o=n[2]||n[3]||"",l=-1,c=o.replace(/\\[{}]/g,h=>h[1]);for(let h=0;h=l&&f.field++}for(let h of r)if(h.line==i.length&&h.from>n.index){let f=n[2]?3+(n[1]||"").length:2;h.from-=f,h.to-=f}r.push(new xl(l,i.length,n.index,n.index+c.length)),s=s.slice(0,n.index)+o+s.slice(n.index+n[0].length)}s=s.replace(/\\([{}])/g,(a,o,l)=>{for(let c of r)c.line==i.length&&c.from>l&&(c.from--,c.to--);return o}),i.push(s)}return new O(i,r)}},E1=Y.widget({widget:new class extends _e{toDOM(){let O=document.createElement("span");return O.className="cm-snippetFieldPosition",O}ignoreEvent(){return!1}}}),A1=Y.mark({class:"cm-snippetField"}),pi=class O{constructor(e,t){this.ranges=e,this.active=t,this.deco=Y.set(e.map(i=>(i.from==i.to?E1:A1).range(i.from,i.to)),!0)}map(e){let t=[];for(let i of this.ranges){let r=i.map(e);if(!r)return null;t.push(r)}return new O(t,this.active)}selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(i=>i.field==this.active&&i.from<=t.from&&i.to>=t.to))}},Sr=V.define({map(O,e){return O&&O.map(e)}}),L1=V.define(),gr=ce.define({create(){return null},update(O,e){for(let t of e.effects){if(t.is(Sr))return t.value;if(t.is(L1)&&O)return new pi(O.ranges,t.value)}return O&&e.docChanged&&(O=O.map(e.changes)),O&&e.selection&&!O.selectionInsideField(e.selection)&&(O=null),O},provide:O=>T.decorations.from(O,e=>e?e.deco:Y.none)});function _l(O,e){return S.create(O.filter(t=>t.field==e).map(t=>S.range(t.from,t.to)))}function M1(O){let e=wl.parse(O);return(t,i,r,n)=>{let{text:s,ranges:a}=e.instantiate(t.state,r),{main:o}=t.state.selection,l={changes:{from:r,to:n==o.from?o.to:n,insert:E.of(s)},scrollIntoView:!0,annotations:i?[Zl.of(i),Qe.userEvent.of("input.complete")]:void 0};if(a.length&&(l.selection=_l(a,0)),a.some(c=>c.field>0)){let c=new pi(a,0),h=l.effects=[Sr.of(c)];t.state.field(gr,!1)===void 0&&h.push(V.appendConfig.of([gr,F1,H1,jQ]))}t.dispatch(t.state.update(l))}}function CQ(O){return({state:e,dispatch:t})=>{let i=e.field(gr,!1);if(!i||O<0&&i.active==0)return!1;let r=i.active+O,n=O>0&&!i.ranges.some(s=>s.field==r+O);return t(e.update({selection:_l(i.ranges,r),effects:Sr.of(n?null:new pi(i.ranges,r)),scrollIntoView:!0})),!0}}var D1=({state:O,dispatch:e})=>O.field(gr,!1)?(e(O.update({effects:Sr.of(null)})),!0):!1,I1=CQ(1),B1=CQ(-1);var N1=[{key:"Tab",run:I1,shift:B1},{key:"Escape",run:D1}],RQ=Z.define({combine(O){return O.length?O[0]:N1}}),F1=ze.highest(Xt.compute([RQ],O=>O.facet(RQ)));function W(O,e){return{...e,apply:M1(O)}}var H1=T.domEventHandlers({mousedown(O,e){let t=e.state.field(gr,!1),i;if(!t||(i=e.posAtCoords({x:O.clientX,y:O.clientY}))==null)return!1;let r=t.ranges.find(n=>n.from<=i&&n.to>=i);return!r||r.field==t.active?!1:(e.dispatch({selection:_l(t.ranges,r.field),effects:Sr.of(t.ranges.some(n=>n.field>r.field)?new pi(t.ranges,r.field):null),scrollIntoView:!0}),!0)}});var Pr={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},_O=V.define({map(O,e){let t=e.mapPos(O,-1,pe.TrackAfter);return t??void 0}}),Rl=new class extends tt{};Rl.startSide=1;Rl.endSide=-1;var GQ=ce.define({create(){return M.empty},update(O,e){if(O=O.map(e.changes),e.selection){let t=e.state.doc.lineAt(e.selection.main.head);O=O.update({filter:i=>i>=t.from&&i<=t.to})}for(let t of e.effects)t.is(_O)&&(O=O.update({add:[Rl.range(t.value,t.value+1)]}));return O}});function EQ(){return[J1,GQ]}var gl="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function AQ(O){for(let e=0;e{if((K1?O.composing:O.compositionStarted)||O.state.readOnly)return!1;let r=O.state.selection.main;if(i.length>2||i.length==2&&Me(Se(i,0))==1||e!=r.from||t!=r.to)return!1;let n=t0(O.state,i);return n?(O.dispatch(n),!0):!1}),e0=({state:O,dispatch:e})=>{if(O.readOnly)return!1;let i=LQ(O,O.selection.main.head).brackets||Pr.brackets,r=null,n=O.changeByRange(s=>{if(s.empty){let a=O0(O.doc,s.head);for(let o of i)if(o==a&&ms(O.doc,s.head)==AQ(Se(o,0)))return{changes:{from:s.head-o.length,to:s.head+o.length},range:S.cursor(s.head-o.length)}}return{range:r=s}});return r||e(O.update(n,{scrollIntoView:!0,userEvent:"delete.backward"})),!r},MQ=[{key:"Backspace",run:e0}];function t0(O,e){let t=LQ(O,O.selection.main.head),i=t.brackets||Pr.brackets;for(let r of i){let n=AQ(Se(r,0));if(e==r)return n==r?n0(O,r,i.indexOf(r+r+r)>-1,t):i0(O,r,n,t.before||Pr.before);if(e==n&&DQ(O,O.selection.main.from))return r0(O,r,n)}return null}function DQ(O,e){let t=!1;return O.field(GQ).between(0,O.doc.length,i=>{i==e&&(t=!0)}),t}function ms(O,e){let t=O.sliceString(e,e+2);return t.slice(0,Me(Se(t,0)))}function O0(O,e){let t=O.sliceString(e-2,e);return Me(Se(t,0))==t.length?t:t.slice(1)}function i0(O,e,t,i){let r=null,n=O.changeByRange(s=>{if(!s.empty)return{changes:[{insert:e,from:s.from},{insert:t,from:s.to}],effects:_O.of(s.to+e.length),range:S.range(s.anchor+e.length,s.head+e.length)};let a=ms(O.doc,s.head);return!a||/\s/.test(a)||i.indexOf(a)>-1?{changes:{insert:e+t,from:s.head},effects:_O.of(s.head+e.length),range:S.cursor(s.head+e.length)}:{range:r=s}});return r?null:O.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function r0(O,e,t){let i=null,r=O.changeByRange(n=>n.empty&&ms(O.doc,n.head)==t?{changes:{from:n.head,to:n.head+t.length,insert:t},range:S.cursor(n.head+t.length)}:i={range:n});return i?null:O.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function n0(O,e,t,i){let r=i.stringPrefixes||Pr.stringPrefixes,n=null,s=O.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:e,from:a.to}],effects:_O.of(a.to+e.length),range:S.range(a.anchor+e.length,a.head+e.length)};let o=a.head,l=ms(O.doc,o),c;if(l==e){if(VQ(O,o))return{changes:{insert:e+e,from:o},effects:_O.of(o+e.length),range:S.cursor(o+e.length)};if(DQ(O,o)){let f=t&&O.sliceDoc(o,o+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:o,to:o+f.length,insert:f},range:S.cursor(o+f.length)}}}else{if(t&&O.sliceDoc(o-2*e.length,o)==e+e&&(c=qQ(O,o-2*e.length,r))>-1&&VQ(O,c))return{changes:{insert:e+e+e+e,from:o},effects:_O.of(o+e.length),range:S.cursor(o+e.length)};if(O.charCategorizer(o)(l)!=ee.Word&&qQ(O,o,r)>-1&&!s0(O,o,e,r))return{changes:{insert:e+e,from:o},effects:_O.of(o+e.length),range:S.cursor(o+e.length)}}return{range:n=a}});return n?null:O.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function VQ(O,e){let t=U(O).resolveInner(e+1);return t.parent&&t.from==e}function s0(O,e,t,i){let r=U(O).resolveInner(e,-1),n=i.reduce((s,a)=>Math.max(s,a.length),0);for(let s=0;s<5;s++){let a=O.sliceDoc(r.from,Math.min(r.to,r.from+t.length+n)),o=a.indexOf(t);if(!o||o>-1&&i.indexOf(a.slice(0,o))>-1){let c=r.firstChild;for(;c&&c.from==r.from&&c.to-c.from>t.length+o;){if(O.sliceDoc(c.to-t.length,c.to)==t)return!1;c=c.firstChild}return!0}let l=r.to==e&&r.parent;if(!l)break;r=l}return!1}function qQ(O,e,t){let i=O.charCategorizer(e);if(i(O.sliceDoc(e-1,e))!=ee.Word)return e;for(let r of t){let n=e-r.length;if(O.sliceDoc(n,e)==r&&i(O.sliceDoc(n-1,n))!=ee.Word)return n}return-1}function IQ(O={}){return[G1,Ce,ge.of(O),j1,a0,jQ]}var Vl=[{key:"Ctrl-Space",run:ml},{mac:"Alt-`",run:ml},{mac:"Alt-i",run:ml},{key:"Escape",run:z1},{key:"ArrowDown",run:us(!0)},{key:"ArrowUp",run:us(!1)},{key:"PageDown",run:us(!0,"page")},{key:"PageUp",run:us(!1,"page")},{key:"Enter",run:q1}],a0=ze.highest(Xt.computeN([ge],O=>O.facet(ge).defaultKeymap?[Vl]:[]));var Ps=class{constructor(e,t,i){this.from=e,this.to=t,this.diagnostic=i}},VO=class O{constructor(e,t,i){this.diagnostics=e,this.panel=t,this.selected=i}static init(e,t,i){let r=i.facet(Xr).markerFilter;r&&(e=r(e,i));let n=e.slice().sort((u,Q)=>u.from-Q.from||u.to-Q.to),s=new Le,a=[],o=0,l=i.doc.iter(),c=0,h=i.doc.length;for(let u=0;;){let Q=u==n.length?null:n[u];if(!Q&&!a.length)break;let $,p;if(a.length)$=o,p=a.reduce((P,y)=>Math.min(P,y.to),Q&&Q.from>$?Q.from:1e8);else{if($=Q.from,$>h)break;p=Q.to,a.push(Q),u++}for(;uP.from||P.to==$))a.push(P),u++,p=Math.min(P.to,p);else{p=Math.min(P.from,p);break}}p=Math.min(p,h);let m=!1;if(a.some(P=>P.from==$&&(P.to==p||p==h))&&(m=$==p,!m&&p-$<10)){let P=$-(c+l.value.length);P>0&&(l.next(P),c=$);for(let y=$;;){if(y>=p){m=!0;break}if(!l.lineBreak&&c+l.value.length>y)break;y=c+l.value.length,c+=l.value.length,l.next()}}let g=m0(a);if(m)s.add($,$,Y.widget({widget:new ql(g),diagnostics:a.slice()}));else{let P=a.reduce((y,X)=>X.markClass?y+" "+X.markClass:y,"");s.add($,p,Y.mark({class:"cm-lintRange cm-lintRange-"+g+P,diagnostics:a.slice(),inclusiveEnd:a.some(y=>y.to>p)}))}if(o=p,o==h)break;for(let P=0;P{if(!(e&&s.diagnostics.indexOf(e)<0))if(!i)i=new Ps(r,n,e||s.diagnostics[0]);else{if(s.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new Ps(i.from,n,i.diagnostic)}}),i}function o0(O,e){let t=e.pos,i=e.end||t,r=O.state.facet(Xr).hideOn(O,t,i);if(r!=null)return r;let n=O.startState.doc.lineAt(e.pos);return!!(O.effects.some(s=>s.is(FQ))||O.changes.touchesRange(n.from,Math.max(n.to,i)))}function l0(O,e){return O.field(Fe,!1)?e:e.concat(V.appendConfig.of(g0))}var FQ=V.define(),zl=V.define(),HQ=V.define(),Fe=ce.define({create(){return new VO(Y.none,null,null)},update(O,e){if(e.docChanged&&O.diagnostics.size){let t=O.diagnostics.map(e.changes),i=null,r=O.panel;if(O.selected){let n=e.changes.mapPos(O.selected.from,1);i=mi(t,O.selected.diagnostic,n)||mi(t,null,n)}!t.size&&r&&e.state.facet(Xr).autoPanel&&(r=null),O=new VO(t,r,i)}for(let t of e.effects)if(t.is(FQ)){let i=e.state.facet(Xr).autoPanel?t.value.length?Tr.open:null:O.panel;O=VO.init(t.value,i,e.state)}else t.is(zl)?O=new VO(O.diagnostics,t.value?Tr.open:null,O.selected):t.is(HQ)&&(O=new VO(O.diagnostics,O.panel,t.value));return O},provide:O=>[TO.from(O,e=>e.panel),T.decorations.from(O,e=>e.diagnostics)]});var c0=Y.mark({class:"cm-lintRange cm-lintRange-active"});function h0(O,e,t){let{diagnostics:i}=O.state.field(Fe),r,n=-1,s=-1;i.between(e-(t<0?1:0),e+(t>0?1:0),(o,l,{spec:c})=>{if(e>=o&&e<=l&&(o==l||(e>o||t>0)&&(ee$(O,t,!1)))}var d0=O=>{let e=O.state.field(Fe,!1);(!e||!e.panel)&&O.dispatch({effects:l0(O.state,[zl.of(!0)])});let t=bO(O,Tr.open);return t&&t.dom.querySelector(".cm-panel-lint ul").focus(),!0},BQ=O=>{let e=O.state.field(Fe,!1);return!e||!e.panel?!1:(O.dispatch({effects:zl.of(!1)}),!0)},u0=O=>{let e=O.state.field(Fe,!1);if(!e)return!1;let t=O.state.selection.main,i=e.diagnostics.iter(t.to+1);return!i.value&&(i=e.diagnostics.iter(0),!i.value||i.from==t.from&&i.to==t.to)?!1:(O.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var KQ=[{key:"Mod-Shift-m",run:d0,preventDefault:!0},{key:"F8",run:u0}];var Xr=Z.define({combine(O){return{sources:O.map(e=>e.source).filter(e=>e!=null),...xe(O.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:NQ,tooltipFilter:NQ,needsRefresh:(e,t)=>e?t?i=>e(i)||t(i):e:t,hideOn:(e,t)=>e?t?(i,r,n)=>e(i,r,n)||t(i,r,n):e:t,autoPanel:(e,t)=>e||t})}}});function NQ(O,e){return O?e?(t,i)=>e(O(t,i),i):O:e}function JQ(O){let e=[];if(O)e:for(let{name:t}of O){for(let i=0;in.toLowerCase()==r.toLowerCase())){e.push(r);continue e}}e.push("")}return e}function e$(O,e,t){var i;let r=t?JQ(e.actions):[];return N("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},N("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(O):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((n,s)=>{let a=!1,o=u=>{if(u.preventDefault(),a)return;a=!0;let Q=mi(O.state.field(Fe).diagnostics,e);Q&&n.apply(O,Q.from,Q.to)},{name:l}=n,c=r[s]?l.indexOf(r[s]):-1,h=c<0?l:[l.slice(0,c),N("u",l.slice(c,c+1)),l.slice(c+1)],f=n.markClass?" "+n.markClass:"";return N("button",{type:"button",class:"cm-diagnosticAction"+f,onclick:o,onmousedown:o,"aria-label":` Action: ${l}${c<0?"":` (access key "${r[s]})"`}.`},h)}),e.source&&N("div",{class:"cm-diagnosticSource"},e.source))}var ql=class extends _e{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return N("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},Ss=class{constructor(e,t){this.diagnostic=t,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=e$(e,t,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},Tr=class O{constructor(e){this.view=e,this.items=[];let t=r=>{if(r.keyCode==27)BQ(this.view),this.view.focus();else if(r.keyCode==38||r.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(r.keyCode==40||r.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(r.keyCode==36)this.moveSelection(0);else if(r.keyCode==35)this.moveSelection(this.items.length-1);else if(r.keyCode==13)this.view.focus();else if(r.keyCode>=65&&r.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:n}=this.items[this.selectedIndex],s=JQ(n.actions);for(let a=0;a{for(let n=0;nBQ(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(Fe).selected;if(!e)return-1;for(let t=0;t{for(let c of l.diagnostics){if(s.has(c))continue;s.add(c);let h=-1,f;for(let u=i;ui&&(this.items.splice(i,h-i),r=!0)),t&&f.diagnostic==t.diagnostic?f.dom.hasAttribute("aria-selected")||(f.dom.setAttribute("aria-selected","true"),n=f):f.dom.hasAttribute("aria-selected")&&f.dom.removeAttribute("aria-selected"),i++}});i({sel:n.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:a,panel:o})=>{let l=o.height/this.list.offsetHeight;a.topo.bottom&&(this.list.scrollTop+=(a.bottom-o.bottom)/l)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),r&&this.sync()}sync(){let e=this.list.firstChild;function t(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)t();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)t()}moveSelection(e){if(this.selectedIndex<0)return;let t=this.view.state.field(Fe),i=mi(t.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:HQ.of(i)})}static open(e){return new O(e)}};function Q0(O,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(O)}')`}function gs(O){return Q0(``,'width="6" height="3"')}var $0=T.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:gs("#d11")},".cm-lintRange-warning":{backgroundImage:gs("orange")},".cm-lintRange-info":{backgroundImage:gs("#999")},".cm-lintRange-hint":{backgroundImage:gs("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}});function p0(O){return O=="error"?4:O=="warning"?3:O=="info"?2:1}function m0(O){let e="hint",t=1;for(let i of O){let r=p0(i.severity);r>t&&(t=r,e=i.severity)}return e}var g0=[Fe,T.decorations.compute([Fe],O=>{let{selected:e,panel:t}=O.field(Fe);return!e||!t||e.from==e.to?Y.none:Y.set([c0.range(e.from,e.to)])}),zd(h0,{hideOn:o0}),$0];var t$=[jd(),Cd(),_d(),zu(),mu(),wd(),Yd(),I.allowMultipleSelections.of(!0),cu(),Nn(Pu,{fallback:!0}),bu(),EQ(),IQ(),Vd(),qd(),Rd(),XQ(),Xt.of([...MQ,...uQ,...kQ,...Cu,...Qu,...Vl,...KQ])];var P0="#e5c07b",O$="#e06c75",S0="#56b6c2",X0="#ffffff",Xs="#abb2bf",Wl="#7d8799",T0="#61afef",b0="#98c379",i$="#d19a66",y0="#c678dd",x0="#21252b",r$="#2c313a",n$="#282c34",Ul="#353a42",k0="#3E4451",s$="#528bff";var w0=T.theme({"&":{color:Xs,backgroundColor:n$},".cm-content":{caretColor:s$},".cm-cursor, .cm-dropCursor":{borderLeftColor:s$},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:k0},".cm-panels":{backgroundColor:x0,color:Xs},".cm-panels.cm-panels-top":{borderBottom:"2px solid black"},".cm-panels.cm-panels-bottom":{borderTop:"2px solid black"},".cm-searchMatch":{backgroundColor:"#72a1ff59",outline:"1px solid #457dff"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"#6199ff2f"},".cm-activeLine":{backgroundColor:"#6699ff0b"},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847"},".cm-gutters":{backgroundColor:n$,color:Wl,border:"none"},".cm-activeLineGutter":{backgroundColor:r$},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:Ul},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:Ul,borderBottomColor:Ul},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:r$,color:Xs}}},{dark:!0}),Z0=ci.define([{tag:d.keyword,color:y0},{tag:[d.name,d.deleted,d.character,d.propertyName,d.macroName],color:O$},{tag:[d.function(d.variableName),d.labelName],color:T0},{tag:[d.color,d.constant(d.name),d.standard(d.name)],color:i$},{tag:[d.definition(d.name),d.separator],color:Xs},{tag:[d.typeName,d.className,d.number,d.changed,d.annotation,d.modifier,d.self,d.namespace],color:P0},{tag:[d.operator,d.operatorKeyword,d.url,d.escape,d.regexp,d.link,d.special(d.string)],color:S0},{tag:[d.meta,d.comment],color:Wl},{tag:d.strong,fontWeight:"bold"},{tag:d.emphasis,fontStyle:"italic"},{tag:d.strikethrough,textDecoration:"line-through"},{tag:d.link,color:Wl,textDecoration:"underline"},{tag:d.heading,fontWeight:"bold",color:O$},{tag:[d.atom,d.bool,d.special(d.variableName)],color:i$},{tag:[d.processingInstruction,d.string,d.inserted],color:b0},{tag:d.invalid,color:X0}]),a$=[w0,Nn(Z0)];var Gl=class O{constructor(e,t,i,r,n,s,a,o,l,c=0,h){this.p=e,this.stack=t,this.state=i,this.reducePos=r,this.pos=n,this.score=s,this.buffer=a,this.bufferBase=o,this.curContext=l,this.lookAhead=c,this.parent=h}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,i=0){let r=e.parser.context;return new O(e,[],t,i,i,0,[],0,r?new Ts(r,r.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let i=e>>19,r=e&65535,{parser:n}=this.p,s=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[r])===null||t===void 0)&&t.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=c):this.p.lastBigReductionSizeo;)this.stack.pop();this.reduceContext(r,l)}storeNode(e,t,i,r=4,n=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&s.buffer[a-4]==0&&s.buffer[a-1]>-1){if(t==i)return;if(s.buffer[a-2]>=t){s.buffer[a-2]=i;return}}}if(!n||this.pos==i)this.buffer.push(e,t,i,r);else{let s=this.buffer.length;if(s>0&&(this.buffer[s-4]!=0||this.buffer[s-1]<0)){let a=!1;for(let o=s;o>0&&this.buffer[o-2]>i;o-=4)if(this.buffer[o-1]>=0){a=!0;break}if(a)for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,r>4&&(r-=4)}this.buffer[s]=e,this.buffer[s+1]=t,this.buffer[s+2]=i,this.buffer[s+3]=r}}shift(e,t,i,r){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let n=e,{parser:s}=this.p;(r>this.pos||t<=s.maxNode)&&(this.pos=r,s.stateFlag(n,1)||(this.reducePos=r)),this.pushState(n,i),this.shiftContext(t,i),t<=s.maxNode&&this.buffer.push(t,i,r,4)}else this.pos=r,this.shiftContext(t,i),t<=this.p.parser.maxNode&&this.buffer.push(t,i,r,4)}apply(e,t,i,r){e&65536?this.reduce(e):this.shift(e,t,i,r)}useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let r=this.pos;this.reducePos=this.pos=r+e.length,this.pushState(t,r),this.buffer.push(i,r,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let i=e.buffer.slice(t),r=e.bufferBase+t;for(;e&&r==e.bufferBase;)e=e.parent;return new O(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,r,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,i?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new El(this);;){let i=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(i==0)return!1;if((i&65536)==0)return!0;t.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let r=[];for(let n=0,s;no&1&&a==s)||r.push(t[n],s)}t=r}let i=[];for(let r=0;r>19,r=t&65535,n=this.stack.length-i*3;if(n<0||e.getGoto(this.stack[n],r,!1)<0){let s=this.findForcedReduction();if(s==null)return!1;t=s}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],i=(r,n)=>{if(!t.includes(r))return t.push(r),e.allActions(r,s=>{if(!(s&393216))if(s&65536){let a=(s>>19)-n;if(a>1){let o=s&65535,l=this.stack.length-a*3;if(l>=0&&e.getGoto(this.stack[l],o,!1)>=0)return a<<19|65536|o}}else{let a=i(s,n+1);if(a!=null)return a}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;t0&&this.emitLookAhead()}},Ts=class{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}},El=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let r=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=r}},Al=class O{constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new O(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new O(this.stack,this.pos,this.index)}};function br(O,e=Uint16Array){if(typeof O!="string")return O;let t=null;for(let i=0,r=0;i=92&&s--,s>=34&&s--;let o=s-32;if(o>=46&&(o-=46,a=!0),n+=o,a)break;n*=46}t?t[r++]=n:t=new e(n)}return t}var gi=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},o$=new gi,Ll=class{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=o$,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let i=this.range,r=this.rangeIndex,n=this.pos+e;for(;ni.to:n>=i.to;){if(r==this.ranges.length-1)return null;let s=this.ranges[++r];n+=s.from-i.to,i=s}return n}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,i,r;if(t>=0&&t=this.chunk2Pos&&ia.to&&(this.chunk2=this.chunk2.slice(0,a.to-i)),r=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),r}acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=o$,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let i="";for(let r of this.ranges){if(r.from>=t)break;r.to>e&&(i+=this.input.read(Math.max(r.from,e),Math.min(r.to,t)))}return i}},hO=class{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:i}=t.p;d$(this.data,e,t,this.id,i.data,i.tokenPrecTable)}};hO.prototype.contextual=hO.prototype.fallback=hO.prototype.extend=!1;var kt=class{constructor(e,t,i){this.precTable=t,this.elseToken=i,this.data=typeof e=="string"?br(e):e}token(e,t){let i=e.pos,r=0;for(;;){let n=e.next<0,s=e.resolveOffset(1,1);if(d$(this.data,e,t,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(n||r++,s==null)break;e.reset(s,e.token)}r&&(e.reset(i,e.token),e.acceptToken(this.elseToken,r))}};kt.prototype.contextual=hO.prototype.fallback=hO.prototype.extend=!1;var z=class{constructor(e,t={}){this.token=e,this.contextual=!!t.contextual,this.fallback=!!t.fallback,this.extend=!!t.extend}};function d$(O,e,t,i,r,n){let s=0,a=1<0){let Q=O[u];if(o.allows(Q)&&(e.token.value==-1||e.token.value==Q||Y0(Q,e.token.value,r,n))){e.acceptToken(Q);break}}let c=e.next,h=0,f=O[s+2];if(e.next<0&&f>h&&O[l+f*3-3]==65535){s=O[l+f*3-1];continue e}for(;h>1,Q=l+u+(u<<1),$=O[Q],p=O[Q+1]||65536;if(c<$)f=u;else if(c>=p)h=u+1;else{s=O[Q+2],e.advance();continue e}}break}}function l$(O,e,t){for(let i=e,r;(r=O[i])!=65535;i++)if(r==t)return i-e;return-1}function Y0(O,e,t,i){let r=l$(t,i,e);return r<0||l$(t,i,O)e)&&!i.type.isError)return t<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(O.length,Math.max(i.from+1,e+25));if(t<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return t<0?0:O.length}}var Ml=class{constructor(e,t){this.fragments=e,this.nodeSet=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?c$(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?c$(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=s,null;if(n instanceof D){if(s==e){if(s=Math.max(this.safeFrom,e)&&(this.trees.push(n),this.start.push(s),this.index.push(0))}else this.index[t]++,this.nextStart=s+n.length}}},Dl=class{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new gi)}getActions(e){let t=0,i=null,{parser:r}=e.p,{tokenizers:n}=r,s=r.stateSlot(e.state,3),a=e.curContext?e.curContext.hash:0,o=0;for(let l=0;lh.end+25&&(o=Math.max(h.lookAhead,o)),h.value!=0)){let f=t;if(h.extended>-1&&(t=this.addActions(e,h.extended,h.end,t)),t=this.addActions(e,h.value,h.end,t),!c.extend&&(i=h,t>f))break}}for(;this.actions.length>t;)this.actions.pop();return o&&e.setLookAhead(o),!i&&e.pos==this.stream.end&&(i=new gi,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,t=this.addActions(e,i.value,i.end,t)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new gi,{pos:i,p:r}=e;return t.start=i,t.end=Math.min(i+1,r.stream.end),t.value=i==r.stream.end?r.parser.eofTerm:0,t}updateCachedToken(e,t,i){let r=this.stream.clipPos(i.pos);if(t.token(this.stream.reset(r,e),i),e.value>-1){let{parser:n}=i.p;for(let s=0;s=0&&i.p.parser.dialect.allows(a>>1)){(a&1)==0?e.value=a>>1:e.extended=a>>1;break}}}else e.value=0,e.end=this.stream.clipPos(r+1)}putAction(e,t,i,r){for(let n=0;ne.bufferLength*4?new Ml(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,i=this.stacks=[],r,n;if(this.bigReductionCount>300&&e.length==1){let[s]=e;for(;s.forceReduce()&&s.stack.length&&s.stack[s.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let s=0;st)i.push(a);else{if(this.advanceStack(a,i,e))continue;{r||(r=[],n=[]),r.push(a);let o=this.tokens.getMainToken(a);n.push(o.value,o.end)}}break}}if(!i.length){let s=r&&_0(r);if(s)return He&&console.log("Finish with "+this.stackID(s)),this.stackToTree(s);if(this.parser.strict)throw He&&r&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&r){let s=this.stoppedAt!=null&&r[0].pos>this.stoppedAt?r[0]:this.runRecovery(r,n,i);if(s)return He&&console.log("Force-finish "+this.stackID(s)),this.stackToTree(s.forceAll())}if(this.recovering){let s=this.recovering==1?1:this.recovering*3;if(i.length>s)for(i.sort((a,o)=>o.score-a.score);i.length>s;)i.pop();i.some(a=>a.reducePos>t)&&this.recovering--}else if(i.length>1){e:for(let s=0;s500&&l.buffer.length>500)if((a.score-l.score||a.buffer.length-l.buffer.length)>0)i.splice(o--,1);else{i.splice(s--,1);continue e}}}i.length>12&&(i.sort((s,a)=>a.score-s.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let s=1;s ":"";if(this.stoppedAt!=null&&r>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,c=l?e.curContext.hash:0;for(let h=this.fragments.nodeAt(r);h;){let f=this.parser.nodeSet.types[h.type.id]==h.type?n.getGoto(e.state,h.type.id):-1;if(f>-1&&h.length&&(!l||(h.prop(R.contextHash)||0)==c))return e.useNode(h,f),He&&console.log(s+this.stackID(e)+` (via reuse of ${n.getName(h.type.id)})`),!0;if(!(h instanceof D)||h.children.length==0||h.positions[0]>0)break;let u=h.children[0];if(u instanceof D&&h.positions[0]==0)h=u;else break}}let a=n.stateSlot(e.state,4);if(a>0)return e.reduce(a),He&&console.log(s+this.stackID(e)+` (via always-reduce ${n.getName(a&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let o=this.tokens.getActions(e);for(let l=0;lr?t.push(Q):i.push(Q)}return!1}advanceFully(e,t){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return h$(e,t),!0}}runRecovery(e,t,i){let r=null,n=!1;for(let s=0;s ":"";if(a.deadEnd&&(n||(n=!0,a.restart(),He&&console.log(c+this.stackID(a)+" (restarted)"),this.advanceFully(a,i))))continue;let h=a.split(),f=c;for(let u=0;u<10&&h.forceReduce()&&(He&&console.log(f+this.stackID(h)+" (via force-reduce)"),!this.advanceFully(h,i));u++)He&&(f=this.stackID(h)+" -> ");for(let u of a.recoverByInsert(o))He&&console.log(c+this.stackID(u)+" (via recover-insert)"),this.advanceFully(u,i);this.stream.end>a.pos?(l==a.pos&&(l++,o=0),a.recoverByDelete(o,l),He&&console.log(c+this.stackID(a)+` (via recover-delete ${this.parser.getName(o)})`),h$(a,i)):(!r||r.scoreO,Ge=class{constructor(e){this.start=e.start,this.shift=e.shift||Cl,this.reduce=e.reduce||Cl,this.reuse=e.reuse||Cl,this.hash=e.hash||(()=>0),this.strict=e.strict!==!1}},Oe=class O extends eO{constructor(e){if(super(),this.wrappers=[],e.version!=14)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let t=e.nodeNames.split(" ");this.minRepeatTerm=t.length;for(let a=0;ae.topRules[a][1]),r=[];for(let a=0;a=0)n(c,o,a[l++]);else{let h=a[l+-c];for(let f=-c;f>0;f--)n(a[l++],o,h);l++}}}this.nodeSet=new Kt(t.map((a,o)=>ue.define({name:o>=this.minRepeatTerm?void 0:a,id:o,props:r[o],top:i.indexOf(o)>-1,error:o==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(o)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let s=br(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let a=0;atypeof a=="number"?new hO(s,a):a),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,i){let r=new Il(this,e,t,i);for(let n of this.wrappers)r=n(r,e,t,i);return r}getGoto(e,t,i=!1){let r=this.goto;if(t>=r[0])return-1;for(let n=r[t+1];;){let s=r[n++],a=s&1,o=r[n++];if(a&&i)return o;for(let l=n+(s>>1);n0}validAction(e,t){return!!this.allActions(e,i=>i==t?!0:null)}allActions(e,t){let i=this.stateSlot(e,4),r=i?t(i):void 0;for(let n=this.stateSlot(e,1);r==null;n+=3){if(this.data[n]==65535)if(this.data[n+1]==1)n=Ut(this.data,n+2);else break;r=t(Ut(this.data,n+1))}return r}nextStates(e){let t=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=Ut(this.data,i+2);else break;if((this.data[i+2]&1)==0){let r=this.data[i+1];t.some((n,s)=>s&1&&n==r)||t.push(this.data[i],r)}}return t}configure(e){let t=Object.assign(Object.create(O.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=i}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(i=>{let r=e.tokenizers.find(n=>n.from==i);return r?r.to:i})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((i,r)=>{let n=e.specializers.find(a=>a.from==i.external);if(!n)return i;let s=Object.assign(Object.assign({},i),{external:n.to});return t.specializers[r]=f$(s),s})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),i=t.map(()=>!1);if(e)for(let n of e.split(" ")){let s=t.indexOf(n);s>=0&&(i[s]=!0)}let r=null;for(let n=0;ni)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scoreO.external(t,i)<<1|e}return O.get}var u$=1,R0=2,V0=3,q0=82,z0=76,U0=117,W0=85,j0=97,C0=122,G0=65,E0=90,A0=95,Nl=48,Q$=34,L0=40,$$=41,M0=32,p$=62,D0=new z(O=>{if(O.next==z0||O.next==W0?O.advance():O.next==U0&&(O.advance(),O.next==Nl+8&&O.advance()),O.next!=q0||(O.advance(),O.next!=Q$))return;O.advance();let e="";for(;O.next!=L0;){if(O.next==M0||O.next<=13||O.next==$$)return;e+=String.fromCharCode(O.next),O.advance()}for(O.advance();;){if(O.next<0)return O.acceptToken(u$);if(O.next==$$){let t=!0;for(let i=0;t&&i{if(O.next==p$)O.peek(1)==p$&&O.acceptToken(R0,1);else{let e=!1,t=0;for(;;t++){if(O.next>=G0&&O.next<=E0)e=!0;else{if(O.next>=j0&&O.next<=C0)return;if(O.next!=A0&&!(O.next>=Nl&&O.next<=Nl+9))break}O.advance()}e&&t>1&&O.acceptToken(V0)}},{extend:!0}),B0=F({"typedef struct union enum class typename decltype auto template operator friend noexcept namespace using requires concept import export module __attribute__ __declspec __based":d.definitionKeyword,"extern MsCallModifier MsPointerModifier extern static register thread_local inline const volatile restrict _Atomic mutable constexpr constinit consteval virtual explicit VirtualSpecifier Access":d.modifier,"if else switch for while do case default return break continue goto throw try catch":d.controlKeyword,"co_return co_yield co_await":d.controlKeyword,"new sizeof delete static_assert":d.operatorKeyword,"NULL nullptr":d.null,this:d.self,"True False":d.bool,"TypeSize PrimitiveType":d.standard(d.typeName),TypeIdentifier:d.typeName,FieldIdentifier:d.propertyName,"CallExpression/FieldExpression/FieldIdentifier":d.function(d.propertyName),"ModuleName/Identifier":d.namespace,PartitionName:d.labelName,StatementIdentifier:d.labelName,"Identifier DestructorName":d.variableName,"CallExpression/Identifier":d.function(d.variableName),"CallExpression/ScopedIdentifier/Identifier":d.function(d.variableName),"FunctionDeclarator/Identifier FunctionDeclarator/DestructorName":d.function(d.definition(d.variableName)),NamespaceIdentifier:d.namespace,OperatorName:d.operator,ArithOp:d.arithmeticOperator,LogicOp:d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,AssignOp:d.definitionOperator,UpdateOp:d.updateOperator,LineComment:d.lineComment,BlockComment:d.blockComment,Number:d.number,String:d.string,"RawString SystemLibString":d.special(d.string),CharLiteral:d.character,EscapeSequence:d.escape,"UserDefinedLiteral/Identifier":d.literal,PreProcArg:d.meta,"PreprocDirectiveName #include #ifdef #ifndef #if #define #else #endif #elif":d.processingInstruction,MacroName:d.special(d.name),"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,"< >":d.angleBracket,". ->":d.derefOperator,", ;":d.separator}),N0={__proto__:null,bool:36,char:36,int:36,float:36,double:36,void:36,size_t:36,ssize_t:36,intptr_t:36,uintptr_t:36,charptr_t:36,int8_t:36,int16_t:36,int32_t:36,int64_t:36,uint8_t:36,uint16_t:36,uint32_t:36,uint64_t:36,char8_t:36,char16_t:36,char32_t:36,char64_t:36,const:70,volatile:72,restrict:74,_Atomic:76,mutable:78,constexpr:80,constinit:82,consteval:84,struct:88,__declspec:92,final:148,override:148,public:152,private:152,protected:152,virtual:154,extern:160,static:162,register:164,inline:166,thread_local:168,__attribute__:172,__based:178,__restrict:180,__uptr:180,__sptr:180,_unaligned:180,__unaligned:180,noexcept:194,requires:198,TRUE:786,true:786,FALSE:788,false:788,typename:218,class:220,template:234,throw:248,__cdecl:256,__clrcall:256,__stdcall:256,__fastcall:256,__thiscall:256,__vectorcall:256,try:260,catch:264,export:282,import:286,case:296,default:298,if:308,else:314,switch:318,do:322,while:324,for:330,return:334,break:338,continue:342,goto:346,co_return:350,co_yield:354,using:362,typedef:366,namespace:380,new:398,delete:400,co_await:402,concept:406,enum:410,static_assert:414,friend:422,union:424,explicit:430,operator:444,module:456,signed:518,unsigned:518,long:518,short:518,decltype:528,auto:530,sizeof:566,NULL:572,nullptr:586,this:588},F0={__proto__:null,"<":755},H0={__proto__:null,">":135},K0={__proto__:null,operator:388,new:576,delete:582},m$=Oe.deserialize({version:14,states:"$;SQ!QQVOOP'gOUOOO(XOWO'#CdO,RQUO'#CgO,]QUO'#FjO-sQbO'#CxO.UQUO'#CxO0TQUO'#KZO0[QUO'#CwO0gOpO'#DvO0oQ!dO'#D]OOQR'#JO'#JOO5XQVO'#GUO5fQUO'#JVOOQQ'#JV'#JVO8zQUO'#KnO{QVO'#E^O?]QUO'#E^OOQQ'#Ed'#EdOOQQ'#Ee'#EeO?bQVO'#EfO@XQVO'#EiOBUQUO'#FPOBvQUO'#FhOOQR'#Fj'#FjOB{QUO'#FjOOQR'#LR'#LROOQR'#LQ'#LQOETQVO'#KQOFxQUO'#LWOGVQUO'#KrOGkQUO'#LWOH]QUO'#LYOOQR'#HU'#HUOOQR'#HV'#HVOOQR'#HW'#HWOOQR'#K}'#K}OOQR'#J_'#J_Q!QQVOOOHkQVO'#FOOIWQUO'#EhOI_QUOOOKZQVO'#HgOKkQUO'#HgONVQUO'#KrONaQUO'#KrOOQQ'#Kr'#KrO!!_QUO'#KrOOQQ'#Jq'#JqO!!lQUO'#HxOOQQ'#KZ'#KZO!&^QUO'#KZO!&zQUO'#KQO!(zQVO'#I]O!(zQVO'#I`OCQQUO'#KQOOQQ'#Ip'#IpOOQQ'#KQ'#KQO!,}QUO'#KZOOQR'#KY'#KYO!-UQUO'#DZO!/mQUO'#KoOOQQ'#Ko'#KoO!/tQUO'#KoO!/{QUO'#ETO!0QQUO'#EWO!0VQUO'#FRO8zQUO'#FPO!QQVO'#F^O!0[Q#vO'#F`O!0gQUO'#FkO!0oQUO'#FpO!0tQVO'#FrO!0oQUO'#FuO!3sQUO'#FvO!3xQVO'#FxO!4SQUO'#FzO!4XQUO'#F|O!4^QUO'#GOO!4cQVO'#GQO!(zQVO'#GSO!4jQUO'#GpO!4xQUO'#GYO!(zQVO'#FeO!6VQUO'#FeO!6[QVO'#G`O!6cQUO'#GaO!6nQUO'#GnO!6sQUO'#GrO!6xQUO'#GzO!7jQ&lO'#HiO!:mQUO'#GuO!:}QUO'#HXO!;YQUO'#HZO!;bQUO'#DXO!;bQUO'#HuO!;bQUO'#HvO!;yQUO'#HwO!<[QUO'#H|O!=PQUO'#H}O!>uQVO'#IbO!(zQVO'#IdO!?PQUO'#IgO!?WQVO'#IjP!@}{,UO'#CbP!6n{,UO'#CbP!AY{7[O'#CbP!6n{,UO'#CbP!A_{,UO'#CbP!AjOSO'#IzPOOO)CEn)CEnOOOO'#I|'#I|O!AtOWO,59OOOQR,59O,59OO!(zQVO,59VOOQQ,59X,59XOOQR'#Do'#DoO!(zQVO,5;ROOQR,5qOOQR'#IX'#IXOOQR'#IY'#IYOOQR'#IZ'#IZOOQR'#I['#I[O!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!(zQVO,5>rO!DOQVO,5>zOOQQ,5?W,5?WO!EqQVO'#CjO!IjQUO'#CzOOQQ,59d,59dOOQQ,59c,59cOOQQ,5<},5<}O!IwQ&lO,5=mO!?PQUO,5?RO!LkQVO,5?UO!LrQbO,59dO!L}QVO'#FYOOQQ,5?P,5?PO!M_QVO,59WO!MfO`O,5:bO!MkQbO'#D^O!M|QbO'#K_O!N[QbO,59wO!NdQbO'#CxO!NuQUO'#CxO!NzQUO'#KZO# UQUO'#CwOOQR-E<|-E<|O# aQUO,5ApO# hQVO'#EfO@XQVO'#EiOBUQUO,5;kOOQR,5l,5>lO#3gQUO'#CgO#4]QUO,5>pO#6OQUO'#IeOOQR'#I}'#I}O#6WQUO,5:xO#6tQUO,5:xO#7eQUO,5:xO#8YQUO'#CuO!0QQUO'#CmOOQQ'#JW'#JWO#6tQUO,5:xO#8bQUO,5;QO!4xQUO'#DOO#9kQUO,5;QO#9pQUO,5>QO#:|QUO'#DOO#;dQUO,5>{O#;iQUO'#KxO#}QUO'#L]O#?UQUO,5>UO#?ZQbO'#CxO#?fQUO'#GcO#?kQUO'#E^O#@[QUO,5;kO#@sQUO'#LOO#@{QUO,5;rOKkQUO'#HfOBUQUO'#HgO#AQQUO'#KrO!6nQUO'#HjO#AxQUO'#CuO!0tQVO,5PO$(WQUO'#E[O$(eQUO,5>ROOQQ,5>S,5>SO$,RQVO'#C|OOQQ-E=o-E=oOOQQ,5>d,5>dOOQQ,59a,59aO$,]QUO,5>wO$.]QUO,5>zO!6nQUO,59uO$.pQUO,5;qO$.}QUO,5<{O!0QQUO,5:oOOQQ,5:r,5:rO$/YQUO,5;mO$/_QUO'#KnOBUQUO,5;kOOQR,5;x,5;xO$0OQUO'#FbO$0^QUO'#FbO$0cQUO,5;zO$3|QVO'#FmO!0tQVO,5eQUO,5pQUO,5=[O$>uQUO,5=[O!4xQUO,5}QUO,5uQUO,5<{O$DQQUO,5<{O$D]QUO,5=YO!(zQVO,5=^O!(zQVO,5=fO#NeQUO,5=mOOQQ,5>T,5>TO$FbQUO,5>TO$FlQUO,5>TO$FqQUO,5>TO$FvQUO,5>TO!6nQUO,5>TO$HtQUO'#KZO$H{QUO,5=oO$IWQUO,5=aOKkQUO,5=oO$JQQUO,5=sOOQR,5=s,5=sO$JYQUO,5=sO$LeQVO'#H[OOQQ,5=u,5=uO!;]QUO,5=uO%#`QUO'#KkO%#gQUO'#K[O%#{QUO'#KkO%$VQUO'#DyO%$hQUO'#D|O%'eQUO'#K[OOQQ'#K['#K[O%)WQUO'#K[O%#gQUO'#K[O%)]QUO'#K[OOQQ,59s,59sOOQQ,5>a,5>aOOQQ,5>b,5>bO%)eQUO'#HzO%)mQUO,5>cOOQQ,5>c,5>cO%-XQUO,5>cO%-dQUO,5>hO%1OQVO,5>iO%1VQUO,5>|O# hQVO'#EfO%4]QUO,5>|OOQQ,5>|,5>|O%4|QUO,5?OO%7QQUO,5?RO!<[QUO,5?RO%8|QUO,5?UO%sQUO1G0mOOQQ1G0m1G0mO%@PQUO'#CpO%B`QbO'#CxO%BkQUO'#CsO%BpQUO'#CsO%BuQUO1G.uO#AxQUO'#CrOOQQ1G.u1G.uO%DxQUO1G4]O%FOQUO1G4^O%GqQUO1G4^O%IdQUO1G4^O%KVQUO1G4^O%LxQUO1G4^O%NkQUO1G4^O&!^QUO1G4^O&$PQUO1G4^O&%rQUO1G4^O&'eQUO1G4^O&)WQUO1G4^O&*yQUO'#KPO&,SQUO'#KPO&,[QUO,59UOOQQ,5=P,5=PO&.dQUO,5=PO&.nQUO,5=PO&.sQUO,5=PO&.xQUO,5=PO!6nQUO,5=PO#NeQUO1G3XO&/SQUO1G4mO!<[QUO1G4mO&1OQUO1G4pO&2qQVO1G4pOOQQ1G/O1G/OOOQQ1G.}1G.}OOQQ1G2i1G2iO!IwQ&lO1G3XO&2xQUO'#LPO@XQVO'#EiO&4RQUO'#F]OOQQ'#Ja'#JaO&4WQUO'#FZO&4cQUO'#LPO&4kQUO,5;tO&4pQUO1G.rOOQQ1G.r1G.rOOQR1G/|1G/|O&6cQ!dO'#JPO&6hQbO,59xO&8yQ!eO'#D`O&9QQ!dO'#JRO&9VQbO,5@yO&9VQbO,5@yOOQR1G/c1G/cO&9bQbO1G/cO&9gQ&lO'#GeO&:eQbO,59dOOQR1G7[1G7[O#@[QUO1G1VO&:pQUO1G1^OBUQUO1G1VO&=RQUO'#CzO#*wQbO,59dO&@tQUO1G6tOOQR-E<{-E<{O&BWQUO1G0dO#6WQUO1G0dOOQQ-E=U-E=UO#6tQUO1G0dOOQQ1G0l1G0lO&B{QUO,59jOOQQ1G3l1G3lO&CcQUO,59jO&CyQUO,59jO!M_QVO1G4gO!(zQVO'#JYO&DeQUO,5AdOOQQ1G0o1G0oO!(zQVO1G0oO!6nQUO'#JnO&DmQUO,5AwOOQQ1G3p1G3pOOQR1G1V1G1VO&HjQVO'#FOO!M_QVO,5;sOOQQ,5;s,5;sOBUQUO'#JcO&JfQUO,5AjO&JnQVO'#E[OOQR1G1^1G1^O&M]QUO'#L]OOQR1G1n1G1nOOQR-E=f-E=fOOQR1G7^1G7^O#DhQUO1G7^OGVQUO1G7^O#DhQUO1G7`OOQR1G7`1G7`O&MeQUO'#G}O&MmQUO'#LXOOQQ,5=h,5=hO&M{QUO,5=jO&NQQUO,5=kOOQR1G7a1G7aO#EfQVO1G7aO&NVQUO1G7aO' ]QVO,5=kOOQR1G1U1G1UO$.vQUO'#E]O'!RQUO'#E]OOQQ'#Kz'#KzO'!lQUO'#KyO'!wQUO,5;UO'#PQUO'#ElO'#dQUO'#ElO'#wQUO'#EtOOQQ'#J['#J[O'#|QUO,5;cO'$sQUO,5;cO'%nQUO,5;dO'&tQVO,5;dOOQQ,5;d,5;dO''OQVO,5;dO'&tQVO,5;dO''VQUO,5;bO'(SQUO,5;eO'(_QUO'#KqO'(gQUO,5:vO'(lQUO,5;fOOQQ1G0n1G0nOOQQ'#J]'#J]O''VQUO,5;bO!4xQUO'#E}OOQQ,5;b,5;bO')gQUO'#E`O'+aQUO'#E{OHrQUO1G0nO'+fQUO'#EbOOQQ'#JX'#JXO'-OQUO'#KsOOQQ'#Ks'#KsO'-xQUO1G0eO'.pQUO1G3kO'/vQVO1G3kOOQQ1G3k1G3kO'0QQVO1G3kO'0XQUO'#L`O'1eQUO'#KXO'1sQUO'#KWO'2OQUO,59hO'2WQUO1G/aO'2]QUO'#FPOOQR1G1]1G1]OOQR1G2g1G2gO$>uQUO1G2gO'2gQUO1G2gO'2rQUO1G0ZOOQR'#J`'#J`O'2wQVO1G1XO'8pQUO'#FTO'8uQUO1G1VO!6nQUO'#JdO'9TQUO,5;|O$0^QUO,5;|OOQQ'#Fc'#FcOOQQ,5;|,5;|O'9cQUO1G1fOOQR1G1f1G1fO'9kQUO,5}QUO1G2`OOQQ'#Cv'#CvO'CzQUO'#G[O'DuQUO'#G[O'DzQUO'#LSO'EYQUO'#G_OOQQ'#LT'#LTO'EhQUO1G2`O'EmQVO1G1kO'HOQVO'#GUOBUQUO'#FWOOQR'#Je'#JeO'EmQVO1G1kO'HYQUO'#FvOOQR1G2f1G2fO'H_QUO1G2gO'HdQUO'#JgO'2gQUO1G2gO!(zQVO1G2tO'HlQUO1G2xO'IuQUO1G3QO'J{QUO1G3XOOQQ1G3o1G3oO'KaQUO1G3oOOQR1G3Z1G3ZO'KfQUO'#KZO'2]QUO'#LUOGkQUO'#LWOOQR'#Gy'#GyO#DhQUO'#LYOOQR'#HQ'#HQO'KpQUO'#GvO'#wQUO'#GuOOQR1G2{1G2{O'LmQUO1G2{O'MdQUO1G3ZO'MoQUO1G3_O'MtQUO1G3_OOQR1G3_1G3_O'M|QUO'#H]OOQR'#H]'#H]O( VQUO'#H]O!(zQVO'#H`O!(zQVO'#H_OOQR'#L['#L[O( [QUO'#L[OOQR'#Jk'#JkO( aQVO,5=vOOQQ,5=v,5=vO( hQUO'#H^O( pQUO'#HZOOQQ1G3a1G3aO( zQUO,5@vOOQQ,5@v,5@vO%)WQUO,5@vO%)]QUO,5@vO%$VQUO,5:eO(%iQUO'#KlO(%wQUO'#KlOOQQ,5:e,5:eOOQQ'#JS'#JSO(&SQUO'#D}O(&^QUO'#KrOGkQUO'#LWO('YQUO'#D}OOQQ'#Hp'#HpOOQQ'#Hr'#HrOOQQ'#Hs'#HsOOQQ'#Km'#KmOOQQ'#JU'#JUO('dQUO,5:hOOQQ,5:h,5:hO((aQUO'#LWO((nQUO'#HtO()UQUO,5@vO()]QUO'#H{O()hQUO'#L_O()pQUO,5>fO()uQUO'#L^OOQQ1G3}1G3}O(-lQUO1G3}O(-sQUO1G3}O(-zQUO1G4TO(/QQUO1G4TO(/VQUO,5A}O!6nQUO1G4hO!(zQVO'#IiOOQQ1G4m1G4mO(/[QUO1G4mO(1_QVO1G4pPOOO1G.h1G.hP!A_{,UO1G.hP(3_QUO'#LfP(3j{,UO1G.hP(3o{7[O1G.hPO{O-E=s-E=sPOOO,5BO,5BOP(3w{,UO,5BOPOOO1G5Q1G5QO!(zQVO7+$]O(3|QUO'#CzOOQQ,59_,59_O(4XQbO,59dO(4dQbO,59_OOQQ,59^,59^OOQQ7+)w7+)wO!M_QVO'#JtO(4oQUO,5@kOOQQ1G.p1G.pOOQQ1G2k1G2kO(4wQUO1G2kO(4|QUO7+(sOOQQ7+*X7+*XO(7bQUO7+*XO(7iQUO7+*XO(1_QVO7+*[O#NeQUO7+(sO(7vQVO'#JbO(8ZQUO,5AkO(8cQUO,5;vOOQQ'#Cp'#CpOOQQ,5;w,5;wO!(zQVO'#F[OOQQ-E=_-E=_O!M_QVO,5;uOOQQ1G1`1G1`OOQQ,5?k,5?kOOQQ-E<}-E<}OOQR'#Dg'#DgOOQR'#Di'#DiOOQR'#Dl'#DlO(9lQ!eO'#K`O(9sQMkO'#K`O(9zQ!eO'#K`OOQR'#K`'#K`OOQR'#JQ'#JQO(:RQ!eO,59zOOQQ,59z,59zO(:YQbO,5?mOOQQ-E=P-E=PO(:hQbO1G6eOOQR7+$}7+$}OOQR7+&q7+&qOOQR7+&x7+&xO'8uQUO7+&qO(:sQUO7+&OO#6WQUO7+&OO(;hQUO1G/UO(]QUO,5?tOOQQ-E=W-E=WO(?fQUO7+&ZOOQQ,5@Y,5@YOOQQ-E=l-E=lO(?kQUO'#LPO@XQVO'#EiO(@wQUO1G1_OOQQ1G1_1G1_O(BQQUO,5?}OOQQ,5?},5?}OOQQ-E=a-E=aO(BfQUO'#KqOOQR7+,x7+,xO#DhQUO7+,xOOQR7+,z7+,zO(BsQUO,5=iO#DsQUO'#JjO(CUQUO,5AsOOQR1G3U1G3UOOQR1G3V1G3VO(CdQUO7+,{OOQR7+,{7+,{O(E[QUO,5:wO(FyQUO'#EwO!(zQVO,5;VO(GlQUO,5:wO(GvQUO'#EpO(HXQUO'#EzOOQQ,5;Z,5;ZO#K]QVO'#ExO(HoQUO,5:wO(HvQUO'#EyO#GgQUO'#JZO(J`QUO,5AeOOQQ1G0p1G0pO(JkQUO,5;WO!<[QUO,5;^O(KUQUO,5;_O(KdQUO,5;WO(MvQUO,5;`OOQQ-E=Y-E=YO(NOQUO1G0}OOQQ1G1O1G1OO(NyQUO1G1OO)!PQVO1G1OO)!WQVO1G1OO)!bQUO1G0|OOQQ1G0|1G0|OOQQ1G1P1G1PO)#_QUO'#JoO)#iQUO,5A]OOQQ1G0b1G0bOOQQ-E=Z-E=ZO)#qQUO,5;iO!<[QUO,5;iO)$nQVO,5:zO)$uQUO,5;gO$ mQUO7+&YOOQQ7+&Y7+&YO!(zQVO'#EfO)$|QUO,5:|OOQQ'#Kt'#KtOOQQ-E=V-E=VOOQQ,5A_,5A_OOQQ'#Jl'#JlO)(qQUO7+&PPOQQ7+&P7+&POOQQ7+)V7+)VO))iQUO7+)VO)*oQVO7+)VOOQQ,5>m,5>mO$)YQVO'#JsO)*vQUO,5@rOOQQ1G/S1G/SOOQQ7+${7+${O)+RQUO7+(RO)+WQUO7+(ROOQR7+(R7+(RO$>uQUO7+(ROOQQ7+%u7+%uOOQR-E=^-E=^O!0VQUO,5;oOOQQ,5@O,5@OOOQQ-E=b-E=bO$0^QUO1G1hOOQQ1G1h1G1hOOQR7+'Q7+'QOOQR1G1s1G1sOBUQUO,5;rO)+tQUO,5hQUO,5}QUO7+(dO)?SQVO7+(dOOQQ7+(l7+(lOOQQ7+)Z7+)ZO)?[QUO'#KkO)?fQUO'#KkOOQR,5=b,5=bO)?sQUO,5=bO!;bQUO,5=bO!;bQUO,5=bO!;bQUO,5=bOOQR7+(g7+(gOOQR7+(u7+(uOOQR7+(y7+(yOOQR,5=w,5=wO)?xQUO,5=zO)AOQUO,5=yOOQR,5Av,5AvOOQR-E=i-E=iOOQQ1G3b1G3bO)BUQUO,5=xO)BZQVO'#EfOOQQ1G6b1G6bO%)WQUO1G6bO%)]QUO1G6bOOQQ1G0P1G0POOQQ-E=Q-E=QO)DrQUO,5AWO(%iQUO'#JTO)D}QUO,5AWO)D}QUO,5AWO)EVQUO,5:iO8zQUO,5:iOOQQ,5>],5>]O)EaQUO,5ArO)EhQUO'#EVO)FrQUO'#EVO)G]QUO,5:iO)GgQUO'#HlO)GgQUO'#HmOOQQ'#Kp'#KpO)HUQUO'#KpO!(zQVO'#HnOOQQ,5:i,5:iO)HvQUO,5:iO!M_QVO,5:iOOQQ-E=S-E=SOOQQ1G0S1G0SOOQQ,5>`,5>`O)H{QUO1G6bO!(zQVO,5>gO)LjQUO'#JrO)LuQUO,5AyOOQQ1G4Q1G4QO)L}QUO,5AxOOQQ,5Ax,5AxOOQQ7+)i7+)iO*!lQUO7+)iOOQQ7+)o7+)oO*'kQVO1G7iO*)mQUO7+*SO*)rQUO,5?TO**xQUO7+*[POOO7+$S7+$SP*,kQUO'#LgP*,sQUO,5BQP*,x{,UO7+$SPOOO1G7j1G7jO*,}QUO<XQUO7+&jO*?_QVO7+&jOOQQ7+&h7+&hOOQQ,5@Z,5@ZOOQQ-E=m-E=mO*@ZQUO1G1TO*@eQUO1G1TO*AOQUO1G0fOOQQ1G0f1G0fO*BUQUO'#K|O*B^QUO1G1ROOQQ<uQUO<VO)GgQUO'#JpO*NQQUO1G0TO*NcQVO1G0TOOQQ1G3u1G3uO*NjQUO,5>WO*NuQUO,5>XO+ dQUO,5>YO+!jQUO1G0TO%)]QUO7++|O+#pQUO1G4ROOQQ,5@^,5@^OOQQ-E=p-E=pOOQQ<n,5>nO+/iQUOANAXOOQRANAXANAXO+/nQUO7+'`OOQRAN@cAN@cO+0zQVOAN@nO+1RQUOAN@nO!0tQVOAN@nO+2[QUOAN@nO+2aQUOAN@}O+2lQUOAN@}O+3rQUOAN@}OOQRAN@nAN@nO!M_QVOAN@}OOQRANAOANAOO+3wQUO7+'|O)7VQUO7+'|OOQQ7+(O7+(OO+4YQUO7+(OO+5`QVO7+(OO+5gQVO7+'hO+5nQUOANAjOOQR7+(h7+(hOOQR7+)P7+)PO+5sQUO7+)PO+5xQUO7+)POOQQ<= h<= hO+6QQUO7+,^O+6YQUO1G5ZOOQQ1G5Z1G5ZO+6eQUO7+%oOOQQ7+%o7+%oO+6vQUO7+%oO*NcQVO7+%oOOQQ7+)a7+)aO+6{QUO7+%oO+8RQUO7+%oO!M_QVO7+%oO+8]QUO1G0]O*LkQUO1G0]O)EhQUO1G0]OOQQ1G0a1G0aO+8zQUO1G3qO+:QQVO1G3qOOQQ1G3q1G3qO+:[QVO1G3qO+:cQUO,5@[OOQQ-E=n-E=nOOQQ1G3r1G3rO%)WQUO<= hOOQQ7+*Z7+*ZPOQQ,5@b,5@bPOQQ-E=t-E=tOOQQ1G/}1G/}OOQQ,5?x,5?xOOQQ-E=[-E=[OOQRG26sG26sO+:zQUOG26YO!0tQVOG26YO+QQUO<uAN>uO+BpQUOAN>uO+CvQUOAN>uO!M_QVOAN>uO+C{QUO<nQUO'#KZO,?OQUO'#CzO,?^QbO,59dO,6VQUO7+&OO,PP>j>|?bFYMY!&^!,tP!3n!4c!5WP!5rPPPPPPPP!6]P!7uP!9W!:pP!:vPPPPPP!:yP!:yPP!:yPP!;VPPPPPP!=X!@oP!@rPP!A`!BTPPPPP!BXP>m!CjPP>m!Eq!Gr!HQ!Ig!KWP!KcP!Kr!Kr# S#$c#%y#)V#,a!Gr#,kPP!Gr#,r#,x#,k#,k#,{P#-P#-n#-n#-n#-n!KWP#.X#.j#1PP#1eP#3QP#3U#3^#4R#4^#6l#6t#6t#3UP#3UP#6{#7RP#7]PP#7x#8g#9X#7xP#9y#:VP#7xP#7xPP#7x#7xP#7xP#7xP#7xP#7xP#7xP#7xP#:Y#7]#:vP#;]P#;r#;r#;r#;r#m>m>m$%Y!BT!BT!BT!BT!BT!BT!6]!6]!6]$%mP$'Y$'h!6]$'nPP!6]$)|$*P#Bo$*S:u7k$-Y$/T$0t$2d7kPP7k$4W7kP7k7kP7kP$7^7kP7kPP7k$7jPPPPPPPPP*]P$:r$:x$=a$?g$?m$@T$@_$@j$@y$AP$B_$C^$Ce$Cl$Cr$Cz$DU$D[$Dg$Dm$Dv$EO$EZ$Ea$Ek$Eq$E{$FS$Fc$Fi$FoP$Fu$F}$GU$Gd$IQ$IW$I^$Ie$InPPPPPPPP$It$IxPPPPP%!z$)|%!}%&V%(_PP%(l%(oPPPPPPPPPP%({%*O%*U%*Y%,P%-^%.P%.W%0g%0mPPP%0w%1S%1V%1]%2d%2g%2q%2{%3P%4T%4v%4|#BxP%5g%5w%5z%6[%6h%6l%6r%6x$)|$*P$*P%6{%7OP%7Y%7]R#cP'`mO[aefwx{!W!X!g!k!n!r!s!v!x#X#Y#[#g#j#m#r#s#t#u#v#w#x#y#z#{#|$O$V$X$Z$f$g$l%^%n&R&T&X&c&g&y&z&}'P'Q'c'j'k'z(a(c(j)m)s*i*j*m*r*s*w+X+Z+i+k+l,Q,S,o,r,x-^-_-b-h.Q.R.V/O/R/]/d/m/o/t/v0i0|1R1b1c1m1q1{1}2d2g2j2v2{3O3j4P4S4X4b5Z5f5r6`6d6g6i6k6u6w6|7c7k7n8f8h8n8t8u9S9W9^9`9m9p9q9|:P:V:X:^:c:gU%pm%q7RQ&n!`Q(k#]d0Q*O/}0O0P0S5O5P5Q5T8RR7R3Ub}Oaewx{!g&T*r&v$j[!W!X!k!n!r!s!v!x#X#Y#[#g#j#m#r#s#t#u#v#w#x#y#z#{#|$O$V$X$Z$f$g$l%^%n&R&X&c&g&y&z&}'P'Q'c'j'k'z(a(c(j)m)s*i*j*m*s*w+X+Z+i+k+l,Q,S,o,r,x-^-_-b-h.Q.R.V/O/R/]/d/m/o/t/v0|1b1c1m1q1{1}2d2g2j2v2{3O3j4P4S4X4b5Z5f5r6`6d6g6i6k6u6w6|7c7k7n8f8h8n8t8u9S9W9^9`9m9p9q9|:P:V:X:^:c:gS%af0i#d%kgnp|#O$h$}%O%T%e%i%j%x&t'u'v(R*Z*a*c*u+^,m,w-`-q-x.g.n.p0^0z0{1P1T2`2k5b6h;X;Y;Z;a;b;c;p;q;r;s;w;x;y;z MacroName LineComment BlockComment PreprocDirective #include String EscapeSequence SystemLibString Identifier ) ( ArgumentList ConditionalExpression AssignmentExpression CallExpression PrimitiveType FieldExpression FieldIdentifier DestructorName TemplateMethod ScopedFieldIdentifier NamespaceIdentifier TemplateType TypeIdentifier ScopedTypeIdentifier ScopedNamespaceIdentifier :: NamespaceIdentifier TypeIdentifier TemplateArgumentList < TypeDescriptor const volatile restrict _Atomic mutable constexpr constinit consteval StructSpecifier struct MsDeclspecModifier __declspec Attribute AttributeName Identifier AttributeArgs { } [ ] UpdateOp ArithOp ArithOp ArithOp LogicOp BitOp BitOp BitOp CompareOp CompareOp CompareOp > CompareOp BitOp UpdateOp , Number CharLiteral AttributeArgs VirtualSpecifier BaseClassClause Access virtual FieldDeclarationList FieldDeclaration extern static register inline thread_local AttributeSpecifier __attribute__ PointerDeclarator MsBasedModifier __based MsPointerModifier FunctionDeclarator ParameterList ParameterDeclaration PointerDeclarator FunctionDeclarator Noexcept noexcept RequiresClause requires True False ParenthesizedExpression CommaExpression LambdaExpression LambdaCaptureSpecifier TemplateParameterList OptionalParameterDeclaration TypeParameterDeclaration typename class VariadicParameterDeclaration VariadicDeclarator ReferenceDeclarator OptionalTypeParameterDeclaration VariadicTypeParameterDeclaration TemplateTemplateParameterDeclaration template AbstractFunctionDeclarator AbstractPointerDeclarator AbstractArrayDeclarator AbstractParenthesizedDeclarator AbstractReferenceDeclarator ThrowSpecifier throw TrailingReturnType CompoundStatement FunctionDefinition MsCallModifier TryStatement try CatchClause catch LinkageSpecification Declaration InitDeclarator InitializerList InitializerPair SubscriptDesignator FieldDesignator ExportDeclaration export ImportDeclaration import ModuleName PartitionName HeaderName CaseStatement case default LabeledStatement StatementIdentifier ExpressionStatement IfStatement if ConditionClause Declaration else SwitchStatement switch DoStatement do while WhileStatement ForStatement for ReturnStatement return BreakStatement break ContinueStatement continue GotoStatement goto CoReturnStatement co_return CoYieldStatement co_yield AttributeStatement ForRangeLoop AliasDeclaration using TypeDefinition typedef PointerDeclarator FunctionDeclarator ArrayDeclarator ParenthesizedDeclarator ThrowStatement NamespaceDefinition namespace ScopedIdentifier Identifier OperatorName operator ArithOp BitOp CompareOp LogicOp new delete co_await ConceptDefinition concept UsingDeclaration enum StaticAssertDeclaration static_assert ConcatenatedString TemplateDeclaration FriendDeclaration friend union FunctionDefinition ExplicitFunctionSpecifier explicit FieldInitializerList FieldInitializer DefaultMethodClause DeleteMethodClause FunctionDefinition OperatorCast operator TemplateInstantiation FunctionDefinition FunctionDefinition Declaration ModuleDeclaration module RequiresExpression RequirementList SimpleRequirement TypeRequirement CompoundRequirement ReturnTypeRequirement ConstraintConjuction LogicOp ConstraintDisjunction LogicOp ArrayDeclarator ParenthesizedDeclarator ReferenceDeclarator TemplateFunction OperatorName StructuredBindingDeclarator ArrayDeclarator ParenthesizedDeclarator ReferenceDeclarator BitfieldClause FunctionDefinition FunctionDefinition Declaration FunctionDefinition Declaration AccessSpecifier UnionSpecifier ClassSpecifier EnumSpecifier SizedTypeSpecifier TypeSize EnumeratorList Enumerator DependentType Decltype decltype auto PlaceholderTypeSpecifier ParameterPackExpansion ParameterPackExpansion FieldIdentifier PointerExpression SubscriptExpression BinaryExpression ArithOp LogicOp LogicOp BitOp UnaryExpression LogicOp BitOp UpdateExpression CastExpression SizeofExpression sizeof CoAwaitExpression CompoundLiteralExpression NULL NewExpression new NewDeclarator DeleteExpression delete ParameterPackExpansion nullptr this UserDefinedLiteral ParamPack #define PreprocArg #if #ifdef #ifndef #else #endif #elif PreprocDirectiveName Macro Program",maxTerm:426,nodeProps:[["group",-35,1,8,11,15,16,17,19,71,72,100,101,102,104,191,208,229,242,243,270,271,272,277,280,281,282,284,285,286,287,290,292,293,294,295,296,"Expression",-13,18,25,26,27,43,255,256,257,258,262,263,265,266,"Type",-19,126,129,147,150,152,153,158,160,163,164,166,168,170,172,174,176,178,179,188,"Statement"],["isolate",-4,4,5,8,10,""],["openedBy",12,"(",52,"{",54,"["],["closedBy",13,")",51,"}",53,"]"]],propSources:[B0],skippedNodes:[0,3,4,5,6,7,10,297,298,299,300,301,302,303,304,305,306,347,348],repeatNodeCount:41,tokenData:"&*r7ZR!UOX$eXY({YZ.gZ]$e]^+P^p$epq({qr.}rs0}st2ktu$euv!7dvw!9bwx!;exy!O{|!?R|}!AV}!O!BQ!O!P!DX!P!Q#+y!Q!R#Az!R![$(x![!]$Ag!]!^$Cc!^!_$D^!_!`%1W!`!a%2X!a!b%5_!b!c$e!c!n%6Y!n!o%7q!o!w%6Y!w!x%7q!x!}%6Y!}#O%:n#O#P%u#Y#]4Y#]#^NZ#^#o4Y#o;'S$e;'S;=`(u<%lO$e4e4eb)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#o4Y#o;'S$e;'S;=`(u<%lO$e4e5xd)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#X4Y#X#Y7W#Y#o4Y#o;'S$e;'S;=`(u<%lO$e4e7cd)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#Y4Y#Y#Z8q#Z#o4Y#o;'S$e;'S;=`(u<%lO$e4e8|d)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#]4Y#]#^:[#^#o4Y#o;'S$e;'S;=`(u<%lO$e4e:gd)^W(qQ'f&j'm.oOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![4Y![!c$e!c!}4Y!}#O$e#O#P&f#P#R$e#R#S4Y#S#T$e#T#b4Y#b#c;u#c#o4Y#o;'S$e;'S;=`(u<%lO$e4e][)T,g)^W(qQ%Z!b'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!?`^)^W(qQ%Z!b!Y,g'f&jOY$eZr$ers%^sw$ewx(Ox{$e{|!@[|!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!@gY)^W!X-y(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!AbY!h,k)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!B__)^W(qQ%Z!b!Y,g'f&jOY$eZr$ers%^sw$ewx(Ox}$e}!O!@[!O!_$e!_!`!8g!`!a!C^!a#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o!CiY(x-y)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!Dd^)^W(qQ'f&j(w,gOY$eZr$ers%^sw$ewx(Ox!O$e!O!P!E`!P!Q$e!Q![!GY![#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!Ei[)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!O$e!O!P!F_!P#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2a!FjY)Z,k)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2]!Gen)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx!Icx!Q$e!Q![!GY![!g$e!g!h#$w!h!i#*Y!i!n$e!n!o#*Y!o!r$e!r!s#$w!s!w$e!w!x#*Y!x#O$e#O#P&f#P#X$e#X#Y#$w#Y#Z#*Y#Z#`$e#`#a#*Y#a#d$e#d#e#$w#e#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e2T!IjY(qQ'f&jOY(OZr(Ors%}s!Q(O!Q![!JY![#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O2T!Jcn(qQ!i,g'f&jOY(OZr(Ors%}sw(Owx!Icx!Q(O!Q![!JY![!g(O!g!h!La!h!i##`!i!n(O!n!o##`!o!r(O!r!s!La!s!w(O!w!x##`!x#O(O#O#P&f#P#X(O#X#Y!La#Y#Z##`#Z#`(O#`#a##`#a#d(O#d#e!La#e#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2T!Ljl(qQ!i,g'f&jOY(OZr(Ors%}s{(O{|!Nb|}(O}!O!Nb!O!Q(O!Q![# e![!c(O!c!h# e!h!i# e!i!n(O!n!o##`!o!w(O!w!x##`!x#O(O#O#P&f#P#T(O#T#Y# e#Y#Z# e#Z#`(O#`#a##`#a#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2T!Ni^(qQ'f&jOY(OZr(Ors%}s!Q(O!Q![# e![!c(O!c!i# e!i#O(O#O#P&f#P#T(O#T#Z# e#Z;'S(O;'S;=`(o<%lO(O2T# nj(qQ!i,g'f&jOY(OZr(Ors%}sw(Owx!Nbx!Q(O!Q![# e![!c(O!c!h# e!h!i# e!i!n(O!n!o##`!o!w(O!w!x##`!x#O(O#O#P&f#P#T(O#T#Y# e#Y#Z# e#Z#`(O#`#a##`#a#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2T##id(qQ!i,g'f&jOY(OZr(Ors%}s!h(O!h!i##`!i!n(O!n!o##`!o!w(O!w!x##`!x#O(O#O#P&f#P#Y(O#Y#Z##`#Z#`(O#`#a##`#a#i(O#i#j##`#j;'S(O;'S;=`(o<%lO(O2]#%Sn)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx(Ox{$e{|#'Q|}$e}!O#'Q!O!Q$e!Q![#(]![!c$e!c!h#(]!h!i#(]!i!n$e!n!o#*Y!o!w$e!w!x#*Y!x#O$e#O#P&f#P#T$e#T#Y#(]#Y#Z#(]#Z#`$e#`#a#*Y#a#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e2]#'Z`)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![#(]![!c$e!c!i#(]!i#O$e#O#P&f#P#T$e#T#Z#(]#Z;'S$e;'S;=`(u<%lO$e2]#(hj)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx!Nbx!Q$e!Q![#(]![!c$e!c!h#(]!h!i#(]!i!n$e!n!o#*Y!o!w$e!w!x#*Y!x#O$e#O#P&f#P#T$e#T#Y#(]#Y#Z#(]#Z#`$e#`#a#*Y#a#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e2]#*ef)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx(Ox!h$e!h!i#*Y!i!n$e!n!o#*Y!o!w$e!w!x#*Y!x#O$e#O#P&f#P#Y$e#Y#Z#*Y#Z#`$e#`#a#*Y#a#i$e#i#j#*Y#j;'S$e;'S;=`(u<%lO$e7Z#,W`)^W(qQ%Z!b![,g'f&jOY$eZr$ers%^sw$ewx(Oxz$ez{#-Y{!P$e!P!Q#:s!Q!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z#-c])^W(qQ'f&jOY#-YYZ#.[Zr#-Yrs#/csw#-Ywx#5wxz#-Yz{#8j{#O#-Y#O#P#2`#P;'S#-Y;'S;=`#:m<%lO#-Y1e#._TOz#.[z{#.n{;'S#.[;'S;=`#/]<%lO#.[1e#.qVOz#.[z{#.n{!P#.[!P!Q#/W!Q;'S#.[;'S;=`#/]<%lO#.[1e#/]OT1e1e#/`P;=`<%l#.[7X#/jZ)^W'f&jOY#/cYZ#.[Zw#/cwx#0]xz#/cz{#4O{#O#/c#O#P#2`#P;'S#/c;'S;=`#5q<%lO#/c7P#0bX'f&jOY#0]YZ#.[Zz#0]z{#0}{#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#1SZ'f&jOY#0]YZ#.[Zz#0]z{#0}{!P#0]!P!Q#1u!Q#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#1|UT1e'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}7P#2eZ'f&jOY#0]YZ#0]Z]#0]]^#3W^z#0]z{#0}{#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#3]X'f&jOY#0]YZ#0]Zz#0]z{#0}{#O#0]#O#P#2`#P;'S#0];'S;=`#3x<%lO#0]7P#3{P;=`<%l#0]7X#4V])^W'f&jOY#/cYZ#.[Zw#/cwx#0]xz#/cz{#4O{!P#/c!P!Q#5O!Q#O#/c#O#P#2`#P;'S#/c;'S;=`#5q<%lO#/c7X#5XW)^WT1e'f&jOY%^Zw%^wx%}x#O%^#O#P&f#P;'S%^;'S;=`'x<%lO%^7X#5tP;=`<%l#/c7R#6OZ(qQ'f&jOY#5wYZ#.[Zr#5wrs#0]sz#5wz{#6q{#O#5w#O#P#2`#P;'S#5w;'S;=`#8d<%lO#5w7R#6x](qQ'f&jOY#5wYZ#.[Zr#5wrs#0]sz#5wz{#6q{!P#5w!P!Q#7q!Q#O#5w#O#P#2`#P;'S#5w;'S;=`#8d<%lO#5w7R#7zW(qQT1e'f&jOY(OZr(Ors%}s#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O7R#8gP;=`<%l#5w7Z#8s_)^W(qQ'f&jOY#-YYZ#.[Zr#-Yrs#/csw#-Ywx#5wxz#-Yz{#8j{!P#-Y!P!Q#9r!Q#O#-Y#O#P#2`#P;'S#-Y;'S;=`#:m<%lO#-Y7Z#9}Y)^W(qQT1e'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z#:pP;=`<%l#-Y7Z#;OY)^W(qQS1e'f&jOY#:sZr#:srs#;nsw#:swx#@{x#O#:s#O#P#[<%lO#b#P;'S#[<%lO#[<%lO#_P;=`<%l#i]S1e'f&jOY#b#P#b#[<%lO#[<%lO#b#P#b#[<%lO#t!R![$2V![!c$e!c!i$2V!i#O$e#O#P&f#P#T$e#T#Z$2V#Z;'S$e;'S;=`(u<%lO$e2]$?Pv)^W(qQ!i,g'f&jOY$eZr$ers%^sw$ewx$4lx!O$e!O!P$ m!P!Q$e!Q![$2V![!c$e!c!g$2V!g!h$:p!h!i$2V!i!n$e!n!o#*Y!o!r$e!r!s#$w!s!w$e!w!x#*Y!x#O$e#O#P&f#P#T$e#T#U$2V#U#V$2V#V#X$2V#X#Y$:p#Y#Z$2V#Z#`$e#`#a#*Y#a#d$e#d#e#$w#e#i$e#i#j#*Y#j#l$e#l#m$0z#m;'S$e;'S;=`(u<%lO$e4e$Ar[(v-X)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox![$e![!]$Bh!]#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3s$BsYm-})^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e2]$CnY)Y,g)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7V$Dk_q,g%]!b)^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!^$Ej!^!_%+w!_!`%.U!`!a%0]!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej*[$Es])^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!`$Ej!`!a%*t!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ejp$FoTO!`$Fl!`!a$GO!a;'S$Fl;'S;=`$GT<%lO$Flp$GTO$Wpp$GWP;=`<%l$Fl*Y$GbZ)^W'f&jOY$GZYZ$FlZw$GZwx$HTx!`$GZ!`!a%(U!a#O$GZ#O#P$Ib#P;'S$GZ;'S;=`%(y<%lO$GZ*Q$HYX'f&jOY$HTYZ$FlZ!`$HT!`!a$Hu!a#O$HT#O#P$Ib#P;'S$HT;'S;=`$Mx<%lO$HT*Q$IOU$WpY#t'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}*Q$Ig['f&jOY$HTYZ$HTZ]$HT]^$J]^!`$HT!`!a$NO!a#O$HT#O#P%&n#P;'S$HT;'S;=`%'f;=`<%l%$z<%lO$HT*Q$JbX'f&jOY$HTYZ$J}Z!`$HT!`!a$Hu!a#O$HT#O#P$Ib#P;'S$HT;'S;=`$Mx<%lO$HT'[$KSX'f&jOY$J}YZ$FlZ!`$J}!`!a$Ko!a#O$J}#O#P$LY#P;'S$J};'S;=`$Mr<%lO$J}'[$KvU$Wp'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}'[$L_Z'f&jOY$J}YZ$J}Z]$J}]^$MQ^!`$J}!`!a$Ko!a#O$J}#O#P$LY#P;'S$J};'S;=`$Mr<%lO$J}'[$MVX'f&jOY$J}YZ$J}Z!`$J}!`!a$Ko!a#O$J}#O#P$LY#P;'S$J};'S;=`$Mr<%lO$J}'[$MuP;=`<%l$J}*Q$M{P;=`<%l$HT*Q$NVW$Wp'f&jOY$NoZ!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`$NtW'f&jOY$NoZ!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`% eUY#t'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%})`% |Y'f&jOY$NoYZ$NoZ]$No]^%!l^#O$No#O#P%#d#P;'S$No;'S;=`%$[;=`<%l%$z<%lO$No)`%!qX'f&jOY$NoYZ%}Z!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`%#aP;=`<%l$No)`%#iZ'f&jOY$NoYZ%}Z]$No]^%!l^!`$No!`!a% ^!a#O$No#O#P% w#P;'S$No;'S;=`%#^<%lO$No)`%$_XOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h;=`<%l$No<%lO%$z#t%$}WOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h<%lO%$z#t%%lOY#t#t%%oRO;'S%$z;'S;=`%%x;=`O%$z#t%%{XOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h;=`<%l%$z<%lO%$z#t%&kP;=`<%l%$z*Q%&sZ'f&jOY$HTYZ$J}Z]$HT]^$J]^!`$HT!`!a$Hu!a#O$HT#O#P$Ib#P;'S$HT;'S;=`$Mx<%lO$HT*Q%'iXOY%$zZ!`%$z!`!a%%g!a#O%$z#O#P%%l#P;'S%$z;'S;=`%&h;=`<%l$HT<%lO%$z*Y%(aW$WpY#t)^W'f&jOY%^Zw%^wx%}x#O%^#O#P&f#P;'S%^;'S;=`'x<%lO%^*Y%(|P;=`<%l$GZ*S%)WZ(qQ'f&jOY%)PYZ$FlZr%)Prs$HTs!`%)P!`!a%)y!a#O%)P#O#P$Ib#P;'S%)P;'S;=`%*n<%lO%)P*S%*UW$WpY#t(qQ'f&jOY(OZr(Ors%}s#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O*S%*qP;=`<%l%)P*[%+RY$WpY#t)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e*[%+tP;=`<%l$Ej7V%,U^)^W(qQ%[!b!f,g'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!_$Ej!_!`%-Q!`!a%*t!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej7V%-]]!g-y)^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!`$Ej!`!a%*t!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej7V%.c]%]!b!b,g)^W(qQ'f&jOY$EjYZ$FlZr$Ejrs$GZsw$Ejwx%)Px!`$Ej!`!a%/[!a#O$Ej#O#P$Ib#P;'S$Ej;'S;=`%+q<%lO$Ej7V%/mY%]!b!b,g$WpY#t)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e)j%0hYY#t)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%1c[)k!c)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`0Q!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%2f]%]!b)^W(qQ!d,g'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`%3_!`!a%4[!a#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%3lY%]!b!b,g)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%4i[)^W(qQ%[!b!f,g'f&jOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e&u%5jY(uP)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z%6ib)^W(yS(qQ!R,f(r%y'f&jOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![%6Y![!c$e!c!}%6Y!}#O$e#O#P&f#P#R$e#R#S%6Y#S#T$e#T#o%6Y#o;'S$e;'S;=`(u<%lO$e7Z%8Qb)^W(yS(qQ!R,f(r%y'f&jOY$eZr$ers%9Ysw$ewx%9{x!Q$e!Q![%6Y![!c$e!c!}%6Y!}#O$e#O#P&f#P#R$e#R#S%6Y#S#T$e#T#o%6Y#o;'S$e;'S;=`(u<%lO$e5P%9cW)^W(p/]'f&jOY%^Zw%^wx%}x#O%^#O#P&f#P;'S%^;'S;=`'x<%lO%^2T%:UW(qQ)],g'f&jOY(OZr(Ors%}s#O(O#O#P&f#P;'S(O;'S;=`(o<%lO(O3o%:yZ!V-y)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox!}$e!}#O%;l#O#P&f#P;'S$e;'S;=`(u<%lO$e&u%;wY)QP)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e4e%[Z]%=q]^%?Z^!Q%=q!Q![%?w![!w%=q!w!x%AX!x#O%=q#O#P%H_#P#i%=q#i#j%Ds#j#l%=q#l#m%IR#m;'S%=q;'S;=`%Kt<%lO%=q&t%=xUXY'f&jOY%}Z#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}4e%>e[XY(n.o'f&jOX%}XY-OYZ*[Z]%}]^-O^p%}pq-Oq#O%}#O#P,^#P;'S%};'S;=`'r<%lO%}4e%?bVXY'f&jOY%}YZ-OZ#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%@OWXY'f&jOY%}Z!Q%}!Q![%@h![#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%@oWXY'f&jOY%}Z!Q%}!Q![%=q![#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%A^['f&jOY%}Z!Q%}!Q![%BS![!c%}!c!i%BS!i#O%}#O#P&f#P#T%}#T#Z%BS#Z;'S%};'S;=`'r<%lO%}&t%BX['f&jOY%}Z!Q%}!Q![%B}![!c%}!c!i%B}!i#O%}#O#P&f#P#T%}#T#Z%B}#Z;'S%};'S;=`'r<%lO%}&t%CS['f&jOY%}Z!Q%}!Q![%Cx![!c%}!c!i%Cx!i#O%}#O#P&f#P#T%}#T#Z%Cx#Z;'S%};'S;=`'r<%lO%}&t%C}['f&jOY%}Z!Q%}!Q![%Ds![!c%}!c!i%Ds!i#O%}#O#P&f#P#T%}#T#Z%Ds#Z;'S%};'S;=`'r<%lO%}&t%Dx['f&jOY%}Z!Q%}!Q![%En![!c%}!c!i%En!i#O%}#O#P&f#P#T%}#T#Z%En#Z;'S%};'S;=`'r<%lO%}&t%Es['f&jOY%}Z!Q%}!Q![%Fi![!c%}!c!i%Fi!i#O%}#O#P&f#P#T%}#T#Z%Fi#Z;'S%};'S;=`'r<%lO%}&t%Fn['f&jOY%}Z!Q%}!Q![%Gd![!c%}!c!i%Gd!i#O%}#O#P&f#P#T%}#T#Z%Gd#Z;'S%};'S;=`'r<%lO%}&t%Gi['f&jOY%}Z!Q%}!Q![%=q![!c%}!c!i%=q!i#O%}#O#P&f#P#T%}#T#Z%=q#Z;'S%};'S;=`'r<%lO%}&t%HfXXY'f&jOY%}YZ%}Z]%}]^'W^#O%}#O#P&f#P;'S%};'S;=`'r<%lO%}&t%IW['f&jOY%}Z!Q%}!Q![%I|![!c%}!c!i%I|!i#O%}#O#P&f#P#T%}#T#Z%I|#Z;'S%};'S;=`'r<%lO%}&t%JR['f&jOY%}Z!Q%}!Q![%Jw![!c%}!c!i%Jw!i#O%}#O#P&f#P#T%}#T#Z%Jw#Z;'S%};'S;=`'r<%lO%}&t%KO[XY'f&jOY%}Z!Q%}!Q![%Jw![!c%}!c!i%Jw!i#O%}#O#P&f#P#T%}#T#Z%Jw#Z;'S%};'S;=`'r<%lO%}&t%KwP;=`<%l%=q2a%LVZ!W,V)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P#Q%Lx#Q;'S$e;'S;=`(u<%lO$e'Y%MTY)Pd)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o%NQ[)^W(qQ%[!b'f&j!_,gOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e7Z& Vd)^W(yS(qQ!R,f(r%y'f&jOY$eZr$ers%9Ysw$ewx%9{x!Q$e!Q!Y%6Y!Y!Z%7q!Z![%6Y![!c$e!c!}%6Y!}#O$e#O#P&f#P#R$e#R#S%6Y#S#T$e#T#o%6Y#o;'S$e;'S;=`(u<%lO$e2]&!pY!T,g)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e3o&#m^)^W(qQ%[!b'f&j!^,gOY$eZr$ers%^sw$ewx(Ox!_$e!_!`!8g!`#O$e#O#P&f#P#p$e#p#q&$i#q;'S$e;'S;=`(u<%lO$e3o&$vY)U,g%^!b)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e'V&%qY!Ua)^W(qQ'f&jOY$eZr$ers%^sw$ewx(Ox#O$e#O#P&f#P;'S$e;'S;=`(u<%lO$e(]&&nc)^W(qQ%[!b'RP'f&jOX$eXY&'yZp$epq&'yqr$ers%^sw$ewx(Ox!c$e!c!}&)_!}#O$e#O#P&f#P#R$e#R#S&)_#S#T$e#T#o&)_#o;'S$e;'S;=`(u<%lO$e&y&(Sc)^W(qQ'f&jOX$eXY&'yZp$epq&'yqr$ers%^sw$ewx(Ox!c$e!c!}&)_!}#O$e#O#P&f#P#R$e#R#S&)_#S#T$e#T#o&)_#o;'S$e;'S;=`(u<%lO$e&y&)jb)^W(qQeT'f&jOY$eZr$ers%^sw$ewx(Ox!Q$e!Q![&)_![!c$e!c!}&)_!}#O$e#O#P&f#P#R$e#R#S&)_#S#T$e#T#o&)_#o;'S$e;'S;=`(u<%lO$e",tokenizers:[D0,I0,0,1,2,3,4,5,6,7,8,9],topRules:{Program:[0,307]},dynamicPrecedences:{65:1,87:1,94:1,119:1,184:1,187:-10,240:-10,241:1,244:-1,246:-10,247:1,262:-1,267:2,268:2,306:-10,365:3,418:1,419:3,420:1,421:1},specialized:[{term:356,get:O=>N0[O]||-1},{term:33,get:O=>F0[O]||-1},{term:66,get:O=>H0[O]||-1},{term:363,get:O=>K0[O]||-1}],tokenPrec:24891});var J0=ne.define({name:"cpp",parser:m$.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),TryStatement:le({except:/^\s*({|catch)\b/}),LabeledStatement:sO,CaseStatement:O=>O.baseIndent+O.unit,BlockComment:()=>null,CompoundStatement:be({closing:"}"}),Statement:le({except:/^{/})}),te.add({"DeclarationList CompoundStatement EnumeratorList FieldDeclarationList InitializerList":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/,closeBrackets:{stringPrefixes:["L","u","U","u8","LR","UR","uR","u8R","R"]}}});function g$(){return new J(J0)}var eb=122,P$=1,tb=123,Ob=124,X$=2,ib=125,rb=3,nb=4,T$=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],sb=58,ab=40,b$=95,ob=91,bs=45,lb=46,cb=35,hb=37,fb=38,db=92,ub=10,Qb=42;function yr(O){return O>=65&&O<=90||O>=97&&O<=122||O>=161}function Fl(O){return O>=48&&O<=57}function S$(O){return Fl(O)||O>=97&&O<=102||O>=65&&O<=70}var y$=(O,e,t)=>(i,r)=>{for(let n=!1,s=0,a=0;;a++){let{next:o}=i;if(yr(o)||o==bs||o==b$||n&&Fl(o))!n&&(o!=bs||a>0)&&(n=!0),s===a&&o==bs&&s++,i.advance();else if(o==db&&i.peek(1)!=ub){if(i.advance(),S$(i.next)){do i.advance();while(S$(i.next));i.next==32&&i.advance()}else i.next>-1&&i.advance();n=!0}else{n&&i.acceptToken(s==2&&r.canShift(X$)?e:o==ab?t:O);break}}},$b=new z(y$(tb,X$,Ob)),pb=new z(y$(ib,rb,nb)),mb=new z(O=>{if(T$.includes(O.peek(-1))){let{next:e}=O;(yr(e)||e==b$||e==cb||e==lb||e==Qb||e==ob||e==sb&&yr(O.peek(1))||e==bs||e==fb)&&O.acceptToken(eb)}}),gb=new z(O=>{if(!T$.includes(O.peek(-1))){let{next:e}=O;if(e==hb&&(O.advance(),O.acceptToken(P$)),yr(e)){do O.advance();while(yr(O.next)||Fl(O.next));O.acceptToken(P$)}}}),Pb=F({"AtKeyword import charset namespace keyframes media supports":d.definitionKeyword,"from to selector":d.keyword,NamespaceName:d.namespace,KeyframeName:d.labelName,KeyframeRangeName:d.operatorKeyword,TagName:d.tagName,ClassName:d.className,PseudoClassName:d.constant(d.className),IdName:d.labelName,"FeatureName PropertyName":d.propertyName,AttributeName:d.attributeName,NumberLiteral:d.number,KeywordQuery:d.keyword,UnaryQueryOp:d.operatorKeyword,"CallTag ValueName":d.atom,VariableName:d.variableName,Callee:d.operatorKeyword,Unit:d.unit,"UniversalSelector NestingSelector":d.definitionOperator,"MatchOp CompareOp":d.compareOperator,"ChildOp SiblingOp, LogicOp":d.logicOperator,BinOp:d.arithmeticOperator,Important:d.modifier,Comment:d.blockComment,ColorLiteral:d.color,"ParenthesizedContent StringLiteral":d.string,":":d.punctuation,"PseudoOp #":d.derefOperator,"; ,":d.separator,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace}),Sb={__proto__:null,lang:38,"nth-child":38,"nth-last-child":38,"nth-of-type":38,"nth-last-of-type":38,dir:38,"host-context":38,if:84,url:124,"url-prefix":124,domain:124,regexp:124},Xb={__proto__:null,or:98,and:98,not:106,only:106,layer:170},Tb={__proto__:null,selector:112,layer:166},bb={__proto__:null,"@import":162,"@media":174,"@charset":178,"@namespace":182,"@keyframes":188,"@supports":200,"@scope":204},yb={__proto__:null,to:207},x$=Oe.deserialize({version:14,states:"EbQYQdOOO#qQdOOP#xO`OOOOQP'#Cf'#CfOOQP'#Ce'#CeO#}QdO'#ChO$nQaO'#CcO$xQdO'#CkO%TQdO'#DpO%YQdO'#DrO%_QdO'#DuO%_QdO'#DxOOQP'#FV'#FVO&eQhO'#EhOOQS'#FU'#FUOOQS'#Ek'#EkQYQdOOO&lQdO'#EOO&PQhO'#EUO&lQdO'#EWO'aQdO'#EYO'lQdO'#E]O'tQhO'#EcO(VQdO'#EeO(bQaO'#CfO)VQ`O'#D{O)[Q`O'#F`O)gQdO'#F`QOQ`OOP)qO&jO'#CaPOOO)C@t)C@tOOQP'#Cj'#CjOOQP,59S,59SO#}QdO,59SO)|QdO,59VO%TQdO,5:[O%YQdO,5:^O%_QdO,5:aO%_QdO,5:cO%_QdO,5:dO%_QdO'#ErO*XQ`O,58}O*aQdO'#DzOOQS,58},58}OOQP'#Cn'#CnOOQO'#Dn'#DnOOQP,59V,59VO*hQ`O,59VO*mQ`O,59VOOQP'#Dq'#DqOOQP,5:[,5:[OOQO'#Ds'#DsO*rQpO,5:^O+]QaO,5:aO+sQaO,5:dOOQW'#DZ'#DZO,ZQhO'#DdO,xQhO'#FaO'tQhO'#DbO-WQ`O'#DhOOQW'#F['#F[O-]Q`O,5;SO-eQ`O'#DeOOQS-E8i-E8iOOQ['#Cs'#CsO-jQdO'#CtO.QQdO'#CzO.hQdO'#C}O/OQ!pO'#DPO1RQ!jO,5:jOOQO'#DU'#DUO*mQ`O'#DTO1cQ!nO'#FXO3`Q`O'#DVO3eQ`O'#DkOOQ['#FX'#FXO-`Q`O,5:pO3jQ!bO,5:rOOQS'#E['#E[O3rQ`O,5:tO3wQdO,5:tOOQO'#E_'#E_O4PQ`O,5:wO4UQhO,5:}O%_QdO'#DgOOQS,5;P,5;PO-eQ`O,5;PO4^QdO,5;PO4fQdO,5:gO4vQdO'#EtO5TQ`O,5;zO5TQ`O,5;zPOOO'#Ej'#EjP5`O&jO,58{POOO,58{,58{OOQP1G.n1G.nOOQP1G.q1G.qO*hQ`O1G.qO*mQ`O1G.qOOQP1G/v1G/vO5kQpO1G/xO5sQaO1G/{O6ZQaO1G/}O6qQaO1G0OO7XQaO,5;^OOQO-E8p-E8pOOQS1G.i1G.iO7cQ`O,5:fO7hQdO'#DoO7oQdO'#CrOOQP1G/x1G/xO&lQdO1G/xO7vQ!jO'#DZO8UQ!bO,59vO8^QhO,5:OOOQO'#F]'#F]O8XQ!bO,59zO'tQhO,59xO8fQhO'#EvO8sQ`O,5;{O9OQhO,59|O9uQhO'#DiOOQW,5:S,5:SOOQS1G0n1G0nOOQW,5:P,5:PO9|Q!fO'#FYOOQS'#FY'#FYOOQS'#Em'#EmO;^QdO,59`OOQ[,59`,59`O;tQdO,59fOOQ[,59f,59fO<[QdO,59iOOQ[,59i,59iOOQ[,59k,59kO&lQdO,59mOPQ!fO1G0ROOQO1G0R1G0ROOQO,5;`,5;`O>gQdO,5;`OOQO-E8r-E8rO>tQ`O1G1fPOOO-E8h-E8hPOOO1G.g1G.gOOQP7+$]7+$]OOQP7+%d7+%dO&lQdO7+%dOOQS1G0Q1G0QO?PQaO'#F_O?ZQ`O,5:ZO?`Q!fO'#ElO@^QdO'#FWO@hQ`O,59^O@mQ!bO7+%dO&lQdO1G/bO@uQhO1G/fOOQW1G/j1G/jOOQW1G/d1G/dOAWQhO,5;bOOQO-E8t-E8tOAfQhO'#DZOAtQhO'#F^OBPQ`O'#F^OBUQ`O,5:TOOQS-E8k-E8kOOQ[1G.z1G.zOOQ[1G/Q1G/QOOQ[1G/T1G/TOOQ[1G/X1G/XOBZQdO,5:lOOQS7+%p7+%pOB`Q`O7+%pOBeQhO'#DYOBmQ`O,59sO'tQhO,59sOOQ[1G/q1G/qOBuQ`O1G/qOOQS7+%z7+%zOBzQbO'#DPOOQO'#Eb'#EbOCYQ`O'#EaOOQO'#Ea'#EaOCeQ`O'#EwOCmQdO,5:zOOQS,5:z,5:zOOQ[1G/m1G/mOOQS7+&V7+&VO-`Q`O7+&VOCxQ!fO'#EsO&lQdO'#EsOEPQdO7+%mOOQO7+%m7+%mOOQO1G0z1G0zOEdQ!bO<jAN>jOIUQaO,5;]OOQO-E8o-E8oOI`QdO,5;[OOQO-E8n-E8nOOQW<WO&lQdO1G0uOK]Q`O7+'OOOQO,5;a,5;aOOQO-E8s-E8sOOQW<t}!O?V!O!P?t!P!Q@]!Q![AU![!]BP!]!^B{!^!_C^!_!`DY!`!aDm!a!b$q!b!cEn!c!}$q!}#OG{#O#P$q#P#QH^#Q#R6W#R#o$q#o#pHo#p#q6W#q#rIQ#r#sIc#s#y$q#y#z%i#z$f$q$f$g%i$g#BY$q#BY#BZ%i#BZ$IS$q$IS$I_%i$I_$I|$q$I|$JO%i$JO$JT$q$JT$JU%i$JU$KV$q$KV$KW%i$KW&FU$q&FU&FV%i&FV;'S$q;'S;=`Iz<%lO$q`$tSOy%Qz;'S%Q;'S;=`%c<%lO%Q`%VS!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Q`%fP;=`<%l%Q~%nh#s~OX%QX^'Y^p%Qpq'Yqy%Qz#y%Q#y#z'Y#z$f%Q$f$g'Y$g#BY%Q#BY#BZ'Y#BZ$IS%Q$IS$I_'Y$I_$I|%Q$I|$JO'Y$JO$JT%Q$JT$JU'Y$JU$KV%Q$KV$KW'Y$KW&FU%Q&FU&FV'Y&FV;'S%Q;'S;=`%c<%lO%Q~'ah#s~!a`OX%QX^'Y^p%Qpq'Yqy%Qz#y%Q#y#z'Y#z$f%Q$f$g'Y$g#BY%Q#BY#BZ'Y#BZ$IS%Q$IS$I_'Y$I_$I|%Q$I|$JO'Y$JO$JT%Q$JT$JU'Y$JU$KV%Q$KV$KW'Y$KW&FU%Q&FU&FV'Y&FV;'S%Q;'S;=`%c<%lO%Qj)OUOy%Qz#]%Q#]#^)b#^;'S%Q;'S;=`%c<%lO%Qj)gU!a`Oy%Qz#a%Q#a#b)y#b;'S%Q;'S;=`%c<%lO%Qj*OU!a`Oy%Qz#d%Q#d#e*b#e;'S%Q;'S;=`%c<%lO%Qj*gU!a`Oy%Qz#c%Q#c#d*y#d;'S%Q;'S;=`%c<%lO%Qj+OU!a`Oy%Qz#f%Q#f#g+b#g;'S%Q;'S;=`%c<%lO%Qj+gU!a`Oy%Qz#h%Q#h#i+y#i;'S%Q;'S;=`%c<%lO%Qj,OU!a`Oy%Qz#T%Q#T#U,b#U;'S%Q;'S;=`%c<%lO%Qj,gU!a`Oy%Qz#b%Q#b#c,y#c;'S%Q;'S;=`%c<%lO%Qj-OU!a`Oy%Qz#h%Q#h#i-b#i;'S%Q;'S;=`%c<%lO%Qj-iS!qY!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Q~-xWOY-uZr-urs.bs#O-u#O#P.g#P;'S-u;'S;=`/c<%lO-u~.gOt~~.jRO;'S-u;'S;=`.s;=`O-u~.vXOY-uZr-urs.bs#O-u#O#P.g#P;'S-u;'S;=`/c;=`<%l-u<%lO-u~/fP;=`<%l-uj/nYjYOy%Qz!Q%Q!Q![0^![!c%Q!c!i0^!i#T%Q#T#Z0^#Z;'S%Q;'S;=`%c<%lO%Qj0cY!a`Oy%Qz!Q%Q!Q![1R![!c%Q!c!i1R!i#T%Q#T#Z1R#Z;'S%Q;'S;=`%c<%lO%Qj1WY!a`Oy%Qz!Q%Q!Q![1v![!c%Q!c!i1v!i#T%Q#T#Z1v#Z;'S%Q;'S;=`%c<%lO%Qj1}YrY!a`Oy%Qz!Q%Q!Q![2m![!c%Q!c!i2m!i#T%Q#T#Z2m#Z;'S%Q;'S;=`%c<%lO%Qj2tYrY!a`Oy%Qz!Q%Q!Q![3d![!c%Q!c!i3d!i#T%Q#T#Z3d#Z;'S%Q;'S;=`%c<%lO%Qj3iY!a`Oy%Qz!Q%Q!Q![4X![!c%Q!c!i4X!i#T%Q#T#Z4X#Z;'S%Q;'S;=`%c<%lO%Qj4`YrY!a`Oy%Qz!Q%Q!Q![5O![!c%Q!c!i5O!i#T%Q#T#Z5O#Z;'S%Q;'S;=`%c<%lO%Qj5TY!a`Oy%Qz!Q%Q!Q![5s![!c%Q!c!i5s!i#T%Q#T#Z5s#Z;'S%Q;'S;=`%c<%lO%Qj5zSrY!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Qd6ZUOy%Qz!_%Q!_!`6m!`;'S%Q;'S;=`%c<%lO%Qd6tS!hS!a`Oy%Qz;'S%Q;'S;=`%c<%lO%Qb7VSZQOy%Qz;'S%Q;'S;=`%c<%lO%Q~7fWOY7cZw7cwx.bx#O7c#O#P8O#P;'S7c;'S;=`8z<%lO7c~8RRO;'S7c;'S;=`8[;=`O7c~8_XOY7cZw7cwx.bx#O7c#O#P8O#P;'S7c;'S;=`8z;=`<%l7c<%lO7c~8}P;=`<%l7cj9VSeYOy%Qz;'S%Q;'S;=`%c<%lO%Q~9hOd~n9oUWQvWOy%Qz!_%Q!_!`6m!`;'S%Q;'S;=`%c<%lO%Qj:YWvW!mQOy%Qz!O%Q!O!P:r!P!Q%Q!Q![=w![;'S%Q;'S;=`%c<%lO%Qj:wU!a`Oy%Qz!Q%Q!Q![;Z![;'S%Q;'S;=`%c<%lO%Qj;bY!a`#}YOy%Qz!Q%Q!Q![;Z![!g%Q!g!hO[!a`#}YOy%Qz!O%Q!O!P;Z!P!Q%Q!Q![=w![!g%Q!g!hyS!^YOy%Qz;'S%Q;'S;=`%c<%lO%Qj?[WvWOy%Qz!O%Q!O!P:r!P!Q%Q!Q![=w![;'S%Q;'S;=`%c<%lO%Qj?yU]YOy%Qz!Q%Q!Q![;Z![;'S%Q;'S;=`%c<%lO%Q~@bTvWOy%Qz{@q{;'S%Q;'S;=`%c<%lO%Q~@xS!a`#t~Oy%Qz;'S%Q;'S;=`%c<%lO%QjAZ[#}YOy%Qz!O%Q!O!P;Z!P!Q%Q!Q![=w![!g%Q!g!hSb[O]||-1},{term:125,get:O=>Xb[O]||-1},{term:4,get:O=>Tb[O]||-1},{term:25,get:O=>bb[O]||-1},{term:123,get:O=>yb[O]||-1}],tokenPrec:1963});var Hl=null;function Kl(){if(!Hl&&typeof document=="object"&&document.body){let{style:O}=document.body,e=[],t=new Set;for(let i in O)i!="cssText"&&i!="cssFloat"&&typeof O[i]=="string"&&(/[A-Z]/.test(i)&&(i=i.replace(/[A-Z]/g,r=>"-"+r.toLowerCase())),t.has(i)||(e.push(i),t.add(i)));Hl=e.sort().map(i=>({type:"property",label:i,apply:i+": "}))}return Hl||[]}var k$=["active","after","any-link","autofill","backdrop","before","checked","cue","default","defined","disabled","empty","enabled","file-selector-button","first","first-child","first-letter","first-line","first-of-type","focus","focus-visible","focus-within","fullscreen","has","host","host-context","hover","in-range","indeterminate","invalid","is","lang","last-child","last-of-type","left","link","marker","modal","not","nth-child","nth-last-child","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","part","placeholder","placeholder-shown","read-only","read-write","required","right","root","scope","selection","slotted","target","target-text","valid","visited","where"].map(O=>({type:"class",label:O})),w$=["above","absolute","activeborder","additive","activecaption","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","antialiased","appworkspace","asterisks","attr","auto","auto-flow","avoid","avoid-column","avoid-page","avoid-region","axis-pan","background","backwards","baseline","below","bidi-override","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","clear","clip","close-quote","col-resize","collapse","color","color-burn","color-dodge","column","column-reverse","compact","condensed","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","darken","dashed","decimal","decimal-leading-zero","default","default-button","dense","destination-atop","destination-in","destination-out","destination-over","difference","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic-abegede-gez","ethiopic-halehame-aa-er","ethiopic-halehame-gez","ew-resize","exclusion","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fill-box","fixed","flat","flex","flex-end","flex-start","footnotes","forwards","from","geometricPrecision","graytext","grid","groove","hand","hard-light","help","hidden","hide","higher","highlight","highlighttext","horizontal","hsl","hsla","hue","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-grid","inline-table","inset","inside","intrinsic","invert","italic","justify","keep-all","landscape","large","larger","left","level","lighter","lighten","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-hexadecimal","lower-latin","lower-norwegian","lowercase","ltr","luminosity","manipulation","match","matrix","matrix3d","medium","menu","menutext","message-box","middle","min-intrinsic","mix","monospace","move","multiple","multiple_mask_images","multiply","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","opacity","open-quote","optimizeLegibility","optimizeSpeed","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","perspective","pinch-zoom","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row","row-resize","row-reverse","rtl","run-in","running","s-resize","sans-serif","saturation","scale","scale3d","scaleX","scaleY","scaleZ","screen","scroll","scrollbar","scroll-position","se-resize","self-start","self-end","semi-condensed","semi-expanded","separate","serif","show","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","soft-light","solid","source-atop","source-in","source-out","source-over","space","space-around","space-between","space-evenly","spell-out","square","start","static","status-bar","stretch","stroke","stroke-box","sub","subpixel-antialiased","svg_masks","super","sw-resize","symbolic","symbols","system-ui","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","text","text-bottom","text-top","textarea","textfield","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","to","top","transform","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","unidirectional-pan","unset","up","upper-latin","uppercase","url","var","vertical","vertical-text","view-box","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","wrap","wrap-reverse","x-large","x-small","xor","xx-large","xx-small"].map(O=>({type:"keyword",label:O})).concat(["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"].map(O=>({type:"constant",label:O}))),xb=["a","abbr","address","article","aside","b","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","dd","del","details","dfn","dialog","div","dl","dt","em","figcaption","figure","footer","form","header","hgroup","h1","h2","h3","h4","h5","h6","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","main","meter","nav","ol","output","p","pre","ruby","section","select","small","source","span","strong","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","tr","u","ul"].map(O=>({type:"type",label:O})),kb=["@charset","@color-profile","@container","@counter-style","@font-face","@font-feature-values","@font-palette-values","@import","@keyframes","@layer","@media","@namespace","@page","@position-try","@property","@scope","@starting-style","@supports","@view-transition"].map(O=>({type:"keyword",label:O})),Wt=/^(\w[\w-]*|-\w[\w-]*|)$/,wb=/^-(-[\w-]*)?$/;function Zb(O,e){var t;if((O.name=="("||O.type.isError)&&(O=O.parent||O),O.name!="ArgList")return!1;let i=(t=O.parent)===null||t===void 0?void 0:t.firstChild;return i?.name!="Callee"?!1:e.sliceString(i.from,i.to)=="var"}var Z$=new Tt,vb=["Declaration"];function Yb(O){for(let e=O;;){if(e.type.isTop)return e;if(!(e=e.parent))return O}}function v$(O,e,t){if(e.to-e.from>4096){let i=Z$.get(e);if(i)return i;let r=[],n=new Set,s=e.cursor(C.IncludeAnonymous);if(s.firstChild())do for(let a of v$(O,s.node,t))n.has(a.label)||(n.add(a.label),r.push(a));while(s.nextSibling());return Z$.set(e,r),r}else{let i=[],r=new Set;return e.cursor().iterate(n=>{var s;if(t(n)&&n.matchContext(vb)&&((s=n.node.nextSibling)===null||s===void 0?void 0:s.name)==":"){let a=O.sliceString(n.from,n.to);r.has(a)||(r.add(a),i.push({label:a,type:"variable"}))}}),i}}var _b=O=>e=>{let{state:t,pos:i}=e,r=U(t).resolveInner(i,-1),n=r.type.isError&&r.from==r.to-1&&t.doc.sliceString(r.from,r.to)=="-";if(r.name=="PropertyName"||(n||r.name=="TagName")&&/^(Block|Styles)$/.test(r.resolve(r.to).name))return{from:r.from,options:Kl(),validFor:Wt};if(r.name=="ValueName")return{from:r.from,options:w$,validFor:Wt};if(r.name=="PseudoClassName")return{from:r.from,options:k$,validFor:Wt};if(O(r)||(e.explicit||n)&&Zb(r,t.doc))return{from:O(r)||n?r.from:i,options:v$(t.doc,Yb(r),O),validFor:wb};if(r.name=="TagName"){for(let{parent:o}=r;o;o=o.parent)if(o.name=="Block")return{from:r.from,options:Kl(),validFor:Wt};return{from:r.from,options:xb,validFor:Wt}}if(r.name=="AtKeyword")return{from:r.from,options:kb,validFor:Wt};if(!e.explicit)return null;let s=r.resolve(i),a=s.childBefore(i);return a&&a.name==":"&&s.name=="PseudoClassSelector"?{from:i,options:k$,validFor:Wt}:a&&a.name==":"&&s.name=="Declaration"||s.name=="ArgList"?{from:i,options:w$,validFor:Wt}:s.name=="Block"||s.name=="Styles"?{from:i,options:Kl(),validFor:Wt}:null},Rb=_b(O=>O.name=="VariableName"),xr=ne.define({name:"css",parser:x$.configure({props:[se.add({Declaration:le()}),te.add({"Block KeyframeList":me})]}),languageData:{commentTokens:{block:{open:"/*",close:"*/"}},indentOnInput:/^\s*\}$/,wordChars:"-"}});function ys(){return new J(xr,xr.data.of({autocomplete:Rb}))}var Vb=177,qb=179,zb=184,Ub=12,Wb=13,jb=17,Cb=20,Gb=25,Eb=53,Ab=95,Lb=142,Mb=144,Db=145,Ib=148,Bb=10,Nb=13,Fb=32,Hb=9,Y$=47,Kb=41,Jb=125,ey=new z((O,e)=>{for(let t=0,i=O.next;(e.context&&(i<0||i==Bb||i==Nb||i==Y$&&O.peek(t+1)==Y$)||i==Kb||i==Jb)&&O.acceptToken(Vb),!(i!=Fb&&i!=Hb);)i=O.peek(++t)},{contextual:!0}),ty=new Set([Ab,zb,Cb,Ub,jb,Mb,Db,Lb,Ib,Wb,Eb,Gb]),Oy=new Ge({start:!1,shift:(O,e)=>e==qb?O:ty.has(e)}),iy=F({"func interface struct chan map const type var":d.definitionKeyword,"import package":d.moduleKeyword,"switch for go select return break continue goto fallthrough case if else defer":d.controlKeyword,range:d.keyword,Bool:d.bool,String:d.string,Rune:d.character,Number:d.number,Nil:d.null,VariableName:d.variableName,DefName:d.definition(d.variableName),TypeName:d.typeName,LabelName:d.labelName,FieldName:d.propertyName,"FunctionDecl/DefName":d.function(d.definition(d.variableName)),"TypeSpec/DefName":d.definition(d.typeName),"CallExpr/VariableName":d.function(d.variableName),LineComment:d.lineComment,BlockComment:d.blockComment,LogicOp:d.logicOperator,ArithOp:d.arithmeticOperator,BitOp:d.bitwiseOperator,"DerefOp .":d.derefOperator,"UpdateOp IncDecOp":d.updateOperator,CompareOp:d.compareOperator,"= :=":d.definitionOperator,"<-":d.operator,'~ "*"':d.modifier,"; ,":d.separator,"... :":d.punctuation,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace}),ry={__proto__:null,package:10,import:18,true:380,false:380,nil:383,struct:48,func:68,interface:78,chan:94,map:118,make:157,new:159,const:204,type:212,var:224,if:236,else:238,switch:242,case:248,default:250,for:260,range:266,go:270,select:274,return:284,break:288,continue:290,goto:292,fallthrough:296,defer:300},_$=Oe.deserialize({version:14,states:"!=xO#{QQOOP$SOQOOO&UQTO'#CbO&]QRO'#FlO]QQOOOOQP'#Cn'#CnOOQP'#Co'#CoO&eQQO'#C|O(kQQO'#C{O)]QRO'#GiO+tQQO'#D_OOQP'#Ge'#GeO+{QQO'#GeO.aQTO'#GaO.hQQO'#D`OOQP'#Gm'#GmO.mQRO'#GdO/hQQO'#DgOOQP'#Gd'#GdO/uQQO'#DrO2bQQO'#DsO4QQTO'#GqO,^QTO'#GaO4XQQO'#DxO4^QQO'#D{OOQO'#EQ'#EQOOQO'#ER'#EROOQO'#ES'#ESOOQO'#ET'#ETO4cQQO'#EPO5}QQO'#EPOOQP'#Ga'#GaO6UQQO'#E`O6^QQO'#EcOOQP'#G`'#G`O6cQQO'#EsOOQP'#G_'#G_O&]QRO'#FnOOQO'#Fn'#FnO9QQQO'#G^QOQQOOO&]QROOO9XQQO'#C`O9^QSO'#CdO9lQQO'#C}O9tQQO'#DSO9yQQO'#D[O:kQQO'#CsO:pQQO'#DhO:uQQO'#EeO:}QQO'#EiO;VQQO'#EoO;_QQO'#EuOPQSO7+%hOOQP7+%h7+%hO4cQQO7+%hOOQP1G0Q1G0QO!>^QQO1G0QOOQP1G0U1G0UO!>fQQO1G0UOF|QQO1G0UOOQO,5nAN>nO4cQQOAN>nO!IsQSOAN>nOOQP<nQQO'#FrOOQO,5vAN>vO!LtQQOAN>vP.hQQO'#F|OOQPG25XG25XO!LyQQOG25bO!MOQQO'#FPOOQPG25bG25bO!MZQQOG25bOOQPLD)tLD)tOOQPG24bG24bO!JqQQOLD*|O!9OQQO'#GQO!McQQO,5;kOOQP,5;k,5;kO?tQQO'#FQO!MnQQO'#FQO!MsQQOLD*|OOQP!$'Nh!$'NhOOQO,5VO^!hOh!POr-TOw}O!P-_O!Q-`O!W-^O!]-eO%O!eO%Y!fO~OZ!sO~O^#uO~O!P$xO~On!lO#W%]aV%]a^%]ah%]ar%]aw%]a!P%]a!Q%]a!W%]a!]%]a#T%]a$w%]a%O%]a%Y%]au%]a~O]${O^#QO~OZ#RO^#VO!W#SO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]O~O]$|O!|,WO~PBROj!qOn%QO!QnOi%cP~P*aO!V%WO!|#`O~PBRO!V%YO~OV!}O[oO^YOaoOdoOh!POjcOr!pOw}O!P!OO!QnO!WaO!]!QO!phO!qhO#Y!RO#^!SO#d!TO#j!UO#m!VO#v!WO#{!XO#}!YO$S!ZO$U![O$V![O$W!]O$Y!^O$[!_O%OQO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~Oi%dX#p%dX#q%dX~PDQOi%]O~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!Q-QO!WaO!]!QO!phO!qhO%O+{O%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O^%aO%O%_O~O!QnO!a%cO~P*aO!QnOn$mX#T$mX#U$mXV$mX$w$mX!a$mX~P*aOn#TO#T%ea#U%eaV%ea$w%ea!a%ea~O]%fO~PF|OV#ga$w#ga~PDTO[%sO~OZ#rO[#qO]%vO%O#oO~O^!hOh!POn%zOr-TOu%xOw}O!P-_O!Q-`O!W-^O!]-eO%O,dO%Y!fO]%[P~O^&OOh!POr!jOw}O!P!OO!Q!kO!WaO!]!QO%Y!fO^%ZXj%ZX~O%O%}O~PKfOjcO^qa]qanqa!Vqa~O^#uO!W&SO~O^!hOh!POr-TOw}O{&WO!P-_O!Q-`O!W-^O!]-eO%O,xO%Y!fO~Oi&^O~PL{O^!hOh!POr!jOw}O!Q!kO!WaO!]!QO%O!eO%Y!fO~O!P#hO~PMwOi&eO%O,yO%Y!fO~O#T&gOV#ZX$w#ZX~P?tO]&kO%O#oO~O^!hOh!POr-TOw}O!P-_O!Q-`O!]-eO%O!eO%Y!fO~O!W&lO#T&mO~P! _O]&qO%O#oO~O#T&sOV#eX$w#eX~P?tO]&vO%O#oO~OjeX~P$XOjcO!|,XO~P2gOn!lO#W&yO#W%]X~O^#VOn#TO!Q#cO!W#SO!|,XO#R#dO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]OV`X#T%eX#U%eX~OZ&zOj$`O$w`X~P!#cOi'OO#p'PO#q'QO~OZ#ROjcO~P!#cO#T'TO#U#iO~O#W'UO~OV'WO!QnO~P*aOV'XO~OjcO~O!|#`OV#za$w#za~PBROi'[O#p']O#q'^O~On#TO!|#`OV%eX$w%eX!a%eX~PBRO!|#`OV$Za$w$Za~PBRO${$rO$|$rO$}'`O~O]${O~O%O!eO]%ZXn%ZX!V%ZX~PKfO!|#`Oi!_Xn!_X!a!`X~PBROi!_Xn!_X!a!`X~O!a'aO~On'bOi%cX~Oi'dO~On'eO!V%bX!a%bX~O!V'gO~O]'jOn'kO!|,YO~PBROn'nO!V'mO!a'oO!|#`O~PBRO!QnO!V'qO!a'rO~P*aO!|#`On$ma#T$ma#U$maV$ma$w$ma!a$ma~PBRO]'sOu'tO~O%Y#XO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOV!xiZ!xi^!xin!xi!Q!xi!W!xi!|!xi#R!xi#T!xi#U!xi$w!xi%`!xi%f!xi%g!xi%i!xi%p!xi%q!xi~O!V!xii!xi!a!xi~P!+YO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOV!xiZ!xi^!xin!xi!Q!xi!W!xi#R!xi#T!xi#U!xi$w!xi%p!xi%q!xi!V!xii!xi!a!xi~O!|!xi~P!-TO!|#`O~P!-TO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[OV!xiZ!xi^!xin!xi!Q!xi!W!xi#R!xi#T!xi#U!xi$w!xi%q!xi~O!|#`O!V!xii!xi!a!xi~P!/VO!|#`OV#Pi$w#Pi!a#Pi~PBRO]'uOn'wOu'vO~OZ#rO[#qO]'zO%O#oO~Ou'|O~P?tOn'}O]%[X~O](PO~OZeX^mX^!TXj!TX!W!TX~OjcOV$]i$w$]i~O%`(ZOV%^X$w%^Xn%^X!V%^X~Oi(`O~PL{O[(aO!W!tOVlX$wlX~On(bO~P?tO[(aOVlX$wlX~Oi(hO%O,yO%Y!fO~O!V(iO~O#T(kO~O](nO%O#oO~O[oO^YOaoOdoOh!POr!pOu-bOw}O!P!OO!QnO!V-UO!WaO!]!QO!phO!qhO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O%O+zO~P!4vO](sO%O#oO~O#T(tOV#ea$w#ea~O](xO%O#oO~O#k(yOV#ii$w#ii~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!Q-PO!WaO!]!QO!phO!qhO%O+xO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O^(|O%O%_O~O#p%dP#q%dP~P/uOi)PO#p'PO#q'QO~O!a)RO~O!QnO#y)VO~P*aOV)WO!|#`O~PBROj#wa~P;_OV)WO!QnO~P*aOi)]O#p']O#q'^O~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!QnO!WaO!]!QO!phO!qhO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O%O,eO~P!:lO!a)bO~Oj!qO!QnO~P*aOj!qO!QnOi%ca~P*aOn)iOi%ca~O!V%ba!a%ba~P?tOn)lO!V%ba!a%ba~O])nO~O])oO~O!V)pO~O!QnO!V)rO!a)sO~P*aO!V)rO!a)sO!|#`O~PBRO])uOn)vO~O])wOn)xO~O^!hOh!POr-TOu%xOw}O!P-_O!Q-`O!W-^O!]-eO%O,dO%Y!fO~O]%[a~P!>nOn)|O]%[a~O]${O]tXntX~OjcOV$^q$w$^q~On*PO{&WO~P?tOn*SO!V%rX~O!V*UO~OjcOV$]q$w$]q~O%`(ZOV|a$w|an|a!V|a~O[*]OVla$wla~O[*]O!W!tOVla$wla~On*PO{&WO!W*`O^%WXj%WX~P! _OjcO#j!UO~OjcO!|,XO~PBROZ*dO^#VO!W#SO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]O~O!|#`O~P!BoO#^*eO~P?tO!a*fO~Oj$`O!|,XO~P!BoO#W*hO~Oj#wi~P;_OV*kO!|#`O~PBROn#TO!Q#cO!|#`O!a$QX#T%eX~PBRO#T*lO~O#W*lO~O!a*mO~O!|#`Oi!_in!_i~PBRO!|#`Oi!bXn!bX!a!cX~PBROi!bXn!bX!a!cX~O!a*nO~Oj!qO!QnOi%ci~P*aO!V%bi!a%bi~P?tO!V*qO!a*rO!|#`O~PBRO!V*qO!|#`O~PBRO]*tO~O]*uO~O]*uOu*vO~O]%[i~P!>nO%O!eO!V%ra~On*|O!V%ra~O[+OOVli$wli~O%O+yO~P!4vO#k+QOV#iy$w#iy~O^+RO%O%_O~O]+SO~O!|,XOj#xq~PBROj#wq~P;_O!V+ZO!|#`O~PBRO]+[On+]O~O%O!eO!V%ri~O^#QOn'eO!V%bX~O#^+`O~P?tOj+aO~O^#VO!W#SO!|#`O%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[O%q#]O~OZ+cO~P!JvO!|#`O!a$Qi~PBRO!|#`Oi!bin!bi~PBRO!V+dO!|#`O~PBRO]+eO~O]+fO~Oi+iO#p+jO#q+kO~O^+lO%O%_O~Oi+pO#p+jO#q+kO~O!a+rO~O#^+sO~P?tO!a+tO~O]+uO~OZeX^eX^!TXj!TX!WeX!W!TX!|eX%YeX%`eX%feX%geX%ieX%jeX%keX%leX%meX%neX%oeX%peX%qeXVeXneX!QeX#ReX#TeX#UeX$weX~O]eX]!TX!VeXieX!aeX~P!NUOjeX~P!NUOZeX^eX^!TXj!TX!WeX!W!TX!|eX%YeX%`eX%feX%geX%ieX%jeX%keX%leX%meX%neX%oeX%peX%qeXn!TX!VeX~O]eX!V!TX~P#!gOh!TXr!TXw!TX{!TX!P!TX!Q!TX!]!TX%O!TX%Y!TX~P#!gOZeX^eX^!TXj!TXneX!WeX!W!TX!|eX%YeX%`eX%feX%geX%ieX%jeX%keX%leX%meX%neX%oeX%peX%qeX~O]eXueX~P#$xO]$mXn$mXu$mX~PF|Oj$mXn$mX~P!7`On+|O]%eau%ea~On+}Oj%ea~O[oO^YOaoOdoOh!POr!pOw}O!P!OO!Q-OO!WaO!]!QO!phO!qhO%O+yO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~OZeX]!TX^UXhUXnUXn!TXrUXuUXwUX!PUX!QUX!WUX!W!TX!]UX%OUX%YUX~OnUX!QeX!aeX#TeX#WUX~P#$xOn+|O!|,YO]%eXu%eX~PBROn+}O!|,XOj%eX~PBRO^&OOV%ZXj%ZX$w%ZX]%ZXn%ZX!V%ZXu%ZX%`%ZX#T%ZX[%ZX!a%ZX~P?wO!|,YO]$man$mau$ma~PBRO!|,XOj$man$ma~PBRO%Y#XO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOZ!xi]!xi^!xi!W!xi!|!xi%`!xi%f!xi%g!xi%i!xi%p!xi%q!xi~Oj!xi~P!+YOn!xiu!xi~P#,hO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOZ!xi]!xi^!xi!W!xi!|!xi%p!xi%q!xi~O%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOV!xiZ!xi^!xij!xin!xi!Q!xi!W!xi#R!xi#T!xi#U!xi$w!xi%p!xi%q!xi~O!|!xi~P#/_On!xiu!xi~P#.TO%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YOZ!xi]!xi^!xi!W!xi%p!xi%q!xi~O!|,WO~P#1^O!|,XO~P#/_O!|,YOn!xiu!xi~P#1^O%Y#XO%`#ZO%fiO%giO%i#ZO%j#YO%k#XO%l#XO%m#YO%n#YO%o#YO%p#[OZ!xi]!xi^!xi!W!xi%q!xi~O!|,WO~P#3QO!|,XOj!xi~P!/VO!|,YOn!xiu!xi~P#3QO!|,XOj#Pi~PBROV!TXZeX^mX!W!TX$w!TX~O%`!TX~P#5RO[!TXhmXnmXrmXwmX!PmX!QmX!WmX!]mX%OmX%YmX~P#5ROn#TO!Q,aO!|,XO#R#dOj`X#T%eX#U%eX~PBRO[oO^YOaoOdoOh!POr!pOw}O!P#hO!WaO!]!QO!phO!qhO%UTO%VUO%YVO%fiO%giO%hjO%ikO%jlO~O!Q-OO%O+yO~P#6{O!Q-PO%O+xO~P#6{O!Q-QO%O+{O~P#6{O#T,bO#U,bO~O#W,cO~O^!hOh!POr-TOw}O!P-_O!Q-WO!W-^O!]-eO%O!eO%Y!fO~O^!hOh!POr-TOw}O!Q-`O!W-^O!]-eO%O!eO%Y!fO~O!P-VO~P#9zO%O+wO~P!4vO!P-XO~O!V-YO!|#`O~PBRO!V-ZO~O!V-[O~O!W-dO~OP%ka%Oa~",goto:"!FW%sPP%tP%wP%zP'SP'XPPPP'`'cP'u'uP)w'u-_PPP0j0m0qP1V4b1VP7s8WP1VP8a8d8hP8p8w1VPP1V8{<`?vPPCY-_-_-_PCdCuCxPC{DQ'u'uDV'uES'u'u'u'uGUIW'uPPJR'uJUMjMjMj'u! r! r!#SP!$`!%d!&d'cP'cPP'cP!&yP!'V!'^!&yP!'a!'h!'n!'w!&yP!'z!(R!&y!(U!(fPP!&yP!(x!)UPP!&y!)Y!)c!&yP!)g!)gP!&yP!&yP!)j!)m!&v!&yP!&yPPP!&yP!&yP!)q!)q!)w!)}!*U!*[!*d!*j!*p!*w!*}!+T!+Z!.q!.x!/O!/X!/m!/s!/z!0Q!0W!0^!0d!0jPPPPPPPPP!0p!1f!1k!1{!2kPP!7P!:^P!>u!?Z!?_!@Z!@fP!@p!D_!Df!Di!DuPPPPPPPPPPPP!FSR!aPRyO!WXOScw!R!T!U!W#O#k#n#u$R$X&O&j&u&|'W'Y']'})W)|*k*w+gQ#pzU#r{#s%uQ#x|U$T!S$U&pQ$^!VQ$y!lR)U'RVROS#nQ#t{T%t#s%uR#t{qrOScw!U!V!W#O#k#n&|'W'Y)W*k+g%PoOSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^%O]OSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^#u!iW^!O!h!t!z#e#h#u#v#y#|#}$P$Q$T$W$v$x%W%Y%a%x%y&O&S&W&]&`&b&d&m'e'|'}(S([(c(i(o(|)l)|*P*Q*S*p*w*|+R+^+j+l,h-U-V-W-X-Y-Z-[-]-_-d'cbOSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dR$O!PT&c#}&dW%`#R&z*d+cQ&Q#vS&V#y&]S&`#}&dR*Y(b'cZOSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-d%fWOSWYacmnw!O!U!V!W!X!Z!_!q!z#O#Q#S#T#V#^#_#`#a#b#c#h#i#j#k#n#v#|$f$v$x%W%Y%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(i(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^S&b#}&d!{-]!h!t#e#u#y$P$Q$T$W%a%x%y&O&W&]&`&m'e'|'}(S([(c(o(|)l)|*Q*p*w+R+j+l,h-U-V-W-X-Y-Z-[-]-_-dQ#v|S$v!j!pU&P#v$v,hZ,h#x&Q&U&V-TS%{#u&OV){'})|*wR#z}T&[#y&]]&X#y&](S([(o*QZ&Z#y&](S(o*QT([&Y(]'s_OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|#}$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&S&W&]&`&b&d&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*P*Q*S*`*h*k*l*n*o*p*r*w*|+R+^+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-d'r_OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|#}$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&S&W&]&`&b&d&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*P*Q*S*`*h*k*l*n*o*p*r*w*|+R+^+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dR!w^'bbOSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dS&a#}&dR(d&bS!u]fX!x`&_(e(oQ!r[Q%O!qQ)d'aU)f'b)i*oR+X*nR%R!qR%P!qV)h'b)i*oV)g'b)i*odtOScw#O#k#n&|'Y+gQ$h!WQ&R#wQ&w$[S'S$c$iQ(V&TQ*O(RQ*V(WQ*b(yQ*c(zR+_+Q%PfOSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^%PgOSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^!q#Weg!o!y$[$_$c$j$m$q$}%^%b%d%m'V'p(z({)S)Y)^)c)e)q)t*i*s+T+V+W+Y,f,g,i,j,w,z-aR#fh#^mOSacmnw!X!Z!_!q#O#S#T#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&y&|'P'T'U'X'Y']'a'b'o'r(k(t)i)s*`*h*l*n*o*r+g-^!W#_e!y$j$m$q$}%b%d%j%k%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aW,T!o,n,q,tj,U$[$_$c(z)S*i,g,j,o,r,u,w,z[,V%^,f,i,p,s,v`,{Y,Q,T,W,Z,^,{-Ox,|!U!V!W&x'R'W)V)W*k+},R,U,X,[,_,a,b,c,|-Pg,}#Q#V'w+|,S,V,Y,],`,}-Q#^mOSacmnw!X!Z!_!q#O#S#T#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&y&|'P'T'U'X'Y']'a'b'o'r(k(t)i)s*`*h*l*n*o*r+g-^`,{Y,Q,T,W,Z,^,{-Ox,|!U!V!W&x'R'W)V)W*k+},R,U,X,[,_,a,b,c,|-Pg,}#Q#V'w+|,S,V,Y,],`,}-Q!Y#^e!y$j$m$q$}%b%d%i%j%k%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aY,Q!o,k,n,q,tl,R$[$_$c(z)S*i,g,j,l,o,r,u,w,z_,S%^,f,i,m,p,s,v!W#_e!y$j$m$q$}%b%d%j%k%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aW,T!o,n,q,tj,U$[$_$c(z)S*i,g,j,o,r,u,w,z],V%^,f,i,p,s,v!S#ae!y$j$m$q$}%b%d%l%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aS,Z!o,tf,[$[$_$c(z)S*i,g,j,u,w,zX,]%^,f,i,v!Q#be!y$j$m$q$}%b%d%m'V'p({)Y)^)c)e)q)t*s+T+V+W+Y-aQ,^!od,_$[$_$c(z)S*i,g,j,w,zV,`%^,f,iprOScw!U!V!W#O#k#n&|'W'Y)W*k+gR)a']etOScw#O#k#n&|'Y+gQ$S!RT&i$R&jR$S!RQ$V!ST&o$U&pQ&U#xR&m$TS(T&S&lV*{*S*|+^R$V!SQ$Y!TT&t$X&uR$Y!TdsOScw#O#k#n&|'Y+gT$p![!]dtOScw#O#k#n&|'Y+gQ*b(yR+_+QQ$a!VQ&{$_Q)T'RR*g)ST&|$`&}Q+b+SQ+m+fR+v+uT+g+a+hR$i!WR$l!YT'Y$k'ZXuOSw#nQ$s!`R'_$sSSO#nR!dSQ%u#sR'y%uUwOS#nR#mwQ&d#}R(g&dQ(c&`R*Z(cS!mX$^R$z!mQ(O%{R)}(OQ&]#yR(_&]Q(]&YR*X(]'r^OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|#}$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&S&W&]&`&b&d&g&l&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*P*Q*S*`*h*k*l*n*o*p*r*w*|+R+^+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dR!v^S'f%T+PR)m'fQ'c%RR)j'cW#Oc&|'Y+gR%[#O^#Ue$[$_$c$m)^,zU%e#U,O,PQ,O,fR,P,gQ&j$RR(m&jS*Q(S(oR*y*QQ*T(TR*}*TQ&p$UR(r&pQ&u$XR(w&uQ&}$`R)O&}Q+h+aR+o+hQ'Z$kR)['ZQ!cRQ#luQ#nyQ%Z!|Q&x$]Q'R$bQ'x%tQ(^&[Q(f&cQ(l&iQ(q&oR(v&tVxOS#nWuOSw#nY!|c#O&|'Y+gR%r#kdtOScw#O#k#n&|'Y+gQ$]!UQ$b!VQ$g!WQ)X'WQ*j)WR+U*kdeOScw#O#k#n&|'Y+gQ!oYQ!ya`#gmn,{,|,}-O-P-QQ$[!UQ$_!VQ$c!WQ$j!Xd$m!Z#i#j&g&s'P'T'U(k(tQ$q!_Q$}!qQ%^#QQ%b#SQ%d#TW%h#^,Q,R,SQ%i#_Q%j#`Q%k#aQ%l#bQ%m#cQ'V$fQ'p%cQ(z&xQ({&yQ)S'RQ)Y'XQ)^']Q)c'aU)e'b)i*oQ)q'oQ)t'rQ*i)VQ*s)sQ+T*hQ+V*lQ+W*nQ+Y*rS,f#V'wS,g,b,cQ,i+|Q,j+}Q,k,TQ,l,UQ,m,VQ,n,WQ,o,XQ,p,YQ,q,ZQ,r,[Q,s,]Q,t,^Q,u,_Q,v,`Q,w,aU,z'W)W*kV-a&l*`-^#bZW!O!h!t!z#e#h#u#v#y#|$P$Q$T$W$v$x%W%Y%a%x%y&O&W&]&`&m'e'|'}(S([(c(i(o(|)l)|*Q*p*w+R+j+l,h-U-V-W-X-Y-Z-[-]-_-d%P[OSYacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*`*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^$zdOSacmnw!U!V!W!X!Z!_!q#O#Q#S#T#V#^#_#`#a#b#c#i#j#k#n$f%c&g&l&s&x&y&|'P'R'T'U'W'X'Y']'a'b'o'r'w(k(t)V)W)i)s*h*k*l*n*o*r+g+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,{,|,}-O-P-Q-^S!gW-]Q!nYS#{!O-_Q$u!hS%T!t+jS%X!z-UQ%n#e[%o#h#|$x-V-W-XW%w#u'})|*wU&P#v$v,h[&X#y&](S([(o*QQ&f$PQ&h$QQ&n$TQ&r$WS'h%W-YS'i%Y-ZW'l%a(|+R+lS'{%x%yQ(Q&OQ(Y&WQ(d&`Q(p&mU)k'e)l*pQ)z'|Q*[(cS*^(i-[Q+P*`R-c-dS#w|!pS$w!j-TQ&T#xQ(R&QQ(W&UR(X&VT%|#u&OhqOScw!U!V#O#k#n&|'Y+gU$Q!R$R&jU$W!T$X&uQ$e!WY%y#u&O'})|*wQ)`']V-S'W)W*kS&[#y&]S*R(S(oR*z*QY&Y#y&](S(o*QR*W(['``OSWYacmnw!O!U!V!W!X!Z!_!h!q!t!z#O#Q#S#T#V#^#_#`#a#b#c#e#h#i#j#k#n#u#v#y#|$P$Q$T$W$f$v$x%W%Y%a%c%x%y&O&W&]&`&g&m&s&x&y&|'P'R'T'U'W'X'Y']'a'b'e'o'r'w'|'}(S([(c(i(k(o(t(|)V)W)i)l)s)|*Q*`*h*k*l*n*o*p*r*w+R+g+j+l+|+},Q,R,S,T,U,V,W,X,Y,Z,[,],^,_,`,a,b,c,h,{,|,}-O-P-Q-U-V-W-X-Y-Z-[-]-^-_-dS&_#}&dW(S&S*S*|+^Q(e&bQ(o&lR*x*PS%U!t*`R+q+jR%S!qQ#PcQ(}&|Q)Z'YR+n+ghpOScw!U!V#O#k#n&|'Y+gQ$d!WQ$n!ZQ%g#VU%p#i'T,bU%q#j'U,cQ(j&gQ(u&sQ)Q'PQ)_']Q)y'wQ*_(kQ*a(tV-R'W)W*kT(U&S&l",nodeNames:"\u26A0 LineComment BlockComment SourceFile PackageClause package DefName ; ImportDecl import ImportSpec . String ) ( SpecList ExprStatement Number Bool Nil Rune VariableName TypedLiteral StructType struct } { StructBody FieldDecl FieldName , PointerType * FunctionType func Parameters Parameter ... InterfaceType interface InterfaceBody MethodElem UnderlyingType ~ TypeElem LogicOp ChannelType chan <- ParenthesizedType QualifiedType TypeName ParameterizedType ] [ TypeArgs ArrayType SliceType MapType map LiteralValue Element Key : Element Key ParenthesizedExpr FunctionLiteral Block Conversion SelectorExpr IndexExpr SliceExpr TypeAssertion CallExpr ParameterizedExpr Arguments CallExpr make new Arguments UnaryExp ArithOp LogicOp BitOp DerefOp BinaryExp ArithOp BitOp BitOp CompareOp LogicOp LogicOp SendStatement IncDecStatement IncDecOp Assignment = UpdateOp VarDecl := ConstDecl const ConstSpec SpecList TypeDecl type TypeSpec TypeParams TypeParam SpecList VarDecl var VarSpec SpecList LabeledStatement LabelName IfStatement if else SwitchStatement switch SwitchBlock Case case default TypeSwitchStatement SwitchBlock Case ForStatement for ForClause RangeClause range GoStatement go SelectStatement select SelectBlock Case ReceiveStatement ReturnStatement return GotoStatement break continue goto FallthroughStatement fallthrough DeferStatement defer FunctionDecl MethodDecl",maxTerm:218,context:Oy,nodeProps:[["isolate",-3,2,12,20,""],["group",-18,12,17,18,19,20,21,22,66,67,69,70,71,72,73,74,77,81,86,"Expr",-20,16,68,93,94,96,99,101,105,111,115,117,120,126,129,134,136,141,143,147,149,"Statement",-12,23,31,33,38,46,49,50,51,52,56,57,58,"Type"],["openedBy",13,"(",25,"{",53,"["],["closedBy",14,")",26,"}",54,"]"]],propSources:[iy],skippedNodes:[0,1,2,153],repeatNodeCount:23,tokenData:":b~RvXY#iYZ#i]^#ipq#iqr#zrs$Xuv&Pvw&^wx&yxy(qyz(vz{({{|)T|})e}!O)j!O!P)u!P!Q+}!Q!R,y!R![-t![!]2^!]!^2k!^!_2p!_!`3]!`!a3e!c!}3x!}#O4j#P#Q4o#Q#R4t#R#S4|#S#T9X#T#o3x#o#p9q#p#q9v#q#r:W#r#s:]$g;'S3x;'S;=`4d<%lO3x~#nS$y~XY#iYZ#i]^#ipq#iU$PP%hQ!_!`$SS$XO!|S~$^W[~OY$XZr$Xrs$vs#O$X#O#P${#P;'S$X;'S;=`%y<%lO$X~${O[~~%ORO;'S$X;'S;=`%X;=`O$X~%^X[~OY$XZr$Xrs$vs#O$X#O#P${#P;'S$X;'S;=`%y;=`<%l$X<%lO$X~%|P;=`<%l$X~&UP%l~!_!`&X~&^O#U~~&cR%j~vw&l!_!`&X#Q#R&q~&qO%p~~&vP%o~!_!`&X~'OWd~OY&yZw&ywx'hx#O&y#O#P'm#P;'S&y;'S;=`(k<%lO&y~'mOd~~'pRO;'S&y;'S;=`'y;=`O&y~(OXd~OY&yZw&ywx'hx#O&y#O#P'm#P;'S&y;'S;=`(k;=`<%l&y<%lO&y~(nP;=`<%l&y~(vO^~~({O]~~)QP%Y~!_!`&X~)YQ%f~{|)`!_!`&X~)eO#R~~)jOn~~)oQ%g~}!O)`!_!`&X~)zRZS!O!P*T!Q![*`#R#S+w~*WP!O!P*Z~*`Ou~Q*eTaQ!Q![*`!g!h*t#R#S+w#X#Y*t#]#^+rQ*wS{|+T}!O+T!Q![+^#R#S+lQ+WQ!Q![+^#R#S+lQ+cRaQ!Q![+^#R#S+l#]#^+rQ+oP!Q![+^Q+wOaQQ+zP!Q![*`~,SR%k~z{,]!P!Q,b!_!`&X~,bO$z~~,gSP~OY,bZ;'S,b;'S;=`,s<%lO,b~,vP;=`<%l,bQ-O[aQ!O!P*`!Q![-t!d!e.c!g!h*t!q!r/Z!z!{/x#R#S.]#U#V.c#X#Y*t#]#^+r#c#d/Z#l#m/xQ-yUaQ!O!P*`!Q![-t!g!h*t#R#S.]#X#Y*t#]#^+rQ.`P!Q![-tQ.fR!Q!R.o!R!S.o#R#S/QQ.tSaQ!Q!R.o!R!S.o#R#S/Q#]#^+rQ/TQ!Q!R.o!R!S.oQ/^Q!Q!Y/d#R#S/rQ/iRaQ!Q!Y/d#R#S/r#]#^+rQ/uP!Q!Y/dQ/{T!O!P0[!Q![1c!c!i1c#R#S2Q#T#Z1cQ0_S!Q![0k!c!i0k#R#S1V#T#Z0kQ0pVaQ!Q![0k!c!i0k!r!s*t#R#S1V#T#Z0k#]#^+r#d#e*tQ1YR!Q![0k!c!i0k#T#Z0kQ1hWaQ!O!P0k!Q![1c!c!i1c!r!s*t#R#S2Q#T#Z1c#]#^+r#d#e*tQ2TR!Q![1c!c!i1c#T#Z1c~2cP!a~!_!`2f~2kO#W~~2pOV~~2uR!|S}!O3O!^!_3T!_!`$S~3TO!Q~~3YP%m~!_!`&X~3bP#T~!_!`$S~3jQ!|S!_!`$S!`!a3p~3uP%n~!_!`&X~3}V%O~!Q![3x!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~4gP;=`<%l3x~4oO!W~~4tO!V~~4yP%i~!_!`&X~5RV%O~!Q![5h!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~5o^aQ%O~!O!P*`!Q![5h!c!g3x!g!h6k!h!}3x#R#S4|#T#X3x#X#Y6k#Y#]3x#]#^8k#^#o3x$g;'S3x;'S;=`4d<%lO3x~6pX%O~{|+T}!O+T!Q![7]!c!}3x#R#S8P#T#o3x$g;'S3x;'S;=`4d<%lO3x~7dXaQ%O~!Q![7]!c!}3x#R#S8P#T#]3x#]#^8k#^#o3x$g;'S3x;'S;=`4d<%lO3x~8UV%O~!Q![7]!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~8rVaQ%O~!Q![3x!c!}3x#R#S3x#T#o3x$g;'S3x;'S;=`4d<%lO3x~9[TO#S9X#S#T$v#T;'S9X;'S;=`9k<%lO9X~9nP;=`<%l9X~9vOj~~9{Q%`~!_!`&X#p#q:R~:WO%q~~:]Oi~~:bO{~",tokenizers:[ey,1,2,new kt("j~RQYZXz{^~^O$|~~aP!P!Qd~iO$}~~",25,181)],topRules:{SourceFile:[0,3]},dynamicPrecedences:{19:1,51:-1,55:2,69:-1,108:-1},specialized:[{term:184,get:O=>ry[O]||-1}],tokenPrec:5451});var ny=[W("func ${name}(${params}) ${type} {\n ${}\n}",{label:"func",detail:"declaration",type:"keyword"}),W("func (${receiver}) ${name}(${params}) ${type} {\n ${}\n}",{label:"func",detail:"method declaration",type:"keyword"}),W("var ${name} = ${value}",{label:"var",detail:"declaration",type:"keyword"}),W("type ${name} ${type}",{label:"type",detail:"declaration",type:"keyword"}),W("const ${name} = ${value}",{label:"const",detail:"declaration",type:"keyword"}),W("type ${name} = ${type}",{label:"type",detail:"alias declaration",type:"keyword"}),W("for ${init}; ${test}; ${update} {\n ${}\n}",{label:"for",detail:"loop",type:"keyword"}),W("for ${i} := range ${value} {\n ${}\n}",{label:"for",detail:"range",type:"keyword"}),W(`select { \${} }`,{label:"select",detail:"statement",type:"keyword"}),W("case ${}:\n${}",{label:"case",type:"keyword"}),W("switch ${} {\n ${}\n}",{label:"switch",detail:"statement",type:"keyword"}),W("switch ${}.(${type}) {\n ${}\n}",{label:"switch",detail:"type statement",type:"keyword"}),W("if ${} {\n ${}\n}",{label:"if",detail:"block",type:"keyword"}),W(`if \${} { \${} } else { \${} }`,{label:"if",detail:"/ else block",type:"keyword"}),W('import ${name} "${module}"\n${}',{label:"import",detail:"declaration",type:"keyword"})],R$=new Tt,q$=new Set(["SourceFile","Block","FunctionDecl","MethodDecl","FunctionLiteral","ForStatement","SwitchStatement","TypeSwitchStatement","IfStatement"]);function Pi(O,e){return(t,i)=>{e:for(let r=t.node.firstChild,n=0,s=null;;){for(;!r;){if(!n)break e;n--,r=s.nextSibling,s=s.parent}e&&r.name==e||r.name=="SpecList"?(n++,s=r,r=r.firstChild):(r.name=="DefName"&&i(r,O),r=r.nextSibling)}return!0}}var sy={FunctionDecl:Pi("function"),VarDecl:Pi("var","VarSpec"),ConstDecl:Pi("constant","ConstSpec"),TypeDecl:Pi("type","TypeSpec"),ImportDecl:Pi("constant","ImportSpec"),Parameter:Pi("var"),__proto__:null};function z$(O,e){let t=R$.get(e);if(t)return t;let i=[],r=!0;function n(s,a){let o=O.sliceString(s.from,s.to);i.push({label:o,type:a})}return e.cursor(C.IncludeAnonymous).iterate(s=>{if(r)r=!1;else if(s.name){let a=sy[s.name];if(a&&a(s,n)||q$.has(s.name))return!1}else if(s.to-s.from>8192){for(let a of z$(O,s.node))i.push(a);return!1}}),R$.set(e,i),i}var V$=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,U$=["String","LineComment","BlockComment","DefName","LabelName","FieldName",".","?."],ay=O=>{let e=U(O.state).resolveInner(O.pos,-1);if(U$.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&V$.test(O.state.sliceDoc(e.from,e.to));if(!t&&!O.explicit)return null;let i=[];for(let r=e;r;r=r.parent)q$.has(r.name)&&(i=i.concat(z$(O.state.doc,r)));return{options:i,from:t?e.from:O.pos,validFor:V$}},Jl=ne.define({name:"go",parser:_$.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),LabeledStatement:sO,"SwitchBlock SelectBlock":O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t||i?0:O.unit)},Block:be({closing:"}"}),BlockComment:()=>null,Statement:le({except:/^{/})}),te.add({"Block SwitchBlock SelectBlock LiteralValue InterfaceType StructType SpecList":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case\b|default\b|\})$/}}),oy=O=>({label:O,type:"keyword"}),ly="interface struct chan map package go return break continue goto fallthrough else defer range true false nil".split(" ").map(oy);function W$(){let O=ny.concat(ly);return new J(Jl,[Jl.data.of({autocomplete:cO(U$,zt(O))}),Jl.data.of({autocomplete:ay})])}var cy=55,hy=1,fy=56,dy=2,uy=57,Qy=3,j$=4,$y=5,rc=6,I$=7,B$=8,N$=9,F$=10,py=11,my=12,gy=13,ec=58,Py=14,Sy=15,C$=59,H$=21,Xy=23,K$=24,Ty=25,Oc=27,J$=28,by=29,yy=32,xy=35,ky=37,wy=38,Zy=0,vy=1,Yy={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},_y={dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},G$={dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}};function Ry(O){return O==45||O==46||O==58||O>=65&&O<=90||O==95||O>=97&&O<=122||O>=161}var E$=null,A$=null,L$=0;function ic(O,e){let t=O.pos+e;if(L$==t&&A$==O)return E$;let i=O.peek(e),r="";for(;Ry(i);)r+=String.fromCharCode(i),i=O.peek(++e);return A$=O,L$=t,E$=r?r.toLowerCase():i==Vy||i==qy?void 0:null}var ep=60,xs=62,nc=47,Vy=63,qy=33,zy=45;function M$(O,e){this.name=O,this.parent=e}var Uy=[rc,F$,I$,B$,N$],Wy=new Ge({start:null,shift(O,e,t,i){return Uy.indexOf(e)>-1?new M$(ic(i,1)||"",O):O},reduce(O,e){return e==H$&&O?O.parent:O},reuse(O,e,t,i){let r=e.type.id;return r==rc||r==ky?new M$(ic(i,1)||"",O):O},strict:!1}),jy=new z((O,e)=>{if(O.next!=ep){O.next<0&&e.context&&O.acceptToken(ec);return}O.advance();let t=O.next==nc;t&&O.advance();let i=ic(O,0);if(i===void 0)return;if(!i)return O.acceptToken(t?Sy:Py);let r=e.context?e.context.name:null;if(t){if(i==r)return O.acceptToken(py);if(r&&_y[r])return O.acceptToken(ec,-2);if(e.dialectEnabled(Zy))return O.acceptToken(my);for(let n=e.context;n;n=n.parent)if(n.name==i)return;O.acceptToken(gy)}else{if(i=="script")return O.acceptToken(I$);if(i=="style")return O.acceptToken(B$);if(i=="textarea")return O.acceptToken(N$);if(Yy.hasOwnProperty(i))return O.acceptToken(F$);r&&G$[r]&&G$[r][i]?O.acceptToken(ec,-1):O.acceptToken(rc)}},{contextual:!0}),Cy=new z(O=>{for(let e=0,t=0;;t++){if(O.next<0){t&&O.acceptToken(C$);break}if(O.next==zy)e++;else if(O.next==xs&&e>=2){t>=3&&O.acceptToken(C$,-2);break}else e=0;O.advance()}});function Gy(O){for(;O;O=O.parent)if(O.name=="svg"||O.name=="math")return!0;return!1}var Ey=new z((O,e)=>{if(O.next==nc&&O.peek(1)==xs){let t=e.dialectEnabled(vy)||Gy(e.context);O.acceptToken(t?$y:j$,2)}else O.next==xs&&O.acceptToken(j$,1)});function sc(O,e,t){let i=2+O.length;return new z(r=>{for(let n=0,s=0,a=0;;a++){if(r.next<0){a&&r.acceptToken(e);break}if(n==0&&r.next==ep||n==1&&r.next==nc||n>=2&&ns?r.acceptToken(e,-s):r.acceptToken(t,-(s-2));break}else if((r.next==10||r.next==13)&&a){r.acceptToken(e,1);break}else n=s=0;r.advance()}})}var Ay=sc("script",cy,hy),Ly=sc("style",fy,dy),My=sc("textarea",uy,Qy),Dy=F({"Text RawText IncompleteTag IncompleteCloseTag":d.content,"StartTag StartCloseTag SelfClosingEndTag EndTag":d.angleBracket,TagName:d.tagName,"MismatchedCloseTag/TagName":[d.tagName,d.invalid],AttributeName:d.attributeName,"AttributeValue UnquotedAttributeValue":d.attributeValue,Is:d.definitionOperator,"EntityReference CharacterReference":d.character,Comment:d.blockComment,ProcessingInst:d.processingInstruction,DoctypeDecl:d.documentMeta}),tp=Oe.deserialize({version:14,states:",xOVO!rOOO!ZQ#tO'#CrO!`Q#tO'#C{O!eQ#tO'#DOO!jQ#tO'#DRO!oQ#tO'#DTO!tOaO'#CqO#PObO'#CqO#[OdO'#CqO$kO!rO'#CqOOO`'#Cq'#CqO$rO$fO'#DUO$zQ#tO'#DWO%PQ#tO'#DXOOO`'#Dl'#DlOOO`'#DZ'#DZQVO!rOOO%UQ&rO,59^O%aQ&rO,59gO%lQ&rO,59jO%wQ&rO,59mO&SQ&rO,59oOOOa'#D_'#D_O&_OaO'#CyO&jOaO,59]OOOb'#D`'#D`O&rObO'#C|O&}ObO,59]OOOd'#Da'#DaO'VOdO'#DPO'bOdO,59]OOO`'#Db'#DbO'jO!rO,59]O'qQ#tO'#DSOOO`,59],59]OOOp'#Dc'#DcO'vO$fO,59pOOO`,59p,59pO(OQ#|O,59rO(TQ#|O,59sOOO`-E7X-E7XO(YQ&rO'#CtOOQW'#D['#D[O(hQ&rO1G.xOOOa1G.x1G.xOOO`1G/Z1G/ZO(sQ&rO1G/ROOOb1G/R1G/RO)OQ&rO1G/UOOOd1G/U1G/UO)ZQ&rO1G/XOOO`1G/X1G/XO)fQ&rO1G/ZOOOa-E7]-E7]O)qQ#tO'#CzOOO`1G.w1G.wOOOb-E7^-E7^O)vQ#tO'#C}OOOd-E7_-E7_O){Q#tO'#DQOOO`-E7`-E7`O*QQ#|O,59nOOOp-E7a-E7aOOO`1G/[1G/[OOO`1G/^1G/^OOO`1G/_1G/_O*VQ,UO,59`OOQW-E7Y-E7YOOOa7+$d7+$dOOO`7+$u7+$uOOOb7+$m7+$mOOOd7+$p7+$pOOO`7+$s7+$sO*bQ#|O,59fO*gQ#|O,59iO*lQ#|O,59lOOO`1G/Y1G/YO*qO7[O'#CwO+SOMhO'#CwOOQW1G.z1G.zOOO`1G/Q1G/QOOO`1G/T1G/TOOO`1G/W1G/WOOOO'#D]'#D]O+eO7[O,59cOOQW,59c,59cOOOO'#D^'#D^O+vOMhO,59cOOOO-E7Z-E7ZOOQW1G.}1G.}OOOO-E7[-E7[",stateData:",c~O!_OS~OUSOVPOWQOXROYTO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O|_O!eZO~OgaO~OgbO~OgcO~OgdO~OgeO~O!XfOPmP![mP~O!YiOQpP![pP~O!ZlORsP![sP~OUSOVPOWQOXROYTOZqO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O!eZO~O![rO~P#gO!]sO!fuO~OgvO~OgwO~OS|OT}OiyO~OS!POT}OiyO~OS!ROT}OiyO~OS!TOT}OiyO~OS}OT}OiyO~O!XfOPmX![mX~OP!WO![!XO~O!YiOQpX![pX~OQ!ZO![!XO~O!ZlORsX![sX~OR!]O![!XO~O![!XO~P#gOg!_O~O!]sO!f!aO~OS!bO~OS!cO~Oj!dOShXThXihX~OS!fOT!gOiyO~OS!hOT!gOiyO~OS!iOT!gOiyO~OS!jOT!gOiyO~OS!gOT!gOiyO~Og!kO~Og!lO~Og!mO~OS!nO~Ol!qO!a!oO!c!pO~OS!rO~OS!sO~OS!tO~Ob!uOc!uOd!uO!a!wO!b!uO~Ob!xOc!xOd!xO!c!wO!d!xO~Ob!uOc!uOd!uO!a!{O!b!uO~Ob!xOc!xOd!xO!c!{O!d!xO~OT~cbd!ey|!e~",goto:"%q!aPPPPPPPPPPPPPPPPPPPPP!b!hP!nPP!zP!}#Q#T#Z#^#a#g#j#m#s#y!bP!b!bP$P$V$m$s$y%P%V%]%cPPPPPPPP%iX^OX`pXUOX`pezabcde{!O!Q!S!UR!q!dRhUR!XhXVOX`pRkVR!XkXWOX`pRnWR!XnXXOX`pQrXR!XpXYOX`pQ`ORx`Q{aQ!ObQ!QcQ!SdQ!UeZ!e{!O!Q!S!UQ!v!oR!z!vQ!y!pR!|!yQgUR!VgQjVR!YjQmWR![mQpXR!^pQtZR!`tS_O`ToXp",nodeNames:"\u26A0 StartCloseTag StartCloseTag StartCloseTag EndTag SelfClosingEndTag StartTag StartTag StartTag StartTag StartTag StartCloseTag StartCloseTag StartCloseTag IncompleteTag IncompleteCloseTag Document Text EntityReference CharacterReference InvalidEntity Element OpenTag TagName Attribute AttributeName Is AttributeValue UnquotedAttributeValue ScriptText CloseTag OpenTag StyleText CloseTag OpenTag TextareaText CloseTag OpenTag CloseTag SelfClosingTag Comment ProcessingInst MismatchedCloseTag CloseTag DoctypeDecl",maxTerm:68,context:Wy,nodeProps:[["closedBy",-10,1,2,3,7,8,9,10,11,12,13,"EndTag",6,"EndTag SelfClosingEndTag",-4,22,31,34,37,"CloseTag"],["openedBy",4,"StartTag StartCloseTag",5,"StartTag",-4,30,33,36,38,"OpenTag"],["group",-10,14,15,18,19,20,21,40,41,42,43,"Entity",17,"Entity TextContent",-3,29,32,35,"TextContent Entity"],["isolate",-11,22,30,31,33,34,36,37,38,39,42,43,"ltr",-3,27,28,40,""]],propSources:[Dy],skippedNodes:[0],repeatNodeCount:9,tokenData:"!]tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^/^!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!Z5zblWOX5uXZ7SZ[5u[^7S^p5uqr5urs7Sst+Ptw5uwx7Sx!]5u!]!^7w!^!a7S!a#S5u#S#T7S#T;'S5u;'S;=`8n<%lO5u!R7VVOp7Sqs7St!]7S!]!^7l!^;'S7S;'S;=`7q<%lO7S!R7qOb!R!R7tP;=`<%l7S!Z8OYlWb!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!Z8qP;=`<%l5u!_8{iiSlWOX5uXZ7SZ[5u[^7S^p5uqr8trs7Sst/^tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^:j!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!_:sbiSlWb!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!VP<%l?Ah;{?Ah?BY7S?BY?Mn;{?MnO7S!V=dXiSb!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!V>SP;=`<%l;{!_>YP;=`<%l8t!_>dhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^/^!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!Z@TalWOX@OXZAYZ[@O[^AY^p@Oqr@OrsAYsw@OwxAYx!]@O!]!^Az!^!aAY!a#S@O#S#TAY#T;'S@O;'S;=`Bq<%lO@O!RA]UOpAYq!]AY!]!^Ao!^;'SAY;'S;=`At<%lOAY!RAtOc!R!RAwP;=`<%lAY!ZBRYlWc!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!ZBtP;=`<%l@O!_COhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^Dj!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!_DsbiSlWc!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!VFQbiSOpAYqrE{rsAYswE{wxAYx!PE{!P!QAY!Q!]E{!]!^GY!^!aAY!a#sE{#s$fAY$f;'SE{;'S;=`G|<%l?AhE{?Ah?BYAY?BY?MnE{?MnOAY!VGaXiSc!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!VHPP;=`<%lE{!_HVP;=`<%lBw!ZHcW!cxaP!b`Or(trs'ksv(tw!^(t!^!_)e!_;'S(t;'S;=`*P<%lO(t!aIYliSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OKQ!O!P-_!P!Q$q!Q!^-_!^!_*V!_!a&X!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!aK_kiSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx!P-_!P!Q$q!Q!^-_!^!_*V!_!`&X!`!aMS!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!TM_XaP!b`!dp!fQOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X!aNZ!ZiSgQaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OMz!O!PMz!P!Q$q!Q![Mz![!]Mz!]!^-_!^!_*V!_!a&X!a!c-_!c!}Mz!}#R-_#R#SMz#S#T1k#T#oMz#o#s-_#s$f$q$f$}-_$}%OMz%O%W-_%W%oMz%o%p-_%p&aMz&a&b-_&b1pMz1p4UMz4U4dMz4d4e-_4e$ISMz$IS$I`-_$I`$IbMz$Ib$Je-_$Je$JgMz$Jg$Kh-_$Kh%#tMz%#t&/x-_&/x&EtMz&Et&FV-_&FV;'SMz;'S;:j!#|;:j;=`3X<%l?&r-_?&r?AhMz?Ah?BY$q?BY?MnMz?MnO$q!a!$PP;=`<%lMz!R!$ZY!b`!dpOq*Vqr!$yrs(Vsv*Vwx)ex!a*V!a!b!4t!b;'S*V;'S;=`*s<%lO*V!R!%Q]!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!%y!O!f*V!f!g!']!g#W*V#W#X!0`#X;'S*V;'S;=`*s<%lO*V!R!&QX!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!&m!O;'S*V;'S;=`*s<%lO*V!R!&vV!b`!dp!ePOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!'dX!b`!dpOr*Vrs(Vsv*Vwx)ex!q*V!q!r!(P!r;'S*V;'S;=`*s<%lO*V!R!(WX!b`!dpOr*Vrs(Vsv*Vwx)ex!e*V!e!f!(s!f;'S*V;'S;=`*s<%lO*V!R!(zX!b`!dpOr*Vrs(Vsv*Vwx)ex!v*V!v!w!)g!w;'S*V;'S;=`*s<%lO*V!R!)nX!b`!dpOr*Vrs(Vsv*Vwx)ex!{*V!{!|!*Z!|;'S*V;'S;=`*s<%lO*V!R!*bX!b`!dpOr*Vrs(Vsv*Vwx)ex!r*V!r!s!*}!s;'S*V;'S;=`*s<%lO*V!R!+UX!b`!dpOr*Vrs(Vsv*Vwx)ex!g*V!g!h!+q!h;'S*V;'S;=`*s<%lO*V!R!+xY!b`!dpOr!+qrs!,hsv!+qvw!-Swx!.[x!`!+q!`!a!/j!a;'S!+q;'S;=`!0Y<%lO!+qq!,mV!dpOv!,hvx!-Sx!`!,h!`!a!-q!a;'S!,h;'S;=`!.U<%lO!,hP!-VTO!`!-S!`!a!-f!a;'S!-S;'S;=`!-k<%lO!-SP!-kO|PP!-nP;=`<%l!-Sq!-xS!dp|POv(Vx;'S(V;'S;=`(h<%lO(Vq!.XP;=`<%l!,ha!.aX!b`Or!.[rs!-Ssv!.[vw!-Sw!`!.[!`!a!.|!a;'S!.[;'S;=`!/d<%lO!.[a!/TT!b`|POr)esv)ew;'S)e;'S;=`)y<%lO)ea!/gP;=`<%l!.[!R!/sV!b`!dp|POr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!0]P;=`<%l!+q!R!0gX!b`!dpOr*Vrs(Vsv*Vwx)ex#c*V#c#d!1S#d;'S*V;'S;=`*s<%lO*V!R!1ZX!b`!dpOr*Vrs(Vsv*Vwx)ex#V*V#V#W!1v#W;'S*V;'S;=`*s<%lO*V!R!1}X!b`!dpOr*Vrs(Vsv*Vwx)ex#h*V#h#i!2j#i;'S*V;'S;=`*s<%lO*V!R!2qX!b`!dpOr*Vrs(Vsv*Vwx)ex#m*V#m#n!3^#n;'S*V;'S;=`*s<%lO*V!R!3eX!b`!dpOr*Vrs(Vsv*Vwx)ex#d*V#d#e!4Q#e;'S*V;'S;=`*s<%lO*V!R!4XX!b`!dpOr*Vrs(Vsv*Vwx)ex#X*V#X#Y!+q#Y;'S*V;'S;=`*s<%lO*V!R!4{Y!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!a!4t!a!b!:]!b;'S!4t;'S;=`!;r<%lO!4tq!5pV!dpOv!5kvx!6Vx!a!5k!a!b!7W!b;'S!5k;'S;=`!8V<%lO!5kP!6YTO!a!6V!a!b!6i!b;'S!6V;'S;=`!7Q<%lO!6VP!6lTO!`!6V!`!a!6{!a;'S!6V;'S;=`!7Q<%lO!6VP!7QOyPP!7TP;=`<%l!6Vq!7]V!dpOv!5kvx!6Vx!`!5k!`!a!7r!a;'S!5k;'S;=`!8V<%lO!5kq!7yS!dpyPOv(Vx;'S(V;'S;=`(h<%lO(Vq!8YP;=`<%l!5ka!8bX!b`Or!8]rs!6Vsv!8]vw!6Vw!a!8]!a!b!8}!b;'S!8];'S;=`!:V<%lO!8]a!9SX!b`Or!8]rs!6Vsv!8]vw!6Vw!`!8]!`!a!9o!a;'S!8];'S;=`!:V<%lO!8]a!9vT!b`yPOr)esv)ew;'S)e;'S;=`)y<%lO)ea!:YP;=`<%l!8]!R!:dY!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!`!4t!`!a!;S!a;'S!4t;'S;=`!;r<%lO!4t!R!;]V!b`!dpyPOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!;uP;=`<%l!4t!V!{let l=a.type.id;if(l==by)return tc(a,o,t);if(l==yy)return tc(a,o,i);if(l==xy)return tc(a,o,r);if(l==H$&&n.length){let c=a.node,h=c.firstChild,f=h&&D$(h,o),u;if(f){for(let Q of n)if(Q.tag==f&&(!Q.attrs||Q.attrs(u||(u=Op(h,o))))){let $=c.lastChild,p=$.type.id==wy?$.from:c.to;if(p>h.to)return{parser:Q.parser,overlay:[{from:h.to,to:p}]}}}}if(s&&l==K$){let c=a.node,h;if(h=c.firstChild){let f=s[o.read(h.from,h.to)];if(f)for(let u of f){if(u.tagName&&u.tagName!=D$(c.parent,o))continue;let Q=c.lastChild;if(Q.type.id==Oc){let $=Q.from+1,p=Q.lastChild,m=Q.to-(p&&p.isError?0:1);if(m>$)return{parser:u.parser,overlay:[{from:$,to:m}],bracketed:!0}}else if(Q.type.id==J$)return{parser:u.parser,overlay:[{from:Q.from,to:Q.to}]}}}}return null})}var Iy=316,By=317,ip=1,Ny=2,Fy=3,Hy=4,Ky=318,Jy=320,ex=321,tx=5,Ox=6,ix=0,lc=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],rp=125,rx=59,cc=47,nx=42,sx=43,ax=45,ox=60,lx=44,cx=63,hx=46,fx=91,dx=new Ge({start:!1,shift(O,e){return e==tx||e==Ox||e==Jy?O:e==ex},strict:!1}),ux=new z((O,e)=>{let{next:t}=O;(t==rp||t==-1||e.context)&&O.acceptToken(Ky)},{contextual:!0,fallback:!0}),Qx=new z((O,e)=>{let{next:t}=O,i;lc.indexOf(t)>-1||t==cc&&((i=O.peek(1))==cc||i==nx)||t!=rp&&t!=rx&&t!=-1&&!e.context&&O.acceptToken(Iy)},{contextual:!0}),$x=new z((O,e)=>{O.next==fx&&!e.context&&O.acceptToken(By)},{contextual:!0}),px=new z((O,e)=>{let{next:t}=O;if(t==sx||t==ax){if(O.advance(),t==O.next){O.advance();let i=!e.context&&e.canShift(ip);O.acceptToken(i?ip:Ny)}}else t==cx&&O.peek(1)==hx&&(O.advance(),O.advance(),(O.next<48||O.next>57)&&O.acceptToken(Fy))},{contextual:!0});function oc(O,e){return O>=65&&O<=90||O>=97&&O<=122||O==95||O>=192||!e&&O>=48&&O<=57}var mx=new z((O,e)=>{if(O.next!=ox||!e.dialectEnabled(ix)||(O.advance(),O.next==cc))return;let t=0;for(;lc.indexOf(O.next)>-1;)O.advance(),t++;if(oc(O.next,!0)){for(O.advance(),t++;oc(O.next,!1);)O.advance(),t++;for(;lc.indexOf(O.next)>-1;)O.advance(),t++;if(O.next==lx)return;for(let i=0;;i++){if(i==7){if(!oc(O.next,!0))return;break}if(O.next!="extends".charCodeAt(i))break;O.advance(),t++}}O.acceptToken(Hy,-t)}),gx=F({"get set async static":d.modifier,"for while do if else switch try catch finally return throw break continue default case defer":d.controlKeyword,"in of await yield void typeof delete instanceof as satisfies":d.operatorKeyword,"let var const using function class extends":d.definitionKeyword,"import export from":d.moduleKeyword,"with debugger new":d.keyword,TemplateString:d.special(d.string),super:d.atom,BooleanLiteral:d.bool,this:d.self,null:d.null,Star:d.modifier,VariableName:d.variableName,"CallExpression/VariableName TaggedTemplateExpression/VariableName":d.function(d.variableName),VariableDefinition:d.definition(d.variableName),Label:d.labelName,PropertyName:d.propertyName,PrivatePropertyName:d.special(d.propertyName),"CallExpression/MemberExpression/PropertyName":d.function(d.propertyName),"FunctionDeclaration/VariableDefinition":d.function(d.definition(d.variableName)),"ClassDeclaration/VariableDefinition":d.definition(d.className),"NewExpression/VariableName":d.className,PropertyDefinition:d.definition(d.propertyName),PrivatePropertyDefinition:d.definition(d.special(d.propertyName)),UpdateOp:d.updateOperator,"LineComment Hashbang":d.lineComment,BlockComment:d.blockComment,Number:d.number,String:d.string,Escape:d.escape,ArithOp:d.arithmeticOperator,LogicOp:d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,RegExp:d.regexp,Equals:d.definitionOperator,Arrow:d.function(d.punctuation),": Spread":d.punctuation,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,"InterpolationStart InterpolationEnd":d.special(d.brace),".":d.derefOperator,", ;":d.separator,"@":d.meta,TypeName:d.typeName,TypeDefinition:d.definition(d.typeName),"type enum interface implements namespace module declare":d.definitionKeyword,"abstract global Privacy readonly override":d.modifier,"is keyof unique infer asserts":d.operatorKeyword,JSXAttributeValue:d.attributeValue,JSXText:d.content,"JSXStartTag JSXStartCloseTag JSXSelfCloseEndTag JSXEndTag":d.angleBracket,"JSXIdentifier JSXNameSpacedName":d.tagName,"JSXAttribute/JSXIdentifier JSXAttribute/JSXNameSpacedName":d.attributeName,"JSXBuiltin/JSXIdentifier":d.standard(d.tagName)}),Px={__proto__:null,export:20,as:25,from:33,default:36,async:41,function:42,in:52,out:55,const:56,extends:60,this:64,true:72,false:72,null:84,void:88,typeof:92,super:108,new:142,delete:154,yield:163,await:167,class:172,public:235,private:235,protected:235,readonly:237,instanceof:256,satisfies:259,import:292,keyof:349,unique:353,infer:359,asserts:395,is:397,abstract:417,implements:419,type:421,let:424,var:426,using:429,interface:435,enum:439,namespace:445,module:447,declare:451,global:455,defer:471,for:476,of:485,while:488,with:492,do:496,if:500,else:502,switch:506,case:512,try:518,catch:522,finally:526,return:530,throw:534,break:538,continue:542,debugger:546},Sx={__proto__:null,async:129,get:131,set:133,declare:195,public:197,private:197,protected:197,static:199,abstract:201,override:203,readonly:209,accessor:211,new:401},Xx={__proto__:null,"<":193},np=Oe.deserialize({version:14,states:"$F|Q%TQlOOO%[QlOOO'_QpOOP(lO`OOO*zQ!0MxO'#CiO+RO#tO'#CjO+aO&jO'#CjO+oO#@ItO'#DaO.QQlO'#DgO.bQlO'#DrO%[QlO'#DzO0fQlO'#ESOOQ!0Lf'#E['#E[O1PQ`O'#EXOOQO'#Ep'#EpOOQO'#Il'#IlO1XQ`O'#GsO1dQ`O'#EoO1iQ`O'#EoO3hQ!0MxO'#JrO6[Q!0MxO'#JsO6uQ`O'#F]O6zQ,UO'#FtOOQ!0Lf'#Ff'#FfO7VO7dO'#FfO9XQMhO'#F|O9`Q`O'#F{OOQ!0Lf'#Js'#JsOOQ!0Lb'#Jr'#JrO9eQ`O'#GwOOQ['#K_'#K_O9pQ`O'#IYO9uQ!0LrO'#IZOOQ['#J`'#J`OOQ['#I_'#I_Q`QlOOQ`QlOOO9}Q!L^O'#DvO:UQlO'#EOO:]QlO'#EQO9kQ`O'#GsO:dQMhO'#CoO:rQ`O'#EnO:}Q`O'#EyO;hQMhO'#FeO;xQ`O'#GsOOQO'#K`'#K`O;}Q`O'#K`O<]Q`O'#G{O<]Q`O'#G|O<]Q`O'#HOO9kQ`O'#HRO=SQ`O'#HUO>kQ`O'#CeO>{Q`O'#HcO?TQ`O'#HiO?TQ`O'#HkO`QlO'#HmO?TQ`O'#HoO?TQ`O'#HrO?YQ`O'#HxO?_Q!0LsO'#IOO%[QlO'#IQO?jQ!0LsO'#ISO?uQ!0LsO'#IUO9uQ!0LrO'#IWO@QQ!0MxO'#CiOASQpO'#DlQOQ`OOO%[QlO'#EQOAjQ`O'#ETO:dQMhO'#EnOAuQ`O'#EnOBQQ!bO'#FeOOQ['#Cg'#CgOOQ!0Lb'#Dq'#DqOOQ!0Lb'#Jv'#JvO%[QlO'#JvOOQO'#Jy'#JyOOQO'#Ih'#IhOCQQpO'#EgOOQ!0Lb'#Ef'#EfOOQ!0Lb'#J}'#J}OC|Q!0MSO'#EgODWQpO'#EWOOQO'#Jx'#JxODlQpO'#JyOEyQpO'#EWODWQpO'#EgPFWO&2DjO'#CbPOOO)CD})CD}OOOO'#I`'#I`OFcO#tO,59UOOQ!0Lh,59U,59UOOOO'#Ia'#IaOFqO&jO,59UOGPQ!L^O'#DcOOOO'#Ic'#IcOGWO#@ItO,59{OOQ!0Lf,59{,59{OGfQlO'#IdOGyQ`O'#JtOIxQ!fO'#JtO+}QlO'#JtOJPQ`O,5:ROJgQ`O'#EpOJtQ`O'#KTOKPQ`O'#KSOKPQ`O'#KSOKXQ`O,5;^OK^Q`O'#KROOQ!0Ln,5:^,5:^OKeQlO,5:^OMcQ!0MxO,5:fONSQ`O,5:nONmQ!0LrO'#KQONtQ`O'#KPO9eQ`O'#KPO! YQ`O'#KPO! bQ`O,5;]O! gQ`O'#KPO!#lQ!fO'#JsOOQ!0Lh'#Ci'#CiO%[QlO'#ESO!$[Q!fO,5:sOOQS'#Jz'#JzOOQO-EtOOQ['#Jh'#JhOOQ[,5>u,5>uOOQ[-E<]-E<]O!TO`QlO,5>VO!LOQ`O,5>XO`QlO,5>ZO!LTQ`O,5>^O!LYQlO,5>dOOQ[,5>j,5>jO%[QlO,5>jO9uQ!0LrO,5>lOOQ[,5>n,5>nO#!dQ`O,5>nOOQ[,5>p,5>pO#!dQ`O,5>pOOQ[,5>r,5>rO##QQpO'#D_O%[QlO'#JvO##sQpO'#JvO##}QpO'#DmO#$`QpO'#DmO#&qQlO'#DmO#&xQ`O'#JuO#'QQ`O,5:WO#'VQ`O'#EtO#'eQ`O'#KUO#'mQ`O,5;_O#'rQpO'#DmO#(PQpO'#EVOOQ!0Lf,5:o,5:oO%[QlO,5:oO#(WQ`O,5:oO?YQ`O,5;YO!CUQpO,5;YO!C^QMhO,5;YO:dQMhO,5;YO#(`Q`O,5@bO#(eQ07dO,5:sOOQO-EPO$6^Q`O,5>POOQ[1G3i1G3iO`QlO1G3iOOQ[1G3o1G3oOOQ[1G3q1G3qO?TQ`O1G3sO$6cQlO1G3uO$:gQlO'#HtOOQ[1G3x1G3xO$:tQ`O'#HzO?YQ`O'#H|OOQ[1G4O1G4OO$:|QlO1G4OO9uQ!0LrO1G4UOOQ[1G4W1G4WOOQ!0Lb'#G_'#G_O9uQ!0LrO1G4YO9uQ!0LrO1G4[O$?TQ`O,5@bO!)[QlO,5;`O9eQ`O,5;`O?YQ`O,5:XO!)[QlO,5:XO!CUQpO,5:XO$?YQ?MtO,5:XOOQO,5;`,5;`O$?dQpO'#IeO$?zQ`O,5@aOOQ!0Lf1G/r1G/rO$@SQpO'#IkO$@^Q`O,5@pOOQ!0Lb1G0y1G0yO#$`QpO,5:XOOQO'#Ig'#IgO$@fQpO,5:qOOQ!0Ln,5:q,5:qO#(ZQ`O1G0ZOOQ!0Lf1G0Z1G0ZO%[QlO1G0ZOOQ!0Lf1G0t1G0tO?YQ`O1G0tO!CUQpO1G0tO!C^QMhO1G0tOOQ!0Lb1G5|1G5|O!ByQ!0LrO1G0^OOQO1G0m1G0mO%[QlO1G0mO$@mQ!0LrO1G0mO$@xQ!0LrO1G0mO!CUQpO1G0^ODWQpO1G0^O$AWQ!0LrO1G0mOOQO1G0^1G0^O$AlQ!0MxO1G0mPOOO-E<[-E<[POOO1G.h1G.hOOOO1G/i1G/iO$AvQ!bO,5QQpO,5@}OOQ!0Lb1G3c1G3cOOQ[7+$V7+$VO@zQ`O7+$VO9uQ!0LrO7+$VO%>]Q`O7+$VO%[QlO1G6lO%[QlO1G6mO%>bQ!0LrO1G6lO%>lQlO1G3kO%>sQ`O1G3kO%>xQlO1G3kOOQ[7+)T7+)TO9uQ!0LrO7+)_O`QlO7+)aOOQ['#Kh'#KhOOQ['#JS'#JSO%?PQlO,5>`OOQ[,5>`,5>`O%[QlO'#HuO%?^Q`O'#HwOOQ[,5>f,5>fO9eQ`O,5>fOOQ[,5>h,5>hOOQ[7+)j7+)jOOQ[7+)p7+)pOOQ[7+)t7+)tOOQ[7+)v7+)vO%?cQpO1G5|O%?}Q?MtO1G0zO%@XQ`O1G0zOOQO1G/s1G/sO%@dQ?MtO1G/sO?YQ`O1G/sO!)[QlO'#DmOOQO,5?P,5?POOQO-ERQ`O7+,WO&>WQ`O7+,XO%[QlO7+,WO%[QlO7+,XOOQ[7+)V7+)VO&>]Q`O7+)VO&>bQlO7+)VO&>iQ`O7+)VOOQ[<nQ`O,5>aOOQ[,5>c,5>cO&>sQ`O1G4QO9eQ`O7+&fO!)[QlO7+&fOOQO7+%_7+%_O&>xQ?MtO1G6ZO?YQ`O7+%_OOQ!0Lf<yQ?MvO,5?aO'@|Q?MvO,5?cO'CPQ?MvO7+'|O'DuQMjOG27TOOQO<VO!l$xO#jROe!iOpkOrPO(T)]O(VTO(YUO(aVO(o[O~O!]$_Oa$qa'z$qa'w$qa!k$qa!Y$qa!_$qa%i$qa!g$qa~Ol)dO~P!&zOh%VOp%WOr%XOs$tOt$tOz%YO|%ZO!O%]O!S${O!_$|O!i%bO!l$xO#j%cO$W%`O$t%^O$v%_O$y%aO(T(vO(VTO(YUO(a$uO(y$}O(z%PO~Og(pP~P!,TO!Q)iO!g)hO!_$^X$Z$^X$]$^X$_$^X$f$^X~O!g)hO!_({X$Z({X$]({X$_({X$f({X~O!Q)iO~P!.^O!Q)iO!_({X$Z({X$]({X$_({X$f({X~O!_)kO$Z)oO$])jO$_)jO$f)pO~O![)sO~P!)[O$]$hO$_$gO$f)wO~On$zX!Q$zX#S$zX'y$zX(y$zX(z$zX~OgmXg$zXnmX!]mX#`mX~P!0SOx)yO(b)zO(c)|O~On*VO!Q*OO'y*PO(y$}O(z%PO~Og)}O~P!1WOg*WO~Oh%VOr%XOs$tOt$tOz%YO|%ZO!OVO!l$xO#jVO!l$xO#jROe!iOpkOrPO(VTO(YUO(aVO(o[O~O(T=QO~P#$qO!]-]O!^(iX~O!^-_O~O!g-VO#`-UO!]#hX!^#hX~O!]-`O!^(xX~O!^-bO~O!c-cO!d-cO(U!lO~P#$`O!^-fO~P'_On-iO!_'`O~O!Y-nO~Os!{a!b!{a!c!{a!d!{a#T!{a#U!{a#V!{a#W!{a#X!{a#[!{a#]!{a(U!{a(V!{a(Y!{a(e!{a(o!{a~P!#vO!p-sO#`-qO~PChO!c-uO!d-uO(U!lO~PDWOa%nO#`-qO'z%nO~Oa%nO!g#vO#`-qO'z%nO~Oa%nO!g#vO!p-sO#`-qO'z%nO(r'pO~O(P'xO(Q'xO(R-zO~Ov-{O~O!Y'Wa!]'Wa~P!:tO![.PO!Y'WX!]'WX~P%[O!](VO!Y(ha~O!Y(ha~PHRO!](^O!Y(va~O!S%hO![.TO!_%iO(T%gO!Y'^X!]'^X~O#`.VO!](ta!k(taa(ta'z(ta~O!g#vO~P#,wO!](jO!k(sa~O!S%hO!_%iO#j.ZO(T%gO~Op.`O!S%hO![.]O!_%iO!|]O#i._O#j.]O(T%gO!]'aX!k'aX~OR.dO!l#xO~Oh%VOn.gO!_'`O%i.fO~Oa#ci!]#ci'z#ci'w#ci!Y#ci!k#civ#ci!_#ci%i#ci!g#ci~P!:tOn>]O!Q*OO'y*PO(y$}O(z%PO~O#k#_aa#_a#`#_a'z#_a!]#_a!k#_a!_#_a!Y#_a~P#/sO#k(`XP(`XR(`X[(`Xa(`Xj(`Xr(`X!S(`X!l(`X!p(`X#R(`X#n(`X#o(`X#p(`X#q(`X#r(`X#s(`X#t(`X#u(`X#v(`X#x(`X#z(`X#{(`X'z(`X(a(`X(r(`X!k(`X!Y(`X'w(`Xv(`X!_(`X%i(`X!g(`X~P!6kO!].tO!k(kX~P!:tO!k.wO~O!Y.yO~OP$[OR#zO!Q#yO!S#{O!l#xO!p$[O(aVO[#mia#mij#mir#mi!]#mi#R#mi#o#mi#p#mi#q#mi#r#mi#s#mi#t#mi#u#mi#v#mi#x#mi#z#mi#{#mi'z#mi(r#mi(y#mi(z#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#n#mi~P#3cO#n$OO~P#3cOP$[OR#zOr$aO!Q#yO!S#{O!l#xO!p$[O#n$OO#o$PO#p$PO#q$PO(aVO[#mia#mij#mi!]#mi#R#mi#s#mi#t#mi#u#mi#v#mi#x#mi#z#mi#{#mi'z#mi(r#mi(y#mi(z#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#r#mi~P#6QO#r$QO~P#6QOP$[OR#zO[$cOj$ROr$aO!Q#yO!S#{O!l#xO!p$[O#R$RO#n$OO#o$PO#p$PO#q$PO#r$QO#s$RO#t$RO#u$bO(aVOa#mi!]#mi#x#mi#z#mi#{#mi'z#mi(r#mi(y#mi(z#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#v#mi~P#8oOP$[OR#zO[$cOj$ROr$aO!Q#yO!S#{O!l#xO!p$[O#R$RO#n$OO#o$PO#p$PO#q$PO#r$QO#s$RO#t$RO#u$bO#v$SO(aVO(z#}Oa#mi!]#mi#z#mi#{#mi'z#mi(r#mi(y#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#x$UO~P#;VO#x#mi~P#;VO#v$SO~P#8oOP$[OR#zO[$cOj$ROr$aO!Q#yO!S#{O!l#xO!p$[O#R$RO#n$OO#o$PO#p$PO#q$PO#r$QO#s$RO#t$RO#u$bO#v$SO#x$UO(aVO(y#|O(z#}Oa#mi!]#mi#{#mi'z#mi(r#mi'w#mi!Y#mi!k#miv#mi!_#mi%i#mi!g#mi~O#z#mi~P#={O#z$WO~P#={OP]XR]X[]Xj]Xr]X!Q]X!S]X!l]X!p]X#R]X#S]X#`]X#kfX#n]X#o]X#p]X#q]X#r]X#s]X#t]X#u]X#v]X#x]X#z]X#{]X$Q]X(a]X(r]X(y]X(z]X!]]X!^]X~O$O]X~P#@jOP$[OR#zO[]O!Q*OO'y*PO(y$}O(z%POP#miR#mi!S#mi!l#mi!p#mi#n#mi#o#mi#p#mi#q#mi(a#mi~P#EyO!]/POg(pX~P!1WOg/RO~Oa$Pi!]$Pi'z$Pi'w$Pi!Y$Pi!k$Piv$Pi!_$Pi%i$Pi!g$Pi~P!:tO$]/SO$_/SO~O$]/TO$_/TO~O!g)hO#`/UO!_$cX$Z$cX$]$cX$_$cX$f$cX~O![/VO~O!_)kO$Z/XO$])jO$_)jO$f/YO~O!]VO!l$xO#j^O!Q*OO'y*PO(y$}O(z%POP#miR#mi!S#mi!l#mi!p#mi#n#mi#o#mi#p#mi#q#mi(a#mi~P&,QO#S$dOP(`XR(`X[(`Xj(`Xn(`Xr(`X!Q(`X!S(`X!l(`X!p(`X#R(`X#n(`X#o(`X#p(`X#q(`X#r(`X#s(`X#t(`X#u(`X#v(`X#x(`X#z(`X#{(`X$O(`X'y(`X(a(`X(r(`X(y(`X(z(`X!](`X!^(`X~O$O$Pi!]$Pi!^$Pi~P#BwO$O!ri!^!ri~P$+oOg']a!]']a~P!1WO!^7nO~O!]'da!^'da~P#BwO!Y7oO~P#/sO!g#vO(r'pO!]'ea!k'ea~O!]/pO!k)Oi~O!]/pO!g#vO!k)Oi~Og$|q!]$|q#`$|q$O$|q~P!1WO!Y'ga!]'ga~P#/sO!g7vO~O!]/yO!Y)Pi~P#/sO!]/yO!Y)Pi~O!Y7yO~Oh%VOr8OO!l%eO(r'pO~Oj8QO!g#vO~Or8TO!g#vO(r'pO~O!Q*OO'y*PO(z%POn'ja(y'ja!]'ja#`'ja~Og'ja$O'ja~P&5RO!Q*OO'y*POn'la(y'la(z'la!]'la#`'la~Og'la$O'la~P&5tOg(_q!](_q~P!1WO#`8VOg(_q!](_q~P!1WO!Y8WO~Og%Oq!]%Oq#`%Oq$O%Oq~P!1WOa$oy!]$oy'z$oy'w$oy!Y$oy!k$oyv$oy!_$oy%i$oy!g$oy~P!:tO!g6rO~O!]5[O!_)Qa~O!_'`OP$TaR$Ta[$Taj$Tar$Ta!Q$Ta!S$Ta!]$Ta!l$Ta!p$Ta#R$Ta#n$Ta#o$Ta#p$Ta#q$Ta#r$Ta#s$Ta#t$Ta#u$Ta#v$Ta#x$Ta#z$Ta#{$Ta(a$Ta(r$Ta(y$Ta(z$Ta~O%i7WO~P&8fO%^8[Oa%[i!_%[i'z%[i!]%[i~Oa#cy!]#cy'z#cy'w#cy!Y#cy!k#cyv#cy!_#cy%i#cy!g#cy~P!:tO[8^O~Ob8`O(T+qO(VTO(YUO~O!]1TO!^)Xi~O`8dO~O(e(|O!]'pX!^'pX~O!]5uO!^)Ua~O!^8nO~P%;eO(o!sO~P$&YO#[8oO~O!_1oO~O!_1oO%i8qO~On8tO!_1oO%i8qO~O[8yO!]'sa!^'sa~O!]1zO!^)Vi~O!k8}O~O!k9OO~O!k9RO~O!k9RO~P%[Oa9TO~O!g9UO~O!k9VO~O!](wi!^(wi~P#BwOa%nO#`9_O'z%nO~O!](ty!k(tya(ty'z(ty~P!:tO!](jO!k(sy~O%i9bO~P&8fO!_'`O%i9bO~O#k$|qP$|qR$|q[$|qa$|qj$|qr$|q!S$|q!]$|q!l$|q!p$|q#R$|q#n$|q#o$|q#p$|q#q$|q#r$|q#s$|q#t$|q#u$|q#v$|q#x$|q#z$|q#{$|q'z$|q(a$|q(r$|q!k$|q!Y$|q'w$|q#`$|qv$|q!_$|q%i$|q!g$|q~P#/sO#k'jaP'jaR'ja['jaa'jaj'jar'ja!S'ja!l'ja!p'ja#R'ja#n'ja#o'ja#p'ja#q'ja#r'ja#s'ja#t'ja#u'ja#v'ja#x'ja#z'ja#{'ja'z'ja(a'ja(r'ja!k'ja!Y'ja'w'jav'ja!_'ja%i'ja!g'ja~P&5RO#k'laP'laR'la['laa'laj'lar'la!S'la!l'la!p'la#R'la#n'la#o'la#p'la#q'la#r'la#s'la#t'la#u'la#v'la#x'la#z'la#{'la'z'la(a'la(r'la!k'la!Y'la'w'lav'la!_'la%i'la!g'la~P&5tO#k%OqP%OqR%Oq[%Oqa%Oqj%Oqr%Oq!S%Oq!]%Oq!l%Oq!p%Oq#R%Oq#n%Oq#o%Oq#p%Oq#q%Oq#r%Oq#s%Oq#t%Oq#u%Oq#v%Oq#x%Oq#z%Oq#{%Oq'z%Oq(a%Oq(r%Oq!k%Oq!Y%Oq'w%Oq#`%Oqv%Oq!_%Oq%i%Oq!g%Oq~P#/sO!]'Yi!k'Yi~P!:tO$O#cq!]#cq!^#cq~P#BwO(y$}OP%aaR%aa[%aaj%aar%aa!S%aa!l%aa!p%aa#R%aa#n%aa#o%aa#p%aa#q%aa#r%aa#s%aa#t%aa#u%aa#v%aa#x%aa#z%aa#{%aa$O%aa(a%aa(r%aa!]%aa!^%aa~On%aa!Q%aa'y%aa(z%aa~P&IyO(z%POP%caR%ca[%caj%car%ca!S%ca!l%ca!p%ca#R%ca#n%ca#o%ca#p%ca#q%ca#r%ca#s%ca#t%ca#u%ca#v%ca#x%ca#z%ca#{%ca$O%ca(a%ca(r%ca!]%ca!^%ca~On%ca!Q%ca'y%ca(y%ca~P&LQOn>^O!Q*OO'y*PO(z%PO~P&IyOn>^O!Q*OO'y*PO(y$}O~P&LQOR0kO!Q0kO!S0lO#S$dOP}a[}aj}an}ar}a!l}a!p}a#R}a#n}a#o}a#p}a#q}a#r}a#s}a#t}a#u}a#v}a#x}a#z}a#{}a$O}a'y}a(a}a(r}a(y}a(z}a!]}a!^}a~O!Q*OO'y*POP$saR$sa[$saj$san$sar$sa!S$sa!l$sa!p$sa#R$sa#n$sa#o$sa#p$sa#q$sa#r$sa#s$sa#t$sa#u$sa#v$sa#x$sa#z$sa#{$sa$O$sa(a$sa(r$sa(y$sa(z$sa!]$sa!^$sa~O!Q*OO'y*POP$uaR$ua[$uaj$uan$uar$ua!S$ua!l$ua!p$ua#R$ua#n$ua#o$ua#p$ua#q$ua#r$ua#s$ua#t$ua#u$ua#v$ua#x$ua#z$ua#{$ua$O$ua(a$ua(r$ua(y$ua(z$ua!]$ua!^$ua~On>^O!Q*OO'y*PO(y$}O(z%PO~OP%TaR%Ta[%Taj%Tar%Ta!S%Ta!l%Ta!p%Ta#R%Ta#n%Ta#o%Ta#p%Ta#q%Ta#r%Ta#s%Ta#t%Ta#u%Ta#v%Ta#x%Ta#z%Ta#{%Ta$O%Ta(a%Ta(r%Ta!]%Ta!^%Ta~P''VO$O$mq!]$mq!^$mq~P#BwO$O$oq!]$oq!^$oq~P#BwO!^9oO~O$O9pO~P!1WO!g#vO!]'ei!k'ei~O!g#vO(r'pO!]'ei!k'ei~O!]/pO!k)Oq~O!Y'gi!]'gi~P#/sO!]/yO!Y)Pq~Or9wO!g#vO(r'pO~O[9yO!Y9xO~P#/sO!Y9xO~Oj:PO!g#vO~Og(_y!](_y~P!1WO!]'na!_'na~P#/sOa%[q!_%[q'z%[q!]%[q~P#/sO[:UO~O!]1TO!^)Xq~O`:YO~O#`:ZO!]'pa!^'pa~O!]5uO!^)Ui~P#BwO!S:]O~O!_1oO%i:`O~O(VTO(YUO(e:eO~O!]1zO!^)Vq~O!k:hO~O!k:iO~O!k:jO~O!k:jO~P%[O#`:mO!]#hy!^#hy~O!]#hy!^#hy~P#BwO%i:rO~P&8fO!_'`O%i:rO~O$O#|y!]#|y!^#|y~P#BwOP$|iR$|i[$|ij$|ir$|i!S$|i!l$|i!p$|i#R$|i#n$|i#o$|i#p$|i#q$|i#r$|i#s$|i#t$|i#u$|i#v$|i#x$|i#z$|i#{$|i$O$|i(a$|i(r$|i!]$|i!^$|i~P''VO!Q*OO'y*PO(z%POP'iaR'ia['iaj'ian'iar'ia!S'ia!l'ia!p'ia#R'ia#n'ia#o'ia#p'ia#q'ia#r'ia#s'ia#t'ia#u'ia#v'ia#x'ia#z'ia#{'ia$O'ia(a'ia(r'ia(y'ia!]'ia!^'ia~O!Q*OO'y*POP'kaR'ka['kaj'kan'kar'ka!S'ka!l'ka!p'ka#R'ka#n'ka#o'ka#p'ka#q'ka#r'ka#s'ka#t'ka#u'ka#v'ka#x'ka#z'ka#{'ka$O'ka(a'ka(r'ka(y'ka(z'ka!]'ka!^'ka~O(y$}OP%aiR%ai[%aij%ain%air%ai!Q%ai!S%ai!l%ai!p%ai#R%ai#n%ai#o%ai#p%ai#q%ai#r%ai#s%ai#t%ai#u%ai#v%ai#x%ai#z%ai#{%ai$O%ai'y%ai(a%ai(r%ai(z%ai!]%ai!^%ai~O(z%POP%ciR%ci[%cij%cin%cir%ci!Q%ci!S%ci!l%ci!p%ci#R%ci#n%ci#o%ci#p%ci#q%ci#r%ci#s%ci#t%ci#u%ci#v%ci#x%ci#z%ci#{%ci$O%ci'y%ci(a%ci(r%ci(y%ci!]%ci!^%ci~O$O$oy!]$oy!^$oy~P#BwO$O#cy!]#cy!^#cy~P#BwO!g#vO!]'eq!k'eq~O!]/pO!k)Oy~O!Y'gq!]'gq~P#/sOr:|O!g#vO(r'pO~O[;QO!Y;PO~P#/sO!Y;PO~Og(_!R!](_!R~P!1WOa%[y!_%[y'z%[y!]%[y~P#/sO!]1TO!^)Xy~O!]5uO!^)Uq~O(T;XO~O!_1oO%i;[O~O!k;_O~O%i;dO~P&8fOP$|qR$|q[$|qj$|qr$|q!S$|q!l$|q!p$|q#R$|q#n$|q#o$|q#p$|q#q$|q#r$|q#s$|q#t$|q#u$|q#v$|q#x$|q#z$|q#{$|q$O$|q(a$|q(r$|q!]$|q!^$|q~P''VO!Q*OO'y*PO(z%POP'jaR'ja['jaj'jan'jar'ja!S'ja!l'ja!p'ja#R'ja#n'ja#o'ja#p'ja#q'ja#r'ja#s'ja#t'ja#u'ja#v'ja#x'ja#z'ja#{'ja$O'ja(a'ja(r'ja(y'ja!]'ja!^'ja~O!Q*OO'y*POP'laR'la['laj'lan'lar'la!S'la!l'la!p'la#R'la#n'la#o'la#p'la#q'la#r'la#s'la#t'la#u'la#v'la#x'la#z'la#{'la$O'la(a'la(r'la(y'la(z'la!]'la!^'la~OP%OqR%Oq[%Oqj%Oqr%Oq!S%Oq!l%Oq!p%Oq#R%Oq#n%Oq#o%Oq#p%Oq#q%Oq#r%Oq#s%Oq#t%Oq#u%Oq#v%Oq#x%Oq#z%Oq#{%Oq$O%Oq(a%Oq(r%Oq!]%Oq!^%Oq~P''VOg%e!Z!]%e!Z#`%e!Z$O%e!Z~P!1WO!Y;hO~P#/sOr;iO!g#vO(r'pO~O[;kO!Y;hO~P#/sO!]'pq!^'pq~P#BwO!]#h!Z!^#h!Z~P#BwO#k%e!ZP%e!ZR%e!Z[%e!Za%e!Zj%e!Zr%e!Z!S%e!Z!]%e!Z!l%e!Z!p%e!Z#R%e!Z#n%e!Z#o%e!Z#p%e!Z#q%e!Z#r%e!Z#s%e!Z#t%e!Z#u%e!Z#v%e!Z#x%e!Z#z%e!Z#{%e!Z'z%e!Z(a%e!Z(r%e!Z!k%e!Z!Y%e!Z'w%e!Z#`%e!Zv%e!Z!_%e!Z%i%e!Z!g%e!Z~P#/sOr;tO!g#vO(r'pO~O!Y;uO~P#/sOr;|O!g#vO(r'pO~O!Y;}O~P#/sOP%e!ZR%e!Z[%e!Zj%e!Zr%e!Z!S%e!Z!l%e!Z!p%e!Z#R%e!Z#n%e!Z#o%e!Z#p%e!Z#q%e!Z#r%e!Z#s%e!Z#t%e!Z#u%e!Z#v%e!Z#x%e!Z#z%e!Z#{%e!Z$O%e!Z(a%e!Z(r%e!Z!]%e!Z!^%e!Z~P''VOrROe!iOpkOrPO(T)]O(VTO(YUO(aVO(o[O~O!]WO!l$xO#jgPPP!>oI[PPPPPPPPP!BOP!C]PPI[!DnPI[PI[I[I[I[I[PI[!FQP!I[P!LbP!Lf!Lp!Lt!LtP!IXP!Lx!LxP#!OP#!SI[PI[#!Y#%_CjA^PA^PA^A^P#&lA^A^#)OA^#+vA^#.SA^A^#.r#1W#1W#1]#1f#1W#1qPP#1WPA^#2ZA^#6YA^A^6mPPP#:_PPP#:x#:xP#:xP#;`#:xPP#;fP#;]P#;]#;y#;]#P#>V#>]#>k#>q#>{#?R#?]#?c#?s#?y#@k#@}#AT#AZ#Ai#BO#Cs#DR#DY#Et#FS#Gt#HS#HY#H`#Hf#Hp#Hv#H|#IW#Ij#IpPPPPPPPPPPP#IvPPPPPPP#Jk#Mx$ b$ i$ qPPP$']P$'f$*_$0x$0{$1O$1}$2Q$2X$2aP$2g$2jP$3W$3[$4S$5b$5g$5}PP$6S$6Y$6^$6a$6e$6i$7e$7|$8e$8i$8l$8o$8y$8|$9Q$9UR!|RoqOXst!Z#d%m&r&t&u&w,s,x2[2_Y!vQ'`-e1o5{Q%tvQ%|yQ&T|Q&j!VS'W!e-]Q'f!iS'l!r!yU*k$|*Z*oQ+o%}S+|&V&WQ,d&dQ-c'_Q-m'gQ-u'mQ0[*qQ1b,OQ1y,eR<{SU+P%]S!S!nQ!r!v!y!z$|'W'_'`'l'm'n*k*o*q*r-]-c-e-u0[0_1o5{5}%[$ti#v$b$c$d$x${%O%Q%^%_%c)y*R*T*V*Y*a*g*w*x+f+i,S,V.f/P/d/m/x/y/{0`0b0i0j0o1f1i1q3c4^4_4j4o5Q5[5_6S7W7v8Q8V8[8q9b9p9y:P:`:r;Q;[;d;kP>X>Y>]>^Q&X|Q'U!eS'[%i-`Q+t&PQ,P&WQ,f&gQ0n+SQ1Y+uQ1_+{Q2Q,jQ2R,kQ5f1TQ5o1aQ6[1zQ6_1|Q6`2PQ8`5gQ8c5lQ8|6bQ:X8dQ:f8yQ;V:YR<}*ZrnOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_R,h&k&z^OPXYstuvwz!Z!`!g!j!o#S#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n%m%t&R&k&n&o&r&t&u&w&{'T'b'r(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mR>S[#]WZ#W#Z'X(T!b%jm#h#i#l$x%e%h(^(h(i(j*Y*^*b+Z+[+^,o-V.T.Z.[.]._/m/p2d3[3]4a6r7TQ%wxQ%{yW&Q|&V&W,OQ&_!TQ'c!hQ'e!iQ(q#sS+n%|%}Q+r&PQ,_&bQ,c&dS-l'f'gQ.i(rQ1R+oQ1X+uQ1Z+vQ1^+zQ1t,`S1x,d,eQ2|-mQ5e1TQ5i1WQ5n1`Q6Z1yQ8_5gQ8b5kQ8f5pQ:T8^R;T:U!U$zi$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y!^%yy!i!u%{%|%}'V'e'f'g'k'u*j+n+o-Y-l-m-t0R0U1R2u2|3T4r4s4v7}9{Q+h%wQ,T&[Q,W&]Q,b&dQ.h(qQ1s,_U1w,c,d,eQ3e.iQ6U1tS6Y1x1yQ8x6Z#f>T#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^o>UPS&[!Q&iQ&]!RQ&^!SU*}%[%d=sR,R&Y%]%Si#v$b$c$d$x${%O%Q%^%_%c)y*R*T*V*Y*a*g*w*x+f+i,S,V.f/P/d/m/x/y/{0`0b0i0j0o1f1i1q3c4^4_4j4o5Q5[5_6S7W7v8Q8V8[8q9b9p9y:P:`:r;Q;[;d;kP>X>Y>]>^T)z$u){V+P%]S$i$^c#Y#e%q%s%u(S(Y(t(y)R)S)T)U)V)W)X)Y)Z)[)^)`)b)g)q+d+x-Z-x-}.S.U.s.v.z.|.}/O/b0p2k2n3O3V3k3p3q3r3s3t3u3v3w3x3y3z3{3|4P4Q4X5X5c6u6{7Q7a7b7k7l8k9X9]9g9m9n:o;W;`SQ'Y!eR2q-]!W!nQ!e!r!v!y!z$|'W'_'`'l'm'n*Z*k*o*q*r-]-c-e-u0[0_1o5{5}R1l,ZnqOXst!Z#d%m&r&t&u&w,s,x2[2_Q&y!^Q'v!xS(s#u<^Q+l%zQ,]&_Q,^&aQ-j'dQ-w'oS.r(x=PS0q+X=ZQ1P+mQ1n,[Q2c,zQ2e,{Q2m-WQ2z-kQ2}-oS5Y0r=eQ5a1QS5d1S=fQ6t2oQ6x2{Q6}3SQ8]5bQ9Y6vQ9Z6yQ9^7OR:l9V$d$]c#Y#e%s%u(S(Y(t(y)R)S)T)U)V)W)X)Y)Z)[)^)`)b)g)q+d+x-Z-x-}.S.U.s.v.z.}/O/b0p2k2n3O3V3k3p3q3r3s3t3u3v3w3x3y3z3{3|4P4Q4X5X5c6u6{7Q7a7b7k7l8k9X9]9g9m9n:o;W;`SS#q]SU$fd)_,mS(p#p'iU*v%R(w4OU0m+O.n7gQ5^0xQ7V3`Q9d7YR:s9em!tQ!r!v!y!z'`'l'm'n-e-u1o5{5}Q't!uS(f#g2US-s'k'wQ/s*]Q0R*jQ3U-vQ4f/tQ4r0TQ4s0UQ4x0^Q7r4`S7}4t4vS8R4y4{Q9r7sQ9v7yQ9{8OQ:Q8TS:{9w9xS;g:|;PS;s;h;iS;{;t;uSSR=o>R%^bOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&o&r&t&u&w&{'T'b'r(T(V(](d(x(z)O)}*i+X+]+g,p,s,x-i-q.P.V.g.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3d3l4z6T6e6f6i6|7[8t9T9_Q%fj!^%xy!i!u%{%|%}'V'e'f'g'k'u*j+n+o-Y-l-m-t0R0U1R2u2|3T4r4s4v7}9{S&Oz!jQ+k%yQ,a&dW1v,b,c,d,eU6X1w1x1yS8w6Y6ZQ:d8x!r=j$Z$n'X)s-U-X/V2p4T5w6s:Z:mSQ=t>QR=u>R%QeOPXYstuvw!Z!`!g!o#S#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&r&t&u&w&{'T'b'r(V(](d(x(z)O)}*i+X+]+g,p,s,x-i-q.P.V.g.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3d3l4z6T6e6f6i6|7[8t9T9_Y#bWZ#W#Z(T!b%jm#h#i#l$x%e%h(^(h(i(j*Y*^*b+Z+[+^,o-V.T.Z.[.]._/m/p2d3[3]4a6r7TQ,n&o!p=k$Z$n)s-U-X/V2p4T5w6s:Z:mSR=n'XU']!e%i*ZR2s-`%SdOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&r&t&u&w&{'T'b'r(T(V(](d(x(z)O)}*i+X+],p,s,x-i-q.P.V.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3l4z6T6e6f6i6|8t9T9_!r)_$Z$n'X)s-U-X/V2p4T5w6s:Z:mSQ,m&oQ0x+gQ3`.gQ7Y3dR9e7[!b$Tc#Y%q(S(Y(t(y)Z)[)`)g+x-x-}.S.U.s.v/b0p3O3V3k3{5X5c6{7Q7a9]:oS)^)q-Z.|2k2n3p4P4X6u7b7k7l8k9X9g9m9n;W;`=vQ>X>ZR>Y>['QkOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n%m%t&R&k&n&o&r&t&u&w&{'T'X'b'r(T(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mSS$oh$pR4U/U'XgOPWXYZhstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n$p%m%t&R&k&n&o&r&t&u&w&{'T'X'b'r(T(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/U/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mST$kf$qQ$ifS)j$l)nR)v$qT$jf$qT)l$l)n'XhOPWXYZhstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$Z$_$a$e$n$p%m%t&R&k&n&o&r&t&u&w&{'T'X'b'r(T(V(](d(x(z)O)s)}*i+X+]+g,p,s,x-U-X-i-q.P.V.g.t.{/U/V/n0]0l0r1S1r2S2T2V2X2[2_2a2p3Q3W3d3l4T4z5w6T6e6f6i6s6|7[8t9T9_:Z:mST$oh$pQ$rhR)u$p%^jOPWXYZstuvw!Z!`!g!o#S#W#Z#d#o#u#x#{$O$P$Q$R$S$T$U$V$W$X$_$a$e%m%t&R&k&n&o&r&t&u&w&{'T'b'r(T(V(](d(x(z)O)}*i+X+]+g,p,s,x-i-q.P.V.g.t.{/n0]0l0r1S1r2S2T2V2X2[2_2a3Q3W3d3l4z6T6e6f6i6|7[8t9T9_!s>Q$Z$n'X)s-U-X/V2p4T5w6s:Z:mS#glOPXZst!Z!`!o#S#d#o#{$n%m&k&n&o&r&t&u&w&{'T'b)O)s*i+]+g,p,s,x-i.g/V/n0]0l1r2S2T2V2X2[2_2a3d4T4z6T6e6f6i7[8t9T!U%Ri$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y#f(w#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^Q+T%aQ/c*Oo4OP>X>YQ*c$zU*l$|*Z*oQ+U%bQ0W*m#f=q#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^n=rTQ=x>UQ=y>VR=z>W!U%Ri$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y#f(w#v$b$c$x${)y*V*Y*g+f+i,S,V.f/d/m/y/{1f1i1q3c4^4j4o5[5_6S7W7v8Q8[8q9b9y:P:`:r;Q;[;d;k]>^o4OP>X>Y>]>^Q,U&]Q1h,WQ5s1gR8h5tV*n$|*Z*oU*n$|*Z*oT5z1o5{S0P*i/nQ4w0]T8S4z:]Q+j%xQ0V*lQ1O+kQ1u,aQ6W1vQ8v6XQ:c8wR;^:d!U%Oi$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Yx*R$v)e*S*u+V/v0d0e4R4g5R5S5W7p8U:R:x=p=}>OS0`*t0a#f]>^nZ>[`=T3}7c7f7j9h:t:w;yS=_.l3iT=`7e9k!U%Qi$d%O%Q%^%_%c*R*T*a*w*x/P/x0`0b0i0j0o4_5Q8V9p>P>X>Y|*T$v)e*U*t+V/g/v0d0e4R4g4|5R5S5W7p8U:R:x=p=}>OS0b*u0c#f]>^nZ>[d=V3}7d7e7j9h9i:t:u:w;yS=a.m3jT=b7f9lrnOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_Q&f!UR,p&ornOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_R&f!UQ,Y&^R1d,RsnOXst!V!Z#d%m&i&r&t&u&w,s,x2[2_Q1p,_S6R1s1tU8p6P6Q6US:_8r8sS;Y:^:aQ;m;ZR;w;nQ&m!VR,i&iR6_1|R:f8yW&Q|&V&W,OR1Z+vQ&r!WR,s&sR,y&xT2],x2_R,}&yQ,|&yR2f,}Q'y!{R-y'ySsOtQ#dXT%ps#dQ#OTR'{#OQ#RUR'}#RQ){$uR/`){Q#UVR(Q#UQ#XWU(W#X(X.QQ(X#YR.Q(YQ-^'YR2r-^Q.u(yS3m.u3nR3n.vQ-e'`R2v-eY!rQ'`-e1o5{R'j!rQ/Q)eR4S/QU#_W%h*YU(_#_(`.RQ(`#`R.R(ZQ-a']R2t-at`OXst!V!Z#d%m&i&k&r&t&u&w,s,x2[2_S#hZ%eU#r`#h.[R.[(jQ(k#jQ.X(gW.a(k.X3X7RQ3X.YR7R3YQ)n$lR/W)nQ$phR)t$pQ$`cU)a$`-|O>Z>[Q/z*eU4k/z4m7xQ4m/|R7x4lS*o$|*ZR0Y*ox*S$v)e*t*u+V/v0d0e4R4g5R5S5W7p8U:R:x=p=}>O!d.j(u)c*[*e.l.m.q/_/k/|0v1e3h4[4h4l5r7]7`7w7z8X8Z9t9|:S:};R;e;j;v>Z>[U/h*S.j7ca7c3}7e7f7j9h:t:w;yQ0a*tQ3i.lU4}0a3i9kR9k7e|*U$v)e*t*u+V/g/v0d0e4R4g4|5R5S5W7p8U:R:x=p=}>O!h.k(u)c*[*e.l.m.q/_/k/|0v1e3f3h4[4h4l5r7]7^7`7w7z8X8Z9t9|:S:};R;e;j;v>Z>[U/j*U.k7de7d3}7e7f7j9h9i:t:u:w;yQ0c*uQ3j.mU5P0c3j9lR9l7fQ*z%UR0g*zQ5]0vR8Y5]Q+_%kR0u+_Q5v1jS8j5v:[R:[8kQ,[&_R1m,[Q5{1oR8m5{Q1{,fS6]1{8zR8z6_Q1U+rW5h1U5j8a:VQ5j1XQ8a5iR:V8bQ+w&QR1[+wQ2_,xR6m2_YrOXst#dQ&v!ZQ+a%mQ,r&rQ,t&tQ,u&uQ,w&wQ2Y,sS2],x2_R6l2[Q%opQ&z!_Q&}!aQ'P!bQ'R!cQ'q!uQ+`%lQ+l%zQ,Q&XQ,h&mQ-P&|W-p'k's't'wQ-w'oQ0X*nQ1P+mQ1c,PS2O,i,lQ2g-OQ2h-RQ2i-SQ2}-oW3P-r-s-v-xQ5a1QQ5m1_Q5q1eQ6V1uQ6a2QQ6k2ZU6z3O3R3UQ6}3SQ8]5bQ8e5oQ8g5rQ8l5zQ8u6WQ8{6`S9[6{7PQ9^7OQ:W8cQ:b8vQ:g8|Q:n9]Q;U:XQ;]:cQ;a:oQ;l;VR;o;^Q%zyQ'd!iQ'o!uU+m%{%|%}Q-W'VU-k'e'f'gS-o'k'uQ0Q*jS1Q+n+oQ2o-YS2{-l-mQ3S-tS4p0R0UQ5b1RQ6v2uQ6y2|Q7O3TU7{4r4s4vQ9z7}R;O9{S$wi>PR*{%VU%Ui%V>PR0f*yQ$viS(u#v+iS)c$b$cQ)e$dQ*[$xS*e${*YQ*t%OQ*u%QQ+Q%^Q+R%_Q+V%cQ.lPQ=}>XQ>O>YQ>Z>]R>[>^Q+O%]Q.nSR#[WR'Z!el!tQ!r!v!y!z'`'l'm'n-e-u1o5{5}S'V!e-]U*j$|*Z*oS-Y'W'_S0U*k*qQ0^*rQ2u-cQ4v0[R4{0_R({#xQ!fQT-d'`-e]!qQ!r'`-e1o5{Q#p]R'i < TypeParamList in out const TypeDefinition extends ThisType this LiteralType ArithOp Number BooleanLiteral TemplateType InterpolationEnd Interpolation InterpolationStart NullType null VoidType void TypeofType typeof MemberExpression . PropertyName [ TemplateString Escape Interpolation super RegExp ] ArrayExpression Spread , } { ObjectExpression Property async get set PropertyDefinition Block : NewTarget new NewExpression ) ( ArgList UnaryExpression delete LogicOp BitOp YieldExpression yield AwaitExpression await ParenthesizedExpression ClassExpression class ClassBody MethodDeclaration Decorator @ MemberExpression PrivatePropertyName CallExpression TypeArgList CompareOp < declare Privacy static abstract override PrivatePropertyDefinition PropertyDeclaration readonly accessor Optional TypeAnnotation Equals StaticBlock FunctionExpression ArrowFunction ParamList ParamList ArrayPattern ObjectPattern PatternProperty Privacy readonly Arrow MemberExpression BinaryExpression ArithOp ArithOp ArithOp ArithOp BitOp CompareOp instanceof satisfies CompareOp BitOp BitOp BitOp LogicOp LogicOp ConditionalExpression LogicOp LogicOp AssignmentExpression UpdateOp PostfixExpression CallExpression InstantiationExpression TaggedTemplateExpression DynamicImport import ImportMeta JSXElement JSXSelfCloseEndTag JSXSelfClosingTag JSXIdentifier JSXBuiltin JSXIdentifier JSXNamespacedName JSXMemberExpression JSXSpreadAttribute JSXAttribute JSXAttributeValue JSXEscape JSXEndTag JSXOpenTag JSXFragmentTag JSXText JSXEscape JSXStartCloseTag JSXCloseTag PrefixCast < ArrowFunction TypeParamList SequenceExpression InstantiationExpression KeyofType keyof UniqueType unique ImportType InferredType infer TypeName ParenthesizedType FunctionSignature ParamList NewSignature IndexedType TupleType Label ArrayType ReadonlyType ObjectType MethodType PropertyType IndexSignature PropertyDefinition CallSignature TypePredicate asserts is NewSignature new UnionType LogicOp IntersectionType LogicOp ConditionalType ParameterizedType ClassDeclaration abstract implements type VariableDeclaration let var using TypeAliasDeclaration InterfaceDeclaration interface EnumDeclaration enum EnumBody NamespaceDeclaration namespace module AmbientDeclaration declare GlobalDeclaration global ClassDeclaration ClassBody AmbientFunctionDeclaration ExportGroup VariableName VariableName ImportDeclaration defer ImportGroup ForStatement for ForSpec ForInSpec ForOfSpec of WhileStatement while WithStatement with DoStatement do IfStatement if else SwitchStatement switch SwitchBody CaseLabel case DefaultLabel TryStatement try CatchClause catch FinallyClause finally ReturnStatement return ThrowStatement throw BreakStatement break ContinueStatement continue DebuggerStatement debugger LabeledStatement ExpressionStatement SingleExpression SingleClassItem",maxTerm:380,context:dx,nodeProps:[["isolate",-8,5,6,14,37,39,51,53,55,""],["group",-26,9,17,19,68,207,211,215,216,218,221,224,234,237,243,245,247,249,252,258,264,266,268,270,272,274,275,"Statement",-34,13,14,32,35,36,42,51,54,55,57,62,70,72,76,80,82,84,85,110,111,120,121,136,139,141,142,143,144,145,147,148,167,169,171,"Expression",-23,31,33,37,41,43,45,173,175,177,178,180,181,182,184,185,186,188,189,190,201,203,205,206,"Type",-3,88,103,109,"ClassItem"],["openedBy",23,"<",38,"InterpolationStart",56,"[",60,"{",73,"(",160,"JSXStartCloseTag"],["closedBy",-2,24,168,">",40,"InterpolationEnd",50,"]",61,"}",74,")",165,"JSXEndTag"]],propSources:[gx],skippedNodes:[0,5,6,278],repeatNodeCount:37,tokenData:"$Fq07[R!bOX%ZXY+gYZ-yZ[+g[]%Z]^.c^p%Zpq+gqr/mrs3cst:_tuEruvJSvwLkwx! Yxy!'iyz!(sz{!)}{|!,q|}!.O}!O!,q!O!P!/Y!P!Q!9j!Q!R#:O!R![#<_![!]#I_!]!^#Jk!^!_#Ku!_!`$![!`!a$$v!a!b$*T!b!c$,r!c!}Er!}#O$-|#O#P$/W#P#Q$4o#Q#R$5y#R#SEr#S#T$7W#T#o$8b#o#p$x#r#s$@U#s$f%Z$f$g+g$g#BYEr#BY#BZ$A`#BZ$ISEr$IS$I_$A`$I_$I|Er$I|$I}$Dk$I}$JO$Dk$JO$JTEr$JT$JU$A`$JU$KVEr$KV$KW$A`$KW&FUEr&FU&FV$A`&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$A`?HUOEr(n%d_$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&j&hT$i&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c&j&zP;=`<%l&c'|'U]$i&j(Z!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!b(SU(Z!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!b(iP;=`<%l'}'|(oP;=`<%l&}'[(y]$i&j(WpOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(rp)wU(WpOY)rZr)rs#O)r#P;'S)r;'S;=`*Z<%lO)rp*^P;=`<%l)r'[*dP;=`<%l(r#S*nX(Wp(Z!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g#S+^P;=`<%l*g(n+dP;=`<%l%Z07[+rq$i&j(Wp(Z!b'|0/lOX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p$f%Z$f$g+g$g#BY%Z#BY#BZ+g#BZ$IS%Z$IS$I_+g$I_$JT%Z$JT$JU+g$JU$KV%Z$KV$KW+g$KW&FU%Z&FU&FV+g&FV;'S%Z;'S;=`+a<%l?HT%Z?HT?HU+g?HUO%Z07[.ST(X#S$i&j'}0/lO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c07[.n_$i&j(Wp(Z!b'}0/lOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z)3p/x`$i&j!p),Q(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`0z!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(KW1V`#v(Ch$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`2X!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(KW2d_#v(Ch$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'At3l_(V':f$i&j(Z!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k(^4r_$i&j(Z!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k&z5vX$i&jOr5qrs6cs!^5q!^!_6y!_#o5q#o#p6y#p;'S5q;'S;=`7h<%lO5q&z6jT$d`$i&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c`6|TOr6yrs7]s;'S6y;'S;=`7b<%lO6y`7bO$d``7eP;=`<%l6y&z7kP;=`<%l5q(^7w]$d`$i&j(Z!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!r8uZ(Z!bOY8pYZ6yZr8prs9hsw8pwx6yx#O8p#O#P6y#P;'S8p;'S;=`:R<%lO8p!r9oU$d`(Z!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!r:UP;=`<%l8p(^:[P;=`<%l4k%9[:hh$i&j(Wp(Z!bOY%ZYZ&cZq%Zqr`#P#o`x!^=^!^!_?q!_#O=^#O#P>`#P#o=^#o#p?q#p;'S=^;'S;=`@h<%lO=^&n>gXWS$i&jOY>`YZ&cZ!^>`!^!_?S!_#o>`#o#p?S#p;'S>`;'S;=`?k<%lO>`S?XSWSOY?SZ;'S?S;'S;=`?e<%lO?SS?hP;=`<%l?S&n?nP;=`<%l>`!f?xWWS(Z!bOY?qZw?qwx?Sx#O?q#O#P?S#P;'S?q;'S;=`@b<%lO?q!f@eP;=`<%l?q(Q@kP;=`<%l=^'`@w]WS$i&j(WpOY@nYZ&cZr@nrs>`s!^@n!^!_Ap!_#O@n#O#P>`#P#o@n#o#pAp#p;'S@n;'S;=`Bg<%lO@ntAwWWS(WpOYApZrAprs?Ss#OAp#O#P?S#P;'SAp;'S;=`Ba<%lOAptBdP;=`<%lAp'`BjP;=`<%l@n#WBvYWS(Wp(Z!bOYBmZrBmrs?qswBmwxApx#OBm#O#P?S#P;'SBm;'S;=`Cf<%lOBm#WCiP;=`<%lBm(rCoP;=`<%l^!Q^$i&j!X7`OY!=yYZ&cZ!P!=y!P!Q!>|!Q!^!=y!^!_!@c!_!}!=y!}#O!CW#O#P!Dy#P#o!=y#o#p!@c#p;'S!=y;'S;=`!Ek<%lO!=y|#X#Z&c#Z#[!>|#[#]&c#]#^!>|#^#a&c#a#b!>|#b#g&c#g#h!>|#h#i&c#i#j!>|#j#k!>|#k#m&c#m#n!>|#n#o&c#p;'S&c;'S;=`&w<%lO&c7`!@hX!X7`OY!@cZ!P!@c!P!Q!AT!Q!}!@c!}#O!Ar#O#P!Bq#P;'S!@c;'S;=`!CQ<%lO!@c7`!AYW!X7`#W#X!AT#Z#[!AT#]#^!AT#a#b!AT#g#h!AT#i#j!AT#j#k!AT#m#n!AT7`!AuVOY!ArZ#O!Ar#O#P!B[#P#Q!@c#Q;'S!Ar;'S;=`!Bk<%lO!Ar7`!B_SOY!ArZ;'S!Ar;'S;=`!Bk<%lO!Ar7`!BnP;=`<%l!Ar7`!BtSOY!@cZ;'S!@c;'S;=`!CQ<%lO!@c7`!CTP;=`<%l!@c^!Ezl$i&j(Z!b!X7`OY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#W&}#W#X!Eq#X#Z&}#Z#[!Eq#[#]&}#]#^!Eq#^#a&}#a#b!Eq#b#g&}#g#h!Eq#h#i&}#i#j!Eq#j#k!Eq#k#m&}#m#n!Eq#n#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}8r!GyZ(Z!b!X7`OY!GrZw!Grwx!@cx!P!Gr!P!Q!Hl!Q!}!Gr!}#O!JU#O#P!Bq#P;'S!Gr;'S;=`!J|<%lO!Gr8r!Hse(Z!b!X7`OY'}Zw'}x#O'}#P#W'}#W#X!Hl#X#Z'}#Z#[!Hl#[#]'}#]#^!Hl#^#a'}#a#b!Hl#b#g'}#g#h!Hl#h#i'}#i#j!Hl#j#k!Hl#k#m'}#m#n!Hl#n;'S'};'S;=`(f<%lO'}8r!JZX(Z!bOY!JUZw!JUwx!Arx#O!JU#O#P!B[#P#Q!Gr#Q;'S!JU;'S;=`!Jv<%lO!JU8r!JyP;=`<%l!JU8r!KPP;=`<%l!Gr>^!KZ^$i&j(Z!bOY!KSYZ&cZw!KSwx!CWx!^!KS!^!_!JU!_#O!KS#O#P!DR#P#Q!^!LYP;=`<%l!KS>^!L`P;=`<%l!_#c#d#Bq#d#l%Z#l#m#Es#m#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#>j_$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#?rd$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#AQ!R!S#AQ!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#AQ#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#A]f$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#AQ!R!S#AQ!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#AQ#S#b%Z#b#c#>_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#Bzc$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#DV!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#DV#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#Dbe$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#DV!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#DV#S#b%Z#b#c#>_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#E|g$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#Ge![!^%Z!^!_*g!_!c%Z!c!i#Ge!i#O%Z#O#P&c#P#R%Z#R#S#Ge#S#T%Z#T#Z#Ge#Z#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'Ad#Gpi$i&j(Wp(Z!bs'9tOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#Ge![!^%Z!^!_*g!_!c%Z!c!i#Ge!i#O%Z#O#P&c#P#R%Z#R#S#Ge#S#T%Z#T#Z#Ge#Z#b%Z#b#c#>_#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z*)x#Il_!g$b$i&j$O)Lv(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z)[#Jv_al$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z04f#LS^h#)`#R-v$?V_!^(CdvBr$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z?O$@a_!q7`$i&j(Wp(Z!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z07[$Aq|$i&j(Wp(Z!b'|0/l$]#t(T,2j(e$I[OX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$f%Z$f$g+g$g#BYEr#BY#BZ$A`#BZ$ISEr$IS$I_$A`$I_$JTEr$JT$JU$A`$JU$KVEr$KV$KW$A`$KW&FUEr&FU&FV$A`&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$A`?HUOEr07[$D|k$i&j(Wp(Z!b'}0/l$]#t(T,2j(e$I[OY%ZYZ&cZr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$g%Z$g;'SEr;'S;=`I|<%lOEr",tokenizers:[Qx,$x,px,mx,2,3,4,5,6,7,8,9,10,11,12,13,14,ux,new kt("$S~RRtu[#O#Pg#S#T#|~_P#o#pb~gOx~~jVO#i!P#i#j!U#j#l!P#l#m!q#m;'S!P;'S;=`#v<%lO!P~!UO!U~~!XS!Q![!e!c!i!e#T#Z!e#o#p#Z~!hR!Q![!q!c!i!q#T#Z!q~!tR!Q![!}!c!i!}#T#Z!}~#QR!Q![!P!c!i!P#T#Z!P~#^R!Q![#g!c!i#g#T#Z#g~#jS!Q![#g!c!i#g#T#Z#g#q#r!P~#yP;=`<%l!P~$RO(c~~",141,340),new kt("j~RQYZXz{^~^O(Q~~aP!P!Qd~iO(R~~",25,323)],topRules:{Script:[0,7],SingleExpression:[1,276],SingleClassItem:[2,277]},dialects:{jsx:0,ts:15175},dynamicPrecedences:{80:1,82:1,94:1,169:1,199:1},specialized:[{term:327,get:O=>Px[O]||-1},{term:343,get:O=>Sx[O]||-1},{term:95,get:O=>Xx[O]||-1}],tokenPrec:15201});var lp=[W("function ${name}(${params}) {\n ${}\n}",{label:"function",detail:"definition",type:"keyword"}),W("for (let ${index} = 0; ${index} < ${bound}; ${index}++) {\n ${}\n}",{label:"for",detail:"loop",type:"keyword"}),W("for (let ${name} of ${collection}) {\n ${}\n}",{label:"for",detail:"of loop",type:"keyword"}),W("do {\n ${}\n} while (${})",{label:"do",detail:"loop",type:"keyword"}),W("while (${}) {\n ${}\n}",{label:"while",detail:"loop",type:"keyword"}),W(`try { \${} } catch (\${error}) { \${} }`,{label:"try",detail:"/ catch block",type:"keyword"}),W("if (${}) {\n ${}\n}",{label:"if",detail:"block",type:"keyword"}),W(`if (\${}) { \${} } else { \${} }`,{label:"if",detail:"/ else block",type:"keyword"}),W(`class \${name} { constructor(\${params}) { \${} } }`,{label:"class",detail:"definition",type:"keyword"}),W('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),W('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],Tx=lp.concat([W("interface ${name} {\n ${}\n}",{label:"interface",detail:"definition",type:"keyword"}),W("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),W("enum ${name} {\n ${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),sp=new Tt,cp=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function kr(O){return(e,t)=>{let i=e.node.getChild("VariableDefinition");return i&&t(i,O),!0}}var bx=["FunctionDeclaration"],yx={FunctionDeclaration:kr("function"),ClassDeclaration:kr("class"),ClassExpression:()=>!0,EnumDeclaration:kr("constant"),TypeAliasDeclaration:kr("type"),NamespaceDeclaration:kr("namespace"),VariableDefinition(O,e){O.matchContext(bx)||e(O,"variable")},TypeDefinition(O,e){e(O,"type")},__proto__:null};function hp(O,e){let t=sp.get(e);if(t)return t;let i=[],r=!0;function n(s,a){let o=O.sliceString(s.from,s.to);i.push({label:o,type:a})}return e.cursor(C.IncludeAnonymous).iterate(s=>{if(r)r=!1;else if(s.name){let a=yx[s.name];if(a&&a(s,n)||cp.has(s.name))return!1}else if(s.to-s.from>8192){for(let a of hp(O,s.node))i.push(a);return!1}}),sp.set(e,i),i}var ap=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,fp=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName","JSXText","JSXAttributeValue","JSXOpenTag","JSXCloseTag","JSXSelfClosingTag",".","?."];function xx(O){let e=U(O.state).resolveInner(O.pos,-1);if(fp.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&ap.test(O.state.sliceDoc(e.from,e.to));if(!t&&!O.explicit)return null;let i=[];for(let r=e;r;r=r.parent)cp.has(r.name)&&(i=i.concat(hp(O.state.doc,r)));return{options:i,from:t?e.from:O.pos,validFor:ap}}var pt=ne.define({name:"javascript",parser:np.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),TryStatement:le({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:sO,SwitchBody:O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t?0:i?1:2)*O.unit},Block:be({closing:"}"}),ArrowFunction:O=>O.baseIndent+O.unit,"TemplateString BlockComment":()=>null,"Statement Property":le({except:/^\s*{/}),JSXElement(O){let e=/^\s*<\//.test(O.textAfter);return O.lineIndent(O.node.from)+(e?0:O.unit)},JSXEscape(O){let e=/\s*\}/.test(O.textAfter);return O.lineIndent(O.node.from)+(e?0:O.unit)},"JSXOpenTag JSXSelfClosingTag"(O){return O.column(O.node.from)+O.unit}}),te.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),dp={test:O=>/^JSX/.test(O.name),facet:or({commentTokens:{block:{open:"{/*",close:"*/}"}}})},hc=pt.configure({dialect:"ts"},"typescript"),fc=pt.configure({dialect:"jsx",props:[Dn.add(O=>O.isTop?[dp]:void 0)]}),dc=pt.configure({dialect:"jsx ts",props:[Dn.add(O=>O.isTop?[dp]:void 0)]},"typescript"),up=O=>({label:O,type:"keyword"}),Qp="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(up),kx=Qp.concat(["declare","implements","private","protected","public"].map(up));function ks(O={}){let e=O.jsx?O.typescript?dc:fc:O.typescript?hc:pt,t=O.typescript?Tx.concat(kx):lp.concat(Qp);return new J(e,[pt.data.of({autocomplete:cO(fp,zt(t))}),pt.data.of({autocomplete:xx}),O.jsx?vx:[]])}function wx(O){for(;;){if(O.name=="JSXOpenTag"||O.name=="JSXSelfClosingTag"||O.name=="JSXFragmentTag")return O;if(O.name=="JSXEscape"||!O.parent)return null;O=O.parent}}function op(O,e,t=O.length){for(let i=e?.firstChild;i;i=i.nextSibling)if(i.name=="JSXIdentifier"||i.name=="JSXBuiltin"||i.name=="JSXNamespacedName"||i.name=="JSXMemberExpression")return O.sliceString(i.from,Math.min(i.to,t));return""}var Zx=typeof navigator=="object"&&/Android\b/.test(navigator.userAgent),vx=T.inputHandler.of((O,e,t,i,r)=>{if((Zx?O.composing:O.compositionStarted)||O.state.readOnly||e!=t||i!=">"&&i!="/"||!pt.isActiveAt(O.state,e,-1))return!1;let n=r(),{state:s}=n,a=s.changeByRange(o=>{var l;let{head:c}=o,h=U(s).resolveInner(c-1,-1),f;if(h.name=="JSXStartTag"&&(h=h.parent),!(s.doc.sliceString(c-1,c)!=i||h.name=="JSXAttributeValue"&&h.to>c)){if(i==">"&&h.name=="JSXFragmentTag")return{range:o,changes:{from:c,insert:""}};if(i=="/"&&h.name=="JSXStartCloseTag"){let u=h.parent,Q=u.parent;if(Q&&u.from==c-2&&((f=op(s.doc,Q.firstChild,c))||((l=Q.firstChild)===null||l===void 0?void 0:l.name)=="JSXFragmentTag")){let $=`${f}>`;return{range:S.cursor(c+$.length,-1),changes:{from:c,insert:$}}}}else if(i==">"){let u=wx(h);if(u&&u.name=="JSXOpenTag"&&!/^\/?>|^<\//.test(s.doc.sliceString(c,c+2))&&(f=op(s.doc,u,c)))return{range:o,changes:{from:c,insert:``}}}}return{range:o}});return a.changes.empty?!1:(O.dispatch([n,s.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)});var wr=["_blank","_self","_top","_parent"],uc=["ascii","utf-8","utf-16","latin1","latin1"],Qc=["get","post","put","delete"],$c=["application/x-www-form-urlencoded","multipart/form-data","text/plain"],Ke=["true","false"],_={},Yx={a:{attrs:{href:null,ping:null,type:null,media:null,target:wr,hreflang:null}},abbr:_,address:_,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:null,hreflang:null,type:null,shape:["default","rect","circle","poly"]}},article:_,aside:_,audio:{attrs:{src:null,mediagroup:null,crossorigin:["anonymous","use-credentials"],preload:["none","metadata","auto"],autoplay:["autoplay"],loop:["loop"],controls:["controls"]}},b:_,base:{attrs:{href:null,target:wr}},bdi:_,bdo:_,blockquote:{attrs:{cite:null}},body:_,br:_,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:["autofocus"],disabled:["autofocus"],formenctype:$c,formmethod:Qc,formnovalidate:["novalidate"],formtarget:wr,type:["submit","reset","button"]}},canvas:{attrs:{width:null,height:null}},caption:_,center:_,cite:_,code:_,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:["command","checkbox","radio"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:["disabled"],checked:["checked"]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:["disabled"],multiple:["multiple"]}},datalist:{attrs:{data:null}},dd:_,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:["open"]}},dfn:_,div:_,dl:_,dt:_,em:_,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:["disabled"],form:null,name:null}},figcaption:_,figure:_,footer:_,form:{attrs:{action:null,name:null,"accept-charset":uc,autocomplete:["on","off"],enctype:$c,method:Qc,novalidate:["novalidate"],target:wr}},h1:_,h2:_,h3:_,h4:_,h5:_,h6:_,head:{children:["title","base","link","style","meta","script","noscript","command"]},header:_,hgroup:_,hr:_,html:{attrs:{manifest:null}},i:_,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:["allow-top-navigation","allow-same-origin","allow-forms","allow-scripts"],seamless:["seamless"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:["anonymous","use-credentials"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:["audio/*","video/*","image/*"],autocomplete:["on","off"],autofocus:["autofocus"],checked:["checked"],disabled:["disabled"],formenctype:$c,formmethod:Qc,formnovalidate:["novalidate"],formtarget:wr,multiple:["multiple"],readonly:["readonly"],required:["required"],type:["hidden","text","search","tel","url","email","password","datetime","date","month","week","time","datetime-local","number","range","color","checkbox","radio","file","submit","image","reset","button"]}},ins:{attrs:{cite:null,datetime:null}},kbd:_,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:["autofocus"],disabled:["disabled"],keytype:["RSA"]}},label:{attrs:{for:null,form:null}},legend:_,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:null,media:null,sizes:["all","16x16","16x16 32x32","16x16 32x32 64x64"]}},map:{attrs:{name:null}},mark:_,menu:{attrs:{label:null,type:["list","context","toolbar"]}},meta:{attrs:{content:null,charset:uc,name:["viewport","application-name","author","description","generator","keywords"],"http-equiv":["content-language","content-type","default-style","refresh"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:_,noscript:_,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:["typemustmatch"]}},ol:{attrs:{reversed:["reversed"],start:null,type:["1","a","A","i","I"]},children:["li","script","template","ul","ol"]},optgroup:{attrs:{disabled:["disabled"],label:null}},option:{attrs:{disabled:["disabled"],label:null,selected:["selected"],value:null}},output:{attrs:{for:null,form:null,name:null}},p:_,param:{attrs:{name:null,value:null}},pre:_,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:_,rt:_,ruby:_,samp:_,script:{attrs:{type:["text/javascript"],src:null,async:["async"],defer:["defer"],charset:uc}},section:_,select:{attrs:{form:null,name:null,size:null,autofocus:["autofocus"],disabled:["disabled"],multiple:["multiple"]}},slot:{attrs:{name:null}},small:_,source:{attrs:{src:null,type:null,media:null}},span:_,strong:_,style:{attrs:{type:["text/css"],media:null,scoped:null}},sub:_,summary:_,sup:_,table:_,tbody:_,td:{attrs:{colspan:null,rowspan:null,headers:null}},template:_,textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:["autofocus"],disabled:["disabled"],readonly:["readonly"],required:["required"],wrap:["soft","hard"]}},tfoot:_,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:["row","col","rowgroup","colgroup"]}},thead:_,time:{attrs:{datetime:null}},title:_,tr:_,track:{attrs:{src:null,label:null,default:null,kind:["subtitles","captions","descriptions","chapters","metadata"],srclang:null}},ul:{children:["li","script","template","ul","ol"]},var:_,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:["anonymous","use-credentials"],preload:["auto","metadata","none"],autoplay:["autoplay"],mediagroup:["movie"],muted:["muted"],controls:["controls"]}},wbr:_},gp={accesskey:null,class:null,contenteditable:Ke,contextmenu:null,dir:["ltr","rtl","auto"],draggable:["true","false","auto"],dropzone:["copy","move","link","string:","file:"],hidden:["hidden"],id:null,inert:["inert"],itemid:null,itemprop:null,itemref:null,itemscope:["itemscope"],itemtype:null,lang:["ar","bn","de","en-GB","en-US","es","fr","hi","id","ja","pa","pt","ru","tr","zh"],spellcheck:Ke,autocorrect:Ke,autocapitalize:Ke,style:null,tabindex:null,title:null,translate:["yes","no"],rel:["stylesheet","alternate","author","bookmark","help","license","next","nofollow","noreferrer","prefetch","prev","search","tag"],role:"alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer".split(" "),"aria-activedescendant":null,"aria-atomic":Ke,"aria-autocomplete":["inline","list","both","none"],"aria-busy":Ke,"aria-checked":["true","false","mixed","undefined"],"aria-controls":null,"aria-describedby":null,"aria-disabled":Ke,"aria-dropeffect":null,"aria-expanded":["true","false","undefined"],"aria-flowto":null,"aria-grabbed":["true","false","undefined"],"aria-haspopup":Ke,"aria-hidden":Ke,"aria-invalid":["true","false","grammar","spelling"],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":["off","polite","assertive"],"aria-multiline":Ke,"aria-multiselectable":Ke,"aria-owns":null,"aria-posinset":null,"aria-pressed":["true","false","mixed","undefined"],"aria-readonly":Ke,"aria-relevant":null,"aria-required":Ke,"aria-selected":["true","false","undefined"],"aria-setsize":null,"aria-sort":["ascending","descending","none","other"],"aria-valuemax":null,"aria-valuemin":null,"aria-valuenow":null,"aria-valuetext":null},Pp="beforeunload copy cut dragstart dragover dragleave dragenter dragend drag paste focus blur change click load mousedown mouseenter mouseleave mouseup keydown keyup resize scroll unload".split(" ").map(O=>"on"+O);for(let O of Pp)gp[O]=null;var qO=class{constructor(e,t){this.tags={...Yx,...e},this.globalAttrs={...gp,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};qO.default=new qO;function Si(O,e,t=O.length){if(!e)return"";let i=e.firstChild,r=i&&i.getChild("TagName");return r?O.sliceString(r.from,Math.min(r.to,t)):""}function Xi(O,e=!1){for(;O;O=O.parent)if(O.name=="Element")if(e)e=!1;else return O;return null}function Sp(O,e,t){let i=t.tags[Si(O,Xi(e))];return i?.children||t.allTags}function pc(O,e){let t=[];for(let i=Xi(e);i&&!i.type.isTop;i=Xi(i.parent)){let r=Si(O,i);if(r&&i.lastChild.name=="CloseTag")break;r&&t.indexOf(r)<0&&(e.name=="EndTag"||e.from>=i.firstChild.to)&&t.push(r)}return t}var Xp=/^[:\-\.\w\u00b7-\uffff]*$/;function $p(O,e,t,i,r){let n=/\s*>/.test(O.sliceDoc(r,r+5))?"":">",s=Xi(t,t.name=="StartTag"||t.name=="TagName");return{from:i,to:r,options:Sp(O.doc,s,e).map(a=>({label:a,type:"type"})).concat(pc(O.doc,t).map((a,o)=>({label:"/"+a,apply:"/"+a+n,type:"type",boost:99-o}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function pp(O,e,t,i){let r=/\s*>/.test(O.sliceDoc(i,i+5))?"":">";return{from:t,to:i,options:pc(O.doc,e).map((n,s)=>({label:n,apply:n+r,type:"type",boost:99-s})),validFor:Xp}}function _x(O,e,t,i){let r=[],n=0;for(let s of Sp(O.doc,t,e))r.push({label:"<"+s,type:"type"});for(let s of pc(O.doc,t))r.push({label:"",type:"type",boost:99-n++});return{from:i,to:i,options:r,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Rx(O,e,t,i,r){let n=Xi(t),s=n?e.tags[Si(O.doc,n)]:null,a=s&&s.attrs?Object.keys(s.attrs):[],o=s&&s.globalAttrs===!1?a:a.length?a.concat(e.globalAttrNames):e.globalAttrNames;return{from:i,to:r,options:o.map(l=>({label:l,type:"property"})),validFor:Xp}}function Vx(O,e,t,i,r){var n;let s=(n=t.parent)===null||n===void 0?void 0:n.getChild("AttributeName"),a=[],o;if(s){let l=O.sliceDoc(s.from,s.to),c=e.globalAttrs[l];if(!c){let h=Xi(t),f=h?e.tags[Si(O.doc,h)]:null;c=f?.attrs&&f.attrs[l]}if(c){let h=O.sliceDoc(i,r).toLowerCase(),f='"',u='"';/^['"]/.test(h)?(o=h[0]=='"'?/^[^"]*$/:/^[^']*$/,f="",u=O.sliceDoc(r,r+1)==h[0]?"":h[0],h=h.slice(1),i++):o=/^[^\s<>='"]*$/;for(let Q of c)a.push({label:Q,apply:f+Q+u,type:"constant"})}}return{from:i,to:r,options:a,validFor:o}}function Tp(O,e){let{state:t,pos:i}=e,r=U(t).resolveInner(i,-1),n=r.resolve(i);for(let s=i,a;n==r&&(a=r.childBefore(s));){let o=a.lastChild;if(!o||!o.type.isError||o.fromTp(i,r)}var zx=pt.parser.configure({top:"SingleExpression"}),yp=[{tag:"script",attrs:O=>O.type=="text/typescript"||O.lang=="ts",parser:hc.parser},{tag:"script",attrs:O=>O.type=="text/babel"||O.type=="text/jsx",parser:fc.parser},{tag:"script",attrs:O=>O.type=="text/typescript-jsx",parser:dc.parser},{tag:"script",attrs(O){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(O.type)},parser:zx},{tag:"script",attrs(O){return!O.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(O.type)},parser:pt.parser},{tag:"style",attrs(O){return(!O.lang||O.lang=="css")&&(!O.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(O.type))},parser:xr.parser}],xp=[{name:"style",parser:xr.parser.configure({top:"Styles"})}].concat(Pp.map(O=>({name:O,parser:pt.parser}))),kp=ne.define({name:"html",parser:tp.configure({props:[se.add({Element(O){let e=/^(\s*)(<\/)?/.exec(O.textAfter);return O.node.to<=O.pos+e[0].length?O.continue():O.lineIndent(O.node.from)+(e[2]?0:O.unit)},"OpenTag CloseTag SelfClosingTag"(O){return O.column(O.node.from)+O.unit},Document(O){if(O.pos+/\s*/.exec(O.textAfter)[0].lengthO.getChild("TagName")})]}),languageData:{commentTokens:{block:{open:""}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:"-_"}}),ws=kp.configure({wrap:ac(yp,xp)});function Ti(O={}){let e="",t;O.matchClosingTags===!1&&(e="noMatch"),O.selfClosingTags===!0&&(e=(e?e+" ":"")+"selfClosing"),(O.nestedLanguages&&O.nestedLanguages.length||O.nestedAttributes&&O.nestedAttributes.length)&&(t=ac((O.nestedLanguages||[]).concat(yp),(O.nestedAttributes||[]).concat(xp)));let i=t?kp.configure({wrap:t,dialect:e}):e?ws.configure({dialect:e}):ws;return new J(i,[ws.data.of({autocomplete:qx(O)}),O.autoCloseTags!==!1?Ux:[],ks().support,ys().support])}var mp=new Set("area base br col command embed frame hr img input keygen link meta param source track wbr menuitem".split(" ")),Ux=T.inputHandler.of((O,e,t,i,r)=>{if(O.composing||O.state.readOnly||e!=t||i!=">"&&i!="/"||!ws.isActiveAt(O.state,e,-1))return!1;let n=r(),{state:s}=n,a=s.changeByRange(o=>{var l,c,h;let f=s.doc.sliceString(o.from-1,o.to)==i,{head:u}=o,Q=U(s).resolveInner(u,-1),$;if(f&&i==">"&&Q.name=="EndTag"){let p=Q.parent;if(((c=(l=p.parent)===null||l===void 0?void 0:l.lastChild)===null||c===void 0?void 0:c.name)!="CloseTag"&&($=Si(s.doc,p.parent,u))&&!mp.has($)){let m=u+(s.doc.sliceString(u,u+1)===">"?1:0),g=``;return{range:o,changes:{from:u,to:m,insert:g}}}}else if(f&&i=="/"&&Q.name=="IncompleteCloseTag"){let p=Q.parent;if(Q.from==u-2&&((h=p.lastChild)===null||h===void 0?void 0:h.name)!="CloseTag"&&($=Si(s.doc,p,u))&&!mp.has($)){let m=u+(s.doc.sliceString(u,u+1)===">"?1:0),g=`${$}>`;return{range:S.cursor(u+g.length,-1),changes:{from:u,to:m,insert:g}}}}return{range:o}});return a.changes.empty?!1:(O.dispatch([n,s.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)});var Wx=F({null:d.null,instanceof:d.operatorKeyword,this:d.self,"new super assert open to with void":d.keyword,"class interface extends implements enum var":d.definitionKeyword,"module package import":d.moduleKeyword,"switch while for if else case default do break continue return try catch finally throw":d.controlKeyword,"requires exports opens uses provides public private protected static transitive abstract final strictfp synchronized native transient volatile throws":d.modifier,IntegerLiteral:d.integer,FloatingPointLiteral:d.float,"StringLiteral TextBlock":d.string,CharacterLiteral:d.character,LineComment:d.lineComment,BlockComment:d.blockComment,BooleanLiteral:d.bool,PrimitiveType:d.standard(d.typeName),TypeName:d.typeName,Identifier:d.variableName,"MethodName/Identifier":d.function(d.variableName),Definition:d.definition(d.variableName),ArithOp:d.arithmeticOperator,LogicOp:d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,AssignOp:d.definitionOperator,UpdateOp:d.updateOperator,Asterisk:d.punctuation,Label:d.labelName,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,".":d.derefOperator,", ;":d.separator}),jx={__proto__:null,true:34,false:34,null:42,void:46,byte:48,short:48,int:48,long:48,char:48,float:48,double:48,boolean:48,extends:62,super:64,class:76,this:78,new:84,public:100,protected:102,private:104,abstract:106,static:108,final:110,strictfp:112,default:114,synchronized:116,native:118,transient:120,volatile:122,throws:150,implements:160,interface:166,enum:176,instanceof:238,open:267,module:269,requires:274,transitive:276,exports:278,to:280,opens:282,uses:284,provides:286,with:288,package:292,import:296,if:308,else:310,while:314,for:318,var:325,assert:332,switch:336,case:342,do:346,break:350,continue:354,return:358,throw:364,try:368,catch:372,finally:380},wp=Oe.deserialize({version:14,states:"##jQ]QPOOQ$wQPOOO(bQQO'#H^O*iQQO'#CbOOQO'#Cb'#CbO*pQPO'#CaO*xOSO'#CpOOQO'#Hc'#HcOOQO'#Cu'#CuO,eQPO'#D_O-OQQO'#HmOOQO'#Hm'#HmO/gQQO'#HhO/nQQO'#HhOOQO'#Hh'#HhOOQO'#Hg'#HgO1rQPO'#DUO2PQPO'#GnO4wQPO'#D_O5OQPO'#DzO*pQPO'#E[O5qQPO'#E[OOQO'#DV'#DVO7SQQO'#HaO9^QQO'#EeO9eQPO'#EdO9jQPO'#EfOOQO'#Hb'#HbO7jQQO'#HbO:pQQO'#FhO:wQPO'#ExO:|QPO'#E}O:|QPO'#FPOOQO'#Ha'#HaOOQO'#HY'#HYOOQO'#Gh'#GhOOQO'#HX'#HXO<^QPO'#FiOOQO'#HW'#HWOOQO'#Gg'#GgQ]QPOOOOQO'#Hs'#HsOQQPO'#GSO>]QPO'#GUO=kQPO'#GWO:|QPO'#GXO>dQPO'#GZO?QQQO'#HiO?mQQO'#CuO?tQPO'#HxO@SQPO'#D_O@rQPO'#DpO?wQPO'#DqO@|QPO'#HxOA_QPO'#DpOAgQPO'#IROAlQPO'#E`OOQO'#Hr'#HrOOQO'#Gm'#GmQ$wQPOOOAtQPO'#HsOOQO'#H^'#H^OCsQQO,58{OOQO'#H['#H[OOOO'#Gi'#GiOEfOSO,59[OOQO,59[,59[OOQO'#Hi'#HiOFVQPO,59eOGXQPO,59yOOQO-E:f-E:fO*pQPO,58zOG{QPO,58zO*pQPO,5;}OHQQPO'#DQOHVQPO'#DQOOQO'#Gk'#GkOIVQQO,59jOOQO'#Dm'#DmOJqQPO'#HuOJ{QPO'#DlOKZQPO'#HtOKcQPO,5<_OKhQPO,59^OLRQPO'#CxOOQO,59c,59cOLYQPO,59bOLeQQO'#H^ONgQQO'#CbO!!iQPO'#D_O!#nQQO'#HmO!$OQQO,59pO!$VQPO'#DvO!$eQPO'#H|O!$mQPO,5:`O!$rQPO,5:`O!%YQPO,5;nO!%eQPO'#ITO!%pQPO,5;eO!%uQPO,5=YOOQO-E:l-E:lOOQO,5:f,5:fO!']QPO,5:fO!'dQPO,5:vO?tQPO,5<_O*pQPO,5:vO_,5>_O!*sQPO,5:gO!+RQPO,5:qO!+ZQPO,5:lO!+fQPO,5>[O!$VQPO,5>[O!'iQPO,59UO!+qQQO,58zO!+yQQO,5;}O!,RQQO,5gQPO,5gQPO,5<}O!2mQPO,59jO!2zQPO'#HuO!3RQPO,59xO!3WQPO,5>dO?tQPO,59xO!3cQPO,5:[OAlQPO,5:zO!3kQPO'#DrO?wQPO'#DrO!3vQPO'#HyO!4OQPO,5:]O?tQPO,5>dO!(hQPO,5>dOAgQPO,5>mOOQO,5:[,5:[O!$rQPO'#DtOOQO,5>m,5>mO!4TQPO'#EaOOQO,5:z,5:zO!7UQPO,5:zO!(hQPO'#DxOOQO-E:k-E:kOOQO,5:y,5:yO*pQPO,58}O!7ZQPO'#ChOOQO1G.k1G.kOOOO-E:g-E:gOOQO1G.v1G.vO!+qQQO1G.fO*pQPO1G.fO!7eQQO1G1iOOQO,59l,59lO!7mQPO,59lOOQO-E:i-E:iO!7rQPO,5>aO!8ZQPO,5:WO`OOQO1G1y1G1yOOQO1G.x1G.xO!8{QPO'#CyO!9kQPO'#HmO!9uQPO'#CzO!:TQPO'#HlO!:]QPO,59dOOQO1G.|1G.|OLYQPO1G.|O!:sQPO,59eO!;QQQO'#H^O!;cQQO'#CbOOQO,5:b,5:bOhOOQO1G/z1G/zO!oOOQO1G1P1G1POOQO1G0Q1G0QO!=oQPO'#E]OOQO1G0b1G0bO!>`QPO1G1yO!'dQPO1G0bO!*sQPO1G0RO!+RQPO1G0]O!+ZQPO1G0WOOQO1G/]1G/]O!>eQQO1G.pO9eQPO1G0jO*pQPO1G0jOgQPO'#GaOOQO1G2a1G2aO#2zQPO1G2iO#6xQPO,5>gOOQO1G/d1G/dOOQO1G4O1G4OO#7ZQPO1G/dOOQO1G/v1G/vOOQO1G0f1G0fO!7UQPO1G0fOOQO,5:^,5:^O!(hQPO'#DsO#7`QPO,5:^O?wQPO'#GrO#7kQPO,5>eOOQO1G/w1G/wOAgQPO'#H{O#7sQPO1G4OO?tQPO1G4OOOQO1G4X1G4XO!#YQPO'#DvO!!iQPO'#D_OOQO,5:{,5:{O#8OQPO,5:{O#8OQPO,5:{O#8VQQO'#HaO#9hQQO'#HbO#9rQQO'#EbO#9}QPO'#EbO#:VQPO'#IOOOQO,5:d,5:dOOQO1G.i1G.iO#:bQQO'#EeO#:rQQO'#H`O#;SQPO'#FTOOQO'#H`'#H`O#;^QPO'#H`O#;{QPO'#IWO#WOOQO1G/O1G/OOOQO7+$h7+$hOOQO1G/{1G/{O#=cQQO1G/{OOQO1G/}1G/}O#=hQPO1G/{OOQO1G/|1G/|OdQPO,5:wOOQO,5:w,5:wOOQO7+'e7+'eOOQO7+%|7+%|OOQO7+%m7+%mO!KqQPO7+%mO!KvQPO7+%mO!LOQPO7+%mOOQO7+%w7+%wO!LnQPO7+%wOOQO7+%r7+%rO!MmQPO7+%rO!MrQPO7+%rOOQO7+&U7+&UOOQO'#Ee'#EeO9eQPO7+&UO9eQPO,5>[O#?TQPO7+$[OOQO7+&T7+&TOOQO7+&W7+&WO:|QPO'#GlO#?cQPO,5>]OOQO1G/_1G/_O:|QPO7+&lO#?nQQO,59eO#@tQPO,59vOOQO,59v,59vOOQO,5:h,5:hOOQO'#EP'#EPOOQO,5:i,5:iO#@{QPO'#EYOgQPO,5jO#M{QPO,59TO#NSQPO'#IVO#N[QPO,5;oO*pQPO'#G{O#NaQPO,5>rOOQO1G.n1G.nOOQO<Z,5>ZOOQO,5=U,5=UOOQO-E:h-E:hO#NvQPO7+%gOOQO7+%g7+%gOOQO7+%i7+%iOOQO<kO$%tQPO'#EZOOQO1G0_1G0_O$%{QPO1G0_O?tQPO,5:pOOQO-E:s-E:sOOQO1G0Z1G0ZOOQO1G0n1G0nO$&QQQO1G0nOOQO<qOOQO1G1Z1G1ZO$+dQPO'#FUOOQO,5=g,5=gOOQO-E:y-E:yO$+iQPO'#GoO$+vQPO,5>cOOQO1G/u1G/uOOQO<sAN>sO!KqQPOAN>sOOQOAN>xAN>xOOQOAN?[AN?[O9eQPOAN?[OOQO1G0`1G0`O$,_QPO1G0`OOQO,5=b,5=bOOQO-E:t-E:tO$,mQPO,5:uOOQO7+%y7+%yOOQO7+&Y7+&YOOQO1G1`1G1`O$,tQQO1G1`OOQO-E:{-E:{O$,|QQO'#IYO$,wQPO1G1`O$&gQPO1G1`O*pQPO1G1`OOQOAN@]AN@]O$-XQQO<tO$.qQPO7+&zO$.vQQO'#IZOOQOAN@nAN@nO$/RQQOAN@nOOQOAN@jAN@jO$/YQPOAN@jO$/_QQO<uOOQOG26YG26YOOQOG26UG26UOOQO<lOWiXuiX%}iX&PiX&RiX&_iX~OZ!aX~P?XOu#OO%}TO&P#SO&R#SO~O%}TO~P3gOg^Oh^Ov#pO!u#rO!z#qO&_!hO&t#oO~O&P!cO&R!dO~P@ZOg^Oh^O%}TO&P!cO&R!dO~O}cO!P%aO~OZ%bO~O}%dO!m%gO~O}cOg&gXh&gXv&gX!S&gX!T&gX!U&gX!V&gX!W&gX!X&gX!Y&gX!Z&gX!]&gX!^&gX!_&gX!u&gX!z&gX%}&gX&P&gX&R&gX&_&gX&t&gX~OW%jOZ%kOgTahTa%}Ta&PTa&RTa~OvTa!STa!TTa!UTa!VTa!WTa!XTa!YTa!ZTa!]Ta!^Ta!_Ta!uTa!zTa#yTa#zTa$WTa$hTa&tTa&_TauTaYTaqTa|Ta!PTa~PC[O&W%nO&Y!tO~Ou#OO%}TOqma&^maYma&nma!Pma~O&vma}ma!rma~PEnO!SyO!TyO!UyO!VyO!WyO!XyO!YyO!ZzO!]yO!^yO!_yO~Og!Rah!Rav!Ra!u!Ra!z!Ra$h!Ra&P!Ra&R!Ra&t!Ra&_!Ra~PFdO#z%pO~Os%rO~Ou%sO%}TO~Ou#OO%}ra&Pra&Rra&vraYrawra&nra&qra!Pra&^raqra~OWra#_ra#ara#bra#dra#era#fra#gra#hra#ira#kra#ora#rra&_ra#prasra|ra~PH_Ou#OO%}TOq&iX!P&iX!b&iX~OY&iX#p&iX~PJ`O!b%vOq!`X!P!`XY!`X~Oq%wO!P&hX~O!P%yO~Ov%zO~Og^Oh^O%}0oO&P!wO&RWO&b%}O~O&^&`P~PKmO%}TO&P!wO&RWO~OW&QXYiXY!aXY&QXZ&QXq!aXu&QXwiX!b&QX#]&QX#_&QX#a&QX#b&QX#d&QX#e&QX#f&QX#g&QX#h&QX#i&QX#k&QX#o&QX#r&QX&^&QX&_&QX&niX&n&QX&qiX&viX&v&QX&x!aX~P?XOWUXYUXY!aXY&]XZUXq!aXuUXw&]X!bUX#]UX#_UX#aUX#bUX#dUX#eUX#fUX#gUX#hUX#iUX#kUX#oUX#rUX&^UX&_UX&nUX&n&]X&q&]X&vUX&v&]X&x!aX~P>lOg^Oh^O%}TO&P!wO&RWOg!RXh!RX&P!RX&R!RX~PFdOu#OOw&XO%}TO&P&UO&R&TO&q&WO~OW#XOY&aX&n&aX&v&aX~P!#YOY&ZO~P9oOg^Oh^O&P!wO&RWO~Oq&]OY&pX~OY&_O~Og^Oh^O%}TO&P!wO&RWOY&pP~PFdOY&dO&n&bO&v#vO~Oq&eO&x$ZOY&wX~OY&gO~O%}TOg%bah%bav%ba!S%ba!T%ba!U%ba!V%ba!W%ba!X%ba!Y%ba!Z%ba!]%ba!^%ba!_%ba!u%ba!z%ba$h%ba&P%ba&R%ba&t%ba&_%ba~O|&hO~P]O}&iO~Op&uOw&vO&PSO&R!qO&_#YO~Oz&tO~P!'iOz&xO&PSO&R!qO&_#YO~OY&eP~P:|Og^Oh^O%}TO&P!wO&RWO~O}cO~P:|OW#XOu#OO%}TO&v&aX~O#r$WO!P#sa#_#sa#a#sa#b#sa#d#sa#e#sa#f#sa#g#sa#h#sa#i#sa#k#sa#o#sa&^#sa&_#sa&n#saY#sa#p#sas#saq#sa|#sa~Oo'_O}'^O!r'`O&_!hO~O}'eO!r'`O~Oo'iO}'hO&_!hO~OZ#xOu'mO%}TO~OW%jO}'sO~OW%jO!P'uO~OW'vO!P'wO~O$h!WO&P0qO&R0pO!P&eP~P/uO!P(SO#p(TO~P9oO}(UO~O$c(WO~O!P(XO~O!P(YO~O!P(ZO~P9oO!P(]O~P9oOZ$lO_VO`VOaVObVOcVOeVOg^Oh^Op!POwkOz!OO%}TO&P(_O&R(^O&XUO~PFdO%Q(hO%U(iOZ$}a_$}a`$}aa$}ab$}ac$}ae$}ag$}ah$}ap$}av$}aw$}az$}a}$}a!P$}a!S$}a!T$}a!U$}a!V$}a!W$}a!X$}a!Y$}a!Z$}a![$}a!]$}a!^$}a!_$}a!u$}a!z$}a#f$}a#r$}a#t$}a#u$}a#y$}a#z$}a$W$}a$Y$}a$`$}a$c$}a$e$}a$h$}a$l$}a$n$}a$s$}a$u$}a$w$}a$y$}a$|$}a%O$}a%w$}a%}$}a&P$}a&R$}a&X$}a&t$}a|$}a$a$}a$q$}a~O}ra!rra'Ora~PH_OZ%bO~PJ`O!P(mO~O!m%gO}&la!P&la~O}cO!P(pO~Oo(tOq!fX&^!fX~Oq(vO&^&mX~O&^(xO~OZ`O_VO`VOaVObVOcVOeVOg^Oh^Op)UOv{Ow)TOz!OO|)PO}cO!PvO![!`O!u}O!z|O#fpO#roO#tpO#upO#y!RO#z!QO$W!SO$Y!TO$`!UO$c!VO$e!XO$h!WO$l!YO$n!ZO$s![O$u!]O$w!^O$y!_O$|!aO%O!bO%}TO&PRO&RQO&XUO&_#YO&tdO~PFdO}%dO~O})]OY&zP~P:|OW%jO!P)dO~Os)eO~Ou#OO%}TOq&ia!P&ia!b&iaY&ia#p&ia~O})fO~P:|Oq%wO!P&ha~Og^Oh^O%}0oO&P!wO&RWO~O&b)mO~P!8jOu#OO%}TOq&aX&^&aXY&aX&n&aX!P&aX~O}&aX!r&aX~P!9SOo)oOp)oOqnX&^nX~Oq)pO&^&`X~O&^)rO~Ou#OOw)tO%}TO&PSO&R!qO~OYma&nma&vma~P!:bOW&QXY!aXq!aXu!aX%}!aX~OWUXY!aXq!aXu!aX%}!aX~OW)wO~Ou#OO%}TO&P#SO&R#SO&q)yO~Og^Oh^O%}TO&P!wO&RWO~PFdOq&]OY&pa~Ou#OO%}TO&P#SO&R#SO&q&WO~OY)|O~OY*PO&n&bO~Oq&eOY&wa~Og^Oh^Ov{O|*XO!u}O%}TO&P!wO&RWO&tdO~PFdO!P*YO~OW^iZ#XXu^i!P^i!b^i#]^i#_^i#a^i#b^i#d^i#e^i#f^i#g^i#h^i#i^i#k^i#o^i#r^i&^^i&_^i&n^i&v^iY^i#p^is^iq^i|^i~OW*iO~Os*jO~P9oOz*kO&PSO&R!qO~O!P]iY]i#p]is]iq]i|]i~P9oOq*lOY&eX!P&eX~P9oOY*nO~O#f$SO#g$TO#k$YO#r$WO!P#^i#_#^i#a#^i#b#^i#d#^i#e#^i#o#^i&^#^i&_#^i&n#^iY#^i#p#^is#^iq#^i|#^i~O#h$UO#i$UO~P!AmO#_#|O#d$QO#e$RO#f$SO#g$TO#h$UO#i$UO#k$YO#r$WO&^#zO&_#zO&n#{O!P#^i#b#^i#o#^iY#^i#p#^is#^iq#^i|#^i~O#a#^i~P!CUO#a#}O~P!CUO#_#|O#f$SO#g$TO#h$UO#i$UO#k$YO#r$WO&^#zO&_#zO!P#^i#a#^i#b#^i#d#^i#e#^i#o#^iY#^i#p#^is#^iq#^i|#^i~O&n#^i~P!DtO&n#{O~P!DtO#f$SO#g$TO#k$YO#r$WO!P#^i#a#^i#b#^i#e#^i#o#^iY#^i#p#^is#^iq#^i|#^i~O#_#|O#d$QO#h$UO#i$UO&^#zO&_#zO&n#{O~P!FdO#k$YO#r$WO!P#^i#_#^i#a#^i#b#^i#d#^i#e#^i#f#^i#h#^i#i#^i#o#^i&^#^i&_#^i&n#^iY#^i#p#^is#^iq#^i|#^i~O#g$TO~P!G{O#g#^i~P!G{O#h#^i#i#^i~P!AmO#p*oO~P9oO#_&aX#a&aX#b&aX#d&aX#e&aX#f&aX#g&aX#h&aX#i&aX#k&aX#o&aX#r&aX&_&aX#p&aXs&aX|&aX~P!9SO!P#liY#li#p#lis#liq#li|#li~P9oO|*rO~P$wO}'^O~O}'^O!r'`O~Oo'_O}'^O!r'`O~O%}TO&P#SO&R#SO|&sP!P&sP~PFdO}'eO~Og^Oh^Ov{O|+PO!P*}O!u}O!z|O%}TO&P!wO&RWO&_!hO&tdO~PFdO}'hO~Oo'iO}'hO~Os+RO~P:|Ou+TO%}TO~Ou'mO})fO%}TOW#Zi!P#Zi#_#Zi#a#Zi#b#Zi#d#Zi#e#Zi#f#Zi#g#Zi#h#Zi#i#Zi#k#Zi#o#Zi#r#Zi&^#Zi&_#Zi&n#Zi&v#ZiY#Zi#p#Zis#Ziq#Zi|#Zi~O}'^OW&diu&di!P&di#_&di#a&di#b&di#d&di#e&di#f&di#g&di#h&di#i&di#k&di#o&di#r&di&^&di&_&di&n&di&v&diY&di#p&dis&diq&di|&di~O#}+]O$P+^O$R+^O$S+_O$T+`O~O|+[O~P##nO$Z+aO&PSO&R!qO~OW+bO!P+cO~O$a+dOZ$_i_$_i`$_ia$_ib$_ic$_ie$_ig$_ih$_ip$_iv$_iw$_iz$_i}$_i!P$_i!S$_i!T$_i!U$_i!V$_i!W$_i!X$_i!Y$_i!Z$_i![$_i!]$_i!^$_i!_$_i!u$_i!z$_i#f$_i#r$_i#t$_i#u$_i#y$_i#z$_i$W$_i$Y$_i$`$_i$c$_i$e$_i$h$_i$l$_i$n$_i$s$_i$u$_i$w$_i$y$_i$|$_i%O$_i%w$_i%}$_i&P$_i&R$_i&X$_i&t$_i|$_i$q$_i~Og^Oh^O$h#sO&P!wO&RWO~O!P+hO~P:|O!P+iO~OZ`O_VO`VOaVObVOcVOeVOg^Oh^Op!POv{OwkOz!OO}cO!PvO!SyO!TyO!UyO!VyO!WyO!XyO!YyO!Z+nO![!`O!]yO!^yO!_yO!u}O!z|O#fpO#roO#tpO#upO#y!RO#z!QO$W!SO$Y!TO$`!UO$c!VO$e!XO$h!WO$l!YO$n!ZO$q+oO$s![O$u!]O$w!^O$y!_O$|!aO%O!bO%}TO&PRO&RQO&XUO&tdO~O|+mO~P#)QOW&QXY&QXZ&QXu&QX!P&QX&viX&v&QX~P?XOWUXYUXZUXuUX!PUX&vUX&v&]X~P>lOW#tOu#uO&v#vO~OW&UXY%XXu&UX!P%XX&v&UX~OZ#XX~P#.VOY+uO!P+sO~O%Q(hO%U(iOZ$}i_$}i`$}ia$}ib$}ic$}ie$}ig$}ih$}ip$}iv$}iw$}iz$}i}$}i!P$}i!S$}i!T$}i!U$}i!V$}i!W$}i!X$}i!Y$}i!Z$}i![$}i!]$}i!^$}i!_$}i!u$}i!z$}i#f$}i#r$}i#t$}i#u$}i#y$}i#z$}i$W$}i$Y$}i$`$}i$c$}i$e$}i$h$}i$l$}i$n$}i$s$}i$u$}i$w$}i$y$}i$|$}i%O$}i%w$}i%}$}i&P$}i&R$}i&X$}i&t$}i|$}i$a$}i$q$}i~OZ+xO~O%Q(hO%U(iOZ%Vi_%Vi`%Via%Vib%Vic%Vie%Vig%Vih%Vip%Viv%Viw%Viz%Vi}%Vi!P%Vi!S%Vi!T%Vi!U%Vi!V%Vi!W%Vi!X%Vi!Y%Vi!Z%Vi![%Vi!]%Vi!^%Vi!_%Vi!u%Vi!z%Vi#f%Vi#r%Vi#t%Vi#u%Vi#y%Vi#z%Vi$W%Vi$Y%Vi$`%Vi$c%Vi$e%Vi$h%Vi$l%Vi$n%Vi$s%Vi$u%Vi$w%Vi$y%Vi$|%Vi%O%Vi%w%Vi%}%Vi&P%Vi&R%Vi&X%Vi&t%Vi|%Vi$a%Vi$q%Vi~Ou#OO%}TO}&oa!P&oa!m&oa~O!P,OO~Oo(tOq!fa&^!fa~Oq(vO&^&ma~O!m%gO}&li!P&li~O|,XO~P]OW,ZO~P5xOW&UXu&UX#_&UX#a&UX#b&UX#d&UX#e&UX#f&UX#g&UX#h&UX#i&UX#k&UX#o&UX#r&UX&^&UX&_&UX&n&UX&v&UX~OZ#xO!P&UX~P#8^OW$gOZ#xO&v#vO~Op,]Ow,]O~Oq,^O}&rX!P&rX~O!b,`O#]#wOY&UXZ#XX~P#8^OY&SXq&SX|&SX!P&SX~P9oO})]O|&yP~P:|OY&SXg%[Xh%[X%}%[X&P%[X&R%[Xq&SX|&SX!P&SX~Oq,cOY&zX~OY,eO~O})fO|&kP~P:|Oq&jX!P&jX|&jXY&jX~P9oO&bTa~PC[Oo)oOp)oOqna&^na~Oq)pO&^&`a~OW,mO~Ow,nO~Ou#OO%}TO&P,rO&R,qO~Og^Oh^Ov#pO!u#rO&P!wO&RWO&t#oO~Og^Oh^Ov{O|,wO!u}O%}TO&P!wO&RWO&tdO~PFdOw-SO&PSO&R!qO&_#YO~Oq*lOY&ea!P&ea~O#_ma#ama#bma#dma#ema#fma#gma#hma#ima#kma#oma#rma&_ma#pmasma|ma~PEnO|-WO~P$wOZ#xO}'^Oq!|X|!|X!P!|X~Oq-[O|&sX!P&sX~O|-_O!P-^O~O&_!hO~P5VOg^Oh^Ov{O|-cO!P*}O!u}O!z|O%}TO&P!wO&RWO&_!hO&tdO~PFdOs-dO~P9oOs-dO~P:|O}'^OW&dqu&dq!P&dq#_&dq#a&dq#b&dq#d&dq#e&dq#f&dq#g&dq#h&dq#i&dq#k&dq#o&dq#r&dq&^&dq&_&dq&n&dq&v&dqY&dq#p&dqs&dqq&dq|&dq~O|-hO~P##nO!W-lO$O-lO&PSO&R!qO~O!P-oO~O$Z-pO&PSO&R!qO~O!b%vO#p-rOq!`X!P!`X~O!P-tO~P9oO!P-tO~P:|O!P-wO~P9oO|-yO~P#)QO![$aO#p-zO~O!P-|O~O!b-}O~OY.QOZ$lO_VO`VOaVObVOcVOeVOg^Oh^Op!POwkOz!OO%}TO&P(_O&R(^O&XUO~PFdOY.QO!P.RO~O%Q(hO%U(iOZ%Vq_%Vq`%Vqa%Vqb%Vqc%Vqe%Vqg%Vqh%Vqp%Vqv%Vqw%Vqz%Vq}%Vq!P%Vq!S%Vq!T%Vq!U%Vq!V%Vq!W%Vq!X%Vq!Y%Vq!Z%Vq![%Vq!]%Vq!^%Vq!_%Vq!u%Vq!z%Vq#f%Vq#r%Vq#t%Vq#u%Vq#y%Vq#z%Vq$W%Vq$Y%Vq$`%Vq$c%Vq$e%Vq$h%Vq$l%Vq$n%Vq$s%Vq$u%Vq$w%Vq$y%Vq$|%Vq%O%Vq%w%Vq%}%Vq&P%Vq&R%Vq&X%Vq&t%Vq|%Vq$a%Vq$q%Vq~Ou#OO%}TO}&oi!P&oi!m&oi~O&n&bOq!ga&^!ga~O!m%gO}&lq!P&lq~O|.^O~P]Op.`Ow&vOz&tO&PSO&R!qO&_#YO~O!P.aO~Oq,^O}&ra!P&ra~O})]O~P:|Oq.gO|&yX~O|.iO~Oq,cOY&za~Oq.mO|&kX~O|.oO~Ow.pO~Oq!aXu!aX!P!aX!b!aX%}!aX~OZ&QX~P#N{OZUX~P#N{O!P.qO~OZ.rO~OW^yZ#XXu^y!P^y!b^y#]^y#_^y#a^y#b^y#d^y#e^y#f^y#g^y#h^y#i^y#k^y#o^y#r^y&^^y&_^y&n^y&v^yY^y#p^ys^yq^y|^y~OY%`aq%`a!P%`a~P9oO!P#nyY#ny#p#nys#nyq#ny|#ny~P9oO}'^Oq!|a|!|a!P!|a~OZ#xO}'^Oq!|a|!|a!P!|a~O%}TO&P#SO&R#SOq%jX|%jX!P%jX~PFdOq-[O|&sa!P&sa~O|!}X~P$wO|/PO~Os/QO~P9oOW%jO!P/RO~OW%jO$Q/WO&PSO&R!qO!P&|P~OW%jO$U/XO~O!P/YO~O!b%vO#p/[Oq!`X!P!`X~OY/^O~O!P/_O~P9oO#p/`O~P9oO!b/bO~OY/cOZ$lO_VO`VOaVObVOcVOeVOg^Oh^Op!POwkOz!OO%}TO&P(_O&R(^O&XUO~PFdOW#[Ou&[X%}&[X&P&[X&R&[X'O&[X~O&_#YO~P$)QOu#OO%}TO'O/eO&P%SX&R%SX~O&n&bOq!gi&^!gi~Op/iO&PSO&R!qO~OW*iOZ#xO~O!P/kO~OY&SXq&SX~P9oO})]Oq%nX|%nX~P:|Oq.gO|&ya~O!b/nO~O})fOq%cX|%cX~P:|Oq.mO|&ka~OY/qO~O!P/rO~OZ/sO~O}'^Oq!|i|!|i!P!|i~O|!}a~P$wOW%jO!P/wO~OW%jOq/xO!P&|X~OY/|O~P9oOY0OO~OY%Xq!P%Xq~P9oO'O/eO&P%Sa&R%Sa~OY0TO~O!P0WO~Ou#OO!P0YO!Z0ZO%}TO~OY0[O~Oq/xO!P&|a~O!P0_O~OW%jOq/xO!P&}X~OY0aO~P9oOY0bO~OY%Xy!P%Xy~P9oOu#OO%}TO&P%ua&R%ua'O%ua~OY0cO~O!P0dO~Ou#OO!P0eO!Z0fO%}TO~OW%jOq%ra!P%ra~Oq/xO!P&}a~O!P0jO~Ou#OO!P0jO!Z0kO%}TO~O!P0lO~O!P0nO~O#p&QXY&QXs&QXq&QX|&QX~P&bO#pUXYUXsUXqUX|UX~P(iO`Q_P#g%y&P&Xc&X~",goto:"#+S'OPPPP'P'd*x.OP'dPP.d.h0PPPPPP1nP3ZPP4v7l:[WP!?[P!Ap!BW!E]3ZPPP!F|!Jm!MaPP#!P#!SP#$`#$f#&V#&f#&n#'p#(Y#)T#)^#)a#)oP#)r#*OP#*V#*^P#*aP#*lP#*o#*r#*u#*y#+PstOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y'urOPXY`acopx!Y![!_!a!e!f!h!i!o!x#P#T#Y#[#_#`#e#i#l#n#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$]$_$e$l$m$n$o$p$q%O%S%V%Z%^%_%b%d%g%k%u%v%{%|&R&S&[&]&`&b&d&i'X'^'_'`'e'h'i'm'n'p'{'|(O(T(U(`(l(t(v({(})O)Q)R)])f)o)p*P*T*W*l*o*p*q*z*{+O+T+d+f+h+i+l+o+r+s+x+},W,Y,^,`,u-[-^-a-r-t-}.R.V.g.m/O/[/_/b/d/n/q0R0X0Z0[0f0h0k0r#xhO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kt!sT!Q!S!T!{!}$k%p+]+^+_+`-k-m/W/X/x0oQ#mdS&Y#`(}Q&l#oU&q#t$g,ZQ&x#vW(b%O+s.R/dU)Y%j'v+bQ)Z%kS)u&S,WU*f&s-R._Q*k&yQ,t*TQ-P*iQ.j,cR.t,uu!sT!Q!S!T!{!}$k%p+]+^+_+`-k-m/W/X/x0oT%l!r)l#{qO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0k#zlO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kX(c%O+s.R/d$TVO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0k$TkO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0k&O[OPX`ceopx!O!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s,Y,^,`-^-r-t-}.R.g.m/O/[/_/b/d/n0Z0f0k0rQ&Q#[Q)s&RV.T+x.X/e&O[OPX`ceopx!O!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s,Y,^,`-^-r-t-}.R.g.m/O/[/_/b/d/n0Z0f0k0rV.T+x.X/e&O]OPX`ceopx!O!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s,Y,^,`-^-r-t-}.R.g.m/O/[/_/b/d/n0Z0f0k0rV.U+x.X/eS#Z[.TS$f!O&tS&s#t$gQ&y#vQ)V%dQ-R*iR._,Z$kZO`copx!Y![!_!a#Y#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$_$l$m$n$o$p$q%O%d%g%k%v&b&d'_'`'i'm(O(T(U(t)Q)R)])f)o)p*P*l*o+T+d+h+i+l+o+s,Y,^,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kQ&O#YR,k)p&P_OPX`ceopx!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s+x,Y,^,`-^-r-t-}.R.X.g.m/O/[/_/b/d/e/n0Z0f0k0r!o#QY!e!x#R#T#`#n$]%R%S%V%^%u%|&S&[&`'X'|(`(l({(}*T*p*z+f+r+},W,u-a.V/q0R0X0[0h$SkO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kQ$m!UQ$n!VQ$s!ZQ$|!`R+p(WQ#yiS'q$e*hQ*e&rQ+X'rS,[)T)UQ-O*gQ-Y*vQ.b,]Q.x-QQ.{-ZQ/j.`Q/u.yR0V/iQ'a$bW*[&m'b'c'dQ+W'qU,x*]*^*_Q-X*vQ-f+XS.u,y,zS.z-Y-ZQ/t.vR/v.{]!mP!o'^*q-^/OreOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!gP!o'^*q-^/OW#b`#e%b&]Q'}$oW(d%O+s.R/dS*U&i*WS*w'e-[S*|'h+OR.X+xh#VY!W!e#n#s%V'|*T*z+f,u-aQ)j%wQ)v&WR,o)y#xnOcopx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0k^!kP!g!o'^*q-^/Ov#TY!W#`#n#s%w&W&[&`'|(`(})y*T+f+r,u.W/hQ#g`Q$b{Q$c|Q$d}W%S!e%V*z-aS%Y!h(vQ%`!iQ&m#pQ&n#qQ&o#rQ(u%ZS(y%^({Q*R&eS*v'e-[R-Z*wU)h%v)f.mR+V'p[!mP!o'^*q-^/OT*}'h+O^!iP!g!o'^*q-^/OQ'd$bQ'l$dQ*_&mQ*d&oV*{'h*|+OQ%[!hR,S(vQ(s%YR,R(u#znO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kQ%c!kS(l%S(yR(|%`T#e`%bU#c`#e%bR)z&]Q%f!lQ(n%UQ(r%XQ,U(zR.],VrvOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!mP!o'^*q-^/OQ%P!bQ%a!jQ%i!pQ'[$ZQ([$|Q(k%QQ(p%WQ+z(iR.Y+yrtOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!mP!o'^*q-^/OS*V&i*WT*}'h+OQ'c$bS*^&m'dR,z*_Q'b$bQ'g$cU*]&m'c'dQ*a&nS,y*^*_R.v,zQ*u'`R+Q'iQ'k$dS*c&o'lR,}*dQ'j$dU*b&o'k'lS,|*c*dR.w,}rtOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!mP!o'^*q-^/OT*}'h+OQ'f$cS*`&n'gR,{*aQ*x'eR.|-[R-`*yQ&j#mR*Z&lT*V&i*WQ%e!lS(q%X%fR,P(rR)R%dWk%O+s.R/d#{lO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0k$SiO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kU&r#t$g,ZS*g&s._Q-Q*iR.y-RT'o$e'p!_#|m#a$r$z$}&w&z&{'O'P'Q'R'S'W'Z)[)g+S+g+j-T-V-e-v-{.e/Z/a/}0Q!]$Pm#a$r$z$}&w&z&{'O'P'R'S'W'Z)[)g+S+g+j-T-V-e-v-{.e/Z/a/}0Q#{nO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0ka)^%k)],`.g/n0Z0f0kQ)`%kR.k,cQ't$hQ)b%oR,f)cT+Y's+ZsvOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YruOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YQ$w!]R$y!^R$p!XrvOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YR(O$oR$q!XR(V$sT+k(U+lX(f%P(g(k+{R+y(hQ.W+xR/h.XQ(j%PQ+w(gQ+|(kR.Z+{R%Q!bQ(e%OV.P+s.R/dQxOQ#lcW$`x#l)Q,YQ)Q%dR,Y)RrXOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Yn!fP!o#e&]&i'^'e'h*W*q+O+x-[-^/Ol!zX!f#P#_#i$[%Z%_%{&R'n'{)O0r!j#PY!e!x#T#`#n$]%S%V%^%u%|&S&[&`'X'|(`(l({(}*T*p*z+f+r+},W,u-a.V/q0R0X0[0hQ#_`Q#ia#d$[op!Y!_!a#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$l%g%k%v&b&d'_'`'i'm(O(T(t)])f)o*P*l*o+T+h+i+o,^,`-r-t-}.g.m/[/_/b/n0Z0f0kS%Z!h(vS%_!i*{S%{#Y)pQ&R#[S'n$e'pY'{$o%O+s.R/dQ)O%bR0r$YQ!uUR%m!uQ)q&OR,l)q^#RY#`$]'X'|(`*px%R!e!x#n%V%^%|&S&[&`({(}*T*z+f+r,W,u-a.V0R[%t#R%R%u+}0X0hS%u#T%SQ+}(lQ0X/qR0h0[Q*m&{R-U*mQ!oPU%h!o*q/OQ*q'^R/O-^!pbOP`cx![!o#e#l$_$m$n$o$p$q%O%b%d&]&i'^'e'h(U)Q)R*W*q+O+d+l+s+x,Y-[-^.R/O/dY!yX!f#_'{)OT#jb!yQ.n,gR/p.nQ%x#VR)k%xQ&c#fS*O&c.[R.[,QQ(w%[R,T(wQ&^#cR){&^Q,_)WR.d,_Q+O'hR-b+OQ-]*xR.}-]Q*W&iR,v*WQ'p$eR+U'pQ&f#gR*S&fQ.h,aR/m.hQ,d)`R.l,dQ+Z'sR-g+ZQ-k+]R/T-kQ/y/US0^/y0`R0`/{Q+l(UR-x+lQ(g%PS+v(g+{R+{(kQ/f.VR0S/fQ+t(eR.S+t`wOcx#l%d)Q)R,YQ$t![Q']$_Q'y$mQ'z$nQ(Q$pQ(R$qS+k(U+lR-q+d'dsOPXY`acopx!Y![!_!a!e!f!h!i!o!x#P#T#Y#[#_#`#e#i#l#n#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$]$_$e$l$m$n$o$p$q%O%S%V%Z%^%_%b%d%g%u%v%{%|&R&S&[&]&`&b&d&i'X'^'_'`'e'h'i'm'n'p'{'|(O(T(U(`(l(t(v({(})O)Q)R)f)o)p*P*T*W*l*o*p*q*z*{+O+T+d+f+h+i+l+o+r+s+x+},W,Y,^,u-[-^-a-r-t-}.R.V.m/O/[/_/b/d/q0R0X0[0h0ra)_%k)],`.g/n0Z0f0kQ!rTQ$h!QQ$i!SQ$j!TQ%o!{Q%q!}Q'x$kQ)c%pQ)l0oS-i+]+_Q-m+^Q-n+`Q/S-kS/U-m/WQ/{/XR0]/x%uSOT`cdopx!Q!S!T!Y![!_!a!{!}#`#l#o#t#u#v#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$g$k$l$m$n$o$p$q%O%d%j%k%p%v&S&d&s&y'm'v(O(T(U(})Q)R)])f*P*T*i*l*o+T+]+^+_+`+b+d+h+i+l+o+s,W,Y,Z,`,c,u-R-k-m-r-t-}.R._.g.m/W/X/[/_/b/d/n/x0Z0f0k0oQ)a%kQ,a)]S.f,`/nQ/l.gQ0g0ZQ0i0fR0m0krmOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,YS#a`$lQ$WoQ$^pQ$r!YQ$z!_Q$}!aQ&w#uQ&z#wY&{#x$o+h-t/_Q&}#|Q'O#}Q'P$OQ'Q$PQ'R$QQ'S$RQ'T$SQ'U$TQ'V$UQ'W$VQ'Z$Z^)[%k)].g/n0Z0f0kU)g%v)f.mQ*Q&dQ+S'mQ+g(OQ+j(TQ,p*PQ-T*lQ-V*oQ-e+TQ-v+iQ-{+oQ.e,`Q/Z-rQ/a-}Q/}/[R0Q/b#xgO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o,Y,`-r-t-}.g.m/[/_/b/n0Z0f0kW(a%O+s.R/dR)S%drYOcx![#l$_$m$n$p$q%d(U)Q)R+d+l,Y[!eP!o'^*q-^/OW!xX$[%{'{Q#``Q#ne#S$]op!Y!_!a#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$l%k%v&d'm(O(T)])f*P*l*o+T+h+i+o,`-r-t-}.g.m/[/_/b/n0Z0f0kQ%V!gS%^!i*{d%|#Y%g&b'_'`'i(t)o)p,^Q&S#_Q&[#bS&`#e&]Q'X$YQ'|$oW(`%O+s.R/dQ({%_Q(}%bS*T&i*WQ*p0rS*z'h+OQ+f'}Q+r(dQ,W)OQ,u*UQ-a*|S.V+x.XR0R/e&O_OPX`ceopx!Y![!_!a!g!i!o#Y#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$l$m$n$o$p$q%O%_%b%d%g%k%v%{&]&b&d&i'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s+x,Y,^,`-^-r-t-}.R.X.g.m/O/[/_/b/d/e/n0Z0f0k0rQ$e!OQ'r$fR*h&t&ZWOPX`ceopx!O!Y![!_!a!g!i!o#Y#[#_#b#e#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Y$Z$[$_$f$l$m$n$o$p$q%O%_%b%d%g%k%v%{&R&]&b&d&i&t'^'_'`'h'i'm'{'}(O(T(U(d(t)O)Q)R)])f)o)p*P*U*W*l*o*q*{*|+O+T+d+h+i+l+o+s+x,Y,^,`-^-r-t-}.R.X.g.m/O/[/_/b/d/e/n0Z0f0k0rR&P#Y$QjOcopx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kQ#f`Q&O#YQ'Y$YU)W%g'`'iQ)}&bQ*s'_Q,Q(tQ,j)oQ,k)pR.c,^Q)n%}R,i)m$SfO`copx!Y![!_!a#l#u#w#x#|#}$O$P$Q$R$S$T$U$V$Z$_$l$m$n$o$p$q%O%d%k%v&d'm(O(T(U)Q)R)])f*P*l*o+T+d+h+i+l+o+s,Y,`-r-t-}.R.g.m/[/_/b/d/n0Z0f0kT&p#t,ZQ&|#xQ(P$oQ-u+hQ/]-tR0P/_]!nP!o'^*q-^/O#PaOPX`bcx![!f!o!y#_#e#l$_$m$n$o$p$q%O%b%d&]&i'^'e'h'{(U)O)Q)R*W*q+O+d+l+s+x,Y-[-^.R/O/dU#WY!W'|Q%T!eU&k#n#s+fQ(o%VS,s*T*zT.s,u-aj#UY!W!e#n#s%V%w&W)y*T*z,u-aU&V#`&`(}Q)x&[Q+e'|Q+q(`Q-s+fQ.O+rQ/g.WR0U/hQ)i%vQ,g)fR/o.mR,h)f`!jP!o'^'h*q+O-^/OT%W!g*|R%]!hW%U!e%V*z-aQ(z%^R,V({S#d`%bR&a#eQ)X%gT*t'`'iR*y'e[!lP!o'^*q-^/OR%X!gR#h`R,b)]R)a%kT-j+]-kQ/V-mR/z/WR/z/X",nodeNames:"\u26A0 LineComment BlockComment Program ModuleDeclaration MarkerAnnotation Identifier ScopedIdentifier . Annotation ) ( AnnotationArgumentList AssignmentExpression FieldAccess IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral TextBlock null ClassLiteral void PrimitiveType TypeName ScopedTypeName GenericType TypeArguments AnnotatedType Wildcard extends super , ArrayType ] Dimension [ class this ParenthesizedExpression ObjectCreationExpression new ArgumentList } { ClassBody ; FieldDeclaration Modifiers public protected private abstract static final strictfp default synchronized native transient volatile VariableDeclarator Definition AssignOp ArrayInitializer MethodDeclaration TypeParameters TypeParameter TypeBound FormalParameters ReceiverParameter FormalParameter SpreadParameter Throws throws Block ClassDeclaration Superclass SuperInterfaces implements InterfaceTypeList InterfaceDeclaration interface ExtendsInterfaces InterfaceBody ConstantDeclaration EnumDeclaration enum EnumBody EnumConstant EnumBodyDeclarations AnnotationTypeDeclaration AnnotationTypeBody AnnotationTypeElementDeclaration StaticInitializer ConstructorDeclaration ConstructorBody ExplicitConstructorInvocation ArrayAccess MethodInvocation MethodName MethodReference ArrayCreationExpression Dimension AssignOp BinaryExpression CompareOp CompareOp LogicOp LogicOp BitOp BitOp BitOp ArithOp ArithOp ArithOp BitOp InstanceofExpression instanceof LambdaExpression InferredParameters TernaryExpression LogicOp : UpdateExpression UpdateOp UnaryExpression LogicOp BitOp CastExpression ElementValueArrayInitializer ElementValuePair open module ModuleBody ModuleDirective requires transitive exports to opens uses provides with PackageDeclaration package ImportDeclaration import Asterisk ExpressionStatement LabeledStatement Label IfStatement if else WhileStatement while ForStatement for ForSpec LocalVariableDeclaration var EnhancedForStatement ForSpec AssertStatement assert SwitchStatement switch SwitchBlock SwitchLabel case DoStatement do BreakStatement break ContinueStatement continue ReturnStatement return SynchronizedStatement ThrowStatement throw TryStatement try CatchClause catch CatchFormalParameter CatchType FinallyClause finally TryWithResourcesStatement ResourceSpecification Resource ClassContent",maxTerm:276,nodeProps:[["isolate",-4,1,2,18,19,""],["group",-26,4,47,76,77,82,87,92,145,147,150,151,153,156,158,161,163,165,167,172,174,176,178,180,181,183,191,"Statement",-25,6,13,14,15,16,17,18,19,20,21,22,39,40,41,99,100,102,103,106,118,120,122,125,127,130,"Expression",-7,23,24,25,26,27,29,34,"Type"],["openedBy",10,"(",44,"{"],["closedBy",11,")",45,"}"]],propSources:[Wx],skippedNodes:[0,1,2],repeatNodeCount:28,tokenData:"#'f_R!_OX%QXY'fYZ)bZ^'f^p%Qpq'fqr*|rs,^st%Qtu4euv5zvw7[wx8rxyAZyzAwz{Be{|CZ|}Dq}!OE_!O!PFx!P!Q! r!Q!R!,h!R![!0`![!]!>p!]!^!@Q!^!_!@n!_!`!BX!`!a!B{!a!b!Di!b!c!EX!c!}!LT!}#O!Mj#O#P%Q#P#Q!NW#Q#R!Nt#R#S4e#S#T%Q#T#o4e#o#p# h#p#q#!U#q#r##n#r#s#$[#s#y%Q#y#z'f#z$f%Q$f$g'f$g#BY4e#BY#BZ#$x#BZ$IS4e$IS$I_#$x$I_$I|4e$I|$JO#$x$JO$JT4e$JT$JU#$x$JU$KV4e$KV$KW#$x$KW&FU4e&FU&FV#$x&FV;'S4e;'S;=`5t<%lO4eS%VV&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QS%qO&YSS%tVOY&ZYZ%lZr&Zrs&ys;'S&Z;'S;=`'`<%lO&ZS&^VOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QS&vP;=`<%l%QS&|UOY&ZYZ%lZr&Zs;'S&Z;'S;=`'`<%lO&ZS'cP;=`<%l&Z_'mk&YS%yZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qs#y%Q#y#z'f#z$f%Q$f$g'f$g#BY%Q#BY#BZ'f#BZ$IS%Q$IS$I_'f$I_$I|%Q$I|$JO'f$JO$JT%Q$JT$JU'f$JU$KV%Q$KV$KW'f$KW&FU%Q&FU&FV'f&FV;'S%Q;'S;=`&s<%lO%Q_)iY&YS%yZX^*Xpq*X#y#z*X$f$g*X#BY#BZ*X$IS$I_*X$I|$JO*X$JT$JU*X$KV$KW*X&FU&FV*XZ*^Y%yZX^*Xpq*X#y#z*X$f$g*X#BY#BZ*X$IS$I_*X$I|$JO*X$JT$JU*X$KV$KW*X&FU&FV*XV+TX#tP&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QU+wV#_Q&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT,aXOY,|YZ%lZr,|rs3Ys#O,|#O#P2d#P;'S,|;'S;=`3S<%lO,|T-PXOY-lYZ%lZr-lrs.^s#O-l#O#P.x#P;'S-l;'S;=`2|<%lO-lT-qX&YSOY-lYZ%lZr-lrs.^s#O-l#O#P.x#P;'S-l;'S;=`2|<%lO-lT.cVcPOY&ZYZ%lZr&Zrs&ys;'S&Z;'S;=`'`<%lO&ZT.}V&YSOY-lYZ/dZr-lrs1]s;'S-l;'S;=`2|<%lO-lT/iW&YSOY0RZr0Rrs0ns#O0R#O#P0s#P;'S0R;'S;=`1V<%lO0RP0UWOY0RZr0Rrs0ns#O0R#O#P0s#P;'S0R;'S;=`1V<%lO0RP0sOcPP0vTOY0RYZ0RZ;'S0R;'S;=`1V<%lO0RP1YP;=`<%l0RT1`XOY,|YZ%lZr,|rs1{s#O,|#O#P2d#P;'S,|;'S;=`3S<%lO,|T2QUcPOY&ZYZ%lZr&Zs;'S&Z;'S;=`'`<%lO&ZT2gVOY-lYZ/dZr-lrs1]s;'S-l;'S;=`2|<%lO-lT3PP;=`<%l-lT3VP;=`<%l,|T3_VcPOY&ZYZ%lZr&Zrs3ts;'S&Z;'S;=`'`<%lO&ZT3yR&WSXY4SYZ4`pq4SP4VRXY4SYZ4`pq4SP4eO&XP_4lb&YS&PZOY%QYZ%lZr%Qrs%qst%Qtu4eu!Q%Q!Q![4e![!c%Q!c!}4e!}#R%Q#R#S4e#S#T%Q#T#o4e#o$g%Q$g;'S4e;'S;=`5t<%lO4e_5wP;=`<%l4eU6RX#hQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QU6uV#]Q&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV7cZ&nR&YSOY%QYZ%lZr%Qrs%qsv%Qvw8Uw!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QU8]V#aQ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT8wZ&YSOY9jYZ%lZr9jrs:xsw9jwx%Qx#O9j#O#PhYZ%lZr>hrs?dsw>hwx;hx#O>h#O#P&Z#P;'S>h;'S;=`@}<%lO>hT>kZOYhYZ%lZr>hrs@Ysw>hwx;hx#O>h#O#P&Z#P;'S>h;'S;=`@}<%lO>hP@]VOY@YZw@Ywx@rx#O@Y#P;'S@Y;'S;=`@w<%lO@YP@wObPP@zP;=`<%l@YTAQP;=`<%l>hTAWP;=`<%l9j_AbVZZ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVBOVYR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVBnX$ZP&YS#gQOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QVCbZ#fR&YSOY%QYZ%lZr%Qrs%qs{%Q{|DT|!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QVD[V#rR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVDxVqR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVEf[#fR&YSOY%QYZ%lZr%Qrs%qs}%Q}!ODT!O!_%Q!_!`6n!`!aF[!a;'S%Q;'S;=`&s<%lO%QVFcV&xR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_GPZWY&YSOY%QYZ%lZr%Qrs%qs!O%Q!O!PGr!P!Q%Q!Q![IQ![;'S%Q;'S;=`&s<%lO%QVGwX&YSOY%QYZ%lZr%Qrs%qs!O%Q!O!PHd!P;'S%Q;'S;=`&s<%lO%QVHkV&qR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTIXc&YS`POY%QYZ%lZr%Qrs%qs!Q%Q!Q![IQ![!f%Q!f!gJd!g!hKQ!h!iJd!i#R%Q#R#SNz#S#W%Q#W#XJd#X#YKQ#Y#ZJd#Z;'S%Q;'S;=`&s<%lO%QTJkV&YS`POY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTKV]&YSOY%QYZ%lZr%Qrs%qs{%Q{|LO|}%Q}!OLO!O!Q%Q!Q![Lp![;'S%Q;'S;=`&s<%lO%QTLTX&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Lp![;'S%Q;'S;=`&s<%lO%QTLwc&YS`POY%QYZ%lZr%Qrs%qs!Q%Q!Q![Lp![!f%Q!f!gJd!g!h%Q!h!iJd!i#R%Q#R#SNS#S#W%Q#W#XJd#X#Y%Q#Y#ZJd#Z;'S%Q;'S;=`&s<%lO%QTNXZ&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Lp![#R%Q#R#SNS#S;'S%Q;'S;=`&s<%lO%QT! PZ&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![IQ![#R%Q#R#SNz#S;'S%Q;'S;=`&s<%lO%Q_! y]&YS#gQOY%QYZ%lZr%Qrs%qsz%Qz{!!r{!P%Q!P!Q!)e!Q!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%Q_!!wX&YSOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{;'S!!r;'S;=`!'s<%lO!!r_!#iT&YSOz!#xz{!$[{;'S!#x;'S;=`!$y<%lO!#xZ!#{TOz!#xz{!$[{;'S!#x;'S;=`!$y<%lO!#xZ!$_VOz!#xz{!$[{!P!#x!P!Q!$t!Q;'S!#x;'S;=`!$y<%lO!#xZ!$yOQZZ!$|P;=`<%l!#x_!%SXOY!%oYZ!#dZr!%ors!'ysz!%oz{!(i{;'S!%o;'S;=`!)_<%lO!%o_!%rXOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{;'S!!r;'S;=`!'s<%lO!!r_!&dZ&YSOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{!P!!r!P!Q!'V!Q;'S!!r;'S;=`!'s<%lO!!r_!'^V&YSQZOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!'vP;=`<%l!!r_!'|XOY!%oYZ!#dZr!%ors!#xsz!%oz{!(i{;'S!%o;'S;=`!)_<%lO!%o_!(lZOY!!rYZ!#dZr!!rrs!%Psz!!rz{!&_{!P!!r!P!Q!'V!Q;'S!!r;'S;=`!'s<%lO!!r_!)bP;=`<%l!%o_!)lV&YSPZOY!)eYZ%lZr!)ers!*Rs;'S!)e;'S;=`!+X<%lO!)e_!*WVPZOY!*mYZ%lZr!*mrs!+_s;'S!*m;'S;=`!,b<%lO!*m_!*rVPZOY!)eYZ%lZr!)ers!*Rs;'S!)e;'S;=`!+X<%lO!)e_!+[P;=`<%l!)e_!+dVPZOY!*mYZ%lZr!*mrs!+ys;'S!*m;'S;=`!,b<%lO!*mZ!,OSPZOY!+yZ;'S!+y;'S;=`!,[<%lO!+yZ!,_P;=`<%l!+y_!,eP;=`<%l!*mT!,ou&YS_POY%QYZ%lZr%Qrs%qs!O%Q!O!P!/S!P!Q%Q!Q![!0`![!d%Q!d!e!3j!e!f%Q!f!gJd!g!hKQ!h!iJd!i!n%Q!n!o!2U!o!q%Q!q!r!5h!r!z%Q!z!{!7`!{#R%Q#R#S!2r#S#U%Q#U#V!3j#V#W%Q#W#XJd#X#YKQ#Y#ZJd#Z#`%Q#`#a!2U#a#c%Q#c#d!5h#d#l%Q#l#m!7`#m;'S%Q;'S;=`&s<%lO%QT!/Za&YS`POY%QYZ%lZr%Qrs%qs!Q%Q!Q![IQ![!f%Q!f!gJd!g!hKQ!h!iJd!i#W%Q#W#XJd#X#YKQ#Y#ZJd#Z;'S%Q;'S;=`&s<%lO%QT!0gi&YS_POY%QYZ%lZr%Qrs%qs!O%Q!O!P!/S!P!Q%Q!Q![!0`![!f%Q!f!gJd!g!hKQ!h!iJd!i!n%Q!n!o!2U!o#R%Q#R#S!2r#S#W%Q#W#XJd#X#YKQ#Y#ZJd#Z#`%Q#`#a!2U#a;'S%Q;'S;=`&s<%lO%QT!2]V&YS_POY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT!2wZ&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!0`![#R%Q#R#S!2r#S;'S%Q;'S;=`&s<%lO%QT!3oY&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!4_!R!S!4_!S;'S%Q;'S;=`&s<%lO%QT!4f`&YS_POY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!4_!R!S!4_!S!n%Q!n!o!2U!o#R%Q#R#S!3j#S#`%Q#`#a!2U#a;'S%Q;'S;=`&s<%lO%QT!5mX&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q!Y!6Y!Y;'S%Q;'S;=`&s<%lO%QT!6a_&YS_POY%QYZ%lZr%Qrs%qs!Q%Q!Q!Y!6Y!Y!n%Q!n!o!2U!o#R%Q#R#S!5h#S#`%Q#`#a!2U#a;'S%Q;'S;=`&s<%lO%QT!7e_&YSOY%QYZ%lZr%Qrs%qs!O%Q!O!P!8d!P!Q%Q!Q![!:r![!c%Q!c!i!:r!i#T%Q#T#Z!:r#Z;'S%Q;'S;=`&s<%lO%QT!8i]&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!9b![!c%Q!c!i!9b!i#T%Q#T#Z!9b#Z;'S%Q;'S;=`&s<%lO%QT!9gc&YSOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!9b![!c%Q!c!i!9b!i!r%Q!r!sKQ!s#R%Q#R#S!8d#S#T%Q#T#Z!9b#Z#d%Q#d#eKQ#e;'S%Q;'S;=`&s<%lO%QT!:yi&YS_POY%QYZ%lZr%Qrs%qs!O%Q!O!P!wX#pR&YSOY%QYZ%lZr%Qrs%qs![%Q![!]!?d!];'S%Q;'S;=`&s<%lO%QV!?kV&vR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!@XV!PR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!@uY&_Z&YSOY%QYZ%lZr%Qrs%qs!^%Q!^!_!Ae!_!`+p!`;'S%Q;'S;=`&s<%lO%QU!AlX#iQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QV!B`X!bR&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QV!CSY&^R&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`!a!Cr!a;'S%Q;'S;=`&s<%lO%QU!CyY#iQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`!a!Ae!a;'S%Q;'S;=`&s<%lO%Q_!DrV&bX#oQ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!E`X%}Z&YSOY%QYZ%lZr%Qrs%qs#]%Q#]#^!E{#^;'S%Q;'S;=`&s<%lO%QV!FQX&YSOY%QYZ%lZr%Qrs%qs#b%Q#b#c!Fm#c;'S%Q;'S;=`&s<%lO%QV!FrX&YSOY%QYZ%lZr%Qrs%qs#h%Q#h#i!G_#i;'S%Q;'S;=`&s<%lO%QV!GdX&YSOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!HP#Y;'S%Q;'S;=`&s<%lO%QV!HUX&YSOY%QYZ%lZr%Qrs%qs#f%Q#f#g!Hq#g;'S%Q;'S;=`&s<%lO%QV!HvX&YSOY%QYZ%lZr%Qrs%qs#Y%Q#Y#Z!Ic#Z;'S%Q;'S;=`&s<%lO%QV!IhX&YSOY%QYZ%lZr%Qrs%qs#T%Q#T#U!JT#U;'S%Q;'S;=`&s<%lO%QV!JYX&YSOY%QYZ%lZr%Qrs%qs#V%Q#V#W!Ju#W;'S%Q;'S;=`&s<%lO%QV!JzX&YSOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!Kg#Y;'S%Q;'S;=`&s<%lO%QV!KnV&tR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!L[b&RZ&YSOY%QYZ%lZr%Qrs%qst%Qtu!LTu!Q%Q!Q![!LT![!c%Q!c!}!LT!}#R%Q#R#S!LT#S#T%Q#T#o!LT#o$g%Q$g;'S!LT;'S;=`!Md<%lO!LT_!MgP;=`<%l!LT_!MqVuZ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!N_VsR&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QU!N{X#eQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`;'S%Q;'S;=`&s<%lO%QV# oV}R&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#!_Z'OX#dQ&YSOY%QYZ%lZr%Qrs%qs!_%Q!_!`6n!`#p%Q#p#q##Q#q;'S%Q;'S;=`&s<%lO%QU##XV#bQ&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV##uV|R&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT#$cV#uP&YSOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#%Ru&YS%yZ&PZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qst%Qtu4eu!Q%Q!Q![4e![!c%Q!c!}4e!}#R%Q#R#S4e#S#T%Q#T#o4e#o#y%Q#y#z'f#z$f%Q$f$g'f$g#BY4e#BY#BZ#$x#BZ$IS4e$IS$I_#$x$I_$I|4e$I|$JO#$x$JO$JT4e$JT$JU#$x$JU$KV4e$KV$KW#$x$KW&FU4e&FU&FV#$x&FV;'S4e;'S;=`5t<%lO4e",tokenizers:[0,1,2,3],topRules:{Program:[0,3],ClassContent:[1,194]},dynamicPrecedences:{27:1,232:-1,243:-1},specialized:[{term:231,get:O=>jx[O]||-1}],tokenPrec:7144});var Cx=ne.define({name:"java",parser:wp.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b)/}),TryStatement:le({except:/^\s*({|catch|finally)\b/}),LabeledStatement:sO,SwitchBlock:O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t?0:i?1:2)*O.unit},Block:be({closing:"}"}),BlockComment:()=>null,Statement:le({except:/^{/})}),te.add({"Block SwitchBlock ClassBody ElementValueArrayInitializer ModuleBody EnumBody ConstructorBody InterfaceBody ArrayInitializer":me,BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/}});function Zp(){return new J(Cx)}var Gx=F({String:d.string,Number:d.number,"True False":d.bool,PropertyName:d.propertyName,Null:d.null,", :":d.separator,"[ ]":d.squareBracket,"{ }":d.brace}),vp=Oe.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[Gx],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var Ex=ne.define({name:"json",parser:vp.configure({props:[se.add({Object:le({except:/^\s*\}/}),Array:le({except:/^\s*\]/})}),te.add({"Object Array":me})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function Yp(){return new J(Ex)}var Ys=class O{static create(e,t,i,r,n){let s=r+(r<<8)+e+(t<<4)|0;return new O(e,t,i,s,n,[],[])}constructor(e,t,i,r,n,s,a){this.type=e,this.value=t,this.from=i,this.hash=r,this.end=n,this.children=s,this.positions=a,this.hashProp=[[R.contextHash,r]]}addChild(e,t){e.prop(R.contextHash)!=this.hash&&(e=new D(e.type,e.children,e.positions,e.length,this.hashProp)),this.children.push(e),this.positions.push(t)}toTree(e,t=this.end){let i=this.children.length-1;return i>=0&&(t=Math.max(t,this.positions[i]+this.children[i].length+this.from)),new D(e.types[this.type],this.children,this.positions,t-this.from).balance({makeTree:(r,n,s)=>new D(ue.none,r,n,s,this.hashProp)})}},b;(function(O){O[O.Document=1]="Document",O[O.CodeBlock=2]="CodeBlock",O[O.FencedCode=3]="FencedCode",O[O.Blockquote=4]="Blockquote",O[O.HorizontalRule=5]="HorizontalRule",O[O.BulletList=6]="BulletList",O[O.OrderedList=7]="OrderedList",O[O.ListItem=8]="ListItem",O[O.ATXHeading1=9]="ATXHeading1",O[O.ATXHeading2=10]="ATXHeading2",O[O.ATXHeading3=11]="ATXHeading3",O[O.ATXHeading4=12]="ATXHeading4",O[O.ATXHeading5=13]="ATXHeading5",O[O.ATXHeading6=14]="ATXHeading6",O[O.SetextHeading1=15]="SetextHeading1",O[O.SetextHeading2=16]="SetextHeading2",O[O.HTMLBlock=17]="HTMLBlock",O[O.LinkReference=18]="LinkReference",O[O.Paragraph=19]="Paragraph",O[O.CommentBlock=20]="CommentBlock",O[O.ProcessingInstructionBlock=21]="ProcessingInstructionBlock",O[O.Escape=22]="Escape",O[O.Entity=23]="Entity",O[O.HardBreak=24]="HardBreak",O[O.Emphasis=25]="Emphasis",O[O.StrongEmphasis=26]="StrongEmphasis",O[O.Link=27]="Link",O[O.Image=28]="Image",O[O.InlineCode=29]="InlineCode",O[O.HTMLTag=30]="HTMLTag",O[O.Comment=31]="Comment",O[O.ProcessingInstruction=32]="ProcessingInstruction",O[O.Autolink=33]="Autolink",O[O.HeaderMark=34]="HeaderMark",O[O.QuoteMark=35]="QuoteMark",O[O.ListMark=36]="ListMark",O[O.LinkMark=37]="LinkMark",O[O.EmphasisMark=38]="EmphasisMark",O[O.CodeMark=39]="CodeMark",O[O.CodeText=40]="CodeText",O[O.CodeInfo=41]="CodeInfo",O[O.LinkTitle=42]="LinkTitle",O[O.LinkLabel=43]="LinkLabel",O[O.URL=44]="URL"})(b||(b={}));var Pc=class{constructor(e,t){this.start=e,this.content=t,this.marks=[],this.parsers=[]}},Sc=class{constructor(){this.text="",this.baseIndent=0,this.basePos=0,this.depth=0,this.markers=[],this.pos=0,this.indent=0,this.next=-1}forward(){this.basePos>this.pos&&this.forwardInner()}forwardInner(){let e=this.skipSpace(this.basePos);this.indent=this.countIndent(e,this.pos,this.indent),this.pos=e,this.next=e==this.text.length?-1:this.text.charCodeAt(e)}skipSpace(e){return vr(this.text,e)}reset(e){for(this.text=e,this.baseIndent=this.basePos=this.pos=this.indent=0,this.forwardInner(),this.depth=1;this.markers.length;)this.markers.pop()}moveBase(e){this.basePos=e,this.baseIndent=this.countIndent(e,this.pos,this.indent)}moveBaseColumn(e){this.baseIndent=e,this.basePos=this.findColumn(e)}addMarker(e){this.markers.push(e)}countIndent(e,t=0,i=0){for(let r=t;r=e.stack[t.depth+1].value+t.baseIndent)return!0;if(t.indent>=t.baseIndent+4)return!1;let i=(O.type==b.OrderedList?Rc:_c)(t,e,!1);return i>0&&(O.type!=b.BulletList||Yc(t,e,!1)<0)&&t.text.charCodeAt(t.pos+i-1)==O.value}var Ap={[b.Blockquote](O,e,t){return t.next!=62?!1:(t.markers.push(L(b.QuoteMark,e.lineStart+t.pos,e.lineStart+t.pos+1)),t.moveBase(t.pos+(ot(t.text.charCodeAt(t.pos+1))?2:1)),O.end=e.lineStart+t.text.length,!0)},[b.ListItem](O,e,t){return t.indent-1?!1:(t.moveBaseColumn(t.baseIndent+O.value),!0)},[b.OrderedList]:_p,[b.BulletList]:_p,[b.Document](){return!0}};function ot(O){return O==32||O==9||O==10||O==13}function vr(O,e=0){for(;et&&ot(O.charCodeAt(e-1));)e--;return e}function Lp(O){if(O.next!=96&&O.next!=126)return-1;let e=O.pos+1;for(;e-1&&O.depth==e.stack.length&&e.parser.leafBlockParsers.indexOf(Kp.SetextHeading)>-1||i<3?-1:1}function Dp(O,e){for(let t=O.stack.length-1;t>=0;t--)if(O.stack[t].type==e)return!0;return!1}function _c(O,e,t){return(O.next==45||O.next==43||O.next==42)&&(O.pos==O.text.length-1||ot(O.text.charCodeAt(O.pos+1)))&&(!t||Dp(e,b.BulletList)||O.skipSpace(O.pos+2)=48&&r<=57;){i++;if(i==O.text.length)return-1;r=O.text.charCodeAt(i)}return i==O.pos||i>O.pos+9||r!=46&&r!=41||iO.pos+1||O.next!=49)?-1:i+1-O.pos}function Ip(O){if(O.next!=35)return-1;let e=O.pos+1;for(;e6?-1:t}function Bp(O){if(O.next!=45&&O.next!=61||O.indent>=O.baseIndent+4)return-1;let e=O.pos+1;for(;e/,Fp=/\?>/,Tc=[[/^<(?:script|pre|style)(?:\s|>|$)/i,/<\/(?:script|pre|style)>/i],[/^\s*/i.exec(i);if(n)return O.append(L(b.Comment,t,t+1+n[0].length));let s=/^\?[^]*?\?>/.exec(i);if(s)return O.append(L(b.ProcessingInstruction,t,t+1+s[0].length));let a=/^(?:![A-Z][^]*?>|!\[CDATA\[[^]*?\]\]>|\/\s*[a-zA-Z][\w-]*\s*>|\s*[a-zA-Z][\w-]*(\s+[a-zA-Z:_][\w-.:]*(?:\s*=\s*(?:[^\s"'=<>`]+|'[^']*'|"[^"]*"))?)*\s*(\/\s*)?>)/.exec(i);return a?O.append(L(b.HTMLTag,t,t+1+a[0].length)):-1},Emphasis(O,e,t){if(e!=95&&e!=42)return-1;let i=t+1;for(;O.char(i)==e;)i++;let r=O.slice(t-1,t),n=O.slice(i,i+1),s=Rr.test(r),a=Rr.test(n),o=/\s|^$/.test(r),l=/\s|^$/.test(n),c=!l&&(!a||o||s),h=!o&&(!s||l||a),f=c&&(e==42||!h||s),u=h&&(e==42||!c||a);return O.append(new Ve(e==95?tm:Om,t,i,(f?1:0)|(u?2:0)))},HardBreak(O,e,t){if(e==92&&O.char(t+1)==10)return O.append(L(b.HardBreak,t,t+2));if(e==32){let i=t+1;for(;O.char(i)==32;)i++;if(O.char(i)==10&&i>=t+2)return O.append(L(b.HardBreak,t,i+1))}return-1},Link(O,e,t){return e==91?O.append(new Ve(zO,t,t+1,1)):-1},Image(O,e,t){return e==33&&O.char(t+1)==91?O.append(new Ve(Vs,t,t+2,1)):-1},LinkEnd(O,e,t){if(e!=93)return-1;for(let i=O.parts.length-1;i>=0;i--){let r=O.parts[i];if(r instanceof Ve&&(r.type==zO||r.type==Vs)){if(!r.side||O.skipSpace(r.to)==t&&!/[(\[]/.test(O.slice(t+1,t+2)))return O.parts[i]=null,-1;let n=O.takeContent(i),s=O.parts[i]=Mx(O,n,r.type==zO?b.Link:b.Image,r.from,t+1);if(r.type==zO)for(let a=0;ae?L(b.URL,e+t,n+t):n==O.length?null:!1}}function rm(O,e,t){let i=O.charCodeAt(e);if(i!=39&&i!=34&&i!=40)return!1;let r=i==40?41:i;for(let n=e+1,s=!1;n=this.end?-1:this.text.charCodeAt(e-this.offset)}get end(){return this.offset+this.text.length}slice(e,t){return this.text.slice(e-this.offset,t-this.offset)}append(e){return this.parts.push(e),e.to}addDelimiter(e,t,i,r,n){return this.append(new Ve(e,t,i,(r?1:0)|(n?2:0)))}get hasOpenLink(){for(let e=this.parts.length-1;e>=0;e--){let t=this.parts[e];if(t instanceof Ve&&(t.type==zO||t.type==Vs))return!0}return!1}addElement(e){return this.append(e)}resolveMarkers(e){for(let i=e;i=e;o--){let $=this.parts[o];if($ instanceof Ve&&$.side&1&&$.type==r.type&&!(n&&(r.side&1||$.side&2)&&($.to-$.from+s)%3==0&&(($.to-$.from)%3||s%3))){a=$;break}}if(!a)continue;let l=r.type.resolve,c=[],h=a.from,f=r.to;if(n){let $=Math.min(2,a.to-a.from,s);h=a.to-$,f=r.from+$,l=$==1?"Emphasis":"StrongEmphasis"}a.type.mark&&c.push(this.elt(a.type.mark,h,a.to));for(let $=o+1;$=0;t--){let i=this.parts[t];if(i instanceof Ve&&i.type==e&&i.side&1)return t}return null}takeContent(e){let t=this.resolveMarkers(e);return this.parts.length=e,t}getDelimiterAt(e){let t=this.parts[e];return t instanceof Ve?t:null}skipSpace(e){return vr(this.text,e-this.offset)+this.offset}elt(e,t,i,r){return typeof e=="string"?L(this.parser.getNodeType(e),t,i,r):new Rs(e,t)}};Vr.linkStart=zO;Vr.imageStart=Vs;function wc(O,e){if(!e.length)return O;if(!O.length)return e;let t=O.slice(),i=0;for(let r of e){for(;i(e?e-1:0))return!1;if(this.fragmentEnd<0){let n=this.fragment.to;for(;n>0&&this.input.read(n-1,n)!=` `;)n--;this.fragmentEnd=n?n-1:0}let i=this.cursor;i||(i=this.cursor=this.fragment.tree.cursor(),i.firstChild());let r=e+this.fragment.offset;for(;i.to<=r;)if(!i.parent())return!1;for(;;){if(i.from>=r)return this.fragment.from<=t;if(!i.childAfter(r))return!1}}matches(e){let t=this.cursor.tree;return t&&t.prop(R.contextHash)==e}takeNodes(e){let t=this.cursor,i=this.fragment.offset,r=this.fragmentEnd-(this.fragment.openEnd?1:0),n=e.absoluteLineStart,s=n,a=e.block.children.length,o=s,l=a;for(;;){if(t.to-i>r){if(t.type.isAnonymous&&t.firstChild())continue;break}let c=sm(t.from-i,e.ranges);if(t.to-i<=e.ranges[e.rangeI].to)e.addNode(t.tree,c);else{let h=new D(e.parser.nodeSet.types[b.Paragraph],[],[],0,e.block.hashProp);e.reusePlaceholders.set(h,t.tree),e.addNode(h,c)}if(t.type.is("Block")&&(Dx.indexOf(t.type.id)<0?(s=t.to-i,a=e.block.children.length):(s=o,a=l,o=t.to-i,l=e.block.children.length)),!t.nextSibling())break}for(;e.block.children.length>a;)e.block.children.pop(),e.block.positions.pop();return s-n}};function sm(O,e){let t=O;for(let i=1;iZs[O]),Object.keys(Zs).map(O=>Kp[O]),Object.keys(Zs),Ax,Ap,Object.keys(gc).map(O=>gc[O]),Object.keys(gc),[]);function Bx(O,e,t){let i=[];for(let r=O.firstChild,n=e;;r=r.nextSibling){let s=r?r.from:t;if(s>n&&i.push({from:n,to:s}),!r)break;n=r.to}return i}function om(O){let{codeParser:e,htmlParser:t}=O;return{wrap:xO((r,n)=>{let s=r.type.id;if(e&&(s==b.CodeBlock||s==b.FencedCode)){let a="";if(s==b.FencedCode){let l=r.node.getChild(b.CodeInfo);l&&(a=n.read(l.from,l.to))}let o=e(a);if(o)return{parser:o,overlay:l=>l.type.id==b.CodeText,bracketed:s==b.FencedCode}}else if(t&&(s==b.HTMLBlock||s==b.HTMLTag||s==b.CommentBlock))return{parser:t,overlay:Bx(r.node,r.from,r.to)};return null})}}var Nx={resolve:"Strikethrough",mark:"StrikethroughMark"},Fx={defineNodes:[{name:"Strikethrough",style:{"Strikethrough/...":d.strikethrough}},{name:"StrikethroughMark",style:d.processingInstruction}],parseInline:[{name:"Strikethrough",parse(O,e,t){if(e!=126||O.char(t+1)!=126||O.char(t+2)==126)return-1;let i=O.slice(t-1,t),r=O.slice(t+2,t+3),n=/\s|^$/.test(i),s=/\s|^$/.test(r),a=Rr.test(i),o=Rr.test(r);return O.addDelimiter(Nx,t,t+2,!s&&(!o||n||a),!n&&(!a||s||o))},after:"Emphasis"}]};function Yr(O,e,t=0,i,r=0){let n=0,s=!0,a=-1,o=-1,l=!1,c=()=>{i.push(O.elt("TableCell",r+a,r+o,O.parser.parseInline(e.slice(a,o),r+a)))};for(let h=t;h-1)&&n++,s=!1,i&&(a>-1&&c(),i.push(O.elt("TableDelimiter",h+r,h+r+1))),a=o=-1):(l||f!=32&&f!=9)&&(a<0&&(a=h),o=h+1),l=!l&&f==92}return a>-1&&(n++,i&&c()),n}function zp(O,e){for(let t=e;tr instanceof qs)||!zp(e.text,e.basePos))return!1;let i=O.peekLine();return lm.test(i)&&Yr(O,e.text,e.basePos)==Yr(O,i,e.basePos)},before:"SetextHeading"}]},vc=class{nextLine(){return!1}finish(e,t){return e.addLeafElement(t,e.elt("Task",t.start,t.start+t.content.length,[e.elt("TaskMarker",t.start,t.start+3),...e.parser.parseInline(t.content.slice(3),t.start+3)])),!0}},Kx={defineNodes:[{name:"Task",block:!0,style:d.list},{name:"TaskMarker",style:d.atom}],parseBlock:[{name:"TaskList",leaf(O,e){return/^\[[ xX]\][ \t]/.test(e.content)&&O.parentType().name=="ListItem"?new vc:null},after:"SetextHeading"}]},Up=/(www\.)|(https?:\/\/)|([\w.+-]{1,100}@)|(mailto:|xmpp:)/gy,Wp=/[\w-]+(\.[\w-]+)+(\/[^\s<]*)?/gy,Jx=/[\w-]+\.[\w-]+($|\/)/,jp=/[\w.+-]+@[\w-]+(\.[\w.-]+)+/gy,Cp=/\/[a-zA-Z\d@.]+/gy;function Gp(O,e,t,i){let r=0;for(let n=e;n-1)return-1;let i=e+t[0].length;for(;;){let r=O[i-1],n;if(/[?!.,:*_~]/.test(r)||r==")"&&Gp(O,e,i,")")>Gp(O,e,i,"("))i--;else if(r==";"&&(n=/&(?:#\d+|#x[a-f\d]+|\w+);$/.exec(O.slice(e,i))))i=e+n.index;else break}return i}function Ep(O,e){jp.lastIndex=e;let t=jp.exec(O);if(!t)return-1;let i=t[0][t[0].length-1];return i=="_"||i=="-"?-1:e+t[0].length-(i=="."?1:0)}var tk={parseInline:[{name:"Autolink",parse(O,e,t){let i=t-O.offset;if(i&&/\w/.test(O.text[i-1]))return-1;Up.lastIndex=i;let r=Up.exec(O.text),n=-1;if(!r)return-1;if(r[1]||r[2]){if(n=ek(O.text,i+r[0].length),n>-1&&O.hasOpenLink){let s=/([^\[\]]|\[[^\]]*\])*/.exec(O.text.slice(i,n));n=i+s[0].length}}else r[3]?n=Ep(O.text,i):(n=Ep(O.text,i+r[0].length),n>-1&&r[0]=="xmpp:"&&(Cp.lastIndex=n,r=Cp.exec(O.text),r&&(n=r.index+r[0].length)));return n<0?-1:(O.addElement(O.elt("URL",t,n+O.offset)),n+O.offset)}}]},cm=[Hx,Kx,Fx,tk];function hm(O,e,t){return(i,r,n)=>{if(r!=O||i.char(n+1)==O)return-1;let s=[i.elt(t,n,n+1)];for(let a=n+1;a"}}}),mm=new R,gm=am.configure({props:[te.add(O=>!O.is("Block")||O.is("Document")||zc(O)!=null||Ok(O)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),mm.add(zc),se.add({Document:()=>null}),iO.add({Document:pm})]});function zc(O){let e=/^(?:ATX|Setext)Heading(\d)$/.exec(O.name);return e?+e[1]:void 0}function Ok(O){return O.name=="OrderedList"||O.name=="BulletList"}function ik(O,e){let t=O;for(;;){let i=t.nextSibling,r;if(!i||(r=zc(i.type))!=null&&r<=e)break;t=i}return t.to}var rk=Ho.of((O,e,t)=>{for(let i=U(O).resolveInner(t,-1);i&&!(i.fromt)return{from:t,to:n}}return null});function Uc(O){return new Re(pm,O,[],"markdown")}var nk=Uc(gm),sk=gm.configure([cm,dm,fm,um,{props:[te.add({Table:(O,e)=>({from:e.doc.lineAt(O.from).to,to:O.to})})]}]),zs=Uc(sk);function ak(O,e){return t=>{if(t&&O){let i=null;if(t=/\S*/.exec(t)[0],typeof O=="function"?i=O(t):i=ar.matchLanguageName(O,t,!0),i instanceof ar)return i.support?i.support.language.parser:nr.getSkippingParser(i.load());if(i)return i.parser}return e?e.parser:null}}var qr=class{constructor(e,t,i,r,n,s,a){this.node=e,this.from=t,this.to=i,this.spaceBefore=r,this.spaceAfter=n,this.type=s,this.item=a}blank(e,t=!0){let i=this.spaceBefore+(this.node.name=="Blockquote"?">":"");if(e!=null){for(;i.length0;r--)i+=" ";return i+(t?this.spaceAfter:"")}}marker(e,t){let i=this.node.name=="OrderedList"?String(+Sm(this.item,e)[2]+t):"";return this.spaceBefore+i+this.type+this.spaceAfter}};function Pm(O,e){let t=[],i=[];for(let r=O;r;r=r.parent){if(r.name=="FencedCode")return i;(r.name=="ListItem"||r.name=="Blockquote")&&t.push(r)}for(let r=t.length-1;r>=0;r--){let n=t[r],s,a=e.lineAt(n.from),o=n.from-a.from;if(n.name=="Blockquote"&&(s=/^ *>( ?)/.exec(a.text.slice(o))))i.push(new qr(n,o,o+s[0].length,"",s[1],">",null));else if(n.name=="ListItem"&&n.parent.name=="OrderedList"&&(s=/^( *)\d+([.)])( *)/.exec(a.text.slice(o)))){let l=s[3],c=s[0].length;l.length>=4&&(l=l.slice(0,l.length-4),c-=4),i.push(new qr(n.parent,o,o+c,s[1],l,s[2],n))}else if(n.name=="ListItem"&&n.parent.name=="BulletList"&&(s=/^( *)([-+*])( {1,4}\[[ xX]\])?( +)/.exec(a.text.slice(o)))){let l=s[4],c=s[0].length;l.length>4&&(l=l.slice(0,l.length-4),c-=4);let h=s[2];s[3]&&(h+=s[3].replace(/[xX]/," ")),i.push(new qr(n.parent,o,o+c,s[1],l,h,n))}}return i}function Sm(O,e){return/^(\s*)(\d+)(?=[.)])/.exec(e.sliceString(O.from,O.from+10))}function Vc(O,e,t,i=0){for(let r=-1,n=O;;){if(n.name=="ListItem"){let a=Sm(n,e),o=+a[2];if(r>=0){if(o!=r+1)return;t.push({from:n.from+a[1].length,to:n.from+a[0].length,insert:String(r+2+i)})}r=o}let s=n.nextSibling;if(!s)break;n=s}}function Wc(O,e){let t=/^[ \t]*/.exec(O)[0].length;if(!t||e.facet(nO)!=" ")return O;let i=ve(O,4,t),r="";for(let n=i;n>0;)n>=4?(r+=" ",n-=4):(r+=" ",n--);return r+O.slice(t)}var ok=(O={})=>({state:e,dispatch:t})=>{let i=U(e),{doc:r}=e,n=null,s=e.changeByRange(a=>{if(!a.empty||!zs.isActiveAt(e,a.from,-1)&&!zs.isActiveAt(e,a.from,1))return n={range:a};let o=a.from,l=r.lineAt(o),c=Pm(i.resolveInner(o,-1),r);for(;c.length&&c[c.length-1].from>o-l.from;)c.pop();if(!c.length)return n={range:a};let h=c[c.length-1];if(h.to-h.spaceAfter.length>o-l.from)return n={range:a};let f=o>=h.to-h.spaceAfter.length&&!/\S/.test(l.text.slice(h.to));if(h.item&&f){let m=h.node.firstChild,g=h.node.getChild("ListItem","ListItem");if(m.to>=o||g&&g.to0&&!/[^\s>]/.test(r.lineAt(l.from-1).text)||O.nonTightLists===!1){let P=c.length>1?c[c.length-2]:null,y,X="";P&&P.item?(y=l.from+P.from,X=P.marker(r,1)):y=l.from+(P?P.to:0);let x=[{from:y,to:o,insert:X}];return h.node.name=="OrderedList"&&Vc(h.item,r,x,-2),P&&P.node.name=="OrderedList"&&Vc(P.item,r,x),{range:S.cursor(y+X.length),changes:x}}else{let P=$m(c,e,l);return{range:S.cursor(o+P.length+1),changes:{from:l.from,insert:P+e.lineBreak}}}}if(h.node.name=="Blockquote"&&f&&l.from){let m=r.lineAt(l.from-1),g=/>\s*$/.exec(m.text);if(g&&g.index==h.from){let P=e.changes([{from:m.from+g.index,to:m.to},{from:l.from+h.from,to:l.to}]);return{range:a.map(P),changes:P}}}let u=[];h.node.name=="OrderedList"&&Vc(h.item,r,u);let Q=h.item&&h.item.from]*/.exec(l.text)[0].length>=h.to)for(let m=0,g=c.length-1;m<=g;m++)$+=m==g&&!Q?c[m].marker(r,1):c[m].blank(ml.from&&/\s/.test(l.text.charAt(p-l.from-1));)p--;return $=Wc($,e),ck(h.node,e.doc)&&($=$m(c,e,l)+e.lineBreak+$),u.push({from:p,to:o,insert:e.lineBreak+$}),{range:S.cursor(p+$.length+1),changes:u}});return n?!1:(t(e.update(s,{scrollIntoView:!0,userEvent:"input"})),!0)},lk=ok();function Qm(O){return O.name=="QuoteMark"||O.name=="ListMark"}function ck(O,e){if(O.name!="OrderedList"&&O.name!="BulletList")return!1;let t=O.firstChild,i=O.getChild("ListItem","ListItem");if(!i)return!1;let r=e.lineAt(t.to),n=e.lineAt(i.from),s=/^[\s>]*$/.test(r.text);return r.number+(s?0:1){let t=U(O),i=null,r=O.changeByRange(n=>{let s=n.from,{doc:a}=O;if(n.empty&&zs.isActiveAt(O,n.from)){let o=a.lineAt(s),l=Pm(hk(t,s),a);if(l.length){let c=l[l.length-1],h=c.to-c.spaceAfter.length+(c.spaceAfter?1:0);if(s-o.from>h&&!/\S/.test(o.text.slice(h,s-o.from)))return{range:S.cursor(o.from+h),changes:{from:o.from+h,to:s}};if(s-o.from==h&&(!c.item||o.from<=c.item.from||!/\S/.test(o.text.slice(0,c.to)))){let f=o.from+c.from;if(c.item&&c.node.from{var t;let{main:i}=e.state.selection;if(i.empty)return!1;let r=(t=O.clipboardData)===null||t===void 0?void 0:t.getData("text/plain");if(!r||!/^(https?:\/\/|mailto:|xmpp:|www\.)/.test(r)||(/^www\./.test(r)&&(r="https://"+r),!zs.isActiveAt(e.state,i.from,1)))return!1;let n=U(e.state),s=!1;return n.iterate({from:i.from,to:i.to,enter:a=>{(a.from>i.from||$k.test(a.name))&&(s=!0)},leave:a=>{a.to=97&&O<=122||O>=65&&O<=90}function zr(O){return O==95||O>=128||wm(O)}function Cc(O){return O>=48&&O<=55||O>=97&&O<=102||O>=65&&O<=70}var _w={int:!0,integer:!0,bool:!0,boolean:!0,float:!0,double:!0,real:!0,string:!0,array:!0,object:!0,unset:!0,__proto__:null},Rw=new z(O=>{if(O.next==40){O.advance();let e=0;for(;km(O.peek(e));)e++;let t="",i;for(;wm(i=O.peek(e));)t+=String.fromCharCode(i),e++;for(;km(O.peek(e));)e++;O.peek(e)==41&&_w[t.toLowerCase()]&&O.acceptToken(mk)}else if(O.next==60&&O.peek(1)==60&&O.peek(2)==60){for(let i=0;i<3;i++)O.advance();for(;O.next==32||O.next==9;)O.advance();let e=O.next==39;if(e&&O.advance(),!zr(O.next))return;let t=String.fromCharCode(O.next);for(;O.advance(),!(!zr(O.next)&&!(O.next>=48&&O.next<=55));)t+=String.fromCharCode(O.next);if(e){if(O.next!=39)return;O.advance()}if(O.next!=10&&O.next!=13)return;for(;;){let i=O.next==10||O.next==13;if(O.advance(),O.next<0)return;if(i){for(;O.next==32||O.next==9;)O.advance();let r=!0;for(let n=0;n{O.next<0&&O.acceptToken(Tk)}),qw=new z((O,e)=>{O.next==63&&e.canShift(bm)&&O.peek(1)==62&&O.acceptToken(bm)});function zw(O){let e=O.peek(1);if(e==110||e==114||e==116||e==118||e==101||e==102||e==92||e==36||e==34||e==123)return 2;if(e>=48&&e<=55){let t=2,i;for(;t<5&&(i=O.peek(t))>=48&&i<=55;)t++;return t}if(e==120&&Cc(O.peek(2)))return Cc(O.peek(3))?4:3;if(e==117&&O.peek(2)==123)for(let t=3;;t++){let i=O.peek(t);if(i==125)return t==2?0:t+1;if(!Cc(i))break}return 0}var Uw=new z((O,e)=>{let t=!1;for(;!(O.next==34||O.next<0||O.next==36&&(zr(O.peek(1))||O.peek(1)==123)||O.next==123&&O.peek(1)==36);t=!0){if(O.next==92){let i=zw(O);if(i){if(t)break;return O.acceptToken(Sk,i)}}else if(!t&&(O.next==91||O.next==45&&O.peek(1)==62&&zr(O.peek(2))||O.next==63&&O.peek(1)==45&&O.peek(2)==62&&zr(O.peek(3)))&&e.canShift(Xk))break;O.advance()}t&&O.acceptToken(Pk)}),Ww=F({"Visibility abstract final static":d.modifier,"for foreach while do if else elseif switch try catch finally return throw break continue default case":d.controlKeyword,"endif endfor endforeach endswitch endwhile declare enddeclare goto match":d.controlKeyword,"and or xor yield unset clone instanceof insteadof":d.operatorKeyword,"function fn class trait implements extends const enum global interface use var":d.definitionKeyword,"include include_once require require_once namespace":d.moduleKeyword,"new from echo print array list as":d.keyword,null:d.null,Boolean:d.bool,VariableName:d.variableName,"NamespaceName/...":d.namespace,"NamedType/...":d.typeName,Name:d.name,"CallExpression/Name":d.function(d.variableName),"LabelStatement/Name":d.labelName,"MemberExpression/Name":d.propertyName,"MemberExpression/VariableName":d.special(d.propertyName),"ScopedExpression/ClassMemberName/Name":d.propertyName,"ScopedExpression/ClassMemberName/VariableName":d.special(d.propertyName),"CallExpression/MemberExpression/Name":d.function(d.propertyName),"CallExpression/ScopedExpression/ClassMemberName/Name":d.function(d.propertyName),"MethodDeclaration/Name":d.function(d.definition(d.variableName)),"FunctionDefinition/Name":d.function(d.definition(d.variableName)),"ClassDeclaration/Name":d.definition(d.className),UpdateOp:d.updateOperator,ArithOp:d.arithmeticOperator,"LogicOp IntersectionType/&":d.logicOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,ControlOp:d.controlOperator,AssignOp:d.definitionOperator,"$ ConcatOp":d.operator,LineComment:d.lineComment,BlockComment:d.blockComment,Integer:d.integer,Float:d.float,String:d.string,ShellExpression:d.special(d.string),"=> ->":d.punctuation,"( )":d.paren,"#[ [ ]":d.squareBracket,"${ { }":d.brace,"-> ?->":d.derefOperator,", ; :: : \\":d.separator,"PhpOpen PhpClose":d.processingInstruction}),jw={__proto__:null,static:325,STATIC:325,class:351,CLASS:351},Zm=Oe.deserialize({version:14,states:"%#[Q`OWOOQhQaOOP%oO`OOOOO#t'#Hh'#HhO%tO#|O'#DuOOO#u'#Dx'#DxQ&SOWO'#DxO&XO$VOOOOQ#u'#Dy'#DyO&lQaO'#D}O'[QdO'#EQO+QQdO'#IqO+_QdO'#ERO-RQaO'#EXO/bQ`O'#EUO/gQ`O'#E_O2UQaO'#E_O2]Q`O'#EgO2bQ`O'#EqO-RQaO'#EqO2mQpO'#FOO2rQ`O'#FOOOQS'#Iq'#IqO2wQ`O'#ExOOQS'#Ih'#IhO5SQdO'#IeO9UQeO'#F]O-RQaO'#FlO-RQaO'#FmO-RQaO'#FnO-RQaO'#FoO-RQaO'#FoO-RQaO'#FrOOQO'#Ir'#IrO9cQ`O'#FxOOQO'#Ht'#HtO9kQ`O'#HXO:VQ`O'#FsO:bQ`O'#HfO:mQ`O'#GPO:uQaO'#GQO-RQaO'#G`O-RQaO'#GcO;bOrO'#GfOOQS'#JP'#JPOOQS'#JO'#JOOOQS'#Ie'#IeO/bQ`O'#GmO/bQ`O'#GoO/bQ`O'#GtOhQaO'#GvO;iQ`O'#GwO;nQ`O'#GzO:]Q`O'#G}O;sQeO'#HOO;sQeO'#HPO;sQeO'#HQO;}Q`O'#HROhQ`O'#HVO:]Q`O'#HWO>mQ`O'#HWO;}Q`O'#HXO:]Q`O'#HZO:]Q`O'#H[O:]Q`O'#H]O>rQ`O'#H`O>}Q`O'#HaOQO!$dQ`O,5POOQ#u-E;h-E;hO!1QQ`O,5=tOOO#u,5:_,5:_O!1]O#|O,5:_OOO#u-E;g-E;gOOOO,5>|,5>|OOQ#y1G0T1G0TO!1eQ`O1G0YO-RQaO1G0YO!2wQ`O1G0qOOQS1G0q1G0qOOQS'#Eo'#EoOOQS'#Il'#IlO-RQaO'#IlOOQS1G0r1G0rO!4ZQ`O'#IoO!5pQ`O'#IqO!5}QaO'#EwOOQO'#Io'#IoO!6XQ`O'#InO!6aQ`O,5;aO-RQaO'#FXOOQS'#FW'#FWOOQS1G1[1G1[O!6fQdO1G1dO!8kQdO1G1dO!:WQdO1G1dO!;sQdO1G1dO!=`QdO1G1dO!>{QdO1G1dO!@hQdO1G1dO!BTQdO1G1dO!CpQdO1G1dO!E]QdO1G1dO!FxQdO1G1dO!HeQdO1G1dO!JQQdO1G1dO!KmQdO1G1dO!MYQdO1G1dO!NuQdO1G1dOOQT1G0_1G0_O!#[Q`O,5<_O#!bQaO'#EYOOQS1G0[1G0[O#!iQ`O,5:zOEdQaO,5:zO#!nQaO,5;OO#!uQdO,5:|O#$tQdO,5?UO#&sQaO'#HmO#'TQ`O,5?TOOQS1G0e1G0eO#']Q`O1G0eO#'bQ`O'#IkO#(zQ`O'#IkO#)SQ`O,5;SOG|QaO,5;SOOQS1G0w1G0wOOQO,5>^,5>^OOQO-E;p-E;pOOQS1G1U1G1UO#)pQdO'#FQO#+uQ`O'#HsOJ}QpO1G1UO2wQ`O'#HpO#+zQtO,5;eO2wQ`O'#HqO#,iQtO,5;gO#-WQaO1G1OOOQS,5;h,5;hO#/gQtO'#FQO#/tQdO1G0dO-RQaO1G0dO#1aQdO1G1aO#2|QdO1G1cOOQO,5X,5>XOOQO-E;k-E;kOOQS7+&P7+&PO!+iQaO,5;TO$$^QaO'#HnO$$hQ`O,5?VOOQS1G0n1G0nO$$pQ`O1G0nPOQO'#FQ'#FQOOQO,5>_,5>_OOQO-E;q-E;qOOQS7+&p7+&pOOQS,5>[,5>[OOQS-E;n-E;nO$$uQtO,5>]OOQS-E;o-E;oO$%dQdO7+&jO$'iQtO'#FQO$'vQdO7+&OOOQS1G0j1G0jOOQO,5>a,5>aOOQO-E;s-E;sOOQ#u7+(x7+(xO!$[QdO7+(xOOQ#u7+(}7+(}O#JfQ`O7+(}O#JkQ`O7+(}OOQ#u7+(z7+(zO!.]Q`O7+(zO!1TQ`O7+(zO!1QQ`O7+(zO$)cQ`O,5i,5>iOOQS-E;{-E;{O$.lQdO7+'qO$.|QpO7+'qO$/XQdO'#IxOOQO,5pOOQ#u,5>p,5>pOOQ#u-EoOOQS-EVQdO1G2^OOQS,5>h,5>hOOQS-E;z-E;zOOQ#u7+({7+({O$?oQ`O'#GXO:]Q`O'#H_OOQO'#IV'#IVO$@fQ`O,5=xOOQ#u,5=x,5=xO$AcQ!bO'#EQO$AzQ!bO7+(}O$BYQpO7+)RO#KRQpO7+)RO$BbQ`O'#HbO!$[QdO7+)RO$BpQdO,5>rOOQS-EVOOQS-E;i-E;iO$D{QdO<Z,5>ZOOQO-E;m-E;mOOQS1G1_1G1_O$8rQaO,5:uO$G}QaO'#HlO$H[Q`O,5?QOOQS1G0`1G0`OOQS7+&Q7+&QO$HdQ`O7+&UO$IyQ`O1G0oO$K`Q`O,5>YOOQO,5>Y,5>YOOQO-E;l-E;lOOQS7+&Y7+&YOOQS7+&U7+&UOOQ#u<c,5>cOOQO-E;u-E;uOOQS<lOOQ#u-EmOOQO-EW,5>WOOQO-E;j-E;jO!+iQaO,5;UOOQ#uANBTANBTO#JfQ`OANBTOOQ#uANBQANBQO!.]Q`OANBQO!+iQaO7+'hOOQO7+'l7+'lO%-bQ`O7+'hO%.wQ`O7+'hO%/SQ`O7+'lO!+iQaO7+'mOOQO7+'m7+'mO%/XQdO'#F}OOQO'#Hv'#HvO%/jQ`O,5e,5>eOOQS-E;w-E;wOOQO1G2_1G2_O$1YQdO1G2_O$/jQpO1G2_O#JkQ`O1G2]O!.mQdO1G2aO%$dQ!bO1G2]O!$[QdO1G2]OOQO1G2a1G2aOOQO1G2]1G2]O%2uQaO'#G]OOQO1G2b1G2bOOQSAN@xAN@xO!.]Q`OAN@xOOOQ<]O%6rQ!bO'#FQO!$[QdOANBXOOQ#uANBXANBXO:]Q`O,5=}O%7WQ`O,5=}O%7cQ`O'#IXO%7wQ`O,5?rOOQS1G3h1G3hOOQS7+)x7+)xP%+OQpOANBXO%8PQ`O1G0pOOQ#uG27oG27oOOQ#uG27lG27lO%9fQ`O<d,5>dO%dOOQO-E;v-E;vO%hQ`O'#IqO%>rQ`O'#IhO!$[QdO'#IOO%@lQaO,5s,5>sOOQO-Ej,5>jOOQP-E;|-E;|OOQO1G2c1G2cOOQ#uLD,kLD,kOOQTG27[G27[O!$[QdOLD-RO!$[QdO<OO%EpQ`O,5>OPOQ#uLD-_LD-_OOQO7+'o7+'oO+_QdO7+'oOOQS!$( ]!$( ]OOQOAN@}AN@}OOQS1G2d1G2dOOQS1G2e1G2eO%E{QdO1G2eOOQ#u!$(!m!$(!mOOQOANBVANBVOOQO1G3j1G3jO:]Q`O1G3jOOQO<tQaO,5:xO'/vQaO,5;uO'/vQaO,5;wO'@sQdO,5YQdO,5<^O)@XQdO,5QQ`O,5=eO*>YQaO'#HkO*>dQ`O,5?ROlQdO7+%tO*@kQ`O1G0jO!+iQaO1G0jO*BQQdO7+&OOoO*GeQ`O,5>VO*HzQdO<[QdO,5{QdO'#IjO.BbQ`O'#IeO.BoQ`O'#GPO.BwQaO,5:nO.COQ`O,5uOs#fOx7xOy7xO}aO!O^O!Q8OO!R}O!T7}O!V7yO!W7yO!Z8QO!d:QO!z]O#T#mO#V#lO#X`O#dhO#fbO#gcO#sdO$[7|O$d7{O$e7|O$hqO%T8PO%U!OO%W}O%X}O%`|O'WYO'u{O#Y']P~O#O#qO~P/lO!z#rO~O#d#tO#fbO#gcO~O'a#vO~O#s#zO~OU$OO!R$OO!w#}O#s3hO'W#{O~OT'XXz'XX!S'XX!c'XX!n'XX!w'XX!z'XX#T'XX#X'XX#a'XX#b'XX#y'XX$R'XX$S'XX$T'XX$U'XX$V'XX$X'XX$Y'XX$Z'XX$['XX$]'XX$^'XX$_'XX%T'XX'P'XX!y'XX!o'XX~O#|$QO$O$RO~P3YOP7wOQ|OU_OW}O[7zOo>uOs#fOx7xOy7xO}aO!O^O!Q8OO!R}O!T7}O!V7yO!W7yO!Z8QO!d:QO!z]O#X`O#dhO#fbO#gcO#sdO$[7|O$d7{O$e7|O$hqO%T8PO%U!OO%W}O%X}O%`|O'WYO'u{OT$PXz$PX!S$PX!c$PX!n$PX!w$PX#a$PX#b$PX#y$PX$R$PX$S$PX$T$PX$U$PX$V$PX$X$PX$Y$PX$Z$PX$]$PX$^$PX$_$PX'P$PX!y$PX!o$PX~Or$TO#T8eO#V8dO~P5^O#sdO'WYO~OS$fO]$aOk$dOm$fOs$`O!a$bO$krO$u$eO~O!z$hO#T$jO'W$gO~Oo$mOs$lO#d$nO~O!z$hO#T$rO~O!U$uO$u$tO~P-ROR${O!p$zO#d$yO#g$zO&}${O~O't$}O~P;PO!z%SO~O!z%UO~O!n#bO'P#bO~P-RO!pXO~O!z%`O~OP7wOQ|OU_OW}O[7zOo>uOs#fOx7xOy7xO}aO!O^O!Q8OO!R}O!T7}O!V7yO!W7yO!Z8QO!d:QO!z]O#X`O#dhO#fbO#gcO#sdO$[7|O$d7{O$e7|O$hqO%T8PO%U!OO%W}O%X}O%`|O'WYO'u{O~O!z%dO~O]$aO~O!pXO#sdO'WYO~O]%rOs%rO#s%nO'WYO~O!j%wO'Q%wO'TRO~O'Q%zO~PhO!o%{O~PhO!r%}O~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'cX#O'cX~P!%aO!r)yO!y'eX#O'eX~P)dO!y#kX#O#kX~P!+iO#O){O!y'bX~O!y)}O~O%T#cOT$Qiz$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi$_$Qi'P$Qi!y$Qi#O$Qi#P$Qi#Y$Qi!o$Qi!r$QiV$Qi#|$Qi$O$Qi!p$Qi~P!%aOz#QO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO!w!yO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi'P$Qi!y$Qi!o$Qi~P!%aOT#SOz#QO!c#UO!w!yO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cO!S$Qi!n$Qi'P$Qi!y$Qi!o$Qi~P!%aOT#SOz#QO!w!yO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cO!S$Qi!c$Qi!n$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi$T$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi$T$Qi$U$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO#T#PO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$[#_O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$Z#^O$[#_O$^#aO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi'P$Qi!y$Qi!o$Qi~P!%aOz#QO$_#aO%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi'P$Qi!y$Qi!o$Qi~P!%aO_*PO~PxO$hqO$krO~P2wO#X+|O#a+{O#b+{O~O#d,OO%W,OO%^+}O'W$gO~O!o,PO~PCVOc%bXd%bXh%bXj%bXf%bXg%bXe%bX~PhOc,TOd,ROP%aiQ%aiS%aiU%aiW%aiX%ai[%ai]%ai^%ai`%aia%aib%aik%aim%aio%aip%aiq%ais%ait%aiu%aiv%aix%aiy%ai|%ai}%ai!O%ai!P%ai!Q%ai!R%ai!T%ai!V%ai!W%ai!X%ai!Y%ai!Z%ai![%ai!]%ai!^%ai!_%ai!a%ai!b%ai!d%ai!n%ai!p%ai!z%ai#X%ai#d%ai#f%ai#g%ai#s%ai$[%ai$d%ai$e%ai$h%ai$k%ai$u%ai%T%ai%U%ai%W%ai%X%ai%`%ai&|%ai'W%ai'u%ai'Q%ai!o%aih%aij%aif%aig%aiY%ai_%aii%aie%ai~Oc,XOd,UOh,WO~OY,YO_,ZO!o,^O~OY,YO_,ZOi%gX~Oi,`O~Oj,aO~O!n,cO~PxO$hqO$krO~P2wO!p)`O~OU$OO!R$OO!w3nO#s3iO'W,zO~O#s,|O~O!p-OO'a'UO~O#sdO'WYO!n&zX#O&zX'P&zX~O#O)gO!n'ya'P'ya~O#s-UO~O!n&_X#O&_X'P&_X#P&_X~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#ka#O#ka~P!%aO!y&cX#O&cX~P@aO#O){O!y'ba~O!o-_O~PCVO#P-`O~O#O-aO!o'YX~O!o-cO~O!y-dO~OT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O#Wi#Y#Wi~P!%aO!y&bX#O&bX~PxO#n'XO~OS+kO].cOm+kOs$`O!U+kO!`+kO!a+kO#d>xO$hqO$krO~P2wOS+kO].cOm+kOs$`O!U+kO!`+kO!a+kO#d>xO$hqO~P2wO!n#bO!p-yO'P#bO~OS+kO]+nOm+kOs$`O!U+kO!_+qO!`+kO!a+kO!o.mO#d>xO$hqO$krO~P2wO#d.rO%W.rO%^+}O'W$gO~O%W.sO~O#Y.tO~Oc%bad%bah%baj%baf%bag%bae%ba~PhOc.wOd,ROP%aqQ%aqS%aqU%aqW%aqX%aq[%aq]%aq^%aq`%aqa%aqb%aqk%aqm%aqo%aqp%aqq%aqs%aqt%aqu%aqv%aqx%aqy%aq|%aq}%aq!O%aq!P%aq!Q%aq!R%aq!T%aq!V%aq!W%aq!X%aq!Y%aq!Z%aq![%aq!]%aq!^%aq!_%aq!a%aq!b%aq!d%aq!n%aq!p%aq!z%aq#X%aq#d%aq#f%aq#g%aq#s%aq$[%aq$d%aq$e%aq$h%aq$k%aq$u%aq%T%aq%U%aq%W%aq%X%aq%`%aq&|%aq'W%aq'u%aq'Q%aq!o%aqh%aqj%aqf%aqg%aqY%aq_%aqi%aqe%aq~Oc.|Od,UOh.{O~O!r(hO~OP7wOQ|OU_OW}O[xO$hqO$krO~P2wOS+kOY,vO]+nOm+kOs$`O!U+kO!_+qO!`+kO!a+kO!o/fO#d>xO$hqO$krO~P2wOw!tX!p!tX#T!tX#n!tX#s#vX#|!tX'W!tX~Ow(ZO!p)`O#T3tO#n3sO~O!p-OO'a&fa~O]/nOs/nO#sdO'WYO~OV/rO!n&za#O&za'P&za~O#O)gO!n'yi'P'yi~O#s/tO~OT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!n&_a#O&_a'P&_a#P&_a~P!%aOz#QO#T#PO$R#RO$S#VO$T#WO$U#XO$V#YO$X#[O$Y#]O$Z#^O$[#_O$]#`O$^#aO$_#aO%T#cOT!vy!S!vy!c!vy!n!vy!w!vy'P!vy!y!vy!o!vy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#ji#O#ji~P!%aO_*PO!o&`X#O&`X~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#]i#O#]i~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#P/yO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!y&ba#O&ba~P!%aO#|0OO!y$ji#O$ji~O#d0PO~O#V0SO#d0RO~P2wOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ji#O$ji~P!%aO!p-yO#|0TO!y$oi#O$oi~O!o0YO'W$gO~O#O0[O!y'kX~O#d0^O~O!y0_O~O!pXO!r0bO~O#T'ZO#n'XO!p'qy!n'qy'P'qy~O!n$sy'P$sy!y$sy!o$sy~PCVO#P0eO#T'ZO#n'XO~O#sdO'WYOw&mX!p&mX#O&mX!n&mX'P&mX~O#O.^Ow'la!p'la!n'la'P'la~OS+kO]0mOm+kOs$`O!U+kO!`+kO!a+kO#d>xO$hqO~P2wO#T3tO#n3sO'W$gO~O#|)XO#T'eX#n'eX'W'eX~O!n#bO!p0sO'P#bO~O#Y0wO~Oh0|O~OTvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$jq#O$jq~P!%aO#|1kO!y$jq#O$jq~O#d1lO~O!n#bO!pXO!z$hO#P1oO'P#bO~O!o1rO'W$gO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$oq#O$oq~P!%aO#T1tO#d1sO!y&lX#O&lX~O#O0[O!y'ka~O#T'ZO#n'XO!p'q!R!n'q!R'P'q!R~O!pXO!r1yO~O!n$s!R'P$s!R!y$s!R!o$s!R~PCVO#P1{O#T'ZO#n'XO~OP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#^i#O#^i~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$jy#O$jy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$oy#O$oy~P!%aO!pXO#P2rO~O#d2sO~O#O0[O!y'ki~O!n$s!Z'P$s!Z!y$s!Z!o$s!Z~PCVOTvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$j!R#O$j!R~P!%aO!n$s!c'P$s!c!y$s!c!o$s!c~PCVO!a3`O'W$gO~OV3dO!o&Wa#O&Wa~O'W$gO!n%Ri'P%Ri~O'a'_O~O'a/jO~O'a*iO~O'a1]O~OT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$ta#|$ta$O$ta'P$ta!y$ta!o$ta#O$ta~P!%aO#T3uO~P-RO#s3lO~O#s3mO~O!U$uO$u$tO~P#-WOT8TOz8RO!S8UO!c8VO!w:_O#P3pO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!n'^X'P'^X!y'^X!o'^X~P!%aOT6QOz6OO!S6RO!c6SO!w7oO#P5aO#T#PO$R6PO$S6TO$T6UO$U6VO$V6WO$X6YO$Y6ZO$Z6[O$[6]O$]6^O$^6_O$_6_O%T#cO#O'^X#Y'^X#|'^X$O'^X!n'^X'P'^X!r'^X!y'^X!o'^XV'^X!p'^X~P!%aO#T5OO~P#-WOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$`a#|$`a$O$`a'P$`a!y$`a!o$`a#O$`a~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$aa#|$aa$O$aa'P$aa!y$aa!o$aa#O$aa~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$ba#|$ba$O$ba'P$ba!y$ba!o$ba#O$ba~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$ca#|$ca$O$ca'P$ca!y$ca!o$ca#O$ca~P!%aOz3{O#|$ca$O$ca#O$ca~PMVOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$fa#|$fa$O$fa'P$fa!y$fa!o$fa#O$fa~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n%Va#|%Va$O%Va'P%Va!y%Va!o%Va#O%Va~P!%aOz3{O#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOT3}Oz3{O!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!S$Qi!n$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOT3}Oz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!S$Qi!c$Qi!n$Qi#|$Qi$O$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O#T#PO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$[4YO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$Z4XO$[4YO$^4[O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOz3{O$_4[O%T#cOT$Qi!S$Qi!c$Qi!n$Qi!w$Qi#T$Qi#|$Qi$O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi'P$Qi!y$Qi!o$Qi#O$Qi~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n#Ua#|#Ua$O#Ua'P#Ua!y#Ua!o#Ua#O#Ua~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n'^a#|'^a$O'^a'P'^a!y'^a!o'^a#O'^a~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT#Qi!S#Qi!c#Qi!n#Qi#|#Qi$O#Qi'P#Qi!y#Qi!o#Qi#O#Qi~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT#}i!S#}i!c#}i!n#}i#|#}i$O#}i'P#}i!y#}i!o#}i#O#}i~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$Pi#|$Pi$O$Pi'P$Pi!y$Pi!o$Pi#O$Pi~P!%aOz3{O#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT!vq!S!vq!c!vq!n!vq!w!vq#|!vq$O!vq'P!vq!y!vq!o!vq#O!vq~P!%aOz3{O!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT#Qq!S#Qq!c#Qq!n#Qq#|#Qq$O#Qq'P#Qq!y#Qq!o#Qq#O#Qq~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$sq#|$sq$O$sq'P$sq!y$sq!o$sq#O$sq~P!%aOz3{O#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cOT!vy!S!vy!c!vy!n!vy!w!vy#|!vy$O!vy'P!vy!y!vy!o!vy#O!vy~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$sy#|$sy$O$sy'P$sy!y$sy!o$sy#O$sy~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$s!R#|$s!R$O$s!R'P$s!R!y$s!R!o$s!R#O$s!R~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$s!Z#|$s!Z$O$s!Z'P$s!Z!y$s!Z!o$s!Z#O$s!Z~P!%aOT3}Oz3{O!S4OO!c4PO!w5rO#T#PO$R3|O$S4QO$T4RO$U4SO$V4TO$X4VO$Y4WO$Z4XO$[4YO$]4ZO$^4[O$_4[O%T#cO!n$s!c#|$s!c$O$s!c'P$s!c!y$s!c!o$s!c#O$s!c~P!%aOP7wOU_O[5kOo9xOs#fOx5gOy5gO}aO!O^O!Q5{O!T5qO!V5iO!W5iO!Z5}O!d5eO!z]O#T5bO#X`O#dhO#fbO#gcO#sdO$[5oO$d5mO$e5oO$hqO%T5|O%U!OO'WYO~P$vO#O9_O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'xX~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#O9aO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'ZX~P!%aOz8RO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOT8TOz8RO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!S$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOT8TOz8RO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!S$Qi!c$Qi#O$Qi#P$Qi#Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi$T$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO#T#PO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$[8`O$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$Z8_O$[8`O$^8bO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aOz8RO$_8bO%T#cOT$Qi!S$Qi!c$Qi!w$Qi#O$Qi#P$Qi#T$Qi#Y$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi!n$Qi'P$Qi!r$Qi!y$Qi!o$QiV$Qi!p$Qi~P!%aO#T9fO~P!+iO!n#Ua'P#Ua!y#Ua!o#Ua~PCVO!n'^a'P'^a!y'^a!o'^a~PCVO#T=PO#V=OO!y&aX#O&aX~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#Wi#O#Wi~P!%aOz8RO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT#Qq!S#Qq!c#Qq#O#Qq#P#Qq#Y#Qq!n#Qq'P#Qq!r#Qq!y#Qq!o#QqV#Qq!p#Qq~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$sq#P$sq#Y$sq!n$sq'P$sq!r$sq!y$sq!o$sqV$sq!p$sq~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y&wa#O&wa~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y&_a#O&_a~P!%aOz8RO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cOT!vy!S!vy!c!vy!w!vy#O!vy#P!vy#Y!vy!n!vy'P!vy!r!vy!y!vy!o!vyV!vy!p!vy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#Wq#O#Wq~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$sy#P$sy#Y$sy!n$sy'P$sy!r$sy!y$sy!o$syV$sy!p$sy~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$s!R#P$s!R#Y$s!R!n$s!R'P$s!R!r$s!R!y$s!R!o$s!RV$s!R!p$s!R~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$s!Z#P$s!Z#Y$s!Z!n$s!Z'P$s!Z!r$s!Z!y$s!Z!o$s!ZV$s!Z!p$s!Z~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO#O$s!c#P$s!c#Y$s!c!n$s!c'P$s!c!r$s!c!y$s!c!o$s!cV$s!c!p$s!c~P!%aO#T9vO~PvO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$`a#O$`a~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$aa#O$aa~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ba#O$ba~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ca#O$ca~P!%aOz:`O%T#cOT$ca!S$ca!c$ca!w$ca!y$ca#O$ca#T$ca$R$ca$S$ca$T$ca$U$ca$V$ca$X$ca$Y$ca$Z$ca$[$ca$]$ca$^$ca$_$ca~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$fa#O$fa~P!%aO!r?SO#P9^O~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$ta#O$ta~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y%Va#O%Va~P!%aOT8TOz8RO!S8UO!c8VO!r9cO!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aOz:`O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!y$Qi#O$Qi~P!%aOT:bOz:`O!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!S$Qi!y$Qi#O$Qi~P!%aOT:bOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!S$Qi!c$Qi!y$Qi#O$Qi~P!%aOz:`O#T#PO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi~P!%aOz:`O#T#PO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi$T$Qi~P!%aOz:`O#T#PO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi$T$Qi$U$Qi~P!%aOz:`O#T#PO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi~P!%aOz:`O$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi~P!%aOz:`O$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi~P!%aOz:`O$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi~P!%aOz:`O$[:mO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$]$Qi~P!%aOz:`O$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi~P!%aOz:`O$Z:lO$[:mO$^:oO$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$]$Qi~P!%aOz:`O$_:oO%T#cOT$Qi!S$Qi!c$Qi!w$Qi!y$Qi#O$Qi#T$Qi$R$Qi$S$Qi$T$Qi$U$Qi$V$Qi$X$Qi$Y$Qi$Z$Qi$[$Qi$]$Qi$^$Qi~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT#Qi!S#Qi!c#Qi!y#Qi#O#Qi~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT#}i!S#}i!c#}i!y#}i#O#}i~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$Pi#O$Pi~P!%aO!r?TO#P9hO~Oz:`O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT!vq!S!vq!c!vq!w!vq!y!vq#O!vq~P!%aOz:`O!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT#Qq!S#Qq!c#Qq!y#Qq#O#Qq~P!%aO!r?YO#P9oO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$sq#O$sq~P!%aO#P9oO#T'ZO#n'XO~Oz:`O#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cOT!vy!S!vy!c!vy!w!vy!y!vy#O!vy~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$sy#O$sy~P!%aO#P9pO#T'ZO#n'XO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$s!R#O$s!R~P!%aO#P9sO#T'ZO#n'XO~OT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$s!Z#O$s!Z~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y$s!c#O$s!c~P!%aO#T;}O~P!+iOT8TOz8RO!S8UO!c8VO!w:_O#P;|O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!y'^X#O'^X~P!%aO!U$uO$u$tO~P$8rOP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QVO~P$8rOP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QWO#X`O#dhO#fbO#gcO#sdO$[vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y#Ua#O#Ua~P!%aOT:bOz:`O!S:cO!c:dO!w>vO#T#PO$R:aO$S:eO$T:fO$U:gO$V:hO$X:jO$Y:kO$Z:lO$[:mO$]:nO$^:oO$_:oO%T#cO!y'^a#O'^a~P!%aOz<]O!w?^O#T#PO$R<_O$SpO~P$8rOP7wOU_O[:rOo?tOs#fOx:rOy:rO}aO!O^O!QqO#X`O#dhO#fbO#gcO#sdO$[oO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aOT8TOz8RO!S8UO!c8VO!w:_O#P>nO#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO!n'^X!r'^X!o'^X#O'^X!p'^X'P'^X~P!%aOT'XXz'XX!S'XX!c'XX!w'XX!z'XX#O'XX#T'XX#X'XX#a'XX#b'XX#y'XX$R'XX$S'XX$T'XX$U'XX$V'XX$X'XX$Y'XX$Z'XX$['XX$]'XX$^'XX$_'XX%T'XX~O#|:uO$O:vO!y'XX~P.@qO!z$hO#T>zO~O!r;SO~PxO!n&qX!p&qX#O&qX'P&qX~O#O?QO!n'pa!p'pa'P'pa~O!r?rO#P;uO~OT[O~O!r?zO#P:rO~OT8TOz8RO!S8UO!c8VO!r>]O!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aOT8TOz8RO!S8UO!c8VO!r>^O!w:_O#T#PO$R8SO$S8WO$T8XO$U8YO$V8ZO$X8]O$Y8^O$Z8_O$[8`O$]8aO$^8bO$_8bO%T#cO~P!%aO!r?{O#P>cO~O!r?|O#P>hO~O#P>hO#T'ZO#n'XO~O#P:rO#T'ZO#n'XO~O#P>iO#T'ZO#n'XO~O#P>lO#T'ZO#n'XO~O!z$hO#T?nO~Oo>wOs$lO~O!z$hO#T?oO~O#O?QO!n'pX!p'pX'P'pX~O!z$hO#T?vO~O!z$hO#T?wO~O!z$hO#T?xO~Oo?lOs$lO~Oo?uOs$lO~Oo?tOs$lO~O%X$]%W$k!e$^#d%`#g'u'W#f~",goto:"%1O'{PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP'|P(TPP(Z(^PPP(vP(^*o(^6cP6cPP>cFxF{PP6cGR! RP! UP! UPPGR! e! h! lGRGRPP! oP! rPPGR!)u!0q!0qGR!0uP!0u!0u!0u!2PP!;g!S#>Y#>h#>n#>x#?O#?U#?[#?b#?l#?v#?|#@S#@^PPPPPPPP#@d#@hP#A^$(h$(k$(u$1R$1_$1t$1zP$1}$2Q$2W$5[$?Y$Gr$Gu$G{$HO$Kb$Ke$Kn$Kv$LQ$Li$MP$Mz%'}PP%0O%0S%0`%0u%0{Q!nQT!qV!rQUOR%x!mRVO}!hPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]|!hPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]Q%_!ZQ%h!aQ%m!eQ'k$cQ'x$iQ)d%lQ+W'{Q,k)QU.O+T+V+]Q.j+pQ/`,jS0a.T.UQ0q.dQ1n0VS1w0`0dQ2Q0nQ2q1pQ2t1xR3[2u|ZPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]2lf]`cgjklmnoprxyz!W!X!Y!]!e!f!g!y!z#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r#}$Q$R$T$h$z%S%U%d%r%}&S&W&[&q&t&u&x'P'X'Z']'a'e'p't'y(R(V(W(Y(Z([(t)T)X)`)c)g)n)u)y*V*Z*[*r*w*|+Q+X+[+^+_+j+m+q+t,Y,c,e,g,i,u,x-O-`-a-t-v-z.S.V.[.].^.b/X/n/y0O0T0b0e1R1S1b1k1o1y1{2k2r3n3p3s3t3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7i7j7k7o7w7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v9|9}:O:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?S?T?Y?^?_?p?q?r?y?z?{?|S$ku$`Q%W!V^%e!_$a'j)Y.f0o2OQ%i!bQ%j!cQ%k!dQ%v!kS&V!|){Q&]#OQ'l$dQ'm$eS'|$j'hQ)S%`Q*v'nQ+z(bQ,O(dQ-S)iU.g+n.c0mQ.q+{Q.r+|Q/d,vS0V-y0XQ1X/cQ1e/rS2T0s2WQ2h1`Q3U2iQ3^2zQ3_2{Q3c3VQ3f3`R3g3d0{!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_0z!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_Q#h^Q%O!PQ%P!QQ%Q!RQ,b(sQ.u,RR.y,UR&r#hQ*Q&qR/w-a0{hPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_R#j_k#n`j#i#q&t&x5d5e9W:Q:R:S:TR#saT&}#r'PR-h*[R&R!{0zhPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_R#tb-x!}[#e#k#u$U$V$W$X$Y$Z$v$w%X%Z%]%a%s%|&O&U&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&v&w&|'`'b'c(e(x)v)x)z*O*U*h*j+a+d,n,q-W-Y-[-e-f-g-w.Y/O/[/v0Q0Z0f1g1j1m1z2S2`2o2p2v3Z4]4^4d4e4f4g4h4i4j4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}5P5Q5T5U5W5X5Y5]5^5`5t6e6f6g6h6i6j6k6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}7O7Q7R7U7V7X7Y7Z7^7_7a7m7q8i8j8k8l8m8n8p8q8r8t8u8v8w8x8y8z8{8|8}9O9P9Q9R9S9U9V9Y9[9]9d9e9g9i9j9k9l9m9n9q9r9t9w:p:x:y:z:{:|:};Q;R;T;U;V;W;X;Y;Z;[;];^;_;`;a;b;c;d;f;g;l;m;p;r;s;w;y;{O>P>Q>R>S>T>U>X>Y>Z>_>`>a>b>d>e>f>g>j>k>m>r>s>{>|>}?V?b?cQ'd$[Y(X$s8o;P=^=_S(]3o7lQ(`$tR+y(aT&X!|){#a$Pg#}$h'X'Z'p't'y(W([)`)c*r*w+Q+X+[+_+j+m+n+t,i,u,x-v.S.V.].b.c0b0m1y3n3s3t7i7j7k7w9|9}:O?S?T?Y?p?q?r?y?z?{?|3yfPVX]`cgjklmnoprxyz!S!W!X!Y!]!e!f!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r#}$Q$R$T$h$z%O%Q%S%T%U%V%d%r%}&S&W&[&q&t&u&x'P'X'Z']'a'e'p't'y(R(V(W(Y(Z([(h(t)T)X)`)c)g)n)u)y){*V*Z*[*r*w*|+Q+X+[+^+_+j+m+n+q+t,Q,T,Y,c,e,g,i,u,x-O-`-a-t-v-z.S.V.[.].^.b.c.u.w/P/X/n/y0O0T0b0e0m0s0}1O1R1S1W1b1k1o1y1{2W2]2k2r3n3p3s3t3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7i7j7k7o7w7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v9|9}:O:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?S?T?Y?^?_?p?q?r?y?z?{?|[#wd#x3h3i3j3kh'V#z'W)f,}-U/k/u1f3l3m3q3rQ)e%nR-T)kY#yd%n)k3h3iV'T#x3j3k1dePVX]`cjklmnoprxyz!S!W!X!Y!]!e!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a'e(R(V(Y(Z(h(t)T)X)g)n)u)y){*V*Z*[*|+^+q,Q,T,Y,c,e,g-O-`-a-t-z.[.^.u.w/P/X/n/y0O0T0e0s0}1O1R1S1W1b1k1o1{2W2]2k2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_Q%o!fQ)l%r#O3vg#}$h'X'Z'p't'y(W([)`*w+Q+X+[+_+j+m+t,i,u,x-v.S.V.].b0b1y7i7j7k7w9|9}:O?S?T?Y?p?q?r?y?z?{?|a3w)c*r+n.c0m3n3s3tY'T#z)f-U3l3mZ*c'W,}/u3q3r0vhPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0}1O1R1S1W1k1o1{2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_T2U0s2WR&^#OR&]#O!r#Z[#e#u$U$V$W$X$Z$s$w%X%Z%]&`&a&b&c&d&e&f&g'`'b'c(e)v)x*O*j+d-Y.Y0f1z2`2p2v3Z9U9V!Y4U3o4d4e4f4g4i4j4l4m4n4o4p4q4r4s4{4|4}5P5Q5T5U5W5X5Y5]5^5`!^6X4^6e6f6g6h6j6k6m6n6o6p6q6r6s6t6|6}7O7Q7R7U7V7X7Y7Z7^7_7a7l7m#b8[#k%a%s%|&O&v&w&|(x*U+a,n,q-W-e-g/[4]5t7q8i8j8k8l8n8o8p8t8u8v8w8x8y8z8{9Y9[9]9d9g9i9l9n9q9r9t9w:p;Rr>s>{?b?c!|:i&U)z-[-f-w0Q0Z1g1j1m2o8q8r9e9j9k9m:x:y:z:{:};P;Q;T;U;V;W;X;Y;Z;[;d;f;g;l;m;p;r;s;w;y;{>R>S!`T>X>Z>_>a>d>e>g>j>k>m>|>}?VoU>Y>`>b>fS$iu#fQ$qwU'{$j$l&pQ'}$kS(P$m$rQ+Z'|Q+](OQ+`(QQ1p0VQ5s7dS5v7f7gQ5w7hQ7p9xS7r9y9zQ7s9{Q;O>uS;h>w>zQ;o?PQ>y?jS?O?l?nQ?U?oQ?`?sS?a?t?wS?d?u?vR?e?xT'u$h+Q!csPVXt!S!j!r!s!w$h%O%Q%T%V'p([(h)`+Q+j+t,Q,T,u,x.u.w/P0}1O1W2]Q$]rR*l'eQ-{+PQ.i+oQ0U-xQ0j.`Q1|0kR2w1}T0W-y0XQ+V'zQ.U+YR0d.XQ(_$tQ)^%iQ)s%vQ*u'mS+x(`(aQ-q*vR.p+yQ(^$tQ)b%kQ)r%vQ*q'lS*t'm)sU+w(_(`(aS-p*u*vS.o+x+yQ/i,{Q/{-nQ/}-qR0v.pQ(]$tQ)]%iQ)_%jQ)q%vU*s'm)r)sW+v(^(_(`(aQ,t)^U-o*t*u*vU.n+w+x+yS/|-p-qS0u.o.pQ1i/}R2Y0vX+r([)`+t,xb%f!_$a'j+n.c.f0m0o2OR,r)YQ$ovS+b(S?Qg?m([)`+i+j+m+t,u,x.a.b0lR0t.kT2V0s2W0}|PVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g,m-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_T$y{$|Q,O(dR.r+|T${{$|Q(j%OQ(r%QQ(w%TQ(z%VQ.},XQ0z.yQ0{.|R2c1WR(m%PX,[(k(l,],_R(n%PX(p%Q%T%V1WR%T!T_%b!]%S(t,c,e/X1RR%V!UR/],gR,j)PQ)a%kS*p'l)bS-m*q,{S/z-n/iR1h/{T,w)`,xQ-P)fU/l,|,}-UU1^/k/t/uR2n1fR/o-OR2l1bSSO!mR!oSQ!rVR%y!rQ!jPS!sV!rQ!wX[%u!j!s!w,Q1O2]Q,Q(hQ1O/PR2]0}Q)o%sS-X)o9bR9b8rQ-b*QR/x-bQ&y#oS*X&y9XR9X:tS*]&|&}R-i*]Q)|&YR-^)|!j'Y#|'o*f*z+O+T+e+i.T.W.Z.a/_0`0c0g0l1x2u5x5y5z7e7t7u7v;q;t;x?W?X?Z?f?g?h?iS*e'Y/g]/g,{-n.f0o1[2O!h'[#|'o*z+O+T+e+i.T.W.Z.a/_0`0c0g0l1x2u5x5y5z7e7t7u7v;q;t;x?W?X?Z?f?g?h?iS*g'[/hZ/h,{-n.f0o2OU#xd%n)kU'S#x3j3kQ3j3hR3k3iQ'W#z^*b'W,}/k/u1f3q3rQ,})fQ/u-UQ3q3lR3r3m|tPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]W$_t'p+j,uS'p$h+QS+j([+tT,u)`,xQ'f$]R*m'fQ0X-yR1q0XQ+R'vR-}+RQ0].PS1u0]1vR1v0^Q._+fR0i._Q+t([R.l+tW+m([)`+t,xS.b+j,uT.e+m.bQ)Z%fR,s)ZQ(T$oS+c(T?RR?R?mQ2W0sR2}2WQ$|{R(f$|Q,S(iR.v,SQ,V(jR.z,VQ,](kQ,_(lT/Q,],_Q)U%aS,o)U9`R9`8qQ)R%_R,l)RQ,x)`R/e,xQ)h%pS-R)h/sR/s-SQ1c/oR2m1cT!uV!rj!iPVX!j!r!s!w(h,Q/P0}1O2]Q%R!SQ(i%OW(p%Q%T%V1WQ.x,TQ0x.uR0y.w|[PVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]Q#e]U#k`#q&xQ#ucQ$UkQ$VlQ$WmQ$XnQ$YoQ$ZpQ$sx^$vy3y5|8P:]n>oQ+a(RQ+d(VQ,n)TQ,q)XQ-W)nQ-Y)uQ-[)yQ-e*VQ-f*ZQ-g*[^-k3u5b7c9v;}>p>qQ-w*|Q.Y+^Q/O,YQ/[,gQ/v-`Q0Q-tQ0Z-zQ0f.[Q1g/yQ1j0OQ1m0TQ1z0eU2S0s2W:rQ2`1SQ2o1kQ2p1oQ2v1{Q3Z2rQ3o3xQ4]jQ4^5eQ4d5fQ4e5hQ4f5jQ4g5lQ4h5nQ4i5pQ4j3zQ4l3|Q4m3}Q4n4OQ4o4PQ4p4QQ4q4RQ4r4SQ4s4TQ4t4UQ4u4VQ4v4WQ4w4XQ4x4YQ4y4ZQ4z4[Q4{4_Q4|4`Q4}4aQ5P4bQ5Q4cQ5T4kQ5U5OQ5W5RQ5X5SQ5Y5VQ5]5ZQ5^5[Q5`5_Q5t5rQ6e5gQ6f5iQ6g5kQ6h5mQ6i5oQ6j5qQ6k5}Q6m6PQ6n6QQ6o6RQ6p6SQ6q6TQ6r6UQ6s6VQ6t6WQ6u6XQ6v6YQ6w6ZQ6x6[Q6y6]Q6z6^Q6{6_Q6|6`Q6}6aQ7O6bQ7Q6cQ7R6dQ7U6lQ7V7PQ7X7SQ7Y7TQ7Z7WQ7^7[Q7_7]Q7a7`Q7l5{Q7m5dQ7q7oQ8i7xQ8j7yQ8k7zQ8l7{Q8m7|Q8n7}Q8o8OQ8p8QU8q,c/X1RQ8r%dQ8t8SQ8u8TQ8v8UQ8w8VQ8x8WQ8y8XQ8z8YQ8{8ZQ8|8[Q8}8]Q9O8^Q9P8_Q9Q8`Q9R8aQ9S8bQ9U8dQ9V8eQ9Y8fQ9[8gQ9]8hQ9d8sQ9e9TQ9g9ZQ9i9^Q9j9_Q9k9aQ9l9cQ9m9fQ9n9hQ9q9oQ9r9pQ9t9sQ9w:QU:p#i&t9WQ:x:UQ:y:VQ:z:WQ:{:XQ:|:YQ:}:ZQ;P:[Q;Q:^Q;R:_Q;T:aQ;U:bQ;V:cQ;W:dQ;X:eQ;Y:fQ;Z:gQ;[:hQ;]:iQ;^:jQ;_:kQ;`:lQ;a:mQ;b:nQ;c:oQ;d:uQ;f:vQ;g:wQ;l;SQ;m;eQ;p;jQ;r;kQ;s;nQ;w;uQ;y;vQ;{;zQOP<{Q>Q<|Q>R=OQ>S=PQ>T=QQ>U=RQ>X=SQ>Y=TQ>Z=UQ>_=aQ>`=bQ>a>VQ>b>WQ>d>[Q>e>]Q>f>^Q>g>cQ>j>hQ>k>iQ>m>lQ>r:SQ>s:RQ>{>vQ>|:qQ>}:sQ?V;iQ?b?^R?c?_R*R&qQ%t!gQ)W%dT*P&q-a$WiPVX]cklmnopxyz!S!W!X!Y!j!r!s!w#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a$Q$R$T$z%O%Q%T%V%}&S&['a(V(h)u+^,Q,T.[.u.w/P0e0}1O1S1W1o1{2]2r3p3u8d8e!t5c']3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5f5h5j5l5n5p7b7c!x7n5a5b5d5e5g5i5k5m5o5q5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`$`:P`j!]!g!y!z#i#l#m#q#r%S%U&q&t&u&x'P(R(t)T)X)n*V*[,e,g-a5r7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8f8g8h8s9W9Z9^9c9h9o9p9s9u9v:Q:R:S:T:_>v?^?_#l>t!|%d&W)y){*Z*|,c-t-z/X/y0O0T1R1k9T9_9a9f:U:V:W:X:Y:Z:[:]:^:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:u:v:w;S;e;j;k;n;u;v;z;|;}=O=P!x?[,Y-`:q:s;iV>[>]>c>h>i>l>n>p!]?]0s2W:rW>^>o>qQ#p`Q&s#iQ&{#qR*T&tS#o`#q^$Sj5d5e:Q:R:S:TS*W&x9WT:t#i&tQ'O#rR*_'PR&T!{R&Z!|Q&Y!|R-]){Q#|gS'^#}3nS'o$h+QS*d'X3sU*f'Z*w-vQ*z'pQ+O'tQ+T'yQ+e(WW+i([)`+t,xQ,{)cQ-n*rQ.T+XQ.W+[Q.Z+_U.a+j+m,uQ.f+nQ/_,iQ0`.SQ0c.VQ0g.]Q0l.bQ0o.cQ1[3tQ1x0bQ2O0mQ2u1yQ5x7iQ5y7jQ5z7kQ7e7wQ7t9|Q7u9}Q7v:OQ;q?SQ;t?TQ;x?YQ?W?pQ?X?qQ?Z?rQ?f?yQ?g?zQ?h?{R?i?|0z!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_#`$Og#}$h'X'Z'p't'y(W([)`)c*r*w+Q+X+[+_+j+m+n+t,i,u,x-v.S.V.].b.c0b0m1y3n3s3t7i7j7k7w9|9}:O?S?T?Y?p?q?r?y?z?{?|S$[r'eQ%l!eS%p!f%rU+f(Y(Z+qQ-Q)gQ/m-OQ0h.^Q1a/nQ2j1bR3W2k|vPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]#Y#g]cklmnopxyz!W!X!Y#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a$Q$R$T$z%}&S&['a(V)u+^.[0e1S1o1{2r3p3u8d8e`+k([)`+j+m+t,u,x.b!t8c']3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5f5h5j5l5n5p7b7c!x<}5a5b5d5e5g5i5k5m5o5q5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`$`?k`j!]!g!y!z#i#l#m#q#r%S%U&q&t&u&x'P(R(t)T)X)n*V*[,e,g-a5r7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8f8g8h8s9W9Z9^9c9h9o9p9s9u9v:Q:R:S:T:_>v?^?_#l?}!|%d&W)y){*Z*|,c-t-z/X/y0O0T1R1k9T9_9a9f:U:V:W:X:Y:Z:[:]:^:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:u:v:w;S;e;j;k;n;u;v;z;|;}=O=P!x@O,Y-`:q:s;iV>[>]>c>h>i>l>n>p!]@P0s2W:rW>^>o>qR'w$hQ'v$hR-|+QR$^rQ#d[Q%Y!WQ%[!XQ%^!YQ(U$pQ({%WQ(|%XQ(}%ZQ)O%]Q)V%cQ)[%gQ)d%lQ)j%qQ)p%tQ*n'iQ-V)mQ-l*oQ.i+oQ.j+pQ.x,WQ/S,`Q/T,aQ/U,bQ/Z,fQ/^,hQ/b,pQ/q-PQ0j.`Q0q.dQ0r.hQ0t.kQ0y.{Q1Y/dQ1_/lQ1n0VQ1|0kQ2Q0nQ2R0pQ2[0|Q2d1XQ2g1^Q2w1}Q2y2PQ2|2VQ3P2ZQ3T2fQ3X2nQ3Y2pQ3]2xQ3a3RQ3b3SR3e3ZR.R+UQ+g(YQ+h(ZR.k+qS+s([+tT,w)`,xa+l([)`+j+m+t,u,x.bQ%g!_Q'i$aQ*o'jQ.h+nS0p.c.fS2P0m0oR2x2OQ$pvW+o([)`+t,xW.`+i+j+m,uS0k.a.bR1}0l|!aPVX!S!j!r!s!w%O%Q%T%V(h,Q,T.u.w/P0}1O1W2]Q$ctW+p([)`+t,xU.d+j+m,uR0n.b0z!OPVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_R/a,m0}}PVX]`cjklmnopxyz!S!W!X!Y!]!g!j!r!s!w!y!z!|#Q#R#S#T#U#V#W#X#Y#Z#[#]#^#_#`#a#i#l#m#q#r$Q$R$T$z%O%Q%S%T%U%V%d%}&S&W&[&q&t&u&x'P']'a(R(V(h(t)T)X)n)u)y){*V*Z*[*|+^,Q,T,Y,c,e,g,m-`-a-t-z.[.u.w/P/X/y0O0T0e0s0}1O1R1S1W1k1o1{2W2]2r3p3u3x3y3z3{3|3}4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4_4`4a4b4c4k5O5R5S5V5Z5[5_5a5b5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5u5{5|5}6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6]6^6_6`6a6b6c6d6l7P7S7T7W7[7]7`7b7c7o7x7y7z7{7|7}8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8]8^8_8`8a8b8d8e8f8g8h8s9T9W9Z9^9_9a9c9f9h9o9p9s9u9v:Q:R:S:T:U:V:W:X:Y:Z:[:]:^:_:`:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:q:r:s:u:v:w;S;e;i;j;k;n;u;v;z;|;}V>W>[>]>^>c>h>i>l>n>o>p>q>v?^?_T$x{$|Q(q%QQ(v%TQ(y%VR2b1WQ%c!]Q(u%SQ,d(tQ/W,cQ/Y,eQ1Q/XR2_1RQ%q!fR)m%rR/p-O",nodeNames:"\u26A0 ( HeredocString EscapeSequence abstract LogicOp array as Boolean break case catch clone const continue default declare do echo else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final finally fn for foreach from function global goto if implements include include_once LogicOp insteadof interface list match namespace new null LogicOp print readonly require require_once return switch throw trait try unset use var Visibility while LogicOp yield LineComment BlockComment TextInterpolation PhpClose Text PhpOpen Template TextInterpolation EmptyStatement ; } { Block : LabelStatement Name ExpressionStatement ConditionalExpression LogicOp MatchExpression ) ( ParenthesizedExpression MatchBlock MatchArm , => AssignmentExpression ArrayExpression ValueList & VariadicUnpacking ... Pair [ ] ListExpression ValueList Pair Pair SubscriptExpression MemberExpression -> ?-> Name VariableName DynamicVariable $ ${ CallExpression ArgList NamedArgument SpreadArgument CastExpression UnionType LogicOp IntersectionType OptionalType NamedType QualifiedName \\ NamespaceName Name NamespaceName Name ScopedExpression :: ClassMemberName DynamicMemberName AssignOp UpdateExpression UpdateOp YieldExpression BinaryExpression LogicOp LogicOp LogicOp BitOp BitOp BitOp CompareOp CompareOp BitOp ArithOp ConcatOp ArithOp ArithOp IncludeExpression RequireExpression CloneExpression UnaryExpression ControlOp LogicOp PrintIntrinsic FunctionExpression static ParamList Parameter #[ Attributes Attribute VariadicParameter PropertyParameter PropertyHooks PropertyHook UseList ArrowFunction NewExpression class BaseClause ClassInterfaceClause DeclarationList ConstDeclaration VariableDeclarator PropertyDeclaration VariableDeclarator MethodDeclaration UseDeclaration UseList UseInsteadOfClause UseAsClause UpdateExpression ArithOp ShellExpression ThrowExpression Integer Float String MemberExpression SubscriptExpression UnaryExpression ArithOp Interpolation String IfStatement ColonBlock SwitchStatement Block CaseStatement DefaultStatement ColonBlock WhileStatement EmptyStatement DoStatement ForStatement ForSpec SequenceExpression ForeachStatement ForSpec Pair GotoStatement ContinueStatement BreakStatement ReturnStatement TryStatement CatchDeclarator DeclareStatement EchoStatement UnsetStatement ConstDeclaration FunctionDefinition ClassDeclaration InterfaceDeclaration TraitDeclaration EnumDeclaration EnumBody EnumCase NamespaceDefinition NamespaceUseDeclaration UseGroup UseClause UseClause GlobalDeclaration FunctionStaticDeclaration Program",maxTerm:318,nodeProps:[["group",-36,2,8,49,82,84,86,89,94,95,103,107,108,112,113,116,120,126,132,137,139,140,154,155,156,157,160,161,173,174,188,190,191,192,193,194,200,"Expression",-28,75,79,81,83,201,203,208,210,211,214,217,218,219,220,221,223,224,225,226,227,228,229,230,231,234,235,239,240,"Statement",-4,121,123,124,125,"Type"],["isolate",-4,67,68,71,200,""],["openedBy",70,"phpOpen",77,"{",87,"(",102,"#["],["closedBy",72,"phpClose",78,"}",88,")",165,"]"]],propSources:[Ww],skippedNodes:[0],repeatNodeCount:32,tokenData:"!GQ_R!]OX$zXY&^YZ'sZ]$z]^&^^p$zpq&^qr)Rrs+Pst+otu2buv5evw6rwx8Vxy>]yz>yz{?g{|@}|}Bb}!OCO!O!PDh!P!QKT!Q!R!!o!R![!$q![!]!,P!]!^!-a!^!_!-}!_!`!1S!`!a!2d!a!b!3t!b!c!7^!c!d!7z!d!e!9Y!e!}!7z!}#O!;b#O#P!V<%lO8VR9WV'TP%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X<%lO9mQ9rV%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X<%lO9mQ:^O%`QQ:aRO;'S9m;'S;=`:j;=`O9mQ:oW%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X;=`<%l9m<%lO9mQ;[P;=`<%l9mR;fV'TP%`QOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRV<%l~8V~O8V~~%fR=OW'TPOY8VYZ9PZ!^8V!^!_;{!_;'S8V;'S;=`=h;=`<%l9m<%lO8VR=mW%`QOw9mwx:Xx#O9m#O#P:^#P;'S9m;'S;=`;X;=`<%l8V<%lO9mR>YP;=`<%l8VR>dV!zQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zV?QV!yU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR?nY'TP$^QOY$zYZ%fZz$zz{@^{!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zR@eW$_Q'TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zRAUY$[Q'TPOY$zYZ%fZ{$z{|At|!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zRA{V%TQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRBiV#OQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_CXZ$[Q%^W'TPOY$zYZ%fZ}$z}!OAt!O!^$z!^!_%k!_!`6U!`!aCz!a;'S$z;'S;=`&W<%lO$zVDRV#aU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zVDo['TP$]QOY$zYZ%fZ!O$z!O!PEe!P!Q$z!Q![Fs![!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zVEjX'TPOY$zYZ%fZ!O$z!O!PFV!P!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zVF^V#VU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRFz_'TP%XQOY$zYZ%fZ!Q$z!Q![Fs![!^$z!^!_%k!_!g$z!g!hGy!h#R$z#R#SJc#S#X$z#X#YGy#Y;'S$z;'S;=`&W<%lO$zRHO]'TPOY$zYZ%fZ{$z{|Hw|}$z}!OHw!O!Q$z!Q![Ii![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRH|X'TPOY$zYZ%fZ!Q$z!Q![Ii![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zRIpZ'TP%XQOY$zYZ%fZ!Q$z!Q![Ii![!^$z!^!_%k!_#R$z#R#SHw#S;'S$z;'S;=`&W<%lO$zRJhX'TPOY$zYZ%fZ!Q$z!Q![Fs![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_K[['TP$^QOY$zYZ%fZz$zz{LQ{!P$z!P!Q,o!Q!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$z_LVX'TPOYLQYZLrZzLQz{N_{!^LQ!^!_! s!_;'SLQ;'S;=`!!i<%lOLQ_LwT'TPOzMWz{Mj{;'SMW;'S;=`NX<%lOMW^MZTOzMWz{Mj{;'SMW;'S;=`NX<%lOMW^MmVOzMWz{Mj{!PMW!P!QNS!Q;'SMW;'S;=`NX<%lOMW^NXO!f^^N[P;=`<%lMW_NdZ'TPOYLQYZLrZzLQz{N_{!PLQ!P!Q! V!Q!^LQ!^!_! s!_;'SLQ;'S;=`!!i<%lOLQ_! ^V!f^'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_! vZOYLQYZLrZzLQz{N_{!aLQ!a!bMW!b;'SLQ;'S;=`!!i<%l~LQ~OLQ~~%f_!!lP;=`<%lLQZ!!vm'TP%WYOY$zYZ%fZ!O$z!O!PFs!P!Q$z!Q![!$q![!^$z!^!_%k!_!d$z!d!e!&o!e!g$z!g!hGy!h!q$z!q!r!(a!r!z$z!z!{!){!{#R$z#R#S!%}#S#U$z#U#V!&o#V#X$z#X#YGy#Y#c$z#c#d!(a#d#l$z#l#m!){#m;'S$z;'S;=`&W<%lO$zZ!$xa'TP%WYOY$zYZ%fZ!O$z!O!PFs!P!Q$z!Q![!$q![!^$z!^!_%k!_!g$z!g!hGy!h#R$z#R#S!%}#S#X$z#X#YGy#Y;'S$z;'S;=`&W<%lO$zZ!&SX'TPOY$zYZ%fZ!Q$z!Q![!$q![!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zZ!&tY'TPOY$zYZ%fZ!Q$z!Q!R!'d!R!S!'d!S!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zZ!'k['TP%WYOY$zYZ%fZ!Q$z!Q!R!'d!R!S!'d!S!^$z!^!_%k!_#R$z#R#S!&o#S;'S$z;'S;=`&W<%lO$zZ!(fX'TPOY$zYZ%fZ!Q$z!Q!Y!)R!Y!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zZ!)YZ'TP%WYOY$zYZ%fZ!Q$z!Q!Y!)R!Y!^$z!^!_%k!_#R$z#R#S!(a#S;'S$z;'S;=`&W<%lO$zZ!*Q]'TPOY$zYZ%fZ!Q$z!Q![!*y![!^$z!^!_%k!_!c$z!c!i!*y!i#T$z#T#Z!*y#Z;'S$z;'S;=`&W<%lO$zZ!+Q_'TP%WYOY$zYZ%fZ!Q$z!Q![!*y![!^$z!^!_%k!_!c$z!c!i!*y!i#R$z#R#S!){#S#T$z#T#Z!*y#Z;'S$z;'S;=`&W<%lO$zR!,WX!rQ'TPOY$zYZ%fZ![$z![!]!,s!]!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!,zV#yQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zV!-hV!nU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!.S[$YQOY$zYZ%fZ!^$z!^!_!.x!_!`!/i!`!a*c!a!b!0]!b;'S$z;'S;=`&W<%l~$z~O$z~~%fR!/PW$ZQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zR!/pX$YQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`$z!`!a*c!a;'S$z;'S;=`&W<%lO$zP!0bR!jP!_!`!0k!r!s!0p#d#e!0pP!0pO!jPP!0sQ!j!k!0y#[#]!0yP!0|Q!r!s!0k#d#e!0k_!1ZX#|Y'TPOY$zYZ%fZ!^$z!^!_%k!_!`)r!`!a!1v!a;'S$z;'S;=`&W<%lO$zV!1}V#PU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!2kX$YQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`!3W!`!a!.x!a;'S$z;'S;=`&W<%lO$zR!3_V$YQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!3{[!wQ'TPOY$zYZ%fZ}$z}!O!4q!O!^$z!^!_%k!_!`$z!`!a!6P!a!b!6m!b;'S$z;'S;=`&W<%lO$zV!4vX'TPOY$zYZ%fZ!^$z!^!_%k!_!`$z!`!a!5c!a;'S$z;'S;=`&W<%lO$zV!5jV#bU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!6WV!h^'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!6tW$RQ'TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`;'S$z;'S;=`&W<%lO$zR!7eV$dQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!8Ta'aS'TP'WYOY$zYZ%fZ!Q$z!Q![!7z![!^$z!^!_%k!_!c$z!c!}!7z!}#R$z#R#S!7z#S#T$z#T#o!7z#o$g$z$g&j!7z&j;'S$z;'S;=`&W<%lO$z_!9ce'aS'TP'WYOY$zYZ%fZr$zrs!:tsw$zwx8Vx!Q$z!Q![!7z![!^$z!^!_%k!_!c$z!c!}!7z!}#R$z#R#S!7z#S#T$z#T#o!7z#o$g$z$g&j!7z&j;'S$z;'S;=`&W<%lO$zR!:{V'TP'uQOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zV!;iV#XU'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!OZ'TPOY!=yYZ!>qZ!^!=y!^!_!@y!_#O!=y#O#P!Au#P#S!=y#S#T!CP#T;'S!=y;'S;=`!Cm<%lO!=yR!>vV'TPO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s<%lO!?]Q!?`VO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s<%lO!?]Q!?xRO;'S!?];'S;=`!@R;=`O!?]Q!@UWO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s;=`<%l!?]<%lO!?]Q!@sO%UQQ!@vP;=`<%l!?]R!@|]OY!=yYZ!>qZ!a!=y!a!b!?]!b#O!=y#O#P!Au#P#S!=y#S#T!CP#T;'S!=y;'S;=`!Cm<%l~!=y~O!=y~~%fR!AzW'TPOY!=yYZ!>qZ!^!=y!^!_!@y!_;'S!=y;'S;=`!Bd;=`<%l!?]<%lO!=yR!BgWO#O!?]#O#P!?u#P#S!?]#S#T!@n#T;'S!?];'S;=`!@s;=`<%l!=y<%lO!?]R!CWV%UQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!CpP;=`<%l!=y_!CzV!p^'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z_!DjY$UQ#n['TPOY$zYZ%fZ!^$z!^!_%k!_!`6U!`#p$z#p#q!EY#q;'S$z;'S;=`&W<%lO$zR!EaV$SQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!E}V!oQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$zR!FkV$eQ'TPOY$zYZ%fZ!^$z!^!_%k!_;'S$z;'S;=`&W<%lO$z",tokenizers:[Rw,Uw,qw,0,1,2,3,Vw],topRules:{Template:[0,73],Program:[1,241]},dynamicPrecedences:{298:1},specialized:[{term:284,get:(O,e)=>xm(O)<<1,external:xm},{term:284,get:O=>jw[O]||-1}],tokenPrec:29889});var Cw=ne.define({name:"php",parser:Zm.configure({props:[se.add({IfStatement:le({except:/^\s*({|else\b|elseif\b|endif\b)/}),TryStatement:le({except:/^\s*({|catch\b|finally\b)/}),SwitchBody:O=>{let e=O.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return O.baseIndent+(t?0:i?1:2)*O.unit},ColonBlock:O=>O.baseIndent+O.unit,"Block EnumBody DeclarationList":be({closing:"}"}),ArrowFunction:O=>O.baseIndent+O.unit,"String BlockComment":()=>null,Statement:le({except:/^({|end(for|foreach|switch|while)\b)/})}),te.add({"Block EnumBody DeclarationList SwitchBody ArrayExpression ValueList":me,ColonBlock(O){return{from:O.from+1,to:O.to}},BlockComment(O){return{from:O.from+2,to:O.to-2}}})]}),languageData:{commentTokens:{block:{open:"/*",close:"*/"},line:"//"},indentOnInput:/^\s*(?:case |default:|end(?:if|for(?:each)?|switch|while)|else(?:if)?|\{|\})$/,wordChars:"$",closeBrackets:{stringPrefixes:["b","B"]}}});function vm(O={}){let e=[],t;if(O.baseLanguage!==null)if(O.baseLanguage)t=O.baseLanguage;else{let i=Ti({matchClosingTags:!1});e.push(i.support),t=i.language}return new J(Cw.configure({wrap:t&&xO(i=>i.type.isTop?{parser:t.parser,overlay:r=>r.name=="Text"}:null),top:O.plain?"Program":"Template"}),e)}var Gw=1,zm=194,Um=195,Ew=196,Ym=197,Aw=198,Lw=199,Mw=200,Dw=2,Wm=3,_m=201,Iw=24,Bw=25,Nw=49,Fw=50,Hw=55,Kw=56,Jw=57,eZ=59,tZ=60,OZ=61,iZ=62,rZ=63,nZ=65,sZ=238,aZ=71,oZ=241,lZ=242,cZ=243,hZ=244,fZ=245,dZ=246,uZ=247,QZ=248,jm=72,$Z=249,pZ=250,mZ=251,gZ=252,PZ=253,SZ=254,XZ=255,TZ=256,bZ=73,yZ=77,xZ=263,kZ=112,wZ=130,ZZ=151,vZ=152,YZ=155,WO=10,Ur=13,Lc=32,js=9,Mc=35,_Z=40,RZ=46,Ac=123,Rm=125,Cm=39,Gm=34,Vm=92,VZ=111,qZ=120,zZ=78,UZ=117,WZ=85,jZ=new Set([Bw,Nw,Fw,xZ,nZ,wZ,Kw,Jw,sZ,iZ,rZ,jm,bZ,yZ,tZ,OZ,ZZ,vZ,YZ,kZ]);function Gc(O){return O==WO||O==Ur}function Ec(O){return O>=48&&O<=57||O>=65&&O<=70||O>=97&&O<=102}var CZ=new z((O,e)=>{let t;if(O.next<0)O.acceptToken(Lw);else if(e.context.flags&Us)Gc(O.next)&&O.acceptToken(Aw,1);else if(((t=O.peek(-1))<0||Gc(t))&&e.canShift(Ym)){let i=0;for(;O.next==Lc||O.next==js;)O.advance(),i++;(O.next==WO||O.next==Ur||O.next==Mc)&&O.acceptToken(Ym,-i)}else Gc(O.next)&&O.acceptToken(Ew,1)},{contextual:!0}),GZ=new z((O,e)=>{let t=e.context;if(t.flags)return;let i=O.peek(-1);if(i==WO||i==Ur){let r=0,n=0;for(;;){if(O.next==Lc)r++;else if(O.next==js)r+=8-r%8;else break;O.advance(),n++}r!=t.indent&&O.next!=WO&&O.next!=Ur&&O.next!=Mc&&(r[O,e|Em])),LZ=new Ge({start:EZ,reduce(O,e,t,i){return O.flags&Us&&jZ.has(e)||(e==aZ||e==jm)&&O.flags&Em?O.parent:O},shift(O,e,t,i){return e==zm?new Ws(O,AZ(i.read(i.pos,t.pos)),0):e==Um?O.parent:e==Iw||e==Hw||e==eZ||e==Wm?new Ws(O,0,Us):qm.has(e)?new Ws(O,0,qm.get(e)|O.flags&Us):O},hash(O){return O.hash}}),MZ=new z(O=>{for(let e=0;e<5;e++){if(O.next!="print".charCodeAt(e))return;O.advance()}if(!/\w/.test(String.fromCharCode(O.next)))for(let e=0;;e++){let t=O.peek(e);if(!(t==Lc||t==js)){t!=_Z&&t!=RZ&&t!=WO&&t!=Ur&&t!=Mc&&O.acceptToken(Gw);return}}}),DZ=new z((O,e)=>{let{flags:t}=e.context,i=t&jt?Gm:Cm,r=(t&Ct)>0,n=!(t&Gt),s=(t&Et)>0,a=O.pos;for(;!(O.next<0);)if(s&&O.next==Ac)if(O.peek(1)==Ac)O.advance(2);else{if(O.pos==a){O.acceptToken(Wm,1);return}break}else if(n&&O.next==Vm){if(O.pos==a){O.advance();let o=O.next;o>=0&&(O.advance(),IZ(O,o)),O.acceptToken(Dw);return}break}else if(O.next==Vm&&!n&&O.peek(1)>-1)O.advance(2);else if(O.next==i&&(!r||O.peek(1)==i&&O.peek(2)==i)){if(O.pos==a){O.acceptToken(_m,r?3:1);return}break}else if(O.next==WO){if(r)O.advance();else if(O.pos==a){O.acceptToken(_m);return}break}else O.advance();O.pos>a&&O.acceptToken(Mw)});function IZ(O,e){if(e==VZ)for(let t=0;t<2&&O.next>=48&&O.next<=55;t++)O.advance();else if(e==qZ)for(let t=0;t<2&&Ec(O.next);t++)O.advance();else if(e==UZ)for(let t=0;t<4&&Ec(O.next);t++)O.advance();else if(e==WZ)for(let t=0;t<8&&Ec(O.next);t++)O.advance();else if(e==zZ&&O.next==Ac){for(O.advance();O.next>=0&&O.next!=Rm&&O.next!=Cm&&O.next!=Gm&&O.next!=WO;)O.advance();O.next==Rm&&O.advance()}}var BZ=F({'async "*" "**" FormatConversion FormatSpec':d.modifier,"for while if elif else try except finally return raise break continue with pass assert await yield match case":d.controlKeyword,"in not and or is del":d.operatorKeyword,"from def class global nonlocal lambda":d.definitionKeyword,import:d.moduleKeyword,"with as print":d.keyword,Boolean:d.bool,None:d.null,VariableName:d.variableName,"CallExpression/VariableName":d.function(d.variableName),"FunctionDefinition/VariableName":d.function(d.definition(d.variableName)),"ClassDefinition/VariableName":d.definition(d.className),PropertyName:d.propertyName,"CallExpression/MemberExpression/PropertyName":d.function(d.propertyName),Comment:d.lineComment,Number:d.number,String:d.string,FormatString:d.special(d.string),Escape:d.escape,UpdateOp:d.updateOperator,"ArithOp!":d.arithmeticOperator,BitOp:d.bitwiseOperator,CompareOp:d.compareOperator,AssignOp:d.definitionOperator,Ellipsis:d.punctuation,At:d.meta,"( )":d.paren,"[ ]":d.squareBracket,"{ }":d.brace,".":d.derefOperator,", ;":d.separator}),NZ={__proto__:null,await:44,or:54,and:56,in:60,not:62,is:64,if:70,else:72,lambda:76,yield:94,from:96,async:102,for:104,None:162,True:164,False:164,del:178,pass:182,break:186,continue:190,return:194,raise:202,import:206,as:208,global:212,nonlocal:214,assert:218,type:223,elif:236,while:240,try:246,except:248,finally:250,with:254,def:258,class:268,match:279,case:285},Am=Oe.deserialize({version:14,states:"##jO`QeOOP$}OSOOO&WQtO'#HUOOQS'#Co'#CoOOQS'#Cp'#CpO'vQdO'#CnO*UQtO'#HTOOQS'#HU'#HUOOQS'#DU'#DUOOQS'#HT'#HTO*rQdO'#D_O+VQdO'#DfO+gQdO'#DjO+zOWO'#DuO,VOWO'#DvO.[QtO'#GuOOQS'#Gu'#GuO'vQdO'#GtO0ZQtO'#GtOOQS'#Eb'#EbO0rQdO'#EcOOQS'#Gs'#GsO0|QdO'#GrOOQV'#Gr'#GrO1XQdO'#FYOOQS'#G^'#G^O1^QdO'#FXOOQV'#IS'#ISOOQV'#Gq'#GqOOQV'#Fq'#FqQ`QeOOO'vQdO'#CqO1lQdO'#C}O1sQdO'#DRO2RQdO'#HYO2cQtO'#EVO'vQdO'#EWOOQS'#EY'#EYOOQS'#E['#E[OOQS'#E^'#E^O2wQdO'#E`O3_QdO'#EdO3rQdO'#EfO3zQtO'#EfO1XQdO'#EiO0rQdO'#ElO1XQdO'#EnO0rQdO'#EtO0rQdO'#EwO4VQdO'#EyO4^QdO'#FOO4iQdO'#EzO0rQdO'#FOO1XQdO'#FQO1XQdO'#FVO4nQdO'#F[P4uOdO'#GpPOOO)CBd)CBdOOQS'#Ce'#CeOOQS'#Cf'#CfOOQS'#Cg'#CgOOQS'#Ch'#ChOOQS'#Ci'#CiOOQS'#Cj'#CjOOQS'#Cl'#ClO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO'vQdO,59OO5TQdO'#DoOOQS,5:Y,5:YO5hQdO'#HdOOQS,5:],5:]O5uQ!fO,5:]O5zQtO,59YO1lQdO,59bO1lQdO,59bO1lQdO,59bO8jQdO,59bO8oQdO,59bO8vQdO,59jO8}QdO'#HTO:TQdO'#HSOOQS'#HS'#HSOOQS'#D['#D[O:lQdO,59aO'vQdO,59aO:zQdO,59aOOQS,59y,59yO;PQdO,5:RO'vQdO,5:ROOQS,5:Q,5:QO;_QdO,5:QO;dQdO,5:XO'vQdO,5:XO'vQdO,5:VOOQS,5:U,5:UO;uQdO,5:UO;zQdO,5:WOOOW'#Fy'#FyOOOOQS'#Ds'#DsOOQS1G/w1G/wOOQS1G.|1G.|O!/[QtO1G.|O!/cQtO1G.|O1lQdO1G.|O!0OQdO1G/UOOQS'#DZ'#DZO0rQdO,59tOOQS1G.{1G.{O!0VQdO1G/eO!0gQdO1G/eO!0oQdO1G/fO'vQdO'#H[O!0tQdO'#H[O!0yQtO1G.{O!1ZQdO,59iO!2aQdO,5=zO!2qQdO,5=zO!2yQdO1G/mO!3OQtO1G/mOOQS1G/l1G/lO!3`QdO,5=uO!4VQdO,5=uO0rQdO1G/qO!4tQdO1G/sO!4yQtO1G/sO!5ZQtO1G/qOOQS1G/p1G/pOOQS1G/r1G/rOOOW-E9w-E9wOOQS1G/{1G/{O!5kQdO'#HxO0rQdO'#HxO!5|QdO,5>cOOOW-E9x-E9xOOQS1G/|1G/|OOQS-E9{-E9{O!6[Q#xO1G2zO!6{QtO1G2zO'vQdO,5kOOQS1G1`1G1`O!8RQdO1G1`OOQS'#DV'#DVO0rQdO,5=qOOQS,5=q,5=qO!8WQdO'#FrO!8cQdO,59oO!8kQdO1G/XO!8uQtO,5=uOOQS1G3`1G3`OOQS,5:m,5:mO!9fQdO'#GtOOQS,5jO!;ZQdO,5>jO1XQdO,5>jO!;lQdO,5>iOOQS-E:R-E:RO!;qQdO1G0lO!;|QdO1G0lO!lO!lO!hO!=VQdO,5>hO!=hQdO'#EpO0rQdO1G0tO!=sQdO1G0tO!=xQgO1G0zO!AvQgO1G0}O!EqQdO,5>oO!E{QdO,5>oO!FTQtO,5>oO0rQdO1G1PO!F_QdO1G1PO4iQdO1G1UO!!vQdO1G1WOOQV,5;a,5;aO!FdQfO,5;aO!FiQgO1G1QO!JjQdO'#GZO4iQdO1G1QO4iQdO1G1QO!JzQdO,5>pO!KXQdO,5>pO1XQdO,5>pOOQV1G1U1G1UO!KaQdO'#FSO!KrQ!fO1G1WO!KzQdO1G1WOOQV1G1]1G1]O4iQdO1G1]O!LPQdO1G1]O!LXQdO'#F^OOQV1G1b1G1bO!#ZQtO1G1bPOOO1G2v1G2vP!L^OSO1G2vOOQS,5=},5=}OOQS'#Dp'#DpO0rQdO,5=}O!LfQdO,5=|O!LyQdO,5=|OOQS1G/u1G/uO!MRQdO,5>PO!McQdO,5>PO!MkQdO,5>PO!NOQdO,5>PO!N`QdO,5>POOQS1G3j1G3jOOQS7+$h7+$hO!8kQdO7+$pO#!RQdO1G.|O#!YQdO1G.|OOQS1G/`1G/`OOQS,5<`,5<`O'vQdO,5<`OOQS7+%P7+%PO#!aQdO7+%POOQS-E9r-E9rOOQS7+%Q7+%QO#!qQdO,5=vO'vQdO,5=vOOQS7+$g7+$gO#!vQdO7+%PO##OQdO7+%QO##TQdO1G3fOOQS7+%X7+%XO##eQdO1G3fO##mQdO7+%XOOQS,5<_,5<_O'vQdO,5<_O##rQdO1G3aOOQS-E9q-E9qO#$iQdO7+%]OOQS7+%_7+%_O#$wQdO1G3aO#%fQdO7+%_O#%kQdO1G3gO#%{QdO1G3gO#&TQdO7+%]O#&YQdO,5>dO#&sQdO,5>dO#&sQdO,5>dOOQS'#Dx'#DxO#'UO&jO'#DzO#'aO`O'#HyOOOW1G3}1G3}O#'fQdO1G3}O#'nQdO1G3}O#'yQ#xO7+(fO#(jQtO1G2UP#)TQdO'#GOOOQS,5nQdO,5sQdO1G4OOOQS-E9y-E9yO#?^QdO1G4OO<[QdO'#H{OOOO'#D{'#D{OOOO'#F|'#F|O#?oO&jO,5:fOOOW,5>e,5>eOOOW7+)i7+)iO#?zQdO7+)iO#@SQdO1G2zO#@mQdO1G2zP'vQdO'#FuO0rQdO<mO#BQQdO,5>mOOQS1G0v1G0vOOQS<rO#KgQdO,5>rO#KrQdO,5>rO#K}QdO,5>qO#L`QdO,5>qOOQS1G1Y1G1YOOQS,5;p,5;pOOQV<VAN>VO$ oQdO<cAN>cO0rQdO1G1|O$!PQtO1G1|P$!ZQdO'#FvOOQS1G2R1G2RP$!hQdO'#F{O$!uQdO7+)jO$#`QdO,5>gOOOO-E9z-E9zOOOW<tO$4{QdO,5>tO1XQdO,5vO$)nQdO,5>vOOQS1G1p1G1pOOQS,5<[,5<[OOQU7+'P7+'PO$+zQdO1G/iO$)nQdO,5wO$8zQdO,5>wOOQS1G1s1G1sOOQS7+'S7+'SP$)nQdO'#GdO$9SQdO1G4bO$9^QdO1G4bO$9fQdO1G4bOOQS7+%T7+%TO$9tQdO1G1tO$:SQtO'#FaO$:ZQdO,5<}OOQS,5<},5<}O$:iQdO1G4cOOQS-E:a-E:aO$)nQdO,5<|O$:pQdO,5<|O$:uQdO7+)|OOQS-E:`-E:`O$;PQdO7+)|O$)nQdO,5S~O%cOS%^OSSOS%]PQ~OPdOVaOfoOhYOopOs!POvqO!PrO!Q{O!T!SO!U!RO!XZO!][O!h`O!r`O!s`O!t`O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO#l!QO#o!TO#s!UO#u!VO#z!WO#}hO$P!XO%oRO%pRO%tSO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O~O%]!YO~OV!aO_!aOa!bOh!iO!X!kO!f!mO%j![O%k!]O%l!^O%m!_O%n!_O%o!`O%p!`O%q!aO%r!aO%s!aO~Ok%xXl%xXm%xXn%xXo%xXp%xXs%xXz%xX{%xX!x%xX#g%xX%[%xX%_%xX%z%xXg%xX!T%xX!U%xX%{%xX!W%xX![%xX!Q%xX#[%xXt%xX!m%xX~P%SOfoOhYO!XZO!][O!h`O!r`O!s`O!t`O%oRO%pRO%tSO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O~Oz%wX{%wX#g%wX%[%wX%_%wX%z%wX~Ok!pOl!qOm!oOn!oOo!rOp!sOs!tO!x%wX~P)pOV!zOg!|Oo0cOv0qO!PrO~P'vOV#OOo0cOv0qO!W#PO~P'vOV#SOa#TOo0cOv0qO![#UO~P'vOQ#XO%`#XO%a#ZO~OQ#^OR#[O%`#^O%a#`O~OV%iX_%iXa%iXh%iXk%iXl%iXm%iXn%iXo%iXp%iXs%iXz%iX!X%iX!f%iX%j%iX%k%iX%l%iX%m%iX%n%iX%o%iX%p%iX%q%iX%r%iX%s%iXg%iX!T%iX!U%iX~O&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O&c^O&d^O&e^O&f^O&g^O&h^O&i^O&j^O{%iX!x%iX#g%iX%[%iX%_%iX%z%iX%{%iX!W%iX![%iX!Q%iX#[%iXt%iX!m%iX~P,eOz#dO{%hX!x%hX#g%hX%[%hX%_%hX%z%hX~Oo0cOv0qO~P'vO#g#gO%[#iO%_#iO~O%uWO~O!T#nO#u!VO#z!WO#}hO~OopO~P'vOV#sOa#tO%uWO{wP~OV#xOo0cOv0qO!Q#yO~P'vO{#{O!x$QO%z#|O#g!yX%[!yX%_!yX~OV#xOo0cOv0qO#g#SX%[#SX%_#SX~P'vOo0cOv0qO#g#WX%[#WX%_#WX~P'vOh$WO%uWO~O!f$YO!r$YO%uWO~OV$eO~P'vO!U$gO#s$hO#u$iO~O{$jO~OV$qO~P'vOS$sO%[$rO%_$rO%c$tO~OV$}Oa$}Og%POo0cOv0qO~P'vOo0cOv0qO{%SO~P'vO&Y%UO~Oa!bOh!iO!X!kO!f!mOVba_bakbalbambanbaobapbasbazba{ba!xba#gba%[ba%_ba%jba%kba%lba%mba%nba%oba%pba%qba%rba%sba%zbagba!Tba!Uba%{ba!Wba![ba!Qba#[batba!mba~On%ZO~Oo%ZO~P'vOo0cO~P'vOk0eOl0fOm0dOn0dOo0mOp0nOs0rOg%wX!T%wX!U%wX%{%wX!W%wX![%wX!Q%wX#[%wX!m%wX~P)pO%{%]Og%vXz%vX!T%vX!U%vX!W%vX{%vX~Og%_Oz%`O!T%dO!U%cO~Og%_O~Oz%gO!T%dO!U%cO!W&SX~O!W%kO~Oz%lO{%nO!T%dO!U%cO![%}X~O![%rO~O![%sO~OQ#XO%`#XO%a%uO~OV%wOo0cOv0qO!PrO~P'vOQ#^OR#[O%`#^O%a%zO~OV!qa_!qaa!qah!qak!qal!qam!qan!qao!qap!qas!qaz!qa{!qa!X!qa!f!qa!x!qa#g!qa%[!qa%_!qa%j!qa%k!qa%l!qa%m!qa%n!qa%o!qa%p!qa%q!qa%r!qa%s!qa%z!qag!qa!T!qa!U!qa%{!qa!W!qa![!qa!Q!qa#[!qat!qa!m!qa~P#yOz%|O{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~P%SOV&OOopOvqO{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~P'vOz%|O{%ha!x%ha#g%ha%[%ha%_%ha%z%ha~OPdOVaOopOvqO!PrO!Q{O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO#g$zX%[$zX%_$zX~P'vO#g#gO%[&TO%_&TO~O!f&UOh&sX%[&sXz&sX#[&sX#g&sX%_&sX#Z&sXg&sX~Oh!iO%[&WO~Okealeameaneaoeapeaseazea{ea!xea#gea%[ea%_ea%zeagea!Tea!Uea%{ea!Wea![ea!Qea#[eatea!mea~P%SOsqazqa{qa#gqa%[qa%_qa%zqa~Ok!pOl!qOm!oOn!oOo!rOp!sO!xqa~PEcO%z&YOz%yX{%yX~O%uWOz%yX{%yX~Oz&]O{wX~O{&_O~Oz%lO#g%}X%[%}X%_%}Xg%}X{%}X![%}X!m%}X%z%}X~OV0lOo0cOv0qO!PrO~P'vO%z#|O#gUa%[Ua%_Ua~Oz&hO#g&PX%[&PX%_&PXn&PX~P%SOz&kO!Q&jO#g#Wa%[#Wa%_#Wa~Oz&lO#[&nO#g&rX%[&rX%_&rXg&rX~O!f$YO!r$YO#Z&qO%uWO~O#Z&qO~Oz&sO#g&tX%[&tX%_&tX~Oz&uO#g&pX%[&pX%_&pX{&pX~O!X&wO%z&xO~Oz&|On&wX~P%SOn'PO~OPdOVaOopOvqO!PrO!Q{O!{tO!}uO#PvO#RwO#TxO#XyO#ZzO#^|O#_|O#a}O#c!OO%['UO~P'vOt'YO#p'WO#q'XOP#naV#naf#nah#nao#nas#nav#na!P#na!Q#na!T#na!U#na!X#na!]#na!h#na!r#na!s#na!t#na!{#na!}#na#P#na#R#na#T#na#X#na#Z#na#^#na#_#na#a#na#c#na#l#na#o#na#s#na#u#na#z#na#}#na$P#na%X#na%o#na%p#na%t#na%u#na&Z#na&[#na&]#na&^#na&_#na&`#na&a#na&b#na&c#na&d#na&e#na&f#na&g#na&h#na&i#na&j#na%Z#na%_#na~Oz'ZO#[']O{&xX~Oh'_O!X&wO~Oh!iO{$jO!X&wO~O{'eO~P%SO%['hO%_'hO~OS'iO%['hO%_'hO~OV!aO_!aOa!bOh!iO!X!kO!f!mO%l!^O%m!_O%n!_O%o!`O%p!`O%q!aO%r!aO%s!aOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~O%k!]O~P!#uO%kWi~P!#uOV!aO_!aOa!bOh!iO!X!kO!f!mO%o!`O%p!`O%q!aO%r!aO%s!aOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%kWi%lWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~O%m!_O%n!_O~P!&pO%mWi%nWi~P!&pOa!bOh!iO!X!kO!f!mOkWilWimWinWioWipWisWizWi{Wi!xWi#gWi%[Wi%_Wi%jWi%kWi%lWi%mWi%nWi%oWi%pWi%zWigWi!TWi!UWi%{Wi!WWi![Wi!QWi#[WitWi!mWi~OV!aO_!aO%q!aO%r!aO%s!aO~P!)nOVWi_Wi%qWi%rWi%sWi~P!)nO!T%dO!U%cOg&VXz&VX~O%z'kO%{'kO~P,eOz'mOg&UX~Og'oO~Oz'pO{'rO!W&XX~Oo0cOv0qOz'pO{'sO!W&XX~P'vO!W'uO~Om!oOn!oOo!rOp!sOkjisjizji{ji!xji#gji%[ji%_ji%zji~Ol!qO~P!.aOlji~P!.aOk0eOl0fOm0dOn0dOo0mOp0nO~Ot'wO~P!/jOV'|Og'}Oo0cOv0qO~P'vOg'}Oz(OO~Og(QO~O!U(SO~Og(TOz(OO!T%dO!U%cO~P%SOk0eOl0fOm0dOn0dOo0mOp0nOgqa!Tqa!Uqa%{qa!Wqa![qa!Qqa#[qatqa!mqa~PEcOV'|Oo0cOv0qO!W&Sa~P'vOz(WO!W&Sa~O!W(XO~Oz(WO!T%dO!U%cO!W&Sa~P%SOV(]Oo0cOv0qO![%}a#g%}a%[%}a%_%}ag%}a{%}a!m%}a%z%}a~P'vOz(^O![%}a#g%}a%[%}a%_%}ag%}a{%}a!m%}a%z%}a~O![(aO~Oz(^O!T%dO!U%cO![%}a~P%SOz(dO!T%dO!U%cO![&Ta~P%SOz(gO{&lX![&lX!m&lX%z&lX~O{(kO![(mO!m(nO%z(jO~OV&OOopOvqO{%hi!x%hi#g%hi%[%hi%_%hi%z%hi~P'vOz(pO{%hi!x%hi#g%hi%[%hi%_%hi%z%hi~O!f&UOh&sa%[&saz&sa#[&sa#g&sa%_&sa#Z&sag&sa~O%[(uO~OV#sOa#tO%uWO~Oz&]O{wa~OopOvqO~P'vOz(^O#g%}a%[%}a%_%}ag%}a{%}a![%}a!m%}a%z%}a~P%SOz(zO#g%hX%[%hX%_%hX%z%hX~O%z#|O#gUi%[Ui%_Ui~O#g&Pa%[&Pa%_&Pan&Pa~P'vOz(}O#g&Pa%[&Pa%_&Pan&Pa~O%uWO#g&ra%[&ra%_&rag&ra~Oz)SO#g&ra%[&ra%_&rag&ra~Og)VO~OV)WOh$WO%uWO~O#Z)XO~O%uWO#g&ta%[&ta%_&ta~Oz)ZO#g&ta%[&ta%_&ta~Oo0cOv0qO#g&pa%[&pa%_&pa{&pa~P'vOz)^O#g&pa%[&pa%_&pa{&pa~OV)`Oa)`O%uWO~O%z)eO~Ot)hO#j)gOP#hiV#hif#hih#hio#his#hiv#hi!P#hi!Q#hi!T#hi!U#hi!X#hi!]#hi!h#hi!r#hi!s#hi!t#hi!{#hi!}#hi#P#hi#R#hi#T#hi#X#hi#Z#hi#^#hi#_#hi#a#hi#c#hi#l#hi#o#hi#s#hi#u#hi#z#hi#}#hi$P#hi%X#hi%o#hi%p#hi%t#hi%u#hi&Z#hi&[#hi&]#hi&^#hi&_#hi&`#hi&a#hi&b#hi&c#hi&d#hi&e#hi&f#hi&g#hi&h#hi&i#hi&j#hi%Z#hi%_#hi~Ot)iOP#kiV#kif#kih#kio#kis#kiv#ki!P#ki!Q#ki!T#ki!U#ki!X#ki!]#ki!h#ki!r#ki!s#ki!t#ki!{#ki!}#ki#P#ki#R#ki#T#ki#X#ki#Z#ki#^#ki#_#ki#a#ki#c#ki#l#ki#o#ki#s#ki#u#ki#z#ki#}#ki$P#ki%X#ki%o#ki%p#ki%t#ki%u#ki&Z#ki&[#ki&]#ki&^#ki&_#ki&`#ki&a#ki&b#ki&c#ki&d#ki&e#ki&f#ki&g#ki&h#ki&i#ki&j#ki%Z#ki%_#ki~OV)kOn&wa~P'vOz)lOn&wa~Oz)lOn&wa~P%SOn)pO~O%Y)tO~Ot)wO#p'WO#q)vOP#niV#nif#nih#nio#nis#niv#ni!P#ni!Q#ni!T#ni!U#ni!X#ni!]#ni!h#ni!r#ni!s#ni!t#ni!{#ni!}#ni#P#ni#R#ni#T#ni#X#ni#Z#ni#^#ni#_#ni#a#ni#c#ni#l#ni#o#ni#s#ni#u#ni#z#ni#}#ni$P#ni%X#ni%o#ni%p#ni%t#ni%u#ni&Z#ni&[#ni&]#ni&^#ni&_#ni&`#ni&a#ni&b#ni&c#ni&d#ni&e#ni&f#ni&g#ni&h#ni&i#ni&j#ni%Z#ni%_#ni~OV)zOo0cOv0qO{$jO~P'vOo0cOv0qO{&xa~P'vOz*OO{&xa~OV*SOa*TOg*WO%q*UO%uWO~O{$jO&{*YO~Oh'_O~Oh!iO{$jO~O%[*_O~O%[*aO%_*aO~OV$}Oa$}Oo0cOv0qOg&Ua~P'vOz*dOg&Ua~Oo0cOv0qO{*gO!W&Xa~P'vOz*hO!W&Xa~Oo0cOv0qOz*hO{*kO!W&Xa~P'vOo0cOv0qOz*hO!W&Xa~P'vOz*hO{*kO!W&Xa~Om0dOn0dOo0mOp0nOgjikjisjizji!Tji!Uji%{ji!Wji{ji![ji#gji%[ji%_ji!Qji#[jitji!mji%zji~Ol0fO~P!NkOlji~P!NkOV'|Og*pOo0cOv0qO~P'vOn*rO~Og*pOz*tO~Og*uO~OV'|Oo0cOv0qO!W&Si~P'vOz*vO!W&Si~O!W*wO~OV(]Oo0cOv0qO![%}i#g%}i%[%}i%_%}ig%}i{%}i!m%}i%z%}i~P'vOz*zO!T%dO!U%cO![&Ti~Oz*}O![%}i#g%}i%[%}i%_%}ig%}i{%}i!m%}i%z%}i~O![+OO~Oa+QOo0cOv0qO![&Ti~P'vOz*zO![&Ti~O![+SO~OV+UOo0cOv0qO{&la![&la!m&la%z&la~P'vOz+VO{&la![&la!m&la%z&la~O!]+YO&n+[O![!nX~O![+^O~O{(kO![+_O~O{(kO![+_O!m+`O~OV&OOopOvqO{%hq!x%hq#g%hq%[%hq%_%hq%z%hq~P'vOz$ri{$ri!x$ri#g$ri%[$ri%_$ri%z$ri~P%SOV&OOopOvqO~P'vOV&OOo0cOv0qO#g%ha%[%ha%_%ha%z%ha~P'vOz+aO#g%ha%[%ha%_%ha%z%ha~Oz$ia#g$ia%[$ia%_$ian$ia~P%SO#g&Pi%[&Pi%_&Pin&Pi~P'vOz+dO#g#Wq%[#Wq%_#Wq~O#[+eOz$va#g$va%[$va%_$vag$va~O%uWO#g&ri%[&ri%_&rig&ri~Oz+gO#g&ri%[&ri%_&rig&ri~OV+iOh$WO%uWO~O%uWO#g&ti%[&ti%_&ti~Oo0cOv0qO#g&pi%[&pi%_&pi{&pi~P'vO{#{Oz#eX!W#eX~Oz+mO!W&uX~O!W+oO~Ot+rO#j)gOP#hqV#hqf#hqh#hqo#hqs#hqv#hq!P#hq!Q#hq!T#hq!U#hq!X#hq!]#hq!h#hq!r#hq!s#hq!t#hq!{#hq!}#hq#P#hq#R#hq#T#hq#X#hq#Z#hq#^#hq#_#hq#a#hq#c#hq#l#hq#o#hq#s#hq#u#hq#z#hq#}#hq$P#hq%X#hq%o#hq%p#hq%t#hq%u#hq&Z#hq&[#hq&]#hq&^#hq&_#hq&`#hq&a#hq&b#hq&c#hq&d#hq&e#hq&f#hq&g#hq&h#hq&i#hq&j#hq%Z#hq%_#hq~On$|az$|a~P%SOV)kOn&wi~P'vOz+yOn&wi~Oz,TO{$jO#[,TO~O#q,VOP#nqV#nqf#nqh#nqo#nqs#nqv#nq!P#nq!Q#nq!T#nq!U#nq!X#nq!]#nq!h#nq!r#nq!s#nq!t#nq!{#nq!}#nq#P#nq#R#nq#T#nq#X#nq#Z#nq#^#nq#_#nq#a#nq#c#nq#l#nq#o#nq#s#nq#u#nq#z#nq#}#nq$P#nq%X#nq%o#nq%p#nq%t#nq%u#nq&Z#nq&[#nq&]#nq&^#nq&_#nq&`#nq&a#nq&b#nq&c#nq&d#nq&e#nq&f#nq&g#nq&h#nq&i#nq&j#nq%Z#nq%_#nq~O#[,WOz%Oa{%Oa~Oo0cOv0qO{&xi~P'vOz,YO{&xi~O{#{O%z,[Og&zXz&zX~O%uWOg&zXz&zX~Oz,`Og&yX~Og,bO~O%Y,eO~O!T%dO!U%cOg&Viz&Vi~OV$}Oa$}Oo0cOv0qOg&Ui~P'vO{,hOz$la!W$la~Oo0cOv0qO{,iOz$la!W$la~P'vOo0cOv0qO{*gO!W&Xi~P'vOz,lO!W&Xi~Oo0cOv0qOz,lO!W&Xi~P'vOz,lO{,oO!W&Xi~Og$hiz$hi!W$hi~P%SOV'|Oo0cOv0qO~P'vOn,qO~OV'|Og,rOo0cOv0qO~P'vOV'|Oo0cOv0qO!W&Sq~P'vOz$gi![$gi#g$gi%[$gi%_$gig$gi{$gi!m$gi%z$gi~P%SOV(]Oo0cOv0qO~P'vOa+QOo0cOv0qO![&Tq~P'vOz,sO![&Tq~O![,tO~OV(]Oo0cOv0qO![%}q#g%}q%[%}q%_%}qg%}q{%}q!m%}q%z%}q~P'vO{,uO~OV+UOo0cOv0qO{&li![&li!m&li%z&li~P'vOz,zO{&li![&li!m&li%z&li~O!]+YO&n+[O![!na~O{(kO![,}O~OV&OOo0cOv0qO#g%hi%[%hi%_%hi%z%hi~P'vOz-OO#g%hi%[%hi%_%hi%z%hi~O%uWO#g&rq%[&rq%_&rqg&rq~Oz-RO#g&rq%[&rq%_&rqg&rq~OV)`Oa)`O%uWO!W&ua~Oz-TO!W&ua~On$|iz$|i~P%SOV)kO~P'vOV)kOn&wq~P'vOt-XOP#myV#myf#myh#myo#mys#myv#my!P#my!Q#my!T#my!U#my!X#my!]#my!h#my!r#my!s#my!t#my!{#my!}#my#P#my#R#my#T#my#X#my#Z#my#^#my#_#my#a#my#c#my#l#my#o#my#s#my#u#my#z#my#}#my$P#my%X#my%o#my%p#my%t#my%u#my&Z#my&[#my&]#my&^#my&_#my&`#my&a#my&b#my&c#my&d#my&e#my&f#my&g#my&h#my&i#my&j#my%Z#my%_#my~O%Z-]O%_-]O~P`O#q-^OP#nyV#nyf#nyh#nyo#nys#nyv#ny!P#ny!Q#ny!T#ny!U#ny!X#ny!]#ny!h#ny!r#ny!s#ny!t#ny!{#ny!}#ny#P#ny#R#ny#T#ny#X#ny#Z#ny#^#ny#_#ny#a#ny#c#ny#l#ny#o#ny#s#ny#u#ny#z#ny#}#ny$P#ny%X#ny%o#ny%p#ny%t#ny%u#ny&Z#ny&[#ny&]#ny&^#ny&_#ny&`#ny&a#ny&b#ny&c#ny&d#ny&e#ny&f#ny&g#ny&h#ny&i#ny&j#ny%Z#ny%_#ny~Oz-aO{$jO#[-aO~Oo0cOv0qO{&xq~P'vOz-dO{&xq~O%z,[Og&zaz&za~O{#{Og&zaz&za~OV*SOa*TO%q*UO%uWOg&ya~Oz-hOg&ya~O$S-lO~OV$}Oa$}Oo0cOv0qO~P'vOo0cOv0qO{-mOz$li!W$li~P'vOo0cOv0qOz$li!W$li~P'vO{-mOz$li!W$li~Oo0cOv0qO{*gO~P'vOo0cOv0qO{*gO!W&Xq~P'vOz-pO!W&Xq~Oo0cOv0qOz-pO!W&Xq~P'vOs-sO!T%dO!U%cOg&Oq!W&Oq![&Oqz&Oq~P!/jOa+QOo0cOv0qO![&Ty~P'vOz$ji![$ji~P%SOa+QOo0cOv0qO~P'vOV+UOo0cOv0qO~P'vOV+UOo0cOv0qO{&lq![&lq!m&lq%z&lq~P'vO{(kO![-xO!m-yO%z-wO~OV&OOo0cOv0qO#g%hq%[%hq%_%hq%z%hq~P'vO%uWO#g&ry%[&ry%_&ryg&ry~OV)`Oa)`O%uWO!W&ui~Ot-}OP#m!RV#m!Rf#m!Rh#m!Ro#m!Rs#m!Rv#m!R!P#m!R!Q#m!R!T#m!R!U#m!R!X#m!R!]#m!R!h#m!R!r#m!R!s#m!R!t#m!R!{#m!R!}#m!R#P#m!R#R#m!R#T#m!R#X#m!R#Z#m!R#^#m!R#_#m!R#a#m!R#c#m!R#l#m!R#o#m!R#s#m!R#u#m!R#z#m!R#}#m!R$P#m!R%X#m!R%o#m!R%p#m!R%t#m!R%u#m!R&Z#m!R&[#m!R&]#m!R&^#m!R&_#m!R&`#m!R&a#m!R&b#m!R&c#m!R&d#m!R&e#m!R&f#m!R&g#m!R&h#m!R&i#m!R&j#m!R%Z#m!R%_#m!R~Oo0cOv0qO{&xy~P'vOV*SOa*TO%q*UO%uWOg&yi~O$S-lO%Z.VO%_.VO~OV.aOh._O!X.^O!].`O!h.YO!s.[O!t.[O%p.XO%uWO&Z]O&[]O&]]O&^]O&_]O&`]O&a]O&b]O~Oo0cOv0qOz$lq!W$lq~P'vO{.fOz$lq!W$lq~Oo0cOv0qO{*gO!W&Xy~P'vOz.gO!W&Xy~Oo0cOv.kO~P'vOs-sO!T%dO!U%cOg&Oy!W&Oy![&Oyz&Oy~P!/jO{(kO![.nO~O{(kO![.nO!m.oO~OV*SOa*TO%q*UO%uWO~Oh.tO!f.rOz$TX#[$TX%j$TXg$TX~Os$TX{$TX!W$TX![$TX~P$-bO%o.vO%p.vOs$UXz$UX{$UX#[$UX%j$UX!W$UXg$UX![$UX~O!h.xO~Oz.|O#[/OO%j.yOs&|X{&|X!W&|Xg&|X~Oa/RO~P$)zOh.tOs&}Xz&}X{&}X#[&}X%j&}X!W&}Xg&}X![&}X~Os/VO{$jO~Oo0cOv0qOz$ly!W$ly~P'vOo0cOv0qO{*gO!W&X!R~P'vOz/ZO!W&X!R~Og&RXs&RX!T&RX!U&RX!W&RX![&RXz&RX~P!/jOs-sO!T%dO!U%cOg&Qa!W&Qa![&Qaz&Qa~O{(kO![/^O~O!f.rOh$[as$[az$[a{$[a#[$[a%j$[a!W$[ag$[a![$[a~O!h/eO~O%o.vO%p.vOs$Uaz$Ua{$Ua#[$Ua%j$Ua!W$Uag$Ua![$Ua~O%j.yOs$Yaz$Ya{$Ya#[$Ya!W$Yag$Ya![$Ya~Os&|a{&|a!W&|ag&|a~P$)nOz/jOs&|a{&|a!W&|ag&|a~O!W/mO~Og/mO~O{/oO~O![/pO~Oo0cOv0qO{*gO!W&X!Z~P'vO{/sO~O%z/tO~P$-bOz/uO#[/OO%j.yOg'PX~Oz/uOg'PX~Og/wO~O!h/xO~O#[/OOs%Saz%Sa{%Sa%j%Sa!W%Sag%Sa![%Sa~O#[/OO%j.yOs%Waz%Wa{%Wa!W%Wag%Wa~Os&|i{&|i!W&|ig&|i~P$)nOz/zO#[/OO%j.yO!['Oa~Og'Pa~P$)nOz0SOg'Pa~Oa0UO!['Oi~P$)zOz0WO!['Oi~Oz0WO#[/OO%j.yO!['Oi~O#[/OO%j.yOg$biz$bi~O%z0ZO~P$-bO#[/OO%j.yOg%Vaz%Va~Og'Pi~P$)nO{0^O~Oa0UO!['Oq~P$)zOz0`O!['Oq~O#[/OO%j.yOz%Ui![%Ui~Oa0UO~P$)zOa0UO!['Oy~P$)zO#[/OO%j.yOg$ciz$ci~O#[/OO%j.yOz%Uq![%Uq~Oz+aO#g%ha%[%ha%_%ha%z%ha~P%SOV&OOo0cOv0qO~P'vOn0hO~Oo0hO~P'vO{0iO~Ot0jO~P!/jO&]&Z&j&h&i&g&f&d&e&c&b&`&a&_&^&[%u~",goto:"!=j'QPPPPPP'RP'Z*s+[+t,_,y-fP.SP'Z.r.r'ZPPP'Z2[PPPPPP2[5PPP5PP7b7k=sPP=v>h>kPP'Z'ZPP>zPP'Z'ZPP'Z'Z'Z'Z'Z?O?w'ZP?zP@QDXGuGyPG|HWH['ZPPPH_Hk'RP'R'RP'RP'RP'RP'RP'R'R'RP'RPP'RPP'RP'RPHqH}IVPI^IdPI^PI^I^PPPI^PKrPK{LVL]KrPI^LfPI^PLmLsPLwM]MzNeLwLwNkNxLwLwLwLw! ^! d! g! l! o! y!!P!!]!!o!!u!#P!#V!#s!#y!$P!$Z!$a!$g!$y!%T!%Z!%a!%k!%q!%w!%}!&T!&Z!&e!&k!&u!&{!'U!'[!'k!'s!'}!(UPPPPPPPPPPP!([!(_!(e!(n!(x!)TPPPPPPPPPPPP!-u!/Z!3^!6oPP!6w!7W!7a!8Y!8P!8c!8i!8l!8o!8r!8z!9jPPPPPPPPPPPPPPPPP!9m!9q!9wP!:]!:a!:m!:v!;S!;j!;m!;p!;v!;|!_![!]Do!]!^Es!^!_FZ!_!`Gk!`!aHX!a!b%T!b!cIf!c!dJU!d!eK^!e!hJU!h!i!#f!i!tJU!t!u!,|!u!wJU!w!x!.t!x!}JU!}#O!0S#O#P&o#P#Q!0j#Q#R!1Q#R#SJU#S#T%T#T#UJU#U#VK^#V#YJU#Y#Z!#f#Z#fJU#f#g!,|#g#iJU#i#j!.t#j#oJU#o#p!1n#p#q!1s#q#r!2a#r#s!2f#s$g%T$g;'SJU;'S;=`KW<%lOJU`%YT&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T`%lP;=`<%l%To%v]&n`%c_OX%TXY%oY[%T[]%o]p%Tpq%oq#O%T#O#P&o#P#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To&tX&n`OY%TYZ%oZ]%T]^%o^#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc'f[&n`O!_%T!_!`([!`#T%T#T#U(r#U#f%T#f#g(r#g#h(r#h#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc(cTmR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc(yT!mR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk)aV&n`&[ZOr%Trs)vs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk){V&n`Or%Trs*bs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk*iT&n`&^ZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To+PZS_&n`OY*xYZ%TZ]*x]^%T^#o*x#o#p+r#p#q*x#q#r+r#r;'S*x;'S;=`,^<%lO*x_+wTS_OY+rZ]+r^;'S+r;'S;=`,W<%lO+r_,ZP;=`<%l+ro,aP;=`<%l*xj,kV%rQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj-XT!xY&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj-oV%lQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk.]V&n`&ZZOw%Twx.rx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk.wV&n`Ow%Twx/^x#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk/eT&n`&]ZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk/{ThZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc0cTgR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk0yXVZ&n`Oz%Tz{1f{!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk1mVaR&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk2ZV%oZ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc2wTzR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To3_W%pZ&n`O!_%T!_!`-Q!`!a3w!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Td4OT&{S&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk4fX!fQ&n`O!O%T!O!P5R!P!Q%T!Q![6T![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk5WV&n`O!O%T!O!P5m!P#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk5tT!rZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti6[a!hX&n`O!Q%T!Q![6T![!g%T!g!h7a!h!l%T!l!m9s!m#R%T#R#S6T#S#X%T#X#Y7a#Y#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti7fZ&n`O{%T{|8X|}%T}!O8X!O!Q%T!Q![8s![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti8^V&n`O!Q%T!Q![8s![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti8z]!hX&n`O!Q%T!Q![8s![!l%T!l!m9s!m#R%T#R#S8s#S#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti9zT!hX&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk:bX%qR&n`O!P%T!P!Q:}!Q!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj;UV%sQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti;ro!hX&n`O!O%T!O!P=s!P!Q%T!Q![>_![!d%T!d!e?q!e!g%T!g!h7a!h!l%T!l!m9s!m!q%T!q!rA]!r!z%T!z!{Bq!{#R%T#R#S>_#S#U%T#U#V?q#V#X%T#X#Y7a#Y#^%T#^#_9s#_#c%T#c#dA]#d#l%T#l#mBq#m#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti=xV&n`O!Q%T!Q![6T![#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti>fc!hX&n`O!O%T!O!P=s!P!Q%T!Q![>_![!g%T!g!h7a!h!l%T!l!m9s!m#R%T#R#S>_#S#X%T#X#Y7a#Y#^%T#^#_9s#_#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti?vY&n`O!Q%T!Q!R@f!R!S@f!S#R%T#R#S@f#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Ti@mY!hX&n`O!Q%T!Q!R@f!R!S@f!S#R%T#R#S@f#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiAbX&n`O!Q%T!Q!YA}!Y#R%T#R#SA}#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiBUX!hX&n`O!Q%T!Q!YA}!Y#R%T#R#SA}#S#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiBv]&n`O!Q%T!Q![Co![!c%T!c!iCo!i#R%T#R#SCo#S#T%T#T#ZCo#Z#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TiCv]!hX&n`O!Q%T!Q![Co![!c%T!c!iCo!i#R%T#R#SCo#S#T%T#T#ZCo#Z#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%ToDvV{_&n`O!_%T!_!`E]!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TcEdT%{R&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkEzT#gZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkFbXmR&n`O!^%T!^!_F}!_!`([!`!a([!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TjGUV%mQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkGrV%zZ&n`O!_%T!_!`([!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkH`WmR&n`O!_%T!_!`([!`!aHx!a#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TjIPV%nQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkIoV_Q#}P&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%ToJ_]&n`&YS%uZO!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUoKZP;=`<%lJUoKge&n`&YS%uZOr%Trs)Ysw%Twx.Ux!Q%T!Q![JU![!c%T!c!tJU!t!uLx!u!}JU!}#R%T#R#SJU#S#T%T#T#fJU#f#gLx#g#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUoMRa&n`&YS%uZOr%TrsNWsw%Twx! vx!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUkN_V&n`&`ZOr%TrsNts#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%TkNyV&n`Or%Trs! `s#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk! gT&n`&bZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk! }V&n`&_ZOw%Twx!!dx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!!iV&n`Ow%Twx!#Ox#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!#VT&n`&aZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!#oe&n`&YS%uZOr%Trs!%Qsw%Twx!&px!Q%T!Q![JU![!c%T!c!tJU!t!u!(`!u!}JU!}#R%T#R#SJU#S#T%T#T#fJU#f#g!(`#g#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!%XV&n`&dZOr%Trs!%ns#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!%sV&n`Or%Trs!&Ys#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!&aT&n`&fZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!&wV&n`&cZOw%Twx!'^x#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!'cV&n`Ow%Twx!'xx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!(PT&n`&eZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!(ia&n`&YS%uZOr%Trs!)nsw%Twx!+^x!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!)uV&n`&hZOr%Trs!*[s#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!*aV&n`Or%Trs!*vs#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!*}T&n`&jZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!+eV&n`&gZOw%Twx!+zx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!,PV&n`Ow%Twx!,fx#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tk!,mT&n`&iZO#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%To!-Vi&n`&YS%uZOr%TrsNWsw%Twx! vx!Q%T!Q![JU![!c%T!c!dJU!d!eLx!e!hJU!h!i!(`!i!}JU!}#R%T#R#SJU#S#T%T#T#UJU#U#VLx#V#YJU#Y#Z!(`#Z#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUo!.}a&n`&YS%uZOr%Trs)Ysw%Twx.Ux!Q%T!Q![JU![!c%T!c!}JU!}#R%T#R#SJU#S#T%T#T#oJU#p#q%T#r$g%T$g;'SJU;'S;=`KW<%lOJUk!0ZT!XZ&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tc!0qT!WR&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%Tj!1XV%kQ&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T~!1sO!]~k!1zV%jR&n`O!_%T!_!`-Q!`#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T~!2fO![~i!2mT%tX&n`O#o%T#p#q%T#r;'S%T;'S;=`%i<%lO%T",tokenizers:[MZ,GZ,CZ,DZ,0,1,2,3,4],topRules:{Script:[0,5]},specialized:[{term:221,get:O=>NZ[O]||-1}],tokenPrec:7668});var Lm=new Tt,Dm=new Set(["Script","Body","FunctionDefinition","ClassDefinition","LambdaExpression","ForStatement","MatchClause"]);function Cs(O){return(e,t,i)=>{if(i)return!1;let r=e.node.getChild("VariableName");return r&&t(r,O),!0}}var FZ={FunctionDefinition:Cs("function"),ClassDefinition:Cs("class"),ForStatement(O,e,t){if(t){for(let i=O.node.firstChild;i;i=i.nextSibling)if(i.name=="VariableName")e(i,"variable");else if(i.name=="in")break}},ImportStatement(O,e){var t,i;let{node:r}=O,n=((t=r.firstChild)===null||t===void 0?void 0:t.name)=="from";for(let s=r.getChild("import");s;s=s.nextSibling)s.name=="VariableName"&&((i=s.nextSibling)===null||i===void 0?void 0:i.name)!="as"&&e(s,n?"variable":"namespace")},AssignStatement(O,e){for(let t=O.node.firstChild;t;t=t.nextSibling)if(t.name=="VariableName")e(t,"variable");else if(t.name==":"||t.name=="AssignOp")break},ParamList(O,e){for(let t=null,i=O.node.firstChild;i;i=i.nextSibling)i.name=="VariableName"&&(!t||!/\*|AssignOp/.test(t.name))&&e(i,"variable"),t=i},CapturePattern:Cs("variable"),AsPattern:Cs("variable"),__proto__:null};function Im(O,e){let t=Lm.get(e);if(t)return t;let i=[],r=!0;function n(s,a){let o=O.sliceString(s.from,s.to);i.push({label:o,type:a})}return e.cursor(C.IncludeAnonymous).iterate(s=>{if(s.name){let a=FZ[s.name];if(a&&a(s,n,r)||!r&&Dm.has(s.name))return!1;r=!1}else if(s.to-s.from>8192){for(let a of Im(O,s.node))i.push(a);return!1}}),Lm.set(e,i),i}var Mm=/^[\w\xa1-\uffff][\w\d\xa1-\uffff]*$/,Bm=["String","FormatString","Comment","PropertyName"];function HZ(O){let e=U(O.state).resolveInner(O.pos,-1);if(Bm.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&Mm.test(O.state.sliceDoc(e.from,e.to));if(!t&&!O.explicit)return null;let i=[];for(let r=e;r;r=r.parent)Dm.has(r.name)&&(i=i.concat(Im(O.state.doc,r)));return{options:i,from:t?e.from:O.pos,validFor:Mm}}var KZ=["__annotations__","__builtins__","__debug__","__doc__","__import__","__name__","__loader__","__package__","__spec__","False","None","True"].map(O=>({label:O,type:"constant"})).concat(["ArithmeticError","AssertionError","AttributeError","BaseException","BlockingIOError","BrokenPipeError","BufferError","BytesWarning","ChildProcessError","ConnectionAbortedError","ConnectionError","ConnectionRefusedError","ConnectionResetError","DeprecationWarning","EOFError","Ellipsis","EncodingWarning","EnvironmentError","Exception","FileExistsError","FileNotFoundError","FloatingPointError","FutureWarning","GeneratorExit","IOError","ImportError","ImportWarning","IndentationError","IndexError","InterruptedError","IsADirectoryError","KeyError","KeyboardInterrupt","LookupError","MemoryError","ModuleNotFoundError","NameError","NotADirectoryError","NotImplemented","NotImplementedError","OSError","OverflowError","PendingDeprecationWarning","PermissionError","ProcessLookupError","RecursionError","ReferenceError","ResourceWarning","RuntimeError","RuntimeWarning","StopAsyncIteration","StopIteration","SyntaxError","SyntaxWarning","SystemError","SystemExit","TabError","TimeoutError","TypeError","UnboundLocalError","UnicodeDecodeError","UnicodeEncodeError","UnicodeError","UnicodeTranslateError","UnicodeWarning","UserWarning","ValueError","Warning","ZeroDivisionError"].map(O=>({label:O,type:"type"}))).concat(["bool","bytearray","bytes","classmethod","complex","float","frozenset","int","list","map","memoryview","object","range","set","staticmethod","str","super","tuple","type"].map(O=>({label:O,type:"class"}))).concat(["abs","aiter","all","anext","any","ascii","bin","breakpoint","callable","chr","compile","delattr","dict","dir","divmod","enumerate","eval","exec","exit","filter","format","getattr","globals","hasattr","hash","help","hex","id","input","isinstance","issubclass","iter","len","license","locals","max","min","next","oct","open","ord","pow","print","property","quit","repr","reversed","round","setattr","slice","sorted","sum","vars","zip"].map(O=>({label:O,type:"function"}))),JZ=[W("def ${name}(${params}):\n ${}",{label:"def",detail:"function",type:"keyword"}),W("for ${name} in ${collection}:\n ${}",{label:"for",detail:"loop",type:"keyword"}),W("while ${}:\n ${}",{label:"while",detail:"loop",type:"keyword"}),W("try:\n ${}\nexcept ${error}:\n ${}",{label:"try",detail:"/ except block",type:"keyword"}),W(`if \${}: `,{label:"if",detail:"block",type:"keyword"}),W("if ${}:\n ${}\nelse:\n ${}",{label:"if",detail:"/ else block",type:"keyword"}),W("class ${name}:\n def __init__(self, ${params}):\n ${}",{label:"class",detail:"definition",type:"keyword"}),W("import ${module}",{label:"import",detail:"statement",type:"keyword"}),W("from ${module} import ${names}",{label:"from",detail:"import",type:"keyword"})],ev=cO(Bm,zt(KZ.concat(JZ)));function Dc(O){let{node:e,pos:t}=O,i=O.lineIndent(t,-1),r=null;for(;;){let n=e.childBefore(t);if(n)if(n.name=="Comment")t=n.from;else if(n.name=="Body"||n.name=="MatchBody")O.baseIndentFor(n)+O.unit<=i&&(r=n),e=n;else if(n.name=="MatchClause")e=n;else if(n.type.is("Statement"))e=n;else break;else break}return r}function Ic(O,e){let t=O.baseIndentFor(e),i=O.lineAt(O.pos,-1),r=i.from+i.text.length;return/^\s*($|#)/.test(i.text)&&O.node.tot?null:t+O.unit}var Bc=ne.define({name:"python",parser:Am.configure({props:[se.add({Body:O=>{var e;let t=/^\s*(#|$)/.test(O.textAfter)&&Dc(O)||O.node;return(e=Ic(O,t))!==null&&e!==void 0?e:O.continue()},MatchBody:O=>{var e;let t=Dc(O);return(e=Ic(O,t||O.node))!==null&&e!==void 0?e:O.continue()},IfStatement:O=>/^\s*(else:|elif )/.test(O.textAfter)?O.baseIndent:O.continue(),"ForStatement WhileStatement":O=>/^\s*else:/.test(O.textAfter)?O.baseIndent:O.continue(),TryStatement:O=>/^\s*(except[ :]|finally:|else:)/.test(O.textAfter)?O.baseIndent:O.continue(),MatchStatement:O=>/^\s*case /.test(O.textAfter)?O.baseIndent+O.unit:O.continue(),"TupleExpression ComprehensionExpression ParamList ArgList ParenthesizedExpression":be({closing:")"}),"DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression":be({closing:"}"}),"ArrayExpression ArrayComprehensionExpression":be({closing:"]"}),MemberExpression:O=>O.baseIndent+O.unit,"String FormatString":()=>null,Script:O=>{var e;let t=Dc(O);return(e=t&&Ic(O,t))!==null&&e!==void 0?e:O.continue()}}),te.add({"ArrayExpression DictionaryExpression SetExpression TupleExpression":me,Body:(O,e)=>({from:O.from+1,to:O.to-(O.to==e.doc.length?0:1)}),"String FormatString":(O,e)=>({from:e.doc.lineAt(O.from).to,to:O.to})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["f","fr","rf","r","u","b","br","rb","F","FR","RF","R","U","B","BR","RB"]},commentTokens:{line:"#"},indentOnInput:/^\s*([\}\]\)]|else:|elif |except |finally:|case\s+[^:]*:?)$/}});function Nm(){return new J(Bc,[Bc.data.of({autocomplete:HZ}),Bc.data.of({autocomplete:ev})])}var tv=36,Fm=1,Ov=2,yi=3,Nc=4,iv=5,rv=6,nv=7,sv=8,av=9,ov=10,lv=11,cv=12,hv=13,fv=14,dv=15,uv=16,Qv=17,Hm=18,$v=19,ng=20,sg=21,Km=22,pv=23,mv=24;function Hc(O){return O>=65&&O<=90||O>=97&&O<=122||O>=48&&O<=57}function gv(O){return O>=48&&O<=57||O>=97&&O<=102||O>=65&&O<=70}function CO(O,e,t){for(let i=!1;;){if(O.next<0)return;if(O.next==e&&!i){O.advance();return}i=t&&!i&&O.next==92,O.advance()}}function Pv(O,e){e:for(;;){if(O.next<0)return;if(O.next==36){O.advance();for(let t=0;t)".charCodeAt(t);for(;;){if(O.next<0)return;if(O.next==i&&O.peek(1)==39){O.advance(2);return}O.advance()}}function Kc(O,e){for(;!(O.next!=95&&!Hc(O.next));)e!=null&&(e+=String.fromCharCode(O.next)),O.advance();return e}function Xv(O){if(O.next==39||O.next==34||O.next==96){let e=O.next;O.advance(),CO(O,e,!1)}else Kc(O)}function Jm(O,e){for(;O.next==48||O.next==49;)O.advance();e&&O.next==e&&O.advance()}function eg(O,e){for(;;){if(O.next==46){if(e)break;e=!0}else if(O.next<48||O.next>57)break;O.advance()}if(O.next==69||O.next==101)for(O.advance(),(O.next==43||O.next==45)&&O.advance();O.next>=48&&O.next<=57;)O.advance()}function tg(O){for(;!(O.next<0||O.next==10);)O.advance()}function jO(O,e){for(let t=0;t!=&|~^/",specialVar:"?",identifierQuotes:'"',caseInsensitiveIdentifiers:!1,words:ag(EO,GO)};function Tv(O,e,t,i){let r={};for(let n in Jc)r[n]=(O.hasOwnProperty(n)?O:Jc)[n];return e&&(r.words=ag(e,t||"",i)),r}function og(O){return new z(e=>{var t;let{next:i}=e;if(e.advance(),jO(i,Fc)){for(;jO(e.next,Fc);)e.advance();e.acceptToken(tv)}else if(i==36&&O.doubleDollarQuotedStrings){let r=Kc(e,"");e.next==36&&(e.advance(),Pv(e,r),e.acceptToken(yi))}else if(i==39||i==34&&O.doubleQuotedStrings)CO(e,i,O.backslashEscapes),e.acceptToken(yi);else if(i==35&&O.hashComments||i==47&&e.next==47&&O.slashComments)tg(e),e.acceptToken(Fm);else if(i==45&&e.next==45&&(!O.spaceAfterDashes||e.peek(1)==32))tg(e),e.acceptToken(Fm);else if(i==47&&e.next==42){e.advance();for(let r=1;;){let n=e.next;if(e.next<0)break;if(e.advance(),n==42&&e.next==47){if(r--,e.advance(),!r)break}else n==47&&e.next==42&&(r++,e.advance())}e.acceptToken(Ov)}else if((i==101||i==69)&&e.next==39)e.advance(),CO(e,39,!0),e.acceptToken(yi);else if((i==110||i==78)&&e.next==39&&O.charSetCasts)e.advance(),CO(e,39,O.backslashEscapes),e.acceptToken(yi);else if(i==95&&O.charSetCasts)for(let r=0;;r++){if(e.next==39&&r>1){e.advance(),CO(e,39,O.backslashEscapes),e.acceptToken(yi);break}if(!Hc(e.next))break;e.advance()}else if(O.plsqlQuotingMechanism&&(i==113||i==81)&&e.next==39&&e.peek(1)>0&&!jO(e.peek(1),Fc)){let r=e.peek(1);e.advance(2),Sv(e,r),e.acceptToken(yi)}else if(jO(i,O.identifierQuotes)){let r=i==91?93:i;CO(e,r,!1),e.acceptToken($v)}else if(i==40)e.acceptToken(nv);else if(i==41)e.acceptToken(sv);else if(i==123)e.acceptToken(av);else if(i==125)e.acceptToken(ov);else if(i==91)e.acceptToken(lv);else if(i==93)e.acceptToken(cv);else if(i==59)e.acceptToken(hv);else if(O.unquotedBitLiterals&&i==48&&e.next==98)e.advance(),Jm(e),e.acceptToken(Km);else if((i==98||i==66)&&(e.next==39||e.next==34)){let r=e.next;e.advance(),O.treatBitsAsBytes?(CO(e,r,O.backslashEscapes),e.acceptToken(pv)):(Jm(e,r),e.acceptToken(Km))}else if(i==48&&(e.next==120||e.next==88)||(i==120||i==88)&&e.next==39){let r=e.next==39;for(e.advance();gv(e.next);)e.advance();r&&e.next==39&&e.advance(),e.acceptToken(Nc)}else if(i==46&&e.next>=48&&e.next<=57)eg(e,!0),e.acceptToken(Nc);else if(i==46)e.acceptToken(fv);else if(i>=48&&i<=57)eg(e,!1),e.acceptToken(Nc);else if(jO(i,O.operatorChars)){for(;jO(e.next,O.operatorChars);)e.advance();e.acceptToken(dv)}else if(jO(i,O.specialVar))e.next==i&&e.advance(),Xv(e),e.acceptToken(Qv);else if(i==58||i==44)e.acceptToken(uv);else if(Hc(i)){let r=Kc(e,String.fromCharCode(i));e.acceptToken(e.next==46||e.peek(-r.length-1)==46?Hm:(t=O.words[r.toLowerCase()])!==null&&t!==void 0?t:Hm)}})}var lg=og(Jc),bv=Oe.deserialize({version:14,states:"%vQ]QQOOO#wQRO'#DSO$OQQO'#CwO%eQQO'#CxO%lQQO'#CyO%sQQO'#CzOOQQ'#DS'#DSOOQQ'#C}'#C}O'UQRO'#C{OOQQ'#Cv'#CvOOQQ'#C|'#C|Q]QQOOQOQQOOO'`QQO'#DOO(xQRO,59cO)PQQO,59cO)UQQO'#DSOOQQ,59d,59dO)cQQO,59dOOQQ,59e,59eO)jQQO,59eOOQQ,59f,59fO)qQQO,59fOOQQ-E6{-E6{OOQQ,59b,59bOOQQ-E6z-E6zOOQQ,59j,59jOOQQ-E6|-E6|O+VQRO1G.}O+^QQO,59cOOQQ1G/O1G/OOOQQ1G/P1G/POOQQ1G/Q1G/QP+kQQO'#C}O+rQQO1G.}O)PQQO,59cO,PQQO'#Cw",stateData:",[~OtOSPOSQOS~ORUOSUOTUOUUOVROXSOZTO]XO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O^]ORvXSvXTvXUvXVvXXvXZvX]vX_vX`vXavXbvXcvXdvXevXfvXgvXhvX~OsvX~P!jOa_Ob_Oc_O~ORUOSUOTUOUUOVROXSOZTO^tO_UO`UOa`Ob`Oc`OdUOeUOfUOgUOhUO~OWaO~P$ZOYcO~P$ZO[eO~P$ZORUOSUOTUOUUOVROXSOZTO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O]hOsoX~P%zOajObjOcjO~O^]ORkaSkaTkaUkaVkaXkaZka]ka_ka`kaakabkackadkaekafkagkahka~Oska~P'kO^]O~OWvXYvX[vX~P!jOWnO~P$ZOYoO~P$ZO[pO~P$ZO^]ORkiSkiTkiUkiVkiXkiZki]ki_ki`kiakibkickidkiekifkigkihki~Oski~P)xOWkaYka[ka~P'kO]hO~P$ZOWkiYki[ki~P)xOasObsOcsO~O",goto:"#hwPPPPPPPPPPPPPPPPPPPPPPPPPPx||||!Y!^!d!xPPP#[TYOZeUORSTWZbdfqT[OZQZORiZSWOZQbRQdSQfTZgWbdfqQ^PWk^lmrQl_Qm`RrseVORSTWZbdfq",nodeNames:"\u26A0 LineComment BlockComment String Number Bool Null ( ) { } [ ] ; . Operator Punctuation SpecialVar Identifier QuotedIdentifier Keyword Type Bits Bytes Builtin Script Statement CompositeIdentifier Parens Braces Brackets Statement",maxTerm:38,nodeProps:[["isolate",-4,1,2,3,19,""]],skippedNodes:[0,1,2],repeatNodeCount:3,tokenData:"RORO",tokenizers:[0,lg],topRules:{Script:[0,25]},tokenPrec:0});function eh(O){let e=O.cursor().moveTo(O.from,-1);for(;/Comment/.test(e.name);)e.moveTo(e.from,-1);return e.node}function Wr(O,e){let t=O.sliceString(e.from,e.to),i=/^([`'"\[])(.*)([`'"\]])$/.exec(t);return i?i[2]:t}function Gs(O){return O&&(O.name=="Identifier"||O.name=="QuotedIdentifier")}function yv(O,e){if(e.name=="CompositeIdentifier"){let t=[];for(let i=e.firstChild;i;i=i.nextSibling)Gs(i)&&t.push(Wr(O,i));return t}return[Wr(O,e)]}function Og(O,e){for(let t=[];;){if(!e||e.name!=".")return t;let i=eh(e);if(!Gs(i))return t;t.unshift(Wr(O,i)),e=eh(i)}}function xv(O,e){let t=U(O).resolveInner(e,-1),i=wv(O.doc,t);return t.name=="Identifier"||t.name=="QuotedIdentifier"||t.name=="Keyword"?{from:t.from,quoted:t.name=="QuotedIdentifier"?O.doc.sliceString(t.from,t.from+1):null,parents:Og(O.doc,eh(t)),aliases:i}:t.name=="."?{from:e,quoted:null,parents:Og(O.doc,t),aliases:i}:{from:e,quoted:null,parents:[],empty:!0,aliases:i}}var kv=new Set("where group having order union intersect except all distinct limit offset fetch for".split(" "));function wv(O,e){let t;for(let r=e;!t;r=r.parent){if(!r)return null;r.name=="Statement"&&(t=r)}let i=null;for(let r=t.firstChild,n=!1,s=null;r;r=r.nextSibling){let a=r.name=="Keyword"?O.sliceString(r.from,r.to).toLowerCase():null,o=null;if(!n)n=a=="from";else if(a=="as"&&s&&Gs(r.nextSibling))o=Wr(O,r.nextSibling);else{if(a&&kv.has(a))break;s&&Gs(r)&&(o=Wr(O,r))}o&&(i||(i=Object.create(null)),i[o]=yv(O,s)),s=/Identifier$/.test(r.name)?r:null}return i}function Zv(O,e,t){return t.map(i=>({...i,label:i.label[0]==O?i.label:O+i.label+e,apply:void 0}))}var vv=/^\w*$/,Yv=/^[`'"\[]?\w*[`'"\]]?$/;function ig(O){return O.self&&typeof O.self.label=="string"}var th=class O{constructor(e,t){this.idQuote=e,this.idCaseInsensitive=t,this.list=[],this.children=void 0}child(e){let t=this.children||(this.children=Object.create(null)),i=t[e];return i||(e&&!this.list.some(r=>r.label==e)&&this.list.push(rg(e,"type",this.idQuote,this.idCaseInsensitive)),t[e]=new O(this.idQuote,this.idCaseInsensitive))}maybeChild(e){return this.children?this.children[e]:null}addCompletion(e){let t=this.list.findIndex(i=>i.label==e.label);t>-1?this.list[t]=e:this.list.push(e)}addCompletions(e){for(let t of e)this.addCompletion(typeof t=="string"?rg(t,"property",this.idQuote,this.idCaseInsensitive):t)}addNamespace(e){Array.isArray(e)?this.addCompletions(e):ig(e)?this.addNamespace(e.children):this.addNamespaceObject(e)}addNamespaceObject(e){for(let t of Object.keys(e)){let i=e[t],r=null,n=t.replace(/\\?\./g,a=>a=="."?"\0":a).split("\0"),s=this;ig(i)&&(r=i.self,i=i.children);for(let a=0;a{let{parents:h,from:f,quoted:u,empty:Q,aliases:$}=xv(c.state,c.pos);if(Q&&!c.explicit)return null;$&&h.length==1&&(h=$[h[0]]||h);let p=o;for(let g of h){for(;!p.children||!p.children[g];)if(p==o&&l)p=l;else if(p==l&&i)p=p.child(i);else return null;let P=p.maybeChild(g);if(!P)return null;p=P}let m=p.list;if(p==o&&$&&(m=m.concat(Object.keys($).map(g=>({label:g,type:"constant"})))),u){let g=u[0],P=cg(g),y=c.state.sliceDoc(c.pos,c.pos+1)==P;return{from:f,to:y?c.pos+1:void 0,options:Zv(g,P,m),validFor:Yv}}else return{from:f,options:m,validFor:vv}}}function Rv(O){return O==sg?"type":O==ng?"keyword":"variable"}function Vv(O,e,t){let i=Object.keys(O).map(r=>t(e?r.toUpperCase():r,Rv(O[r])));return cO(["QuotedIdentifier","String","LineComment","BlockComment","."],zt(i))}var qv=bv.configure({props:[se.add({Statement:le()}),te.add({Statement(O,e){return{from:Math.min(O.from+100,e.doc.lineAt(O.from).to),to:O.to}},BlockComment(O){return{from:O.from+2,to:O.to-2}}}),F({Keyword:d.keyword,Type:d.typeName,Builtin:d.standard(d.name),Bits:d.number,Bytes:d.string,Bool:d.bool,Null:d.null,Number:d.number,String:d.string,Identifier:d.name,QuotedIdentifier:d.special(d.string),SpecialVar:d.special(d.name),LineComment:d.lineComment,BlockComment:d.blockComment,Operator:d.operator,"Semi Punctuation":d.punctuation,"( )":d.paren,"{ }":d.brace,"[ ]":d.squareBracket})]}),wt=class O{constructor(e,t,i){this.dialect=e,this.language=t,this.spec=i}get extension(){return this.language.extension}configureLanguage(e,t){return new O(this.dialect,this.language.configure(e,t),this.spec)}static define(e){let t=Tv(e,e.keywords,e.types,e.builtin),i=ne.define({name:"sql",parser:qv.configure({tokenizers:[{from:lg,to:og(t)}]}),languageData:{commentTokens:{line:"--",block:{open:"/*",close:"*/"}},closeBrackets:{brackets:["(","[","{","'",'"',"`"]}}});return new O(t,i,e)}};function zv(O,e){return{label:O,type:e,boost:-1}}function Uv(O,e=!1,t){return Vv(O.dialect.words,e,t||zv)}function Wv(O){return O.schema?_v(O.schema,O.tables,O.schemas,O.defaultTable,O.defaultSchema,O.dialect||Oh):()=>null}function jv(O){return O.schema?(O.dialect||Oh).language.data.of({autocomplete:Wv(O)}):[]}function hg(O={}){let e=O.dialect||Oh;return new J(e.language,[jv(O),e.language.data.of({autocomplete:Uv(e,O.upperCaseKeywords,O.keywordCompletion)})])}var Oh=wt.define({}),q5=wt.define({charSetCasts:!0,doubleDollarQuotedStrings:!0,operatorChars:"+-*/<>=~!@#%^&|`?",specialVar:"",keywords:EO+"abort abs absent access according ada admin aggregate alias also always analyse analyze array_agg array_max_cardinality asensitive assert assignment asymmetric atomic attach attribute attributes avg backward base64 begin_frame begin_partition bernoulli bit_length blocked bom cache called cardinality catalog_name ceil ceiling chain char_length character_length character_set_catalog character_set_name character_set_schema characteristics characters checkpoint class class_origin cluster coalesce cobol collation_catalog collation_name collation_schema collect column_name columns command_function command_function_code comment comments committed concurrently condition_number configuration conflict connection_name constant constraint_catalog constraint_name constraint_schema contains content control conversion convert copy corr cost covar_pop covar_samp csv cume_dist current_catalog current_row current_schema cursor_name database datalink datatype datetime_interval_code datetime_interval_precision db debug defaults defined definer degree delimiter delimiters dense_rank depends derived detach detail dictionary disable discard dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue document dump dynamic_function dynamic_function_code element elsif empty enable encoding encrypted end_frame end_partition endexec enforced enum errcode error event every exclude excluding exclusive exp explain expression extension extract family file filter final first_value flag floor following force foreach fortran forward frame_row freeze fs functions fusion generated granted greatest groups handler header hex hierarchy hint id ignore ilike immediately immutable implementation implicit import include including increment indent index indexes info inherit inherits inline insensitive instance instantiable instead integrity intersection invoker isnull key_member key_type label lag last_value lead leakproof least length library like_regex link listen ln load location lock locked log logged lower mapping matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text min minvalue mod mode more move multiset mumps name namespace nfc nfd nfkc nfkd nil normalize normalized nothing notice notify notnull nowait nth_value ntile nullable nullif nulls number occurrences_regex octet_length octets off offset oids operator options ordering others over overlay overriding owned owner parallel parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partition pascal passing passthrough password percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding prepared print_strict_params procedural procedures program publication query quote raise range rank reassign recheck recovery refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex rename repeatable replace replica requiring reset respect restart restore result_oid returned_cardinality returned_length returned_octet_length returned_sqlstate returning reverse routine_catalog routine_name routine_schema routines row_count row_number rowtype rule scale schema_name schemas scope scope_catalog scope_name scope_schema security selective self sensitive sequence sequences serializable server server_name setof share show simple skip slice snapshot source specific_name sqlcode sqlerror sqrt stable stacked standalone statement statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time table_name tables tablesample tablespace temp template ties token top_level_count transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex trigger_catalog trigger_name trigger_schema trim trim_array truncate trusted type types uescape unbounded uncommitted unencrypted unlink unlisten unlogged unnamed untyped upper uri use_column use_variable user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema vacuum valid validate validator value_of var_pop var_samp varbinary variable_conflict variadic verbose version versioning views volatile warning whitespace width_bucket window within wrapper xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate yes",types:GO+"bigint int8 bigserial serial8 varbit bool box bytea cidr circle precision float8 inet int4 json jsonb line lseg macaddr macaddr8 money numeric pg_lsn point polygon float4 int2 smallserial serial2 serial serial4 text timetz timestamptz tsquery tsvector txid_snapshot uuid xml"}),fg="accessible algorithm analyze asensitive authors auto_increment autocommit avg avg_row_length binlog btree cache catalog_name chain change changed checkpoint checksum class_origin client_statistics coalesce code collations columns comment committed completion concurrent consistent contains contributors convert database databases day_hour day_microsecond day_minute day_second delay_key_write delayed delimiter des_key_file dev_pop dev_samp deviance directory disable discard distinctrow div dual dumpfile enable enclosed ends engine engines enum errors escaped even event events every explain extended fast field fields flush force found_rows fulltext grants handler hash high_priority hosts hour_microsecond hour_minute hour_second ignore ignore_server_ids import index index_statistics infile innodb insensitive insert_method install invoker iterate keys kill linear lines list load lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modify mutex mysql_errno no_write_to_binlog offline offset one online optimize optionally outfile pack_keys parser partition partitions password phase plugin plugins prev processlist profile profiles purge query quick range read_write rebuild recover regexp relaylog remove rename reorganize repair repeatable replace require resume rlike row_format rtree schedule schema_name schemas second_microsecond security sensitive separator serializable server share show slave slow snapshot soname spatial sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result ssl starting starts std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace terminated triggers truncate uncommitted uninstall unlock upgrade use use_frm user_resources user_statistics utc_date utc_time utc_timestamp variables views warnings xa xor year_month zerofill",dg=GO+"bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int1 int2 int3 int4 int8 float4 float8 varbinary varcharacter precision datetime unsigned signed",ug="charset clear edit ego help nopager notee nowarning pager print prompt quit rehash source status system tee",z5=wt.define({operatorChars:"*+-%<>!=&|^",charSetCasts:!0,doubleQuotedStrings:!0,unquotedBitLiterals:!0,hashComments:!0,spaceAfterDashes:!0,specialVar:"@?",identifierQuotes:"`",keywords:EO+"group_concat "+fg,types:dg,builtin:ug}),U5=wt.define({operatorChars:"*+-%<>!=&|^",charSetCasts:!0,doubleQuotedStrings:!0,unquotedBitLiterals:!0,hashComments:!0,spaceAfterDashes:!0,specialVar:"@?",identifierQuotes:"`",keywords:EO+"always generated groupby_concat hard persistent shutdown soft virtual "+fg,types:dg,builtin:ug}),Cv="approx_count_distinct approx_percentile_cont approx_percentile_disc avg checksum_agg count count_big grouping grouping_id max min product stdev stdevp sum var varp ai_generate_embeddings ai_generate_chunks cume_dist first_value lag last_value lead percentile_cont percentile_disc percent_rank left_shift right_shift bit_count get_bit set_bit collationproperty tertiary_weights @@datefirst @@dbts @@langid @@language @@lock_timeout @@max_connections @@max_precision @@nestlevel @@options @@remserver @@servername @@servicename @@spid @@textsize @@version cast convert parse try_cast try_convert try_parse asymkey_id asymkeyproperty certproperty cert_id crypt_gen_random decryptbyasymkey decryptbycert decryptbykey decryptbykeyautoasymkey decryptbykeyautocert decryptbypassphrase encryptbyasymkey encryptbycert encryptbykey encryptbypassphrase hashbytes is_objectsigned key_guid key_id key_name signbyasymkey signbycert symkeyproperty verifysignedbycert verifysignedbyasymkey @@cursor_rows @@fetch_status cursor_status datalength ident_current ident_incr ident_seed identity sql_variant_property @@datefirst current_timestamp current_timezone current_timezone_id date_bucket dateadd datediff datediff_big datefromparts datename datepart datetime2fromparts datetimefromparts datetimeoffsetfromparts datetrunc day eomonth getdate getutcdate isdate month smalldatetimefromparts switchoffset sysdatetime sysdatetimeoffset sysutcdatetime timefromparts todatetimeoffset year edit_distance edit_distance_similarity jaro_winkler_distance jaro_winkler_similarity edge_id_from_parts graph_id_from_edge_id graph_id_from_node_id node_id_from_parts object_id_from_edge_id object_id_from_node_id json isjson json_array json_contains json_modify json_object json_path_exists json_query json_value regexp_like regexp_replace regexp_substr regexp_instr regexp_count regexp_matches regexp_split_to_table abs acos asin atan atn2 ceiling cos cot degrees exp floor log log10 pi power radians rand round sign sin sqrt square tan choose greatest iif least @@procid app_name applock_mode applock_test assemblyproperty col_length col_name columnproperty databasepropertyex db_id db_name file_id file_idex file_name filegroup_id filegroup_name filegroupproperty fileproperty filepropertyex fulltextcatalogproperty fulltextserviceproperty index_col indexkey_property indexproperty next value for object_definition object_id object_name object_schema_name objectproperty objectpropertyex original_db_name parsename schema_id schema_name scope_identity serverproperty stats_date type_id type_name typeproperty dense_rank ntile rank row_number publishingservername certenclosed certprivatekey current_user database_principal_id has_dbaccess has_perms_by_name is_member is_rolemember is_srvrolemember loginproperty original_login permissions pwdencrypt pwdcompare session_user sessionproperty suser_id suser_name suser_sid suser_sname system_user user user_id user_name ascii char charindex concat concat_ws difference format left len lower ltrim nchar patindex quotename replace replicate reverse right rtrim soundex space str string_agg string_escape stuff substring translate trim unicode upper $partition @@error @@identity @@pack_received @@rowcount @@trancount binary_checksum checksum compress connectionproperty context_info current_request_id current_transaction_id decompress error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big session_context xact_state @@connections @@cpu_busy @@idle @@io_busy @@pack_sent @@packet_errors @@timeticks @@total_errors @@total_read @@total_write textptr textvalid columns_updated eventdata trigger_nestlevel vector_distance vectorproperty vector_search generate_series opendatasource openjson openquery openrowset openxml predict string_split coalesce nullif apply catch filter force include keep keepfixed modify optimize parameterization parameters partition recompile sequence set",W5=wt.define({keywords:EO+"add external procedure all fetch public alter file raiserror and fillfactor read any for readtext as foreign reconfigure asc freetext references authorization freetexttable replication backup from restore begin full restrict between function return break goto revert browse grant revoke bulk group right by having rollback cascade holdlock rowcount case identity rowguidcol check identity_insert rule checkpoint identitycol save close if schema clustered in securityaudit coalesce index select collate inner semantickeyphrasetable column insert semanticsimilaritydetailstable commit intersect semanticsimilaritytable compute into session_user constraint is set contains join setuser containstable key shutdown continue kill some convert left statistics create like system_user cross lineno table current load tablesample current_date merge textsize current_time national then current_timestamp nocheck to current_user nonclustered top cursor not tran database null transaction dbcc nullif trigger deallocate of truncate declare off try_convert default offsets tsequal delete on union deny open unique desc opendatasource unpivot disk openquery update distinct openrowset updatetext distributed openxml use double option user drop or values dump order varying else outer view end over waitfor errlvl percent when escape pivot where except plan while exec precision with execute primary within group exists print writetext exit proc noexpand index forceseek forcescan holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot spatial_window_max_cells tablock tablockx updlock xlock keepidentity keepdefaults ignore_constraints ignore_triggers",types:GO+"smalldatetime datetimeoffset datetime2 datetime bigint smallint smallmoney tinyint money real text nvarchar ntext varbinary image hierarchyid uniqueidentifier sql_variant xml",builtin:Cv,operatorChars:"*+-%<>!=^&|/",specialVar:"@",identifierQuotes:'"['}),j5=wt.define({keywords:EO+"abort analyze attach autoincrement conflict database detach exclusive fail glob ignore index indexed instead isnull notnull offset plan pragma query raise regexp reindex rename replace temp vacuum virtual",types:GO+"bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int2 int8 unsigned signed real",builtin:"auth backup bail changes clone databases dbinfo dump echo eqp explain fullschema headers help import imposter indexes iotrace lint load log mode nullvalue once print prompt quit restore save scanstats separator shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width",operatorChars:"*+-%<>!=&|/~",identifierQuotes:'`"',specialVar:"@:?$"}),C5=wt.define({keywords:"add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime infinity NaN",types:GO+"ascii bigint blob counter frozen inet list map static text timeuuid tuple uuid varint",slashComments:!0}),G5=wt.define({keywords:EO+"abort accept access add all alter and any arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body by case cast char_base check close cluster clusters colauth column comment commit compress connected constant constraint crash create current currval cursor data_base database dba deallocate debugoff debugon declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry exception exception_init exchange exclusive exists external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base of off offline on online only option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw rebuild record ref references refresh rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work",builtin:"appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define echo editfile embedded feedback flagger flush heading headsep instance linesize lno loboffset logsource longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar repfooter repheader serveroutput shiftinout show showmode spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout timing trimout trimspool ttitle underline verify version wrap",types:GO+"ascii bfile bfilename bigserial bit blob dec long number nvarchar nvarchar2 serial smallint string text uid varchar2 xml",operatorChars:"*/+-%<>!=~",doubleQuotedStrings:!0,charSetCasts:!0,plsqlQuotingMechanism:!0});var ih=1,Gv=2,Ev=3,Av=4,Lv=5,Mv=36,Dv=37,Iv=38,Bv=11,Nv=13;function Fv(O){return O==45||O==46||O==58||O>=65&&O<=90||O==95||O>=97&&O<=122||O>=161}function Hv(O){return O==9||O==10||O==13||O==32}var Qg=null,$g=null,pg=0;function rh(O,e){let t=O.pos+e;if($g==O&&pg==t)return Qg;for(;Hv(O.peek(e));)e++;let i="";for(;;){let r=O.peek(e);if(!Fv(r))break;i+=String.fromCharCode(r),e++}return $g=O,pg=t,Qg=i||null}function mg(O,e){this.name=O,this.parent=e}var Kv=new Ge({start:null,shift(O,e,t,i){return e==ih?new mg(rh(i,1)||"",O):O},reduce(O,e){return e==Bv&&O?O.parent:O},reuse(O,e,t,i){let r=e.type.id;return r==ih||r==Nv?new mg(rh(i,1)||"",O):O},strict:!1}),Jv=new z((O,e)=>{if(O.next==60){if(O.advance(),O.next==47){O.advance();let t=rh(O,0);if(!t)return O.acceptToken(Lv);if(e.context&&t==e.context.name)return O.acceptToken(Gv);for(let i=e.context;i;i=i.parent)if(i.name==t)return O.acceptToken(Ev,-2);O.acceptToken(Av)}else if(O.next!=33&&O.next!=63)return O.acceptToken(ih)}},{contextual:!0});function nh(O,e){return new z(t=>{let i=0,r=e.charCodeAt(0);e:for(;!(t.next<0);t.advance(),i++)if(t.next==r){for(let n=1;n"),tY=nh(Dv,"?>"),OY=nh(Iv,"]]>"),iY=F({Text:d.content,"StartTag StartCloseTag EndTag SelfCloseEndTag":d.angleBracket,TagName:d.tagName,"MismatchedCloseTag/TagName":[d.tagName,d.invalid],AttributeName:d.attributeName,AttributeValue:d.attributeValue,Is:d.definitionOperator,"EntityReference CharacterReference":d.character,Comment:d.blockComment,ProcessingInst:d.processingInstruction,DoctypeDecl:d.documentMeta,Cdata:d.special(d.string)}),gg=Oe.deserialize({version:14,states:",lOQOaOOOrOxO'#CfOzOpO'#CiO!tOaO'#CgOOOP'#Cg'#CgO!{OrO'#CrO#TOtO'#CsO#]OpO'#CtOOOP'#DT'#DTOOOP'#Cv'#CvQQOaOOOOOW'#Cw'#CwO#eOxO,59QOOOP,59Q,59QOOOO'#Cx'#CxO#mOpO,59TO#uO!bO,59TOOOP'#C|'#C|O$TOaO,59RO$[OpO'#CoOOOP,59R,59ROOOQ'#C}'#C}O$dOrO,59^OOOP,59^,59^OOOS'#DO'#DOO$lOtO,59_OOOP,59_,59_O$tOpO,59`O$|OpO,59`OOOP-E6t-E6tOOOW-E6u-E6uOOOP1G.l1G.lOOOO-E6v-E6vO%UO!bO1G.oO%UO!bO1G.oO%dOpO'#CkO%lO!bO'#CyO%zO!bO1G.oOOOP1G.o1G.oOOOP1G.w1G.wOOOP-E6z-E6zOOOP1G.m1G.mO&VOpO,59ZO&_OpO,59ZOOOQ-E6{-E6{OOOP1G.x1G.xOOOS-E6|-E6|OOOP1G.y1G.yO&gOpO1G.zO&gOpO1G.zOOOP1G.z1G.zO&oO!bO7+$ZO&}O!bO7+$ZOOOP7+$Z7+$ZOOOP7+$c7+$cO'YOpO,59VO'bOpO,59VO'mO!bO,59eOOOO-E6w-E6wO'{OpO1G.uO'{OpO1G.uOOOP1G.u1G.uO(TOpO7+$fOOOP7+$f7+$fO(]O!bO<c!|;'S(o;'S;=`)]<%lO(oi>jX|W!O`Or(ors&osv(owx'}x!r(o!r!s?V!s;'S(o;'S;=`)]<%lO(oi?^X|W!O`Or(ors&osv(owx'}x!g(o!g!h?y!h;'S(o;'S;=`)]<%lO(oi@QY|W!O`Or?yrs@psv?yvwA[wxBdx!`?y!`!aCr!a;'S?y;'S;=`Db<%lO?ya@uV!O`Ov@pvxA[x!`@p!`!aAy!a;'S@p;'S;=`B^<%lO@pPA_TO!`A[!`!aAn!a;'SA[;'S;=`As<%lOA[PAsOiPPAvP;=`<%lA[aBQSiP!O`Ov&ox;'S&o;'S;=`'Q<%lO&oaBaP;=`<%l@pXBiX|WOrBdrsA[svBdvwA[w!`Bd!`!aCU!a;'SBd;'S;=`Cl<%lOBdXC]TiP|WOr'}sv'}w;'S'};'S;=`(c<%lO'}XCoP;=`<%lBdiC{ViP|W!O`Or(ors&osv(owx'}x;'S(o;'S;=`)]<%lO(oiDeP;=`<%l?yiDoZ|W!O`Or(ors&osv(owx'}x!e(o!e!fEb!f#V(o#V#WIr#W;'S(o;'S;=`)]<%lO(oiEiX|W!O`Or(ors&osv(owx'}x!f(o!f!gFU!g;'S(o;'S;=`)]<%lO(oiF]X|W!O`Or(ors&osv(owx'}x!c(o!c!dFx!d;'S(o;'S;=`)]<%lO(oiGPX|W!O`Or(ors&osv(owx'}x!v(o!v!wGl!w;'S(o;'S;=`)]<%lO(oiGsX|W!O`Or(ors&osv(owx'}x!c(o!c!dH`!d;'S(o;'S;=`)]<%lO(oiHgX|W!O`Or(ors&osv(owx'}x!}(o!}#OIS#O;'S(o;'S;=`)]<%lO(oiI]V|W!O`yPOr(ors&osv(owx'}x;'S(o;'S;=`)]<%lO(oiIyX|W!O`Or(ors&osv(owx'}x#W(o#W#XJf#X;'S(o;'S;=`)]<%lO(oiJmX|W!O`Or(ors&osv(owx'}x#T(o#T#UKY#U;'S(o;'S;=`)]<%lO(oiKaX|W!O`Or(ors&osv(owx'}x#h(o#h#iK|#i;'S(o;'S;=`)]<%lO(oiLTX|W!O`Or(ors&osv(owx'}x#T(o#T#UH`#U;'S(o;'S;=`)]<%lO(oiLwX|W!O`Or(ors&osv(owx'}x#c(o#c#dMd#d;'S(o;'S;=`)]<%lO(oiMkX|W!O`Or(ors&osv(owx'}x#V(o#V#WNW#W;'S(o;'S;=`)]<%lO(oiN_X|W!O`Or(ors&osv(owx'}x#h(o#h#iNz#i;'S(o;'S;=`)]<%lO(oi! RX|W!O`Or(ors&osv(owx'}x#m(o#m#n! n#n;'S(o;'S;=`)]<%lO(oi! uX|W!O`Or(ors&osv(owx'}x#d(o#d#e!!b#e;'S(o;'S;=`)]<%lO(oi!!iX|W!O`Or(ors&osv(owx'}x#X(o#X#Y?y#Y;'S(o;'S;=`)]<%lO(oi!#_V!SP|W!O`Or(ors&osv(owx'}x;'S(o;'S;=`)]<%lO(ok!$PXaQVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$qo!$wX[UVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$qk!%mZVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_!`$q!`!a!&`!a;'S$q;'S;=`)c<%lO$qk!&kX!RQVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$qk!'aZVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_#P$q#P#Q!(S#Q;'S$q;'S;=`)c<%lO$qk!(]ZVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_!`$q!`!a!)O!a;'S$q;'S;=`)c<%lO$qk!)ZXxQVP|W!O`Or$qrs%gsv$qwx'^x!^$q!^!_(o!_;'S$q;'S;=`)c<%lO$q",tokenizers:[Jv,eY,tY,OY,0,1,2,3,4],topRules:{Document:[0,6]},tokenPrec:0});function Es(O,e){let t=e&&e.getChild("TagName");return t?O.sliceString(t.from,t.to):""}function sh(O,e){let t=e&&e.firstChild;return!t||t.name!="OpenTag"?"":Es(O,t)}function rY(O,e,t){let i=e&&e.getChildren("Attribute").find(n=>n.from<=t&&n.to>=t),r=i&&i.getChild("AttributeName");return r?O.sliceString(r.from,r.to):""}function ah(O){for(let e=O&&O.parent;e;e=e.parent)if(e.name=="Element")return e;return null}function nY(O,e){var t;let i=U(O).resolveInner(e,-1),r=null;for(let n=i;!r&&n.parent;n=n.parent)(n.name=="OpenTag"||n.name=="CloseTag"||n.name=="SelfClosingTag"||n.name=="MismatchedCloseTag")&&(r=n);if(r&&(r.to>e||r.lastChild.type.isError)){let n=r.parent;if(i.name=="TagName")return r.name=="CloseTag"||r.name=="MismatchedCloseTag"?{type:"closeTag",from:i.from,context:n}:{type:"openTag",from:i.from,context:ah(n)};if(i.name=="AttributeName")return{type:"attrName",from:i.from,context:r};if(i.name=="AttributeValue")return{type:"attrValue",from:i.from,context:r};let s=i==r||i.name=="Attribute"?i.childBefore(e):i;return s?.name=="StartTag"?{type:"openTag",from:e,context:ah(n)}:s?.name=="StartCloseTag"&&s.to<=e?{type:"closeTag",from:e,context:n}:s?.name=="Is"?{type:"attrValue",from:e,context:r}:s?{type:"attrName",from:e,context:r}:null}else if(i.name=="StartCloseTag")return{type:"closeTag",from:e,context:i.parent};for(;i.parent&&i.to==e&&!(!((t=i.lastChild)===null||t===void 0)&&t.type.isError);)i=i.parent;return i.name=="Element"||i.name=="Text"||i.name=="Document"?{type:"tag",from:e,context:i.name=="Element"?i:ah(i)}:null}var lh=class{constructor(e,t,i){this.attrs=t,this.attrValues=i,this.children=[],this.name=e.name,this.completion=Object.assign(Object.assign({type:"type"},e.completion||{}),{label:this.name}),this.openCompletion=Object.assign(Object.assign({},this.completion),{label:"<"+this.name}),this.closeCompletion=Object.assign(Object.assign({},this.completion),{label:"",boost:2}),this.closeNameCompletion=Object.assign(Object.assign({},this.completion),{label:this.name+">"}),this.text=e.textContent?e.textContent.map(r=>({label:r,type:"text"})):[]}},oh=/^[:\-\.\w\u00b7-\uffff]*$/;function Pg(O){return Object.assign(Object.assign({type:"property"},O.completion||{}),{label:O.name})}function Sg(O){return typeof O=="string"?{label:`"${O}"`,type:"constant"}:/^"/.test(O.label)?O:Object.assign(Object.assign({},O),{label:`"${O.label}"`})}function sY(O,e){let t=[],i=[],r=Object.create(null);for(let o of e){let l=Pg(o);t.push(l),o.global&&i.push(l),o.values&&(r[o.name]=o.values.map(Sg))}let n=[],s=[],a=Object.create(null);for(let o of O){let l=i,c=r;o.attributes&&(l=l.concat(o.attributes.map(f=>typeof f=="string"?t.find(u=>u.label==f)||{label:f,type:"property"}:(f.values&&(c==r&&(c=Object.create(c)),c[f.name]=f.values.map(Sg)),Pg(f)))));let h=new lh(o,l,c);a[h.name]=h,n.push(h),o.top&&s.push(h)}s.length||(s=n);for(let o=0;o{var l;let{doc:c}=o.state,h=nY(o.state,o.pos);if(!h||h.type=="tag"&&!o.explicit)return null;let{type:f,from:u,context:Q}=h;if(f=="openTag"){let $=s,p=sh(c,Q);if(p){let m=a[p];$=m?.children||n}return{from:u,options:$.map(m=>m.completion),validFor:oh}}else if(f=="closeTag"){let $=sh(c,Q);return $?{from:u,to:o.pos+(c.sliceString(o.pos,o.pos+1)==">"?1:0),options:[((l=a[$])===null||l===void 0?void 0:l.closeNameCompletion)||{label:$+">",type:"type"}],validFor:oh}:null}else if(f=="attrName"){let $=a[Es(c,Q)];return{from:u,options:$?.attrs||i,validFor:oh}}else if(f=="attrValue"){let $=rY(c,Q,u);if(!$)return null;let p=a[Es(c,Q)],m=(p?.attrValues||r)[$];return!m||!m.length?null:{from:u,to:o.pos+(c.sliceString(o.pos,o.pos+1)=='"'?1:0),options:m,validFor:/^"[^"]*"?$/}}else if(f=="tag"){let $=sh(c,Q),p=a[$],m=[],g=Q&&Q.lastChild;$&&(!g||g.name!="CloseTag"||Es(c,g)!=$)&&m.push(p?p.closeCompletion:{label:"",type:"type",boost:2});let P=m.concat((p?.children||(Q?n:s)).map(y=>y.openCompletion));if(Q&&p?.text.length){let y=Q.firstChild;y.to>o.pos-20&&!/\S/.test(o.state.sliceDoc(y.to,o.pos))&&(P=P.concat(p.text))}return{from:u,options:P,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}else return null}}var ch=ne.define({name:"xml",parser:gg.configure({props:[se.add({Element(O){let e=/^\s*<\//.test(O.textAfter);return O.lineIndent(O.node.from)+(e?0:O.unit)},"OpenTag CloseTag SelfClosingTag"(O){return O.column(O.node.from)+O.unit}}),te.add({Element(O){let e=O.firstChild,t=O.lastChild;return!e||e.name!="OpenTag"?null:{from:e.to,to:t.name=="CloseTag"?t.from:O.to}}}),hr.add({"OpenTag CloseTag":O=>O.getChild("TagName")})]}),languageData:{commentTokens:{block:{open:""}},indentOnInput:/^\s*<\/$/}});function Tg(O={}){let e=[ch.data.of({autocomplete:sY(O.elements||[],O.attributes||[])})];return O.autoCloseTags!==!1&&e.push(aY),new J(ch,e)}function Xg(O,e,t=O.length){if(!e)return"";let i=e.firstChild,r=i&&i.getChild("TagName");return r?O.sliceString(r.from,Math.min(r.to,t)):""}var aY=T.inputHandler.of((O,e,t,i,r)=>{if(O.composing||O.state.readOnly||e!=t||i!=">"&&i!="/"||!ch.isActiveAt(O.state,e,-1))return!1;let n=r(),{state:s}=n,a=s.changeByRange(o=>{var l,c,h;let{head:f}=o,u=s.doc.sliceString(f-1,f)==i,Q=U(s).resolveInner(f,-1),$;if(u&&i==">"&&Q.name=="EndTag"){let p=Q.parent;if(((c=(l=p.parent)===null||l===void 0?void 0:l.lastChild)===null||c===void 0?void 0:c.name)!="CloseTag"&&($=Xg(s.doc,p.parent,f))){let m=f+(s.doc.sliceString(f,f+1)===">"?1:0),g=``;return{range:o,changes:{from:f,to:m,insert:g}}}}else if(u&&i=="/"&&Q.name=="StartCloseTag"){let p=Q.parent;if(Q.from==f-2&&((h=p.lastChild)===null||h===void 0?void 0:h.name)!="CloseTag"&&($=Xg(s.doc,p,f))){let m=f+(s.doc.sliceString(f,f+1)===">"?1:0),g=`${$}>`;return{range:S.cursor(f+g.length,-1),changes:{from:f,to:m,insert:g}}}}return{range:o}});return a.changes.empty?!1:(O.dispatch([n,s.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)});var xi=63,bg=64,oY=1,lY=2,kg=3,cY=4,wg=5,hY=6,fY=7,Zg=65,dY=66,uY=8,QY=9,$Y=10,pY=11,mY=12,vg=13,gY=19,PY=20,SY=29,XY=33,TY=34,bY=47,yY=0,$h=1,fh=2,Cr=3,dh=4,At=class{constructor(e,t,i){this.parent=e,this.depth=t,this.type=i,this.hash=(e?e.hash+e.hash<<8:0)+t+(t<<4)+i}};At.top=new At(null,-1,yY);function jr(O,e){for(let t=0,i=e-O.pos-1;;i--,t++){let r=O.peek(i);if(Lt(r)||r==-1)return t}}function uh(O){return O==32||O==9}function Lt(O){return O==10||O==13}function Yg(O){return uh(O)||Lt(O)}function AO(O){return O<0||Yg(O)}var xY=new Ge({start:At.top,reduce(O,e){return O.type==Cr&&(e==PY||e==TY)?O.parent:O},shift(O,e,t,i){if(e==kg)return new At(O,jr(i,i.pos),$h);if(e==Zg||e==wg)return new At(O,jr(i,i.pos),fh);if(e==xi)return O.parent;if(e==gY||e==XY)return new At(O,0,Cr);if(e==vg&&O.type==dh)return O.parent;if(e==bY){let r=/[1-9]/.exec(i.read(i.pos,t.pos));if(r)return new At(O,O.depth+ +r[0],dh)}return O},hash(O){return O.hash}});function ki(O,e,t=0){return O.peek(t)==e&&O.peek(t+1)==e&&O.peek(t+2)==e&&AO(O.peek(t+3))}var kY=new z((O,e)=>{if(O.next==-1&&e.canShift(bg))return O.acceptToken(bg);let t=O.peek(-1);if((Lt(t)||t<0)&&e.context.type!=Cr){if(ki(O,45))if(e.canShift(xi))O.acceptToken(xi);else return O.acceptToken(oY,3);if(ki(O,46))if(e.canShift(xi))O.acceptToken(xi);else return O.acceptToken(lY,3);let i=0;for(;O.next==32;)i++,O.advance();(i{if(e.context.type==Cr){O.next==63&&(O.advance(),AO(O.next)&&O.acceptToken(fY));return}if(O.next==45)O.advance(),AO(O.next)&&O.acceptToken(e.context.type==$h&&e.context.depth==jr(O,O.pos-1)?cY:kg);else if(O.next==63)O.advance(),AO(O.next)&&O.acceptToken(e.context.type==fh&&e.context.depth==jr(O,O.pos-1)?hY:wg);else{let t=O.pos;for(;;)if(uh(O.next)){if(O.pos==t)return;O.advance()}else if(O.next==33)_g(O);else if(O.next==38)Qh(O);else if(O.next==42){Qh(O);break}else if(O.next==39||O.next==34){if(ph(O,!0))break;return}else if(O.next==91||O.next==123){if(!vY(O))return;break}else{Rg(O,!0,!1,0);break}for(;uh(O.next);)O.advance();if(O.next==58){if(O.pos==t&&e.canShift(SY))return;let i=O.peek(1);AO(i)&&O.acceptTokenTo(e.context.type==fh&&e.context.depth==jr(O,t)?dY:Zg,t)}}},{contextual:!0});function ZY(O){return O>32&&O<127&&O!=34&&O!=37&&O!=44&&O!=60&&O!=62&&O!=92&&O!=94&&O!=96&&O!=123&&O!=124&&O!=125}function yg(O){return O>=48&&O<=57||O>=97&&O<=102||O>=65&&O<=70}function xg(O,e){return O.next==37?(O.advance(),yg(O.next)&&O.advance(),yg(O.next)&&O.advance(),!0):ZY(O.next)||e&&O.next==44?(O.advance(),!0):!1}function _g(O){if(O.advance(),O.next==60){for(O.advance();;)if(!xg(O,!0)){O.next==62&&O.advance();break}}else for(;xg(O,!1););}function Qh(O){for(O.advance();!AO(O.next)&&As(O.tag)!="f";)O.advance()}function ph(O,e){let t=O.next,i=!1,r=O.pos;for(O.advance();;){let n=O.next;if(n<0)break;if(O.advance(),n==t)if(n==39)if(O.next==39)O.advance();else break;else break;else if(n==92&&t==34)O.next>=0&&O.advance();else if(Lt(n)){if(e)return!1;i=!0}else if(e&&O.pos>=r+1024)return!1}return!i}function vY(O){for(let e=[],t=O.pos+1024;;)if(O.next==91||O.next==123)e.push(O.next),O.advance();else if(O.next==39||O.next==34){if(!ph(O,!0))return!1}else if(O.next==93||O.next==125){if(e[e.length-1]!=O.next-2)return!1;if(e.pop(),O.advance(),!e.length)return!0}else{if(O.next<0||O.pos>t||Lt(O.next))return!1;O.advance()}}var YY="iiisiiissisfissssssssssssisssiiissssssssssssssssssssssssssfsfssissssssssssssssssssssssssssfif";function As(O){return O<33?"u":O>125?"s":YY[O-33]}function hh(O,e){let t=As(O);return t!="u"&&!(e&&t=="f")}function Rg(O,e,t,i){if(As(O.next)=="s"||(O.next==63||O.next==58||O.next==45)&&hh(O.peek(1),t))O.advance();else return!1;let r=O.pos;for(;;){let n=O.next,s=0,a=i+1;for(;Yg(n);){if(Lt(n)){if(e)return!1;a=0}else a++;n=O.peek(++s)}if(!(n>=0&&(n==58?hh(O.peek(s+1),t):n==35?O.peek(s-1)!=32:hh(n,t)))||!t&&a<=i||a==0&&!t&&(ki(O,45,s)||ki(O,46,s)))break;if(e&&As(n)=="f")return!1;for(let l=s;l>=0;l--)O.advance();if(e&&O.pos>r+1024)return!1}return!0}var _Y=new z((O,e)=>{if(O.next==33)_g(O),O.acceptToken(mY);else if(O.next==38||O.next==42){let t=O.next==38?$Y:pY;Qh(O),O.acceptToken(t)}else O.next==39||O.next==34?(ph(O,!1),O.acceptToken(QY)):Rg(O,!1,e.context.type==Cr,e.context.depth)&&O.acceptToken(uY)}),RY=new z((O,e)=>{let t=e.context.type==dh?e.context.depth:-1,i=O.pos;e:for(;;){let r=0,n=O.next;for(;n==32;)n=O.peek(++r);if(!r&&(ki(O,45,r)||ki(O,46,r))||!Lt(n)&&(t<0&&(t=Math.max(e.context.depth+1,r)),rYAN>Y",stateData:";S~O!fOS!gOS^OS~OP_OQbORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!V[O!cTO~O`cO~P]OVkOWROXROYeOZfO[dOcPOmhOqQO~OboO~P!bOVtOWROXROYeOZfO[dOcPOmrOqQO~OpwO~P#WORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!cTO~OSvP!avP!bvP~P#|OWROXROYeOZfO[dOcPOqQO~OmzO~P%OOm!OOUzP!azP!bzP!dzP~P#|O^!SO!b!QO!f!TO!g!RO~ORSOTUOWROXROcPOqQO!PVO!cTO~OY!UOP!QXQ!QX!V!QX!`!QXS!QX!a!QX!b!QXU!QXm!QX!d!QX~P&aO[!WOP!SXQ!SX!V!SX!`!SXS!SX!a!SX!b!SXU!SXm!SX!d!SX~P&aO^!ZO!W![O!b!YO!f!]O!g!YO~OP!_O!V[OQaX!`aX~OPaXQaX!VaX!`aX~P#|OP!bOQ!cO!V[O~OP_O!V[O~P#|OWROXROY!fOcPOqQObfXmfXofXpfX~OWROXRO[!hOcPOqQObhXmhXohXphX~ObeXmlXoeX~ObkXokX~P%OOm!kO~Om!lObnPonP~P%OOb!pOo!oO~Ob!pO~P!bOm!sOosXpsX~OosXpsX~P%OOm!uOotPptP~P%OOo!xOp!yO~Op!yO~P#WOS!|O!a#OO!b#OO~OUyX!ayX!byX!dyX~P#|Om#QO~OU#SO!a#UO!b#UO!d#RO~Om#WOUzX!azX!bzX!dzX~O]#XO~O!b#XO!g#YO~O^#ZO!b#XO!g#YO~OP!RXQ!RX!V!RX!`!RXS!RX!a!RX!b!RXU!RXm!RX!d!RX~P&aOP!TXQ!TX!V!TX!`!TXS!TX!a!TX!b!TXU!TXm!TX!d!TX~P&aO!b#^O!g#^O~O^#_O!b#^O!f#`O!g#^O~O^#_O!W#aO!b#^O!g#^O~OPaaQaa!Vaa!`aa~P#|OP#cO!V[OQ!XX!`!XX~OP!XXQ!XX!V!XX!`!XX~P#|OP_O!V[OQ!_X!`!_X~P#|OWROXROcPOqQObgXmgXogXpgX~OWROXROcPOqQObiXmiXoiXpiX~Obkaoka~P%OObnXonX~P%OOm#kO~Ob#lOo!oO~Oosapsa~P%OOotXptX~P%OOm#pO~Oo!xOp#qO~OSwP!awP!bwP~P#|OS!|O!a#vO!b#vO~OUya!aya!bya!dya~P#|Om#xO~P%OOm#{OU}P!a}P!b}P!d}P~P#|OU#SO!a$OO!b$OO!d#RO~O]$QO~O!b$QO!g$RO~O!b$SO!g$SO~O^$TO!b$SO!g$SO~O^$TO!b$SO!f$UO!g$SO~OP!XaQ!Xa!V!Xa!`!Xa~P#|Obnaona~P%OOotapta~P%OOo!xO~OU|X!a|X!b|X!d|X~P#|Om$ZO~Om$]OU}X!a}X!b}X!d}X~O]$^O~O!b$_O!g$_O~O^$`O!b$_O!g$_O~OU|a!a|a!b|a!d|a~P#|O!b$cO!g$cO~O",goto:",]!mPPPPPPPPPPPPPPPPP!nPP!v#v#|$`#|$c$f$j$nP%VPPP!v%Y%^%a%{&O%a&R&U&X&_&b%aP&e&{&e'O'RPP']'a'g'm's'y(XPPPPPPPP(_)e*X+c,VUaObcR#e!c!{ROPQSTUXY_bcdehknrtvz!O!U!W!_!b!c!f!h!k!l!s!u!|#Q#R#S#W#c#k#p#x#{$Z$]QmPR!qnqfPQThknrtv!k!l!s!u#R#k#pR!gdR!ieTlPnTjPnSiPnSqQvQ{TQ!mkQ!trQ!vtR#y#RR!nkTsQvR!wt!RWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]RySR#t!|R|TR|UQ!PUR#|#SR#z#RR#z#SyZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]R!VXR!XYa]O^abc!a!c!eT!da!eQnPR!rnQvQR!{vQ!}yR#u!}Q#T|R#}#TW^Obc!cS!^^!aT!aa!eQ!eaR#f!eW`Obc!cQxSS}U#SQ!`_Q#PzQ#V!OQ#b!_Q#d!bQ#s!|Q#w#QQ$P#WQ$V#cQ$Y#xQ$[#{Q$a$ZR$b$]xZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]Q!VXQ!XYQ#[!UR#]!W!QWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]pfPQThknrtv!k!l!s!u#R#k#pQ!gdQ!ieQ#g!fR#h!hSgPn^pQTkrtv#RQ!jhQ#i!kQ#j!lQ#n!sQ#o!uQ$W#kR$X#pQuQR!zv",nodeNames:"\u26A0 DirectiveEnd DocEnd - - ? ? ? Literal QuotedLiteral Anchor Alias Tag BlockLiteralContent Comment Stream BOM Document ] [ FlowSequence Item Tagged Anchored Anchored Tagged FlowMapping Pair Key : Pair , } { FlowMapping Pair Pair BlockSequence Item Item BlockMapping Pair Pair Key Pair Pair BlockLiteral BlockLiteralHeader Tagged Anchored Anchored Tagged Directive DirectiveName DirectiveContent Document",maxTerm:74,context:xY,nodeProps:[["isolate",-3,8,9,14,""],["openedBy",18,"[",32,"{"],["closedBy",19,"]",33,"}"]],propSources:[VY],skippedNodes:[0],repeatNodeCount:6,tokenData:"-Y~RnOX#PXY$QYZ$]Z]#P]^$]^p#Ppq$Qqs#Pst$btu#Puv$yv|#P|}&e}![#P![!]'O!]!`#P!`!a'i!a!}#P!}#O*g#O#P#P#P#Q+Q#Q#o#P#o#p+k#p#q'i#q#r,U#r;'S#P;'S;=`#z<%l?HT#P?HT?HU,o?HUO#PQ#UU!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PQ#kTOY#PZs#Pt;'S#P;'S;=`#z<%lO#PQ#}P;=`<%l#P~$VQ!f~XY$Qpq$Q~$bO!g~~$gS^~OY$bZ;'S$b;'S;=`$s<%lO$b~$vP;=`<%l$bR%OX!WQOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR%rX!WQ!VPOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR&bP;=`<%l%kR&lUoP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'VUmP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'p[!PP!WQOY#PZp#Ppq#hq{#P{|(f|}#P}!O(f!O!R#P!R![)p![;'S#P;'S;=`#z<%lO#PR(mW!PP!WQOY#PZp#Ppq#hq!R#P!R![)V![;'S#P;'S;=`#z<%lO#PR)^U!PP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR)wY!PP!WQOY#PZp#Ppq#hq{#P{|)V|}#P}!O)V!O;'S#P;'S;=`#z<%lO#PR*nUcP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+XUbP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+rUqP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,]UpP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,vU`P!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#P",tokenizers:[kY,wY,_Y,RY,0,1],topRules:{Stream:[0,15]},tokenPrec:0});var qY=Oe.deserialize({version:14,states:"!vOQOPOOO]OPO'#C_OhOPO'#C^OOOO'#Cc'#CcOpOPO'#CaQOOOOOO{OPOOOOOO'#Cb'#CbO!WOPO'#C`O!`OPO,58xOOOO-E6a-E6aOOOO-E6`-E6`OOOO'#C_'#C_OOOO1G.d1G.d",stateData:"!h~OXPOYROWTP~OWVXXRXYRX~OYVOXSP~OXROYROWTX~OXROYROWTP~OYVOXSX~OX[O~OXY~",goto:"vWPPX[beioRUOQQOR]XRXQTTOUQWQRZWSSOURYS",nodeNames:"\u26A0 Document Frontmatter DashLine FrontmatterContent Body",maxTerm:10,skippedNodes:[0],repeatNodeCount:2,tokenData:"$z~RXOYnYZ!^Z]n]^!^^}n}!O!i!O;'Sn;'S;=`!c<%lOn~qXOYnYZ!^Z]n]^!^^;'Sn;'S;=`!c<%l~n~On~~!^~!cOY~~!fP;=`<%ln~!lZOYnYZ!^Z]n]^!^^}n}!O#_!O;'Sn;'S;=`!c<%l~n~On~~!^~#bZOYnYZ!^Z]n]^!^^}n}!O$T!O;'Sn;'S;=`!c<%l~n~On~~!^~$WXOYnYZ$sZ]n]^$s^;'Sn;'S;=`!c<%l~n~On~~$s~$zOX~Y~",tokenizers:[0],topRules:{Document:[0,1]},tokenPrec:67}),zY=ne.define({name:"yaml",parser:Vg.configure({props:[se.add({Stream:O=>{for(let e=O.node.resolve(O.pos,-1);e&&e.to>=O.pos;e=e.parent){if(e.name=="BlockLiteralContent"&&e.fromO.pos)return null}}return null},FlowMapping:be({closing:"}"}),FlowSequence:be({closing:"]"})}),te.add({"FlowMapping FlowSequence":me,"Item Pair BlockLiteral":(O,e)=>({from:e.doc.lineAt(O.from).to,to:O.to})})]}),languageData:{commentTokens:{line:"#"},indentOnInput:/^\s*[\]\}]$/}});function qg(){return new J(zY)}var nV=ne.define({name:"yaml-frontmatter",parser:qY.configure({props:[F({DashLine:d.meta})]})});function UY({canWrap:O,isDisabled:e,isLive:t,isLiveDebounced:i,isLiveOnBlur:r,liveDebounce:n,language:s,state:a}){return{editor:null,themeCompartment:new FO,isDocChanged:!1,state:a,init(){let o=this.getLanguageExtension(),l=Alpine.debounce(()=>this.$wire.commit(),n??300);this.editor=new T({parent:this.$refs.editor,state:I.create({doc:this.state,extensions:[t$,Xt.of([QQ]),...O?[T.lineWrapping]:[],I.readOnly.of(e),T.editable.of(!e),T.updateListener.of(c=>{c.docChanged&&(this.isDocChanged=!0,this.state=c.state.doc.toString(),!r&&(t||i)&&l())}),T.domEventHandlers({blur:(c,h)=>{r&&this.isDocChanged&&this.$wire.$commit()}}),...o?[o]:[],this.themeCompartment.of(this.getThemeExtensions())]})}),this.$watch("state",()=>{this.state!==void 0&&this.editor.state.doc.toString()!==this.state&&this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length,insert:this.state}})}),this.themeObserver=new MutationObserver(()=>{this.editor.dispatch({effects:this.themeCompartment.reconfigure(this.getThemeExtensions())})}),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]})},isDarkMode(){return document.documentElement.classList.contains("dark")},getThemeExtensions(){return this.isDarkMode()?[a$]:[]},getLanguageExtension(){return s&&{cpp:g$,css:ys,go:W$,html:Ti,java:Zp,javascript:ks,json:Yp,markdown:Tm,php:vm,python:Nm,sql:hg,xml:Tg,yaml:qg}[s]?.()||null},destroy(){this.themeObserver&&(this.themeObserver.disconnect(),this.themeObserver=null),this.editor&&(this.editor.destroy(),this.editor=null)}}}export{UY as default}; ================================================ FILE: public/js/filament/forms/components/color-picker.js ================================================ var c=(e,t=0,r=1)=>e>r?r:eMath.round(r*e)/r;var at={grad:360/400,turn:360,rad:360/(Math.PI*2)},F=e=>G(v(e)),v=e=>(e[0]==="#"&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:e.length===4?a(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:e.length===8?a(parseInt(e.substring(6,8),16)/255,2):1}),nt=(e,t="deg")=>Number(e)*(at[t]||1),it=e=>{let r=/hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?lt({h:nt(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:r[5]===void 0?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},J=it,lt=({h:e,s:t,l:r,a:o})=>(t*=(r<50?r:100-r)/100,{h:e,s:t>0?2*t/(r+t)*100:0,v:r+t,a:o}),X=e=>ct(A(e)),Y=({h:e,s:t,v:r,a:o})=>{let s=(200-t)*r/100;return{h:a(e),s:a(s>0&&s<200?t*r/100/(s<=100?s:200-s)*100:0),l:a(s/2),a:a(o,2)}};var d=e=>{let{h:t,s:r,l:o}=Y(e);return`hsl(${t}, ${r}%, ${o}%)`},$=e=>{let{h:t,s:r,l:o,a:s}=Y(e);return`hsla(${t}, ${r}%, ${o}%, ${s})`},A=({h:e,s:t,v:r,a:o})=>{e=e/360*6,t=t/100,r=r/100;let s=Math.floor(e),n=r*(1-t),i=r*(1-(e-s)*t),l=r*(1-(1-e+s)*t),q=s%6;return{r:a([r,i,n,n,l,r][q]*255),g:a([l,r,r,i,n,n][q]*255),b:a([n,n,l,r,r,i][q]*255),a:a(o,2)}},B=e=>{let{r:t,g:r,b:o}=A(e);return`rgb(${t}, ${r}, ${o})`},D=e=>{let{r:t,g:r,b:o,a:s}=A(e);return`rgba(${t}, ${r}, ${o}, ${s})`};var I=e=>{let r=/rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?G({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:r[7]===void 0?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},U=I,b=e=>{let t=e.toString(16);return t.length<2?"0"+t:t},ct=({r:e,g:t,b:r,a:o})=>{let s=o<1?b(a(o*255)):"";return"#"+b(e)+b(t)+b(r)+s},G=({r:e,g:t,b:r,a:o})=>{let s=Math.max(e,t,r),n=s-Math.min(e,t,r),i=n?s===e?(t-r)/n:s===t?2+(r-e)/n:4+(e-t)/n:0;return{h:a(60*(i<0?i+6:i)),s:a(s?n/s*100:0),v:a(s/255*100),a:o}};var L=(e,t)=>{if(e===t)return!0;for(let r in e)if(e[r]!==t[r])return!1;return!0},h=(e,t)=>e.replace(/\s/g,"")===t.replace(/\s/g,""),K=(e,t)=>e.toLowerCase()===t.toLowerCase()?!0:L(v(e),v(t));var Q={},S=e=>{let t=Q[e];return t||(t=document.createElement("template"),t.innerHTML=e,Q[e]=t),t},f=(e,t,r)=>{e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:r}))};var m=!1,O=e=>"touches"in e,pt=e=>m&&!O(e)?!1:(m||(m=O(e)),!0),W=(e,t)=>{let r=O(t)?t.touches[0]:t,o=e.el.getBoundingClientRect();f(e.el,"move",e.getMove({x:c((r.pageX-(o.left+window.pageXOffset))/o.width),y:c((r.pageY-(o.top+window.pageYOffset))/o.height)}))},ut=(e,t)=>{let r=t.keyCode;r>40||e.xy&&r<37||r<33||(t.preventDefault(),f(e.el,"move",e.getMove({x:r===39?.01:r===37?-.01:r===34?.05:r===33?-.05:r===35?1:r===36?-1:0,y:r===40?.01:r===38?-.01:0},!0)))},u=class{constructor(t,r,o,s){let n=S(`
`);t.appendChild(n.content.cloneNode(!0));let i=t.querySelector(`[part=${r}]`);i.addEventListener("mousedown",this),i.addEventListener("touchstart",this),i.addEventListener("keydown",this),this.el=i,this.xy=s,this.nodes=[i.firstChild,i]}set dragging(t){let r=t?document.addEventListener:document.removeEventListener;r(m?"touchmove":"mousemove",this),r(m?"touchend":"mouseup",this)}handleEvent(t){switch(t.type){case"mousedown":case"touchstart":if(t.preventDefault(),!pt(t)||!m&&t.button!=0)return;this.el.focus(),W(this,t),this.dragging=!0;break;case"mousemove":case"touchmove":t.preventDefault(),W(this,t);break;case"mouseup":case"touchend":this.dragging=!1;break;case"keydown":ut(this,t);break}}style(t){t.forEach((r,o)=>{for(let s in r)this.nodes[o].style.setProperty(s,r[s])})}};var H=class extends u{constructor(t){super(t,"hue",'aria-label="Hue" aria-valuemin="0" aria-valuemax="360"',!1)}update({h:t}){this.h=t,this.style([{left:`${t/360*100}%`,color:d({h:t,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuenow",`${a(t)}`)}getMove(t,r){return{h:r?c(this.h+t.x*360,0,360):360*t.x}}};var w=class extends u{constructor(t){super(t,"saturation",'aria-label="Color"',!0)}update(t){this.hsva=t,this.style([{top:`${100-t.v}%`,left:`${t.s}%`,color:d(t)},{"background-color":d({h:t.h,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuetext",`Saturation ${a(t.s)}%, Brightness ${a(t.v)}%`)}getMove(t,r){return{s:r?c(this.hsva.s+t.x*100,0,100):t.x*100,v:r?c(this.hsva.v-t.y*100,0,100):Math.round(100-t.y*100)}}};var Z=':host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:"";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}';var tt="[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}";var rt="[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}";var T=Symbol("same"),R=Symbol("color"),et=Symbol("hsva"),_=Symbol("update"),ot=Symbol("parts"),g=Symbol("css"),x=Symbol("sliders"),p=class extends HTMLElement{static get observedAttributes(){return["color"]}get[g](){return[Z,tt,rt]}get[x](){return[w,H]}get color(){return this[R]}set color(t){if(!this[T](t)){let r=this.colorModel.toHsva(t);this[_](r),this[R]=t}}constructor(){super();let t=S(``),r=this.attachShadow({mode:"open"});r.appendChild(t.content.cloneNode(!0)),r.addEventListener("move",this),this[ot]=this[x].map(o=>new o(r))}connectedCallback(){if(this.hasOwnProperty("color")){let t=this.color;delete this.color,this.color=t}else this.color||(this.color=this.colorModel.defaultColor)}attributeChangedCallback(t,r,o){let s=this.colorModel.fromAttr(o);this[T](s)||(this.color=s)}handleEvent(t){let r=this[et],o={...r,...t.detail};this[_](o);let s;!L(o,r)&&!this[T](s=this.colorModel.fromHsva(o))&&(this[R]=s,f(this,"color-changed",{value:s}))}[T](t){return this.color&&this.colorModel.equal(t,this.color)}[_](t){this[et]=t,this[ot].forEach(r=>r.update(t))}};var dt={defaultColor:"#000",toHsva:F,fromHsva:({h:e,s:t,v:r})=>X({h:e,s:t,v:r,a:1}),equal:K,fromAttr:e=>e},y=class extends p{get colorModel(){return dt}};var P=class extends y{};customElements.define("hex-color-picker",P);var ht={defaultColor:"hsl(0, 0%, 0%)",toHsva:J,fromHsva:d,equal:h,fromAttr:e=>e},M=class extends p{get colorModel(){return ht}};var z=class extends M{};customElements.define("hsl-string-color-picker",z);var mt={defaultColor:"rgb(0, 0, 0)",toHsva:U,fromHsva:B,equal:h,fromAttr:e=>e},k=class extends p{get colorModel(){return mt}};var V=class extends k{};customElements.define("rgb-string-color-picker",V);var C=class extends u{constructor(t){super(t,"alpha",'aria-label="Alpha" aria-valuemin="0" aria-valuemax="1"',!1)}update(t){this.hsva=t;let r=$({...t,a:0}),o=$({...t,a:1}),s=t.a*100;this.style([{left:`${s}%`,color:$(t)},{"--gradient":`linear-gradient(90deg, ${r}, ${o}`}]);let n=a(s);this.el.setAttribute("aria-valuenow",`${n}`),this.el.setAttribute("aria-valuetext",`${n}%`)}getMove(t,r){return{a:r?c(this.hsva.a+t.x):t.x}}};var st=`[part=alpha]{flex:0 0 24px}[part=alpha]::after{display:block;content:"";position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit;background-image:var(--gradient);box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part^=alpha]{background-color:#fff;background-image:url('data:image/svg+xml,')}[part=alpha-pointer]{top:50%}`;var E=class extends p{get[g](){return[...super[g],st]}get[x](){return[...super[x],C]}};var ft={defaultColor:"rgba(0, 0, 0, 1)",toHsva:I,fromHsva:D,equal:h,fromAttr:e=>e},N=class extends E{get colorModel(){return ft}};var j=class extends N{};customElements.define("rgba-string-color-picker",j);function gt({isAutofocused:e,isDisabled:t,isLive:r,isLiveDebounced:o,isLiveOnBlur:s,liveDebounce:n,state:i}){return{state:i,init(){this.state===null||this.state===""||this.setState(this.state),e&&this.togglePanelVisibility(this.$refs.input),this.$watch("state",Alpine.debounce(l=>{CSS.supports("color",l)&&(this.$refs.picker.color=l)},200)),this.$refs.input.addEventListener("change",l=>{this.setState(l.target.value)}),this.$refs.panel.addEventListener("color-changed",l=>{this.setState(l.detail.value),!(s||!(r||o))&&setTimeout(()=>{this.state===l.detail.value&&this.commitState()},o?n:250)}),(r||o||s)&&new MutationObserver(()=>this.isOpen()?null:this.commitState()).observe(this.$refs.panel,{attributes:!0,childList:!0})},togglePanelVisibility(){t||this.$refs.panel.toggle(this.$refs.input)},setState(l){this.state=l,this.$refs.input.value=l,this.$refs.picker.color=l},isOpen(){return this.$refs.panel.style.display==="block"},commitState(){JSON.stringify(this.$wire.__instance.canonical)!==JSON.stringify(this.$wire.__instance.ephemeral)&&this.$wire.$commit()}}}export{gt as default}; ================================================ FILE: public/js/filament/forms/components/date-time-picker.js ================================================ var Gi=Object.create;var Hn=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var Zi=Object.getOwnPropertyNames;var Vi=Object.getPrototypeOf,Ki=Object.prototype.hasOwnProperty;var v=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports);var Qi=(n,t,a,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of Zi(t))!Ki.call(n,e)&&e!==a&&Hn(n,e,{get:()=>t[e],enumerable:!(i=Ri(t,e))||i.enumerable});return n};var oe=(n,t,a)=>(a=n!=null?Gi(Vi(n)):{},Qi(t||!n||!n.__esModule?Hn(a,"default",{value:n,enumerable:!0}):a,n));var En=v((He,je)=>{(function(n,t){typeof He=="object"&&typeof je<"u"?je.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_advancedFormat=t()})(He,(function(){"use strict";return function(n,t){var a=t.prototype,i=a.format;a.format=function(e){var r=this,s=this.$locale();if(!this.isValid())return i.bind(this)(e);var _=this.$utils(),d=(e||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(u){switch(u){case"Q":return Math.ceil((r.$M+1)/3);case"Do":return s.ordinal(r.$D);case"gggg":return r.weekYear();case"GGGG":return r.isoWeekYear();case"wo":return s.ordinal(r.week(),"W");case"w":case"ww":return _.s(r.week(),u==="w"?1:2,"0");case"W":case"WW":return _.s(r.isoWeek(),u==="W"?1:2,"0");case"k":case"kk":return _.s(String(r.$H===0?24:r.$H),u==="k"?1:2,"0");case"X":return Math.floor(r.$d.getTime()/1e3);case"x":return r.$d.getTime();case"z":return"["+r.offsetName()+"]";case"zzz":return"["+r.offsetName("long")+"]";default:return u}}));return i.bind(this)(d)}}}))});var Jn=v((Te,we)=>{(function(n,t){typeof Te=="object"&&typeof we<"u"?we.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_customParseFormat=t()})(Te,(function(){"use strict";var n={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},t=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,a=/\d/,i=/\d\d/,e=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,s={},_=function(c){return(c=+c)+(c>68?1900:2e3)},d=function(c){return function(y){this[c]=+y}},u=[/[+-]\d\d:?(\d\d)?|Z/,function(c){(this.zone||(this.zone={})).offset=(function(y){if(!y||y==="Z")return 0;var D=y.match(/([+-]|\d\d)/g),L=60*D[1]+(+D[2]||0);return L===0?0:D[0]==="+"?-L:L})(c)}],o=function(c){var y=s[c];return y&&(y.indexOf?y:y.s.concat(y.f))},f=function(c,y){var D,L=s.meridiem;if(L){for(var w=1;w<=24;w+=1)if(c.indexOf(L(w,0,y))>-1){D=w>12;break}}else D=c===(y?"pm":"PM");return D},l={A:[r,function(c){this.afternoon=f(c,!1)}],a:[r,function(c){this.afternoon=f(c,!0)}],Q:[a,function(c){this.month=3*(c-1)+1}],S:[a,function(c){this.milliseconds=100*+c}],SS:[i,function(c){this.milliseconds=10*+c}],SSS:[/\d{3}/,function(c){this.milliseconds=+c}],s:[e,d("seconds")],ss:[e,d("seconds")],m:[e,d("minutes")],mm:[e,d("minutes")],H:[e,d("hours")],h:[e,d("hours")],HH:[e,d("hours")],hh:[e,d("hours")],D:[e,d("day")],DD:[i,d("day")],Do:[r,function(c){var y=s.ordinal,D=c.match(/\d+/);if(this.day=D[0],y)for(var L=1;L<=31;L+=1)y(L).replace(/\[|\]/g,"")===c&&(this.day=L)}],w:[e,d("week")],ww:[i,d("week")],M:[e,d("month")],MM:[i,d("month")],MMM:[r,function(c){var y=o("months"),D=(o("monthsShort")||y.map((function(L){return L.slice(0,3)}))).indexOf(c)+1;if(D<1)throw new Error;this.month=D%12||D}],MMMM:[r,function(c){var y=o("months").indexOf(c)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,d("year")],YY:[i,function(c){this.year=_(c)}],YYYY:[/\d{4}/,d("year")],Z:u,ZZ:u};function m(c){var y,D;y=c,D=s&&s.formats;for(var L=(c=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function($,j,U){var W=U&&U.toUpperCase();return j||D[U]||n[U]||D[W].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(g,M,h){return M||h.slice(1)}))}))).match(t),w=L.length,b=0;b-1)return new Date((Y==="X"?1e3:1)*p);var T=m(Y)(p),q=T.year,N=T.month,F=T.day,P=T.hours,B=T.minutes,Q=T.seconds,ae=T.milliseconds,Z=T.zone,J=T.week,R=new Date,X=F||(q||N?1:R.getDate()),ee=q||R.getFullYear(),fe=0;q&&!N||(fe=N>0?N-1:R.getMonth());var me,pe=P||0,Le=B||0,De=Q||0,ve=ae||0;return Z?new Date(Date.UTC(ee,fe,X,pe,Le,De,ve+60*Z.offset*1e3)):S?new Date(Date.UTC(ee,fe,X,pe,Le,De,ve)):(me=new Date(ee,fe,X,pe,Le,De,ve),J&&(me=H(me).week(J).toDate()),me)}catch{return new Date("")}})(C,x,A,D),this.init(),W&&W!==!0&&(this.$L=this.locale(W).$L),U&&C!=this.format(x)&&(this.$d=new Date("")),s={}}else if(x instanceof Array)for(var g=x.length,M=1;M<=g;M+=1){I[1]=x[M-1];var h=D.apply(this,I);if(h.isValid()){this.$d=h.$d,this.$L=h.$L,this.init();break}M===g&&(this.$d=new Date(""))}else w.call(this,b)}}}))});var Un=v(($e,Ce)=>{(function(n,t){typeof $e=="object"&&typeof Ce<"u"?Ce.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_localeData=t()})($e,(function(){"use strict";return function(n,t,a){var i=t.prototype,e=function(u){return u&&(u.indexOf?u:u.s)},r=function(u,o,f,l,m){var c=u.name?u:u.$locale(),y=e(c[o]),D=e(c[f]),L=y||D.map((function(b){return b.slice(0,l)}));if(!m)return L;var w=c.weekStart;return L.map((function(b,C){return L[(C+(w||0))%7]}))},s=function(){return a.Ls[a.locale()]},_=function(u,o){return u.formats[o]||(function(f){return f.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(l,m,c){return m||c.slice(1)}))})(u.formats[o.toUpperCase()])},d=function(){var u=this;return{months:function(o){return o?o.format("MMMM"):r(u,"months")},monthsShort:function(o){return o?o.format("MMM"):r(u,"monthsShort","months",3)},firstDayOfWeek:function(){return u.$locale().weekStart||0},weekdays:function(o){return o?o.format("dddd"):r(u,"weekdays")},weekdaysMin:function(o){return o?o.format("dd"):r(u,"weekdaysMin","weekdays",2)},weekdaysShort:function(o){return o?o.format("ddd"):r(u,"weekdaysShort","weekdays",3)},longDateFormat:function(o){return _(u.$locale(),o)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}};i.localeData=function(){return d.bind(this)()},a.localeData=function(){var u=s();return{firstDayOfWeek:function(){return u.weekStart||0},weekdays:function(){return a.weekdays()},weekdaysShort:function(){return a.weekdaysShort()},weekdaysMin:function(){return a.weekdaysMin()},months:function(){return a.months()},monthsShort:function(){return a.monthsShort()},longDateFormat:function(o){return _(u,o)},meridiem:u.meridiem,ordinal:u.ordinal}},a.months=function(){return r(s(),"months")},a.monthsShort=function(){return r(s(),"monthsShort","months",3)},a.weekdays=function(u){return r(s(),"weekdays",null,null,u)},a.weekdaysShort=function(u){return r(s(),"weekdaysShort","weekdays",3,u)},a.weekdaysMin=function(u){return r(s(),"weekdaysMin","weekdays",2,u)}}}))});var Wn=v((Oe,ze)=>{(function(n,t){typeof Oe=="object"&&typeof ze<"u"?ze.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_timezone=t()})(Oe,(function(){"use strict";var n={year:0,month:1,day:2,hour:3,minute:4,second:5},t={};return function(a,i,e){var r,s=function(o,f,l){l===void 0&&(l={});var m=new Date(o),c=(function(y,D){D===void 0&&(D={});var L=D.timeZoneName||"short",w=y+"|"+L,b=t[w];return b||(b=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:y,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:L}),t[w]=b),b})(f,l);return c.formatToParts(m)},_=function(o,f){for(var l=s(o,f),m=[],c=0;c=0&&(m[w]=parseInt(L,10))}var b=m[3],C=b===24?0:b,A=m[0]+"-"+m[1]+"-"+m[2]+" "+C+":"+m[4]+":"+m[5]+":000",I=+o;return(e.utc(A).valueOf()-(I-=I%1e3))/6e4},d=i.prototype;d.tz=function(o,f){o===void 0&&(o=r);var l,m=this.utcOffset(),c=this.toDate(),y=c.toLocaleString("en-US",{timeZone:o}),D=Math.round((c-new Date(y))/1e3/60),L=15*-Math.round(c.getTimezoneOffset()/15)-D;if(!Number(L))l=this.utcOffset(0,f);else if(l=e(y,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(L,!0),f){var w=l.utcOffset();l=l.add(m-w,"minute")}return l.$x.$timezone=o,l},d.offsetName=function(o){var f=this.$x.$timezone||e.tz.guess(),l=s(this.valueOf(),f,{timeZoneName:o}).find((function(m){return m.type.toLowerCase()==="timezonename"}));return l&&l.value};var u=d.startOf;d.startOf=function(o,f){if(!this.$x||!this.$x.$timezone)return u.call(this,o,f);var l=e(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return u.call(l,o,f).tz(this.$x.$timezone,!0)},e.tz=function(o,f,l){var m=l&&f,c=l||f||r,y=_(+e(),c);if(typeof o!="string")return e(o).tz(c);var D=(function(C,A,I){var x=C-60*A*1e3,$=_(x,I);if(A===$)return[x,A];var j=_(x-=60*($-A)*1e3,I);return $===j?[x,$]:[C-60*Math.min($,j)*1e3,Math.max($,j)]})(e.utc(o,m).valueOf(),y,c),L=D[0],w=D[1],b=e(L).utcOffset(w);return b.$x.$timezone=c,b},e.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},e.tz.setDefault=function(o){r=o}}}))});var Pn=v((Ae,qe)=>{(function(n,t){typeof Ae=="object"&&typeof qe<"u"?qe.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_plugin_utc=t()})(Ae,(function(){"use strict";var n="minute",t=/[+-]\d\d(?::?\d\d)?/g,a=/([+-]|\d\d)/g;return function(i,e,r){var s=e.prototype;r.utc=function(m){var c={date:m,utc:!0,args:arguments};return new e(c)},s.utc=function(m){var c=r(this.toDate(),{locale:this.$L,utc:!0});return m?c.add(this.utcOffset(),n):c},s.local=function(){return r(this.toDate(),{locale:this.$L,utc:!1})};var _=s.parse;s.parse=function(m){m.utc&&(this.$u=!0),this.$utils().u(m.$offset)||(this.$offset=m.$offset),_.call(this,m)};var d=s.init;s.init=function(){if(this.$u){var m=this.$d;this.$y=m.getUTCFullYear(),this.$M=m.getUTCMonth(),this.$D=m.getUTCDate(),this.$W=m.getUTCDay(),this.$H=m.getUTCHours(),this.$m=m.getUTCMinutes(),this.$s=m.getUTCSeconds(),this.$ms=m.getUTCMilliseconds()}else d.call(this)};var u=s.utcOffset;s.utcOffset=function(m,c){var y=this.$utils().u;if(y(m))return this.$u?0:y(this.$offset)?u.call(this):this.$offset;if(typeof m=="string"&&(m=(function(b){b===void 0&&(b="");var C=b.match(t);if(!C)return null;var A=(""+C[0]).match(a)||["-",0,0],I=A[0],x=60*+A[1]+ +A[2];return x===0?0:I==="+"?x:-x})(m),m===null))return this;var D=Math.abs(m)<=16?60*m:m;if(D===0)return this.utc(c);var L=this.clone();if(c)return L.$offset=D,L.$u=!1,L;var w=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(L=this.local().add(D+w,n)).$offset=D,L.$x.$localOffset=w,L};var o=s.format;s.format=function(m){var c=m||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return o.call(this,c)},s.valueOf=function(){var m=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*m},s.isUTC=function(){return!!this.$u},s.toISOString=function(){return this.toDate().toISOString()},s.toString=function(){return this.toDate().toUTCString()};var f=s.toDate;s.toDate=function(m){return m==="s"&&this.$offset?r(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():f.call(this)};var l=s.diff;s.diff=function(m,c,y){if(m&&this.$u===m.$u)return l.call(this,m,c,y);var D=this.local(),L=r(m).local();return l.call(D,L,c,y)}}}))});var k=v((Ie,xe)=>{(function(n,t){typeof Ie=="object"&&typeof xe<"u"?xe.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs=t()})(Ie,(function(){"use strict";var n=1e3,t=6e4,a=36e5,i="millisecond",e="second",r="minute",s="hour",_="day",d="week",u="month",o="quarter",f="year",l="date",m="Invalid Date",c=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,D={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(g){var M=["th","st","nd","rd"],h=g%100;return"["+g+(M[(h-20)%10]||M[h]||M[0])+"]"}},L=function(g,M,h){var p=String(g);return!p||p.length>=M?g:""+Array(M+1-p.length).join(h)+g},w={s:L,z:function(g){var M=-g.utcOffset(),h=Math.abs(M),p=Math.floor(h/60),Y=h%60;return(M<=0?"+":"-")+L(p,2,"0")+":"+L(Y,2,"0")},m:function g(M,h){if(M.date()1)return g(H[0])}else{var T=M.name;C[T]=M,Y=T}return!p&&Y&&(b=Y),Y||!p&&b},$=function(g,M){if(I(g))return g.clone();var h=typeof M=="object"?M:{};return h.date=g,h.args=arguments,new U(h)},j=w;j.l=x,j.i=I,j.w=function(g,M){return $(g,{locale:M.$L,utc:M.$u,x:M.$x,$offset:M.$offset})};var U=(function(){function g(h){this.$L=x(h.locale,null,!0),this.parse(h),this.$x=this.$x||h.x||{},this[A]=!0}var M=g.prototype;return M.parse=function(h){this.$d=(function(p){var Y=p.date,S=p.utc;if(Y===null)return new Date(NaN);if(j.u(Y))return new Date;if(Y instanceof Date)return new Date(Y);if(typeof Y=="string"&&!/Z$/i.test(Y)){var H=Y.match(c);if(H){var T=H[2]-1||0,q=(H[7]||"0").substring(0,3);return S?new Date(Date.UTC(H[1],T,H[3]||1,H[4]||0,H[5]||0,H[6]||0,q)):new Date(H[1],T,H[3]||1,H[4]||0,H[5]||0,H[6]||0,q)}}return new Date(Y)})(h),this.init()},M.init=function(){var h=this.$d;this.$y=h.getFullYear(),this.$M=h.getMonth(),this.$D=h.getDate(),this.$W=h.getDay(),this.$H=h.getHours(),this.$m=h.getMinutes(),this.$s=h.getSeconds(),this.$ms=h.getMilliseconds()},M.$utils=function(){return j},M.isValid=function(){return this.$d.toString()!==m},M.isSame=function(h,p){var Y=$(h);return this.startOf(p)<=Y&&Y<=this.endOf(p)},M.isAfter=function(h,p){return $(h){(function(n,t){typeof Ne=="object"&&typeof Fe<"u"?Fe.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_am=t(n.dayjs)})(Ne,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"am",weekdays:"\u12A5\u1211\u12F5_\u1230\u129E_\u121B\u12AD\u1230\u129E_\u1228\u1261\u12D5_\u1210\u1219\u1235_\u12A0\u122D\u1265_\u1245\u12F3\u121C".split("_"),weekdaysShort:"\u12A5\u1211\u12F5_\u1230\u129E_\u121B\u12AD\u1230_\u1228\u1261\u12D5_\u1210\u1219\u1235_\u12A0\u122D\u1265_\u1245\u12F3\u121C".split("_"),weekdaysMin:"\u12A5\u1211_\u1230\u129E_\u121B\u12AD_\u1228\u1261_\u1210\u1219_\u12A0\u122D_\u1245\u12F3".split("_"),months:"\u1303\u1295\u12CB\u122A_\u134C\u1265\u122F\u122A_\u121B\u122D\u127D_\u12A4\u1355\u122A\u120D_\u121C\u12ED_\u1301\u1295_\u1301\u120B\u12ED_\u12A6\u1308\u1235\u1275_\u1234\u1355\u1274\u121D\u1260\u122D_\u12A6\u12AD\u1276\u1260\u122D_\u1296\u126C\u121D\u1260\u122D_\u12F2\u1234\u121D\u1260\u122D".split("_"),monthsShort:"\u1303\u1295\u12CB_\u134C\u1265\u122F_\u121B\u122D\u127D_\u12A4\u1355\u122A_\u121C\u12ED_\u1301\u1295_\u1301\u120B\u12ED_\u12A6\u1308\u1235_\u1234\u1355\u1274_\u12A6\u12AD\u1276_\u1296\u126C\u121D_\u12F2\u1234\u121D".split("_"),weekStart:1,yearStart:4,relativeTime:{future:"\u1260%s",past:"%s \u1260\u134A\u1275",s:"\u1325\u1242\u1275 \u1230\u12A8\u1295\u12F6\u127D",m:"\u12A0\u1295\u12F5 \u12F0\u1242\u1243",mm:"%d \u12F0\u1242\u1243\u12CE\u127D",h:"\u12A0\u1295\u12F5 \u1230\u12D3\u1275",hh:"%d \u1230\u12D3\u1273\u1275",d:"\u12A0\u1295\u12F5 \u1240\u1295",dd:"%d \u1240\u1293\u1275",M:"\u12A0\u1295\u12F5 \u12C8\u122D",MM:"%d \u12C8\u122B\u1275",y:"\u12A0\u1295\u12F5 \u12D3\u1218\u1275",yy:"%d \u12D3\u1218\u1273\u1275"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM D \u1363 YYYY",LLL:"MMMM D \u1363 YYYY HH:mm",LLLL:"dddd \u1363 MMMM D \u1363 YYYY HH:mm"},ordinal:function(e){return e+"\u129B"}};return a.default.locale(i,null,!0),i}))});var Rn=v((Ee,Je)=>{(function(n,t){typeof Ee=="object"&&typeof Je<"u"?Je.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ar=t(n.dayjs)})(Ee,(function(n){"use strict";function t(f){return f&&typeof f=="object"&&"default"in f?f:{default:f}}var a=t(n),i="\u064A\u0646\u0627\u064A\u0631_\u0641\u0628\u0631\u0627\u064A\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064A\u0644_\u0645\u0627\u064A\u0648_\u064A\u0648\u0646\u064A\u0648_\u064A\u0648\u0644\u064A\u0648_\u0623\u063A\u0633\u0637\u0633_\u0633\u0628\u062A\u0645\u0628\u0631_\u0623\u0643\u062A\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062F\u064A\u0633\u0645\u0628\u0631".split("_"),e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},r={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},s=/[١٢٣٤٥٦٧٨٩٠]/g,_=/،/g,d=/\d/g,u=/,/g,o={name:"ar",weekdays:"\u0627\u0644\u0623\u062D\u062F_\u0627\u0644\u0625\u062B\u0646\u064A\u0646_\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062E\u0645\u064A\u0633_\u0627\u0644\u062C\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062A".split("_"),weekdaysShort:"\u0623\u062D\u062F_\u0625\u062B\u0646\u064A\u0646_\u062B\u0644\u0627\u062B\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062E\u0645\u064A\u0633_\u062C\u0645\u0639\u0629_\u0633\u0628\u062A".split("_"),weekdaysMin:"\u062D_\u0646_\u062B_\u0631_\u062E_\u062C_\u0633".split("_"),months:i,monthsShort:i,weekStart:6,meridiem:function(f){return f>12?"\u0645":"\u0635"},relativeTime:{future:"\u0628\u0639\u062F %s",past:"\u0645\u0646\u0630 %s",s:"\u062B\u0627\u0646\u064A\u0629 \u0648\u0627\u062D\u062F\u0629",m:"\u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629",mm:"%d \u062F\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629 \u0648\u0627\u062D\u062F\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062A",d:"\u064A\u0648\u0645 \u0648\u0627\u062D\u062F",dd:"%d \u0623\u064A\u0627\u0645",M:"\u0634\u0647\u0631 \u0648\u0627\u062D\u062F",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0639\u0627\u0645 \u0648\u0627\u062D\u062F",yy:"%d \u0623\u0639\u0648\u0627\u0645"},preparse:function(f){return f.replace(s,(function(l){return r[l]})).replace(_,",")},postformat:function(f){return f.replace(d,(function(l){return e[l]})).replace(u,"\u060C")},ordinal:function(f){return f},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200FM/\u200FYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"}};return a.default.locale(o,null,!0),o}))});var Zn=v((Ue,We)=>{(function(n,t){typeof Ue=="object"&&typeof We<"u"?We.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_bs=t(n.dayjs)})(Ue,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"bs",weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010Detvrtak_petak_subota".split("_"),months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),weekStart:1,weekdaysShort:"ned._pon._uto._sri._\u010Det._pet._sub.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010De_pe_su".split("_"),ordinal:function(e){return e},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return a.default.locale(i,null,!0),i}))});var Vn=v((Pe,Ge)=>{(function(n,t){typeof Pe=="object"&&typeof Ge<"u"?Ge.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ca=t(n.dayjs)})(Pe,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ca",weekdays:"Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),weekdaysShort:"Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),months:"Gener_Febrer_Mar\xE7_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),monthsShort:"Gen._Febr._Mar\xE7_Abr._Maig_Juny_Jul._Ag._Set._Oct._Nov._Des.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",ll:"D MMM YYYY",lll:"D MMM YYYY, H:mm",llll:"ddd D MMM YYYY, H:mm"},relativeTime:{future:"d'aqu\xED %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:function(e){return""+e+(e===1||e===3?"r":e===2?"n":e===4?"t":"\xE8")}};return a.default.locale(i,null,!0),i}))});var Re=v((ye,Kn)=>{(function(n,t){typeof ye=="object"&&typeof Kn<"u"?t(ye,k()):typeof define=="function"&&define.amd?define(["exports","dayjs"],t):t((n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ku={},n.dayjs)})(ye,(function(n,t){"use strict";function a(d){return d&&typeof d=="object"&&"default"in d?d:{default:d}}var i=a(t),e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},r={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},s=["\u06A9\u0627\u0646\u0648\u0648\u0646\u06CC \u062F\u0648\u0648\u06D5\u0645","\u0634\u0648\u0628\u0627\u062A","\u0626\u0627\u062F\u0627\u0631","\u0646\u06CC\u0633\u0627\u0646","\u0626\u0627\u06CC\u0627\u0631","\u062D\u0648\u0632\u06D5\u06CC\u0631\u0627\u0646","\u062A\u06D5\u0645\u0645\u0648\u0648\u0632","\u0626\u0627\u0628","\u0626\u06D5\u06CC\u0644\u0648\u0648\u0644","\u062A\u0634\u0631\u06CC\u0646\u06CC \u06CC\u06D5\u06A9\u06D5\u0645","\u062A\u0634\u0631\u06CC\u0646\u06CC \u062F\u0648\u0648\u06D5\u0645","\u06A9\u0627\u0646\u0648\u0648\u0646\u06CC \u06CC\u06D5\u06A9\u06D5\u0645"],_={name:"ku",months:s,monthsShort:s,weekdays:"\u06CC\u06D5\u06A9\u0634\u06D5\u0645\u0645\u06D5_\u062F\u0648\u0648\u0634\u06D5\u0645\u0645\u06D5_\u0633\u06CE\u0634\u06D5\u0645\u0645\u06D5_\u0686\u0648\u0627\u0631\u0634\u06D5\u0645\u0645\u06D5_\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645\u0645\u06D5_\u0647\u06D5\u06CC\u0646\u06CC_\u0634\u06D5\u0645\u0645\u06D5".split("_"),weekdaysShort:"\u06CC\u06D5\u06A9\u0634\u06D5\u0645_\u062F\u0648\u0648\u0634\u06D5\u0645_\u0633\u06CE\u0634\u06D5\u0645_\u0686\u0648\u0627\u0631\u0634\u06D5\u0645_\u067E\u06CE\u0646\u062C\u0634\u06D5\u0645_\u0647\u06D5\u06CC\u0646\u06CC_\u0634\u06D5\u0645\u0645\u06D5".split("_"),weekStart:6,weekdaysMin:"\u06CC_\u062F_\u0633_\u0686_\u067E_\u0647\u0640_\u0634".split("_"),preparse:function(d){return d.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(u){return r[u]})).replace(/،/g,",")},postformat:function(d){return d.replace(/\d/g,(function(u){return e[u]})).replace(/,/g,"\u060C")},ordinal:function(d){return d},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiem:function(d){return d<12?"\u067E.\u0646":"\u062F.\u0646"},relativeTime:{future:"\u0644\u06D5 %s",past:"\u0644\u06D5\u0645\u06D5\u0648\u067E\u06CE\u0634 %s",s:"\u0686\u06D5\u0646\u062F \u0686\u0631\u06A9\u06D5\u06CC\u06D5\u06A9",m:"\u06CC\u06D5\u06A9 \u062E\u0648\u0644\u06D5\u06A9",mm:"%d \u062E\u0648\u0644\u06D5\u06A9",h:"\u06CC\u06D5\u06A9 \u06A9\u0627\u062A\u0698\u0645\u06CE\u0631",hh:"%d \u06A9\u0627\u062A\u0698\u0645\u06CE\u0631",d:"\u06CC\u06D5\u06A9 \u0695\u06C6\u0698",dd:"%d \u0695\u06C6\u0698",M:"\u06CC\u06D5\u06A9 \u0645\u0627\u0646\u06AF",MM:"%d \u0645\u0627\u0646\u06AF",y:"\u06CC\u06D5\u06A9 \u0633\u0627\u06B5",yy:"%d \u0633\u0627\u06B5"}};i.default.locale(_,null,!0),n.default=_,n.englishToArabicNumbersMap=e,Object.defineProperty(n,"__esModule",{value:!0})}))});var Qn=v((Ze,Ve)=>{(function(n,t){typeof Ze=="object"&&typeof Ve<"u"?Ve.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_cs=t(n.dayjs)})(Ze,(function(n){"use strict";function t(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var a=t(n);function i(s){return s>1&&s<5&&~~(s/10)!=1}function e(s,_,d,u){var o=s+" ";switch(d){case"s":return _||u?"p\xE1r sekund":"p\xE1r sekundami";case"m":return _?"minuta":u?"minutu":"minutou";case"mm":return _||u?o+(i(s)?"minuty":"minut"):o+"minutami";case"h":return _?"hodina":u?"hodinu":"hodinou";case"hh":return _||u?o+(i(s)?"hodiny":"hodin"):o+"hodinami";case"d":return _||u?"den":"dnem";case"dd":return _||u?o+(i(s)?"dny":"dn\xED"):o+"dny";case"M":return _||u?"m\u011Bs\xEDc":"m\u011Bs\xEDcem";case"MM":return _||u?o+(i(s)?"m\u011Bs\xEDce":"m\u011Bs\xEDc\u016F"):o+"m\u011Bs\xEDci";case"y":return _||u?"rok":"rokem";case"yy":return _||u?o+(i(s)?"roky":"let"):o+"lety"}}var r={name:"cs",weekdays:"ned\u011Ble_pond\u011Bl\xED_\xFAter\xFD_st\u0159eda_\u010Dtvrtek_p\xE1tek_sobota".split("_"),weekdaysShort:"ne_po_\xFAt_st_\u010Dt_p\xE1_so".split("_"),weekdaysMin:"ne_po_\xFAt_st_\u010Dt_p\xE1_so".split("_"),months:"leden_\xFAnor_b\u0159ezen_duben_kv\u011Bten_\u010Derven_\u010Dervenec_srpen_z\xE1\u0159\xED_\u0159\xEDjen_listopad_prosinec".split("_"),monthsShort:"led_\xFAno_b\u0159e_dub_kv\u011B_\u010Dvn_\u010Dvc_srp_z\xE1\u0159_\u0159\xEDj_lis_pro".split("_"),weekStart:1,yearStart:4,ordinal:function(s){return s+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e}};return a.default.locale(r,null,!0),r}))});var Xn=v((Ke,Qe)=>{(function(n,t){typeof Ke=="object"&&typeof Qe<"u"?Qe.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_cy=t(n.dayjs)})(Ke,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"cy",weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),weekStart:1,weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"mewn %s",past:"%s yn \xF4l",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"}};return a.default.locale(i,null,!0),i}))});var Bn=v((Xe,Be)=>{(function(n,t){typeof Xe=="object"&&typeof Be<"u"?Be.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_da=t(n.dayjs)})(Xe,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"da",weekdays:"s\xF8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xF8rdag".split("_"),weekdaysShort:"s\xF8n._man._tirs._ons._tors._fre._l\xF8r.".split("_"),weekdaysMin:"s\xF8._ma._ti._on._to._fr._l\xF8.".split("_"),months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj_juni_juli_aug._sept._okt._nov._dec.".split("_"),weekStart:1,yearStart:4,ordinal:function(e){return e+"."},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xE5 sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xE5ned",MM:"%d m\xE5neder",y:"et \xE5r",yy:"%d \xE5r"}};return a.default.locale(i,null,!0),i}))});var ei=v((et,tt)=>{(function(n,t){typeof et=="object"&&typeof tt<"u"?tt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_de=t(n.dayjs)})(et,(function(n){"use strict";function t(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var a=t(n),i={s:"ein paar Sekunden",m:["eine Minute","einer Minute"],mm:"%d Minuten",h:["eine Stunde","einer Stunde"],hh:"%d Stunden",d:["ein Tag","einem Tag"],dd:["%d Tage","%d Tagen"],M:["ein Monat","einem Monat"],MM:["%d Monate","%d Monaten"],y:["ein Jahr","einem Jahr"],yy:["%d Jahre","%d Jahren"]};function e(s,_,d){var u=i[d];return Array.isArray(u)&&(u=u[_?0:1]),u.replace("%d",s)}var r={name:"de",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Januar_Februar_M\xE4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xE4rz_Apr._Mai_Juni_Juli_Aug._Sept._Okt._Nov._Dez.".split("_"),ordinal:function(s){return s+"."},weekStart:1,yearStart:4,formats:{LTS:"HH:mm:ss",LT:"HH:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e}};return a.default.locale(r,null,!0),r}))});var ti=v((nt,it)=>{(function(n,t){typeof nt=="object"&&typeof it<"u"?it.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_el=t(n.dayjs)})(nt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"el",weekdays:"\u039A\u03C5\u03C1\u03B9\u03B1\u03BA\u03AE_\u0394\u03B5\u03C5\u03C4\u03AD\u03C1\u03B1_\u03A4\u03C1\u03AF\u03C4\u03B7_\u03A4\u03B5\u03C4\u03AC\u03C1\u03C4\u03B7_\u03A0\u03AD\u03BC\u03C0\u03C4\u03B7_\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE_\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF".split("_"),weekdaysShort:"\u039A\u03C5\u03C1_\u0394\u03B5\u03C5_\u03A4\u03C1\u03B9_\u03A4\u03B5\u03C4_\u03A0\u03B5\u03BC_\u03A0\u03B1\u03C1_\u03A3\u03B1\u03B2".split("_"),weekdaysMin:"\u039A\u03C5_\u0394\u03B5_\u03A4\u03C1_\u03A4\u03B5_\u03A0\u03B5_\u03A0\u03B1_\u03A3\u03B1".split("_"),months:"\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2_\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2_\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2_\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2_\u039C\u03AC\u03B9\u03BF\u03C2_\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2_\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2_\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2_\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2_\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2_\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2_\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2".split("_"),monthsShort:"\u0399\u03B1\u03BD_\u03A6\u03B5\u03B2_\u039C\u03B1\u03C1_\u0391\u03C0\u03C1_\u039C\u03B1\u03B9_\u0399\u03BF\u03C5\u03BD_\u0399\u03BF\u03C5\u03BB_\u0391\u03C5\u03B3_\u03A3\u03B5\u03C0\u03C4_\u039F\u03BA\u03C4_\u039D\u03BF\u03B5_\u0394\u03B5\u03BA".split("_"),ordinal:function(e){return e},weekStart:1,relativeTime:{future:"\u03C3\u03B5 %s",past:"\u03C0\u03C1\u03B9\u03BD %s",s:"\u03BC\u03B5\u03C1\u03B9\u03BA\u03AC \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1",m:"\u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC",mm:"%d \u03BB\u03B5\u03C0\u03C4\u03AC",h:"\u03BC\u03AF\u03B1 \u03CE\u03C1\u03B1",hh:"%d \u03CE\u03C1\u03B5\u03C2",d:"\u03BC\u03AF\u03B1 \u03BC\u03AD\u03C1\u03B1",dd:"%d \u03BC\u03AD\u03C1\u03B5\u03C2",M:"\u03AD\u03BD\u03B1 \u03BC\u03AE\u03BD\u03B1",MM:"%d \u03BC\u03AE\u03BD\u03B5\u03C2",y:"\u03AD\u03BD\u03B1 \u03C7\u03C1\u03CC\u03BD\u03BF",yy:"%d \u03C7\u03C1\u03CC\u03BD\u03B9\u03B1"},formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"}};return a.default.locale(i,null,!0),i}))});var ni=v((rt,at)=>{(function(n,t){typeof rt=="object"&&typeof at<"u"?at.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_en=t()})(rt,(function(){"use strict";return{name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(n){var t=["th","st","nd","rd"],a=n%100;return"["+n+(t[(a-20)%10]||t[a]||t[0])+"]"}}}))});var ii=v((st,ut)=>{(function(n,t){typeof st=="object"&&typeof ut<"u"?ut.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_es=t(n.dayjs)})(st,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"es",monthsShort:"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),weekdays:"domingo_lunes_martes_mi\xE9rcoles_jueves_viernes_s\xE1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xE9._jue._vie._s\xE1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xE1".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xEDa",dd:"%d d\xEDas",M:"un mes",MM:"%d meses",y:"un a\xF1o",yy:"%d a\xF1os"},ordinal:function(e){return e+"\xBA"}};return a.default.locale(i,null,!0),i}))});var ri=v((dt,ot)=>{(function(n,t){typeof dt=="object"&&typeof ot<"u"?ot.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_et=t(n.dayjs)})(dt,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n);function i(r,s,_,d){var u={s:["m\xF5ne sekundi","m\xF5ni sekund","paar sekundit"],m:["\xFChe minuti","\xFCks minut"],mm:["%d minuti","%d minutit"],h:["\xFChe tunni","tund aega","\xFCks tund"],hh:["%d tunni","%d tundi"],d:["\xFChe p\xE4eva","\xFCks p\xE4ev"],M:["kuu aja","kuu aega","\xFCks kuu"],MM:["%d kuu","%d kuud"],y:["\xFChe aasta","aasta","\xFCks aasta"],yy:["%d aasta","%d aastat"]};return s?(u[_][2]?u[_][2]:u[_][1]).replace("%d",r):(d?u[_][0]:u[_][1]).replace("%d",r)}var e={name:"et",weekdays:"p\xFChap\xE4ev_esmasp\xE4ev_teisip\xE4ev_kolmap\xE4ev_neljap\xE4ev_reede_laup\xE4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),months:"jaanuar_veebruar_m\xE4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xE4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),ordinal:function(r){return r+"."},weekStart:1,relativeTime:{future:"%s p\xE4rast",past:"%s tagasi",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:"%d p\xE4eva",M:i,MM:i,y:i,yy:i},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"}};return a.default.locale(e,null,!0),e}))});var ai=v((_t,lt)=>{(function(n,t){typeof _t=="object"&&typeof lt<"u"?lt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fa=t(n.dayjs)})(_t,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"fa",weekdays:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647_\u062F\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200C\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647_\u062C\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06CC_\u062F_\u0633_\u0686_\u067E_\u062C_\u0634".split("_"),weekStart:6,months:"\u0698\u0627\u0646\u0648\u06CC\u0647_\u0641\u0648\u0631\u06CC\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06CC\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06CC\u0647_\u0627\u0648\u062A_\u0633\u067E\u062A\u0627\u0645\u0628\u0631_\u0627\u06A9\u062A\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062F\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06CC\u0647_\u0641\u0648\u0631\u06CC\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06CC\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06CC\u0647_\u0627\u0648\u062A_\u0633\u067E\u062A\u0627\u0645\u0628\u0631_\u0627\u06A9\u062A\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062F\u0633\u0627\u0645\u0628\u0631".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"\u062F\u0631 %s",past:"%s \u067E\u06CC\u0634",s:"\u0686\u0646\u062F \u062B\u0627\u0646\u06CC\u0647",m:"\u06CC\u06A9 \u062F\u0642\u06CC\u0642\u0647",mm:"%d \u062F\u0642\u06CC\u0642\u0647",h:"\u06CC\u06A9 \u0633\u0627\u0639\u062A",hh:"%d \u0633\u0627\u0639\u062A",d:"\u06CC\u06A9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06CC\u06A9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06CC\u06A9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"}};return a.default.locale(i,null,!0),i}))});var si=v((ft,mt)=>{(function(n,t){typeof ft=="object"&&typeof mt<"u"?mt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fi=t(n.dayjs)})(ft,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n);function i(r,s,_,d){var u={s:"muutama sekunti",m:"minuutti",mm:"%d minuuttia",h:"tunti",hh:"%d tuntia",d:"p\xE4iv\xE4",dd:"%d p\xE4iv\xE4\xE4",M:"kuukausi",MM:"%d kuukautta",y:"vuosi",yy:"%d vuotta",numbers:"nolla_yksi_kaksi_kolme_nelj\xE4_viisi_kuusi_seitsem\xE4n_kahdeksan_yhdeks\xE4n".split("_")},o={s:"muutaman sekunnin",m:"minuutin",mm:"%d minuutin",h:"tunnin",hh:"%d tunnin",d:"p\xE4iv\xE4n",dd:"%d p\xE4iv\xE4n",M:"kuukauden",MM:"%d kuukauden",y:"vuoden",yy:"%d vuoden",numbers:"nollan_yhden_kahden_kolmen_nelj\xE4n_viiden_kuuden_seitsem\xE4n_kahdeksan_yhdeks\xE4n".split("_")},f=d&&!s?o:u,l=f[_];return r<10?l.replace("%d",f.numbers[r]):l.replace("%d",r)}var e={name:"fi",weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xE4kuu_hein\xE4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xE4_hein\xE4_elo_syys_loka_marras_joulu".split("_"),ordinal:function(r){return r+"."},weekStart:1,yearStart:4,relativeTime:{future:"%s p\xE4\xE4st\xE4",past:"%s sitten",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM[ta] YYYY",LLL:"D. MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, D. MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"D. MMM YYYY",lll:"D. MMM YYYY, [klo] HH.mm",llll:"ddd, D. MMM YYYY, [klo] HH.mm"}};return a.default.locale(e,null,!0),e}))});var ui=v((ct,ht)=>{(function(n,t){typeof ct=="object"&&typeof ht<"u"?ht.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_fr=t(n.dayjs)})(ct,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"fr",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),months:"janvier_f\xE9vrier_mars_avril_mai_juin_juillet_ao\xFBt_septembre_octobre_novembre_d\xE9cembre".split("_"),monthsShort:"janv._f\xE9vr._mars_avr._mai_juin_juil._ao\xFBt_sept._oct._nov._d\xE9c.".split("_"),weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return""+e+(e===1?"er":"")}};return a.default.locale(i,null,!0),i}))});var di=v((Mt,Yt)=>{(function(n,t){typeof Mt=="object"&&typeof Yt<"u"?Yt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_he=t(n.dayjs)})(Mt,(function(n){"use strict";function t(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var a=t(n),i={s:"\u05DE\u05E1\u05E4\u05E8 \u05E9\u05E0\u05D9\u05D5\u05EA",ss:"%d \u05E9\u05E0\u05D9\u05D5\u05EA",m:"\u05D3\u05E7\u05D4",mm:"%d \u05D3\u05E7\u05D5\u05EA",h:"\u05E9\u05E2\u05D4",hh:"%d \u05E9\u05E2\u05D5\u05EA",hh2:"\u05E9\u05E2\u05EA\u05D9\u05D9\u05DD",d:"\u05D9\u05D5\u05DD",dd:"%d \u05D9\u05DE\u05D9\u05DD",dd2:"\u05D9\u05D5\u05DE\u05D9\u05D9\u05DD",M:"\u05D7\u05D5\u05D3\u05E9",MM:"%d \u05D7\u05D5\u05D3\u05E9\u05D9\u05DD",MM2:"\u05D7\u05D5\u05D3\u05E9\u05D9\u05D9\u05DD",y:"\u05E9\u05E0\u05D4",yy:"%d \u05E9\u05E0\u05D9\u05DD",yy2:"\u05E9\u05E0\u05EA\u05D9\u05D9\u05DD"};function e(s,_,d){return(i[d+(s===2?"2":"")]||i[d]).replace("%d",s)}var r={name:"he",weekdays:"\u05E8\u05D0\u05E9\u05D5\u05DF_\u05E9\u05E0\u05D9_\u05E9\u05DC\u05D9\u05E9\u05D9_\u05E8\u05D1\u05D9\u05E2\u05D9_\u05D7\u05DE\u05D9\u05E9\u05D9_\u05E9\u05D9\u05E9\u05D9_\u05E9\u05D1\u05EA".split("_"),weekdaysShort:"\u05D0\u05F3_\u05D1\u05F3_\u05D2\u05F3_\u05D3\u05F3_\u05D4\u05F3_\u05D5\u05F3_\u05E9\u05F3".split("_"),weekdaysMin:"\u05D0\u05F3_\u05D1\u05F3_\u05D2\u05F3_\u05D3\u05F3_\u05D4\u05F3_\u05D5_\u05E9\u05F3".split("_"),months:"\u05D9\u05E0\u05D5\u05D0\u05E8_\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8_\u05DE\u05E8\u05E5_\u05D0\u05E4\u05E8\u05D9\u05DC_\u05DE\u05D0\u05D9_\u05D9\u05D5\u05E0\u05D9_\u05D9\u05D5\u05DC\u05D9_\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8_\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8_\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8_\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8_\u05D3\u05E6\u05DE\u05D1\u05E8".split("_"),monthsShort:"\u05D9\u05E0\u05D5_\u05E4\u05D1\u05E8_\u05DE\u05E8\u05E5_\u05D0\u05E4\u05E8_\u05DE\u05D0\u05D9_\u05D9\u05D5\u05E0_\u05D9\u05D5\u05DC_\u05D0\u05D5\u05D2_\u05E1\u05E4\u05D8_\u05D0\u05D5\u05E7_\u05E0\u05D5\u05D1_\u05D3\u05E6\u05DE".split("_"),relativeTime:{future:"\u05D1\u05E2\u05D5\u05D3 %s",past:"\u05DC\u05E4\u05E0\u05D9 %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:function(s){return s},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05D1]MMMM YYYY",LLL:"D [\u05D1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05D1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05D1]MMMM YYYY",LLL:"D [\u05D1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05D1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"}};return a.default.locale(r,null,!0),r}))});var oi=v((yt,pt)=>{(function(n,t){typeof yt=="object"&&typeof pt<"u"?pt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hi=t(n.dayjs)})(yt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"hi",weekdays:"\u0930\u0935\u093F\u0935\u093E\u0930_\u0938\u094B\u092E\u0935\u093E\u0930_\u092E\u0902\u0917\u0932\u0935\u093E\u0930_\u092C\u0941\u0927\u0935\u093E\u0930_\u0917\u0941\u0930\u0942\u0935\u093E\u0930_\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930_\u0936\u0928\u093F\u0935\u093E\u0930".split("_"),months:"\u091C\u0928\u0935\u0930\u0940_\u092B\u093C\u0930\u0935\u0930\u0940_\u092E\u093E\u0930\u094D\u091A_\u0905\u092A\u094D\u0930\u0948\u0932_\u092E\u0908_\u091C\u0942\u0928_\u091C\u0941\u0932\u093E\u0908_\u0905\u0917\u0938\u094D\u0924_\u0938\u093F\u0924\u092E\u094D\u092C\u0930_\u0905\u0915\u094D\u091F\u0942\u092C\u0930_\u0928\u0935\u092E\u094D\u092C\u0930_\u0926\u093F\u0938\u092E\u094D\u092C\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093F_\u0938\u094B\u092E_\u092E\u0902\u0917\u0932_\u092C\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094D\u0930_\u0936\u0928\u093F".split("_"),monthsShort:"\u091C\u0928._\u092B\u093C\u0930._\u092E\u093E\u0930\u094D\u091A_\u0905\u092A\u094D\u0930\u0948._\u092E\u0908_\u091C\u0942\u0928_\u091C\u0941\u0932._\u0905\u0917._\u0938\u093F\u0924._\u0905\u0915\u094D\u091F\u0942._\u0928\u0935._\u0926\u093F\u0938.".split("_"),weekdaysMin:"\u0930_\u0938\u094B_\u092E\u0902_\u092C\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),ordinal:function(e){return e},formats:{LT:"A h:mm \u092C\u091C\u0947",LTS:"A h:mm:ss \u092C\u091C\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092C\u091C\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092C\u091C\u0947"},relativeTime:{future:"%s \u092E\u0947\u0902",past:"%s \u092A\u0939\u0932\u0947",s:"\u0915\u0941\u091B \u0939\u0940 \u0915\u094D\u0937\u0923",m:"\u090F\u0915 \u092E\u093F\u0928\u091F",mm:"%d \u092E\u093F\u0928\u091F",h:"\u090F\u0915 \u0918\u0902\u091F\u093E",hh:"%d \u0918\u0902\u091F\u0947",d:"\u090F\u0915 \u0926\u093F\u0928",dd:"%d \u0926\u093F\u0928",M:"\u090F\u0915 \u092E\u0939\u0940\u0928\u0947",MM:"%d \u092E\u0939\u0940\u0928\u0947",y:"\u090F\u0915 \u0935\u0930\u094D\u0937",yy:"%d \u0935\u0930\u094D\u0937"}};return a.default.locale(i,null,!0),i}))});var _i=v((Lt,Dt)=>{(function(n,t){typeof Lt=="object"&&typeof Dt<"u"?Dt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hu=t(n.dayjs)})(Lt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"hu",weekdays:"vas\xE1rnap_h\xE9tf\u0151_kedd_szerda_cs\xFCt\xF6rt\xF6k_p\xE9ntek_szombat".split("_"),weekdaysShort:"vas_h\xE9t_kedd_sze_cs\xFCt_p\xE9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),months:"janu\xE1r_febru\xE1r_m\xE1rcius_\xE1prilis_m\xE1jus_j\xFAnius_j\xFAlius_augusztus_szeptember_okt\xF3ber_november_december".split("_"),monthsShort:"jan_feb_m\xE1rc_\xE1pr_m\xE1j_j\xFAn_j\xFAl_aug_szept_okt_nov_dec".split("_"),ordinal:function(e){return e+"."},weekStart:1,relativeTime:{future:"%s m\xFAlva",past:"%s",s:function(e,r,s,_){return"n\xE9h\xE1ny m\xE1sodperc"+(_||r?"":"e")},m:function(e,r,s,_){return"egy perc"+(_||r?"":"e")},mm:function(e,r,s,_){return e+" perc"+(_||r?"":"e")},h:function(e,r,s,_){return"egy "+(_||r?"\xF3ra":"\xF3r\xE1ja")},hh:function(e,r,s,_){return e+" "+(_||r?"\xF3ra":"\xF3r\xE1ja")},d:function(e,r,s,_){return"egy "+(_||r?"nap":"napja")},dd:function(e,r,s,_){return e+" "+(_||r?"nap":"napja")},M:function(e,r,s,_){return"egy "+(_||r?"h\xF3nap":"h\xF3napja")},MM:function(e,r,s,_){return e+" "+(_||r?"h\xF3nap":"h\xF3napja")},y:function(e,r,s,_){return"egy "+(_||r?"\xE9v":"\xE9ve")},yy:function(e,r,s,_){return e+" "+(_||r?"\xE9v":"\xE9ve")}},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"}};return a.default.locale(i,null,!0),i}))});var li=v((vt,gt)=>{(function(n,t){typeof vt=="object"&&typeof gt<"u"?gt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_hy_am=t(n.dayjs)})(vt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"hy-am",weekdays:"\u056F\u056B\u0580\u0561\u056F\u056B_\u0565\u0580\u056F\u0578\u0582\u0577\u0561\u0562\u0569\u056B_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B_\u0570\u056B\u0576\u0563\u0577\u0561\u0562\u0569\u056B_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),months:"\u0570\u0578\u0582\u0576\u057E\u0561\u0580\u056B_\u0583\u0565\u057F\u0580\u057E\u0561\u0580\u056B_\u0574\u0561\u0580\u057F\u056B_\u0561\u057A\u0580\u056B\u056C\u056B_\u0574\u0561\u0575\u056B\u057D\u056B_\u0570\u0578\u0582\u0576\u056B\u057D\u056B_\u0570\u0578\u0582\u056C\u056B\u057D\u056B_\u0585\u0563\u0578\u057D\u057F\u0578\u057D\u056B_\u057D\u0565\u057A\u057F\u0565\u0574\u0562\u0565\u0580\u056B_\u0570\u0578\u056F\u057F\u0565\u0574\u0562\u0565\u0580\u056B_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056B_\u0564\u0565\u056F\u057F\u0565\u0574\u0562\u0565\u0580\u056B".split("_"),weekStart:1,weekdaysShort:"\u056F\u0580\u056F_\u0565\u0580\u056F_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),monthsShort:"\u0570\u0576\u057E_\u0583\u057F\u0580_\u0574\u0580\u057F_\u0561\u057A\u0580_\u0574\u0575\u057D_\u0570\u0576\u057D_\u0570\u056C\u057D_\u0585\u0563\u057D_\u057D\u057A\u057F_\u0570\u056F\u057F_\u0576\u0574\u0562_\u0564\u056F\u057F".split("_"),weekdaysMin:"\u056F\u0580\u056F_\u0565\u0580\u056F_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},relativeTime:{future:"%s \u0570\u0565\u057F\u0578",past:"%s \u0561\u057C\u0561\u057B",s:"\u0574\u056B \u0584\u0561\u0576\u056B \u057E\u0561\u0575\u0580\u056F\u0575\u0561\u0576",m:"\u0580\u0578\u057A\u0565",mm:"%d \u0580\u0578\u057A\u0565",h:"\u056A\u0561\u0574",hh:"%d \u056A\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056B\u057D",MM:"%d \u0561\u0574\u056B\u057D",y:"\u057F\u0561\u0580\u056B",yy:"%d \u057F\u0561\u0580\u056B"}};return a.default.locale(i,null,!0),i}))});var fi=v((bt,St)=>{(function(n,t){typeof bt=="object"&&typeof St<"u"?St.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_id=t(n.dayjs)})(bt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"id",weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var mi=v((kt,Ht)=>{(function(n,t){typeof kt=="object"&&typeof Ht<"u"?Ht.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_it=t(n.dayjs)})(kt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"it",weekdays:"domenica_luned\xEC_marted\xEC_mercoled\xEC_gioved\xEC_venerd\xEC_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),weekStart:1,monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"tra %s",past:"%s fa",s:"qualche secondo",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:function(e){return e+"\xBA"}};return a.default.locale(i,null,!0),i}))});var ci=v((jt,Tt)=>{(function(n,t){typeof jt=="object"&&typeof Tt<"u"?Tt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ja=t(n.dayjs)})(jt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ja",weekdays:"\u65E5\u66DC\u65E5_\u6708\u66DC\u65E5_\u706B\u66DC\u65E5_\u6C34\u66DC\u65E5_\u6728\u66DC\u65E5_\u91D1\u66DC\u65E5_\u571F\u66DC\u65E5".split("_"),weekdaysShort:"\u65E5_\u6708_\u706B_\u6C34_\u6728_\u91D1_\u571F".split("_"),weekdaysMin:"\u65E5_\u6708_\u706B_\u6C34_\u6728_\u91D1_\u571F".split("_"),months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e){return e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5(ddd) HH:mm"},meridiem:function(e){return e<12?"\u5348\u524D":"\u5348\u5F8C"},relativeTime:{future:"%s\u5F8C",past:"%s\u524D",s:"\u6570\u79D2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65E5",dd:"%d\u65E5",M:"1\u30F6\u6708",MM:"%d\u30F6\u6708",y:"1\u5E74",yy:"%d\u5E74"}};return a.default.locale(i,null,!0),i}))});var hi=v((wt,$t)=>{(function(n,t){typeof wt=="object"&&typeof $t<"u"?$t.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ka=t(n.dayjs)})(wt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ka",weekdays:"\u10D9\u10D5\u10D8\u10E0\u10D0_\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8_\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8_\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8".split("_"),weekdaysShort:"\u10D9\u10D5\u10D8_\u10DD\u10E0\u10E8_\u10E1\u10D0\u10DB_\u10DD\u10D7\u10EE_\u10EE\u10E3\u10D7_\u10DE\u10D0\u10E0_\u10E8\u10D0\u10D1".split("_"),weekdaysMin:"\u10D9\u10D5_\u10DD\u10E0_\u10E1\u10D0_\u10DD\u10D7_\u10EE\u10E3_\u10DE\u10D0_\u10E8\u10D0".split("_"),months:"\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8_\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8_\u10DB\u10D0\u10E0\u10E2\u10D8_\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8_\u10DB\u10D0\u10D8\u10E1\u10D8_\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8_\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8_\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD_\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8_\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8_\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8_\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8".split("_"),monthsShort:"\u10D8\u10D0\u10DC_\u10D7\u10D4\u10D1_\u10DB\u10D0\u10E0_\u10D0\u10DE\u10E0_\u10DB\u10D0\u10D8_\u10D8\u10D5\u10DC_\u10D8\u10D5\u10DA_\u10D0\u10D2\u10D5_\u10E1\u10D4\u10E5_\u10DD\u10E5\u10E2_\u10DC\u10DD\u10D4_\u10D3\u10D4\u10D9".split("_"),weekStart:1,formats:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},relativeTime:{future:"%s \u10E8\u10D4\u10DB\u10D3\u10D4\u10D2",past:"%s \u10EC\u10D8\u10DC",s:"\u10EC\u10D0\u10DB\u10D8",m:"\u10EC\u10E3\u10D7\u10D8",mm:"%d \u10EC\u10E3\u10D7\u10D8",h:"\u10E1\u10D0\u10D0\u10D7\u10D8",hh:"%d \u10E1\u10D0\u10D0\u10D7\u10D8\u10E1",d:"\u10D3\u10E6\u10D4\u10E1",dd:"%d \u10D3\u10E6\u10D8\u10E1 \u10D2\u10D0\u10DC\u10DB\u10D0\u10D5\u10DA\u10DD\u10D1\u10D0\u10E8\u10D8",M:"\u10D7\u10D5\u10D8\u10E1",MM:"%d \u10D7\u10D5\u10D8\u10E1",y:"\u10EC\u10D4\u10DA\u10D8",yy:"%d \u10EC\u10DA\u10D8\u10E1"},ordinal:function(e){return e}};return a.default.locale(i,null,!0),i}))});var Mi=v((Ct,Ot)=>{(function(n,t){typeof Ct=="object"&&typeof Ot<"u"?Ot.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_km=t(n.dayjs)})(Ct,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"km",weekdays:"\u17A2\u17B6\u1791\u17B7\u178F\u17D2\u1799_\u1785\u17D0\u1793\u17D2\u1791_\u17A2\u1784\u17D2\u1782\u17B6\u179A_\u1796\u17BB\u1792_\u1796\u17D2\u179A\u17A0\u179F\u17D2\u1794\u178F\u17B7\u17CD_\u179F\u17BB\u1780\u17D2\u179A_\u179F\u17C5\u179A\u17CD".split("_"),months:"\u1798\u1780\u179A\u17B6_\u1780\u17BB\u1798\u17D2\u1797\u17C8_\u1798\u17B8\u1793\u17B6_\u1798\u17C1\u179F\u17B6_\u17A7\u179F\u1797\u17B6_\u1798\u17B7\u1790\u17BB\u1793\u17B6_\u1780\u1780\u17D2\u1780\u178A\u17B6_\u179F\u17B8\u17A0\u17B6_\u1780\u1789\u17D2\u1789\u17B6_\u178F\u17BB\u179B\u17B6_\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6_\u1792\u17D2\u1793\u17BC".split("_"),weekStart:1,weekdaysShort:"\u17A2\u17B6_\u1785_\u17A2_\u1796_\u1796\u17D2\u179A_\u179F\u17BB_\u179F".split("_"),monthsShort:"\u1798\u1780\u179A\u17B6_\u1780\u17BB\u1798\u17D2\u1797\u17C8_\u1798\u17B8\u1793\u17B6_\u1798\u17C1\u179F\u17B6_\u17A7\u179F\u1797\u17B6_\u1798\u17B7\u1790\u17BB\u1793\u17B6_\u1780\u1780\u17D2\u1780\u178A\u17B6_\u179F\u17B8\u17A0\u17B6_\u1780\u1789\u17D2\u1789\u17B6_\u178F\u17BB\u179B\u17B6_\u179C\u17B7\u1785\u17D2\u1786\u17B7\u1780\u17B6_\u1792\u17D2\u1793\u17BC".split("_"),weekdaysMin:"\u17A2\u17B6_\u1785_\u17A2_\u1796_\u1796\u17D2\u179A_\u179F\u17BB_\u179F".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s\u1791\u17C0\u178F",past:"%s\u1798\u17BB\u1793",s:"\u1794\u17C9\u17BB\u1793\u17D2\u1798\u17B6\u1793\u179C\u17B7\u1793\u17B6\u1791\u17B8",m:"\u1798\u17BD\u1799\u1793\u17B6\u1791\u17B8",mm:"%d \u1793\u17B6\u1791\u17B8",h:"\u1798\u17BD\u1799\u1798\u17C9\u17C4\u1784",hh:"%d \u1798\u17C9\u17C4\u1784",d:"\u1798\u17BD\u1799\u1790\u17D2\u1784\u17C3",dd:"%d \u1790\u17D2\u1784\u17C3",M:"\u1798\u17BD\u1799\u1781\u17C2",MM:"%d \u1781\u17C2",y:"\u1798\u17BD\u1799\u1786\u17D2\u1793\u17B6\u17C6",yy:"%d \u1786\u17D2\u1793\u17B6\u17C6"}};return a.default.locale(i,null,!0),i}))});var Yi=v((zt,At)=>{(function(n,t){typeof zt=="object"&&typeof At<"u"?At.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_lt=t(n.dayjs)})(zt,(function(n){"use strict";function t(d){return d&&typeof d=="object"&&"default"in d?d:{default:d}}var a=t(n),i="sausio_vasario_kovo_baland\u017Eio_gegu\u017E\u0117s_bir\u017Eelio_liepos_rugpj\u016B\u010Dio_rugs\u0117jo_spalio_lapkri\u010Dio_gruod\u017Eio".split("_"),e="sausis_vasaris_kovas_balandis_gegu\u017E\u0117_bir\u017Eelis_liepa_rugpj\u016Btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),r=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,s=function(d,u){return r.test(u)?i[d.month()]:e[d.month()]};s.s=e,s.f=i;var _={name:"lt",weekdays:"sekmadienis_pirmadienis_antradienis_tre\u010Diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),weekdaysShort:"sek_pir_ant_tre_ket_pen_\u0161e\u0161".split("_"),weekdaysMin:"s_p_a_t_k_pn_\u0161".split("_"),months:s,monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),ordinal:function(d){return d+"."},weekStart:1,relativeTime:{future:"u\u017E %s",past:"prie\u0161 %s",s:"kelias sekundes",m:"minut\u0119",mm:"%d minutes",h:"valand\u0105",hh:"%d valandas",d:"dien\u0105",dd:"%d dienas",M:"m\u0117nes\u012F",MM:"%d m\u0117nesius",y:"metus",yy:"%d metus"},format:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"}};return a.default.locale(_,null,!0),_}))});var yi=v((qt,It)=>{(function(n,t){typeof qt=="object"&&typeof It<"u"?It.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_lv=t(n.dayjs)})(qt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"lv",weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),months:"janv\u0101ris_febru\u0101ris_marts_apr\u012Blis_maijs_j\u016Bnijs_j\u016Blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),weekStart:1,weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016Bn_j\u016Bl_aug_sep_okt_nov_dec".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:"da\u017E\u0101m sekund\u0113m",m:"min\u016Btes",mm:"%d min\u016Bt\u0113m",h:"stundas",hh:"%d stund\u0101m",d:"dienas",dd:"%d dien\u0101m",M:"m\u0113ne\u0161a",MM:"%d m\u0113ne\u0161iem",y:"gada",yy:"%d gadiem"}};return a.default.locale(i,null,!0),i}))});var pi=v((xt,Nt)=>{(function(n,t){typeof xt=="object"&&typeof Nt<"u"?Nt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ms=t(n.dayjs)})(xt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ms",weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH.mm",LLLL:"dddd, D MMMM YYYY HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var Li=v((Ft,Et)=>{(function(n,t){typeof Ft=="object"&&typeof Et<"u"?Et.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_my=t(n.dayjs)})(Ft,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"my",weekdays:"\u1010\u1014\u1004\u103A\u1039\u1002\u1014\u103D\u1031_\u1010\u1014\u1004\u103A\u1039\u101C\u102C_\u1021\u1004\u103A\u1039\u1002\u102B_\u1017\u102F\u1012\u1039\u1013\u101F\u1030\u1038_\u1000\u103C\u102C\u101E\u1015\u1010\u1031\u1038_\u101E\u1031\u102C\u1000\u103C\u102C_\u1005\u1014\u1031".split("_"),months:"\u1007\u1014\u103A\u1014\u101D\u102B\u101B\u102E_\u1016\u1031\u1016\u1031\u102C\u103A\u101D\u102B\u101B\u102E_\u1019\u1010\u103A_\u1027\u1015\u103C\u102E_\u1019\u1031_\u1007\u103D\u1014\u103A_\u1007\u1030\u101C\u102D\u102F\u1004\u103A_\u101E\u103C\u1002\u102F\u1010\u103A_\u1005\u1000\u103A\u1010\u1004\u103A\u1018\u102C_\u1021\u1031\u102C\u1000\u103A\u1010\u102D\u102F\u1018\u102C_\u1014\u102D\u102F\u101D\u1004\u103A\u1018\u102C_\u1012\u102E\u1007\u1004\u103A\u1018\u102C".split("_"),weekStart:1,weekdaysShort:"\u1014\u103D\u1031_\u101C\u102C_\u1002\u102B_\u101F\u1030\u1038_\u1000\u103C\u102C_\u101E\u1031\u102C_\u1014\u1031".split("_"),monthsShort:"\u1007\u1014\u103A_\u1016\u1031_\u1019\u1010\u103A_\u1015\u103C\u102E_\u1019\u1031_\u1007\u103D\u1014\u103A_\u101C\u102D\u102F\u1004\u103A_\u101E\u103C_\u1005\u1000\u103A_\u1021\u1031\u102C\u1000\u103A_\u1014\u102D\u102F_\u1012\u102E".split("_"),weekdaysMin:"\u1014\u103D\u1031_\u101C\u102C_\u1002\u102B_\u101F\u1030\u1038_\u1000\u103C\u102C_\u101E\u1031\u102C_\u1014\u1031".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"\u101C\u102C\u1019\u100A\u103A\u1037 %s \u1019\u103E\u102C",past:"\u101C\u103D\u1014\u103A\u1001\u1032\u1037\u101E\u1031\u102C %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103A.\u1021\u1014\u100A\u103A\u1038\u1004\u101A\u103A",m:"\u1010\u1005\u103A\u1019\u102D\u1014\u1005\u103A",mm:"%d \u1019\u102D\u1014\u1005\u103A",h:"\u1010\u1005\u103A\u1014\u102C\u101B\u102E",hh:"%d \u1014\u102C\u101B\u102E",d:"\u1010\u1005\u103A\u101B\u1000\u103A",dd:"%d \u101B\u1000\u103A",M:"\u1010\u1005\u103A\u101C",MM:"%d \u101C",y:"\u1010\u1005\u103A\u1014\u103E\u1005\u103A",yy:"%d \u1014\u103E\u1005\u103A"}};return a.default.locale(i,null,!0),i}))});var Di=v((Jt,Ut)=>{(function(n,t){typeof Jt=="object"&&typeof Ut<"u"?Ut.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_nb=t(n.dayjs)})(Jt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"nb",weekdays:"s\xF8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xF8rdag".split("_"),weekdaysShort:"s\xF8._ma._ti._on._to._fr._l\xF8.".split("_"),weekdaysMin:"s\xF8_ma_ti_on_to_fr_l\xF8".split("_"),months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),ordinal:function(e){return e+"."},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xE5ned",MM:"%d m\xE5neder",y:"ett \xE5r",yy:"%d \xE5r"}};return a.default.locale(i,null,!0),i}))});var vi=v((Wt,Pt)=>{(function(n,t){typeof Wt=="object"&&typeof Pt<"u"?Pt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_nl=t(n.dayjs)})(Wt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"nl",weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),ordinal:function(e){return"["+e+(e===1||e===8||e>=20?"ste":"de")+"]"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"een minuut",mm:"%d minuten",h:"een uur",hh:"%d uur",d:"een dag",dd:"%d dagen",M:"een maand",MM:"%d maanden",y:"een jaar",yy:"%d jaar"}};return a.default.locale(i,null,!0),i}))});var gi=v((Gt,Rt)=>{(function(n,t){typeof Gt=="object"&&typeof Rt<"u"?Rt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pl=t(n.dayjs)})(Gt,(function(n){"use strict";function t(o){return o&&typeof o=="object"&&"default"in o?o:{default:o}}var a=t(n);function i(o){return o%10<5&&o%10>1&&~~(o/10)%10!=1}function e(o,f,l){var m=o+" ";switch(l){case"m":return f?"minuta":"minut\u0119";case"mm":return m+(i(o)?"minuty":"minut");case"h":return f?"godzina":"godzin\u0119";case"hh":return m+(i(o)?"godziny":"godzin");case"MM":return m+(i(o)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return m+(i(o)?"lata":"lat")}}var r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015Bnia_pa\u017Adziernika_listopada_grudnia".split("_"),s="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017Adziernik_listopad_grudzie\u0144".split("_"),_=/D MMMM/,d=function(o,f){return _.test(f)?r[o.month()]:s[o.month()]};d.s=s,d.f=r;var u={name:"pl",weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015Broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015Br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015Ar_Cz_Pt_So".split("_"),months:d,monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017A_lis_gru".split("_"),ordinal:function(o){return o+"."},weekStart:1,yearStart:4,relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:e,mm:e,h:e,hh:e,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:e,y:"rok",yy:e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"}};return a.default.locale(u,null,!0),u}))});var bi=v((Zt,Vt)=>{(function(n,t){typeof Zt=="object"&&typeof Vt<"u"?Vt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pt=t(n.dayjs)})(Zt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"pt",weekdays:"domingo_segunda-feira_ter\xE7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xE1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sab".split("_"),weekdaysMin:"Do_2\xAA_3\xAA_4\xAA_5\xAA_6\xAA_Sa".split("_"),months:"janeiro_fevereiro_mar\xE7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"\xBA"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xE0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xE0s] HH:mm"},relativeTime:{future:"em %s",past:"h\xE1 %s",s:"alguns segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xEAs",MM:"%d meses",y:"um ano",yy:"%d anos"}};return a.default.locale(i,null,!0),i}))});var Si=v((Kt,Qt)=>{(function(n,t){typeof Kt=="object"&&typeof Qt<"u"?Qt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_pt_br=t(n.dayjs)})(Kt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"pt-br",weekdays:"domingo_segunda-feira_ter\xE7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xE1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xE1b".split("_"),weekdaysMin:"Do_2\xAA_3\xAA_4\xAA_5\xAA_6\xAA_S\xE1".split("_"),months:"janeiro_fevereiro_mar\xE7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),ordinal:function(e){return e+"\xBA"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xE0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xE0s] HH:mm"},relativeTime:{future:"em %s",past:"h\xE1 %s",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xEAs",MM:"%d meses",y:"um ano",yy:"%d anos"}};return a.default.locale(i,null,!0),i}))});var ki=v((Xt,Bt)=>{(function(n,t){typeof Xt=="object"&&typeof Bt<"u"?Bt.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ro=t(n.dayjs)})(Xt,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ro",weekdays:"Duminic\u0103_Luni_Mar\u021Bi_Miercuri_Joi_Vineri_S\xE2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xE2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xE2".split("_"),months:"Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),monthsShort:"Ian._Febr._Mart._Apr._Mai_Iun._Iul._Aug._Sept._Oct._Nov._Dec.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},relativeTime:{future:"peste %s",past:"acum %s",s:"c\xE2teva secunde",m:"un minut",mm:"%d minute",h:"o or\u0103",hh:"%d ore",d:"o zi",dd:"%d zile",M:"o lun\u0103",MM:"%d luni",y:"un an",yy:"%d ani"},ordinal:function(e){return e}};return a.default.locale(i,null,!0),i}))});var Hi=v((en,tn)=>{(function(n,t){typeof en=="object"&&typeof tn<"u"?tn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ru=t(n.dayjs)})(en,(function(n){"use strict";function t(l){return l&&typeof l=="object"&&"default"in l?l:{default:l}}var a=t(n),i="\u044F\u043D\u0432\u0430\u0440\u044F_\u0444\u0435\u0432\u0440\u0430\u043B\u044F_\u043C\u0430\u0440\u0442\u0430_\u0430\u043F\u0440\u0435\u043B\u044F_\u043C\u0430\u044F_\u0438\u044E\u043D\u044F_\u0438\u044E\u043B\u044F_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F_\u043E\u043A\u0442\u044F\u0431\u0440\u044F_\u043D\u043E\u044F\u0431\u0440\u044F_\u0434\u0435\u043A\u0430\u0431\u0440\u044F".split("_"),e="\u044F\u043D\u0432\u0430\u0440\u044C_\u0444\u0435\u0432\u0440\u0430\u043B\u044C_\u043C\u0430\u0440\u0442_\u0430\u043F\u0440\u0435\u043B\u044C_\u043C\u0430\u0439_\u0438\u044E\u043D\u044C_\u0438\u044E\u043B\u044C_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C_\u043E\u043A\u0442\u044F\u0431\u0440\u044C_\u043D\u043E\u044F\u0431\u0440\u044C_\u0434\u0435\u043A\u0430\u0431\u0440\u044C".split("_"),r="\u044F\u043D\u0432._\u0444\u0435\u0432\u0440._\u043C\u0430\u0440._\u0430\u043F\u0440._\u043C\u0430\u044F_\u0438\u044E\u043D\u044F_\u0438\u044E\u043B\u044F_\u0430\u0432\u0433._\u0441\u0435\u043D\u0442._\u043E\u043A\u0442._\u043D\u043E\u044F\u0431._\u0434\u0435\u043A.".split("_"),s="\u044F\u043D\u0432._\u0444\u0435\u0432\u0440._\u043C\u0430\u0440\u0442_\u0430\u043F\u0440._\u043C\u0430\u0439_\u0438\u044E\u043D\u044C_\u0438\u044E\u043B\u044C_\u0430\u0432\u0433._\u0441\u0435\u043D\u0442._\u043E\u043A\u0442._\u043D\u043E\u044F\u0431._\u0434\u0435\u043A.".split("_"),_=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function d(l,m,c){var y,D;return c==="m"?m?"\u043C\u0438\u043D\u0443\u0442\u0430":"\u043C\u0438\u043D\u0443\u0442\u0443":l+" "+(y=+l,D={mm:m?"\u043C\u0438\u043D\u0443\u0442\u0430_\u043C\u0438\u043D\u0443\u0442\u044B_\u043C\u0438\u043D\u0443\u0442":"\u043C\u0438\u043D\u0443\u0442\u0443_\u043C\u0438\u043D\u0443\u0442\u044B_\u043C\u0438\u043D\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043E\u0432",dd:"\u0434\u0435\u043D\u044C_\u0434\u043D\u044F_\u0434\u043D\u0435\u0439",MM:"\u043C\u0435\u0441\u044F\u0446_\u043C\u0435\u0441\u044F\u0446\u0430_\u043C\u0435\u0441\u044F\u0446\u0435\u0432",yy:"\u0433\u043E\u0434_\u0433\u043E\u0434\u0430_\u043B\u0435\u0442"}[c].split("_"),y%10==1&&y%100!=11?D[0]:y%10>=2&&y%10<=4&&(y%100<10||y%100>=20)?D[1]:D[2])}var u=function(l,m){return _.test(m)?i[l.month()]:e[l.month()]};u.s=e,u.f=i;var o=function(l,m){return _.test(m)?r[l.month()]:s[l.month()]};o.s=s,o.f=r;var f={name:"ru",weekdays:"\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435_\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A_\u0432\u0442\u043E\u0440\u043D\u0438\u043A_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043F\u044F\u0442\u043D\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u0432\u0441\u043A_\u043F\u043D\u0434_\u0432\u0442\u0440_\u0441\u0440\u0434_\u0447\u0442\u0432_\u043F\u0442\u043D_\u0441\u0431\u0442".split("_"),weekdaysMin:"\u0432\u0441_\u043F\u043D_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043F\u0442_\u0441\u0431".split("_"),months:u,monthsShort:o,weekStart:1,yearStart:4,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043D\u0430\u0437\u0430\u0434",s:"\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u043A\u0443\u043D\u0434",m:d,mm:d,h:"\u0447\u0430\u0441",hh:d,d:"\u0434\u0435\u043D\u044C",dd:d,M:"\u043C\u0435\u0441\u044F\u0446",MM:d,y:"\u0433\u043E\u0434",yy:d},ordinal:function(l){return l},meridiem:function(l){return l<4?"\u043D\u043E\u0447\u0438":l<12?"\u0443\u0442\u0440\u0430":l<17?"\u0434\u043D\u044F":"\u0432\u0435\u0447\u0435\u0440\u0430"}};return a.default.locale(f,null,!0),f}))});var ji=v((nn,rn)=>{(function(n,t){typeof nn=="object"&&typeof rn<"u"?rn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sl=t(n.dayjs)})(nn,(function(n){"use strict";function t(_){return _&&typeof _=="object"&&"default"in _?_:{default:_}}var a=t(n);function i(_){return _%100==2}function e(_){return _%100==3||_%100==4}function r(_,d,u,o){var f=_+" ";switch(u){case"s":return d||o?"nekaj sekund":"nekaj sekundami";case"m":return d?"ena minuta":"eno minuto";case"mm":return i(_)?f+(d||o?"minuti":"minutama"):e(_)?f+(d||o?"minute":"minutami"):f+(d||o?"minut":"minutami");case"h":return d?"ena ura":"eno uro";case"hh":return i(_)?f+(d||o?"uri":"urama"):e(_)?f+(d||o?"ure":"urami"):f+(d||o?"ur":"urami");case"d":return d||o?"en dan":"enim dnem";case"dd":return i(_)?f+(d||o?"dneva":"dnevoma"):f+(d||o?"dni":"dnevi");case"M":return d||o?"en mesec":"enim mesecem";case"MM":return i(_)?f+(d||o?"meseca":"mesecema"):e(_)?f+(d||o?"mesece":"meseci"):f+(d||o?"mesecev":"meseci");case"y":return d||o?"eno leto":"enim letom";case"yy":return i(_)?f+(d||o?"leti":"letoma"):e(_)?f+(d||o?"leta":"leti"):f+(d||o?"let":"leti")}}var s={name:"sl",weekdays:"nedelja_ponedeljek_torek_sreda_\u010Detrtek_petek_sobota".split("_"),months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),weekStart:1,weekdaysShort:"ned._pon._tor._sre._\u010Det._pet._sob.".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdaysMin:"ne_po_to_sr_\u010De_pe_so".split("_"),ordinal:function(_){return _+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm",l:"D. M. YYYY"},relativeTime:{future:"\u010Dez %s",past:"pred %s",s:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r}};return a.default.locale(s,null,!0),s}))});var Ti=v((an,sn)=>{(function(n,t){typeof an=="object"&&typeof sn<"u"?sn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sr_cyrl=t(n.dayjs)})(an,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n),i={words:{m:["\u0458\u0435\u0434\u0430\u043D \u043C\u0438\u043D\u0443\u0442","\u0458\u0435\u0434\u043D\u043E\u0433 \u043C\u0438\u043D\u0443\u0442\u0430"],mm:["%d \u043C\u0438\u043D\u0443\u0442","%d \u043C\u0438\u043D\u0443\u0442\u0430","%d \u043C\u0438\u043D\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043D \u0441\u0430\u0442","\u0458\u0435\u0434\u043D\u043E\u0433 \u0441\u0430\u0442\u0430"],hh:["%d \u0441\u0430\u0442","%d \u0441\u0430\u0442\u0430","%d \u0441\u0430\u0442\u0438"],d:["\u0458\u0435\u0434\u0430\u043D \u0434\u0430\u043D","\u0458\u0435\u0434\u043D\u043E\u0433 \u0434\u0430\u043D\u0430"],dd:["%d \u0434\u0430\u043D","%d \u0434\u0430\u043D\u0430","%d \u0434\u0430\u043D\u0430"],M:["\u0458\u0435\u0434\u0430\u043D \u043C\u0435\u0441\u0435\u0446","\u0458\u0435\u0434\u043D\u043E\u0433 \u043C\u0435\u0441\u0435\u0446\u0430"],MM:["%d \u043C\u0435\u0441\u0435\u0446","%d \u043C\u0435\u0441\u0435\u0446\u0430","%d \u043C\u0435\u0441\u0435\u0446\u0438"],y:["\u0458\u0435\u0434\u043D\u0443 \u0433\u043E\u0434\u0438\u043D\u0443","\u0458\u0435\u0434\u043D\u0435 \u0433\u043E\u0434\u0438\u043D\u0435"],yy:["%d \u0433\u043E\u0434\u0438\u043D\u0443","%d \u0433\u043E\u0434\u0438\u043D\u0435","%d \u0433\u043E\u0434\u0438\u043D\u0430"]},correctGrammarCase:function(r,s){return r%10>=1&&r%10<=4&&(r%100<10||r%100>=20)?r%10==1?s[0]:s[1]:s[2]},relativeTimeFormatter:function(r,s,_,d){var u=i.words[_];if(_.length===1)return _==="y"&&s?"\u0458\u0435\u0434\u043D\u0430 \u0433\u043E\u0434\u0438\u043D\u0430":d||s?u[0]:u[1];var o=i.correctGrammarCase(r,u);return _==="yy"&&s&&o==="%d \u0433\u043E\u0434\u0438\u043D\u0443"?r+" \u0433\u043E\u0434\u0438\u043D\u0430":o.replace("%d",r)}},e={name:"sr-cyrl",weekdays:"\u041D\u0435\u0434\u0435\u0459\u0430_\u041F\u043E\u043D\u0435\u0434\u0435\u0459\u0430\u043A_\u0423\u0442\u043E\u0440\u0430\u043A_\u0421\u0440\u0435\u0434\u0430_\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043A_\u041F\u0435\u0442\u0430\u043A_\u0421\u0443\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u041D\u0435\u0434._\u041F\u043E\u043D._\u0423\u0442\u043E._\u0421\u0440\u0435._\u0427\u0435\u0442._\u041F\u0435\u0442._\u0421\u0443\u0431.".split("_"),weekdaysMin:"\u043D\u0435_\u043F\u043E_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043F\u0435_\u0441\u0443".split("_"),months:"\u0408\u0430\u043D\u0443\u0430\u0440_\u0424\u0435\u0431\u0440\u0443\u0430\u0440_\u041C\u0430\u0440\u0442_\u0410\u043F\u0440\u0438\u043B_\u041C\u0430\u0458_\u0408\u0443\u043D_\u0408\u0443\u043B_\u0410\u0432\u0433\u0443\u0441\u0442_\u0421\u0435\u043F\u0442\u0435\u043C\u0431\u0430\u0440_\u041E\u043A\u0442\u043E\u0431\u0430\u0440_\u041D\u043E\u0432\u0435\u043C\u0431\u0430\u0440_\u0414\u0435\u0446\u0435\u043C\u0431\u0430\u0440".split("_"),monthsShort:"\u0408\u0430\u043D._\u0424\u0435\u0431._\u041C\u0430\u0440._\u0410\u043F\u0440._\u041C\u0430\u0458_\u0408\u0443\u043D_\u0408\u0443\u043B_\u0410\u0432\u0433._\u0421\u0435\u043F._\u041E\u043A\u0442._\u041D\u043E\u0432._\u0414\u0435\u0446.".split("_"),weekStart:1,relativeTime:{future:"\u0437\u0430 %s",past:"\u043F\u0440\u0435 %s",s:"\u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0441\u0435\u043A\u0443\u043D\u0434\u0438",m:i.relativeTimeFormatter,mm:i.relativeTimeFormatter,h:i.relativeTimeFormatter,hh:i.relativeTimeFormatter,d:i.relativeTimeFormatter,dd:i.relativeTimeFormatter,M:i.relativeTimeFormatter,MM:i.relativeTimeFormatter,y:i.relativeTimeFormatter,yy:i.relativeTimeFormatter},ordinal:function(r){return r+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"}};return a.default.locale(e,null,!0),e}))});var wi=v((un,dn)=>{(function(n,t){typeof un=="object"&&typeof dn<"u"?dn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sr=t(n.dayjs)})(un,(function(n){"use strict";function t(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var a=t(n),i={words:{m:["jedan minut","jednog minuta"],mm:["%d minut","%d minuta","%d minuta"],h:["jedan sat","jednog sata"],hh:["%d sat","%d sata","%d sati"],d:["jedan dan","jednog dana"],dd:["%d dan","%d dana","%d dana"],M:["jedan mesec","jednog meseca"],MM:["%d mesec","%d meseca","%d meseci"],y:["jednu godinu","jedne godine"],yy:["%d godinu","%d godine","%d godina"]},correctGrammarCase:function(r,s){return r%10>=1&&r%10<=4&&(r%100<10||r%100>=20)?r%10==1?s[0]:s[1]:s[2]},relativeTimeFormatter:function(r,s,_,d){var u=i.words[_];if(_.length===1)return _==="y"&&s?"jedna godina":d||s?u[0]:u[1];var o=i.correctGrammarCase(r,u);return _==="yy"&&s&&o==="%d godinu"?r+" godina":o.replace("%d",r)}},e={name:"sr",weekdays:"Nedelja_Ponedeljak_Utorak_Sreda_\u010Cetvrtak_Petak_Subota".split("_"),weekdaysShort:"Ned._Pon._Uto._Sre._\u010Cet._Pet._Sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010De_pe_su".split("_"),months:"Januar_Februar_Mart_April_Maj_Jun_Jul_Avgust_Septembar_Oktobar_Novembar_Decembar".split("_"),monthsShort:"Jan._Feb._Mar._Apr._Maj_Jun_Jul_Avg._Sep._Okt._Nov._Dec.".split("_"),weekStart:1,relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:i.relativeTimeFormatter,mm:i.relativeTimeFormatter,h:i.relativeTimeFormatter,hh:i.relativeTimeFormatter,d:i.relativeTimeFormatter,dd:i.relativeTimeFormatter,M:i.relativeTimeFormatter,MM:i.relativeTimeFormatter,y:i.relativeTimeFormatter,yy:i.relativeTimeFormatter},ordinal:function(r){return r+"."},formats:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"}};return a.default.locale(e,null,!0),e}))});var $i=v((on,_n)=>{(function(n,t){typeof on=="object"&&typeof _n<"u"?_n.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_sv=t(n.dayjs)})(on,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"sv",weekdays:"s\xF6ndag_m\xE5ndag_tisdag_onsdag_torsdag_fredag_l\xF6rdag".split("_"),weekdaysShort:"s\xF6n_m\xE5n_tis_ons_tor_fre_l\xF6r".split("_"),weekdaysMin:"s\xF6_m\xE5_ti_on_to_fr_l\xF6".split("_"),months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekStart:1,yearStart:4,ordinal:function(e){var r=e%10;return"["+e+(r===1||r===2?"a":"e")+"]"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},relativeTime:{future:"om %s",past:"f\xF6r %s sedan",s:"n\xE5gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xE5nad",MM:"%d m\xE5nader",y:"ett \xE5r",yy:"%d \xE5r"}};return a.default.locale(i,null,!0),i}))});var Ci=v((ln,fn)=>{(function(n,t){typeof ln=="object"&&typeof fn<"u"?fn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_th=t(n.dayjs)})(ln,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"th",weekdays:"\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C_\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C_\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23_\u0E1E\u0E38\u0E18_\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35_\u0E28\u0E38\u0E01\u0E23\u0E4C_\u0E40\u0E2A\u0E32\u0E23\u0E4C".split("_"),weekdaysShort:"\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C_\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C_\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23_\u0E1E\u0E38\u0E18_\u0E1E\u0E24\u0E2B\u0E31\u0E2A_\u0E28\u0E38\u0E01\u0E23\u0E4C_\u0E40\u0E2A\u0E32\u0E23\u0E4C".split("_"),weekdaysMin:"\u0E2D\u0E32._\u0E08._\u0E2D._\u0E1E._\u0E1E\u0E24._\u0E28._\u0E2A.".split("_"),months:"\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21_\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C_\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21_\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19_\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21_\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19_\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21_\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21_\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19_\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21_\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19_\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21".split("_"),monthsShort:"\u0E21.\u0E04._\u0E01.\u0E1E._\u0E21\u0E35.\u0E04._\u0E40\u0E21.\u0E22._\u0E1E.\u0E04._\u0E21\u0E34.\u0E22._\u0E01.\u0E04._\u0E2A.\u0E04._\u0E01.\u0E22._\u0E15.\u0E04._\u0E1E.\u0E22._\u0E18.\u0E04.".split("_"),formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0E40\u0E27\u0E25\u0E32 H:mm",LLLL:"\u0E27\u0E31\u0E19dddd\u0E17\u0E35\u0E48 D MMMM YYYY \u0E40\u0E27\u0E25\u0E32 H:mm"},relativeTime:{future:"\u0E2D\u0E35\u0E01 %s",past:"%s\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27",s:"\u0E44\u0E21\u0E48\u0E01\u0E35\u0E48\u0E27\u0E34\u0E19\u0E32\u0E17\u0E35",m:"1 \u0E19\u0E32\u0E17\u0E35",mm:"%d \u0E19\u0E32\u0E17\u0E35",h:"1 \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07",hh:"%d \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07",d:"1 \u0E27\u0E31\u0E19",dd:"%d \u0E27\u0E31\u0E19",M:"1 \u0E40\u0E14\u0E37\u0E2D\u0E19",MM:"%d \u0E40\u0E14\u0E37\u0E2D\u0E19",y:"1 \u0E1B\u0E35",yy:"%d \u0E1B\u0E35"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var Oi=v((mn,cn)=>{(function(n,t){typeof mn=="object"&&typeof cn<"u"?cn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_tr=t(n.dayjs)})(mn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"tr",weekdays:"Pazar_Pazartesi_Sal\u0131_\xC7ar\u015Famba_Per\u015Fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xC7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xC7a_Pe_Cu_Ct".split("_"),months:"Ocak_\u015Eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011Fustos_Eyl\xFCl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015Eub_Mar_Nis_May_Haz_Tem_A\u011Fu_Eyl_Eki_Kas_Ara".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},relativeTime:{future:"%s sonra",past:"%s \xF6nce",s:"birka\xE7 saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xFCn",dd:"%d g\xFCn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e){return e+"."}};return a.default.locale(i,null,!0),i}))});var zi=v((hn,Mn)=>{(function(n,t){typeof hn=="object"&&typeof Mn<"u"?Mn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_uk=t(n.dayjs)})(hn,(function(n){"use strict";function t(u){return u&&typeof u=="object"&&"default"in u?u:{default:u}}var a=t(n),i="\u0441\u0456\u0447\u043D\u044F_\u043B\u044E\u0442\u043E\u0433\u043E_\u0431\u0435\u0440\u0435\u0437\u043D\u044F_\u043A\u0432\u0456\u0442\u043D\u044F_\u0442\u0440\u0430\u0432\u043D\u044F_\u0447\u0435\u0440\u0432\u043D\u044F_\u043B\u0438\u043F\u043D\u044F_\u0441\u0435\u0440\u043F\u043D\u044F_\u0432\u0435\u0440\u0435\u0441\u043D\u044F_\u0436\u043E\u0432\u0442\u043D\u044F_\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043D\u044F".split("_"),e="\u0441\u0456\u0447\u0435\u043D\u044C_\u043B\u044E\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043D\u044C_\u043A\u0432\u0456\u0442\u0435\u043D\u044C_\u0442\u0440\u0430\u0432\u0435\u043D\u044C_\u0447\u0435\u0440\u0432\u0435\u043D\u044C_\u043B\u0438\u043F\u0435\u043D\u044C_\u0441\u0435\u0440\u043F\u0435\u043D\u044C_\u0432\u0435\u0440\u0435\u0441\u0435\u043D\u044C_\u0436\u043E\u0432\u0442\u0435\u043D\u044C_\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043D\u044C".split("_"),r=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function s(u,o,f){var l,m;return f==="m"?o?"\u0445\u0432\u0438\u043B\u0438\u043D\u0430":"\u0445\u0432\u0438\u043B\u0438\u043D\u0443":f==="h"?o?"\u0433\u043E\u0434\u0438\u043D\u0430":"\u0433\u043E\u0434\u0438\u043D\u0443":u+" "+(l=+u,m={ss:o?"\u0441\u0435\u043A\u0443\u043D\u0434\u0430_\u0441\u0435\u043A\u0443\u043D\u0434\u0438_\u0441\u0435\u043A\u0443\u043D\u0434":"\u0441\u0435\u043A\u0443\u043D\u0434\u0443_\u0441\u0435\u043A\u0443\u043D\u0434\u0438_\u0441\u0435\u043A\u0443\u043D\u0434",mm:o?"\u0445\u0432\u0438\u043B\u0438\u043D\u0430_\u0445\u0432\u0438\u043B\u0438\u043D\u0438_\u0445\u0432\u0438\u043B\u0438\u043D":"\u0445\u0432\u0438\u043B\u0438\u043D\u0443_\u0445\u0432\u0438\u043B\u0438\u043D\u0438_\u0445\u0432\u0438\u043B\u0438\u043D",hh:o?"\u0433\u043E\u0434\u0438\u043D\u0430_\u0433\u043E\u0434\u0438\u043D\u0438_\u0433\u043E\u0434\u0438\u043D":"\u0433\u043E\u0434\u0438\u043D\u0443_\u0433\u043E\u0434\u0438\u043D\u0438_\u0433\u043E\u0434\u0438\u043D",dd:"\u0434\u0435\u043D\u044C_\u0434\u043D\u0456_\u0434\u043D\u0456\u0432",MM:"\u043C\u0456\u0441\u044F\u0446\u044C_\u043C\u0456\u0441\u044F\u0446\u0456_\u043C\u0456\u0441\u044F\u0446\u0456\u0432",yy:"\u0440\u0456\u043A_\u0440\u043E\u043A\u0438_\u0440\u043E\u043A\u0456\u0432"}[f].split("_"),l%10==1&&l%100!=11?m[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?m[1]:m[2])}var _=function(u,o){return r.test(o)?i[u.month()]:e[u.month()]};_.s=e,_.f=i;var d={name:"uk",weekdays:"\u043D\u0435\u0434\u0456\u043B\u044F_\u043F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A_\u0432\u0456\u0432\u0442\u043E\u0440\u043E\u043A_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043F\u2019\u044F\u0442\u043D\u0438\u0446\u044F_\u0441\u0443\u0431\u043E\u0442\u0430".split("_"),weekdaysShort:"\u043D\u0434\u043B_\u043F\u043D\u0434_\u0432\u0442\u0440_\u0441\u0440\u0434_\u0447\u0442\u0432_\u043F\u0442\u043D_\u0441\u0431\u0442".split("_"),weekdaysMin:"\u043D\u0434_\u043F\u043D_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043F\u0442_\u0441\u0431".split("_"),months:_,monthsShort:"\u0441\u0456\u0447_\u043B\u044E\u0442_\u0431\u0435\u0440_\u043A\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043B\u0438\u043F_\u0441\u0435\u0440\u043F_\u0432\u0435\u0440_\u0436\u043E\u0432\u0442_\u043B\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekStart:1,relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043E\u043C\u0443",s:"\u0434\u0435\u043A\u0456\u043B\u044C\u043A\u0430 \u0441\u0435\u043A\u0443\u043D\u0434",m:s,mm:s,h:s,hh:s,d:"\u0434\u0435\u043D\u044C",dd:s,M:"\u043C\u0456\u0441\u044F\u0446\u044C",MM:s,y:"\u0440\u0456\u043A",yy:s},ordinal:function(u){return u},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"}};return a.default.locale(d,null,!0),d}))});var Ai=v((Yn,yn)=>{(function(n,t){typeof Yn=="object"&&typeof yn<"u"?yn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_ur=t(n.dayjs)})(Yn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"ur",weekdays:"\u0627\u062A\u0648\u0627\u0631_\u067E\u06CC\u0631_\u0645\u0646\u06AF\u0644_\u0628\u062F\u06BE_\u062C\u0645\u0639\u0631\u0627\u062A_\u062C\u0645\u0639\u06C1_\u06C1\u0641\u062A\u06C1".split("_"),months:"\u062C\u0646\u0648\u0631\u06CC_\u0641\u0631\u0648\u0631\u06CC_\u0645\u0627\u0631\u0686_\u0627\u067E\u0631\u06CC\u0644_\u0645\u0626\u06CC_\u062C\u0648\u0646_\u062C\u0648\u0644\u0627\u0626\u06CC_\u0627\u06AF\u0633\u062A_\u0633\u062A\u0645\u0628\u0631_\u0627\u06A9\u062A\u0648\u0628\u0631_\u0646\u0648\u0645\u0628\u0631_\u062F\u0633\u0645\u0628\u0631".split("_"),weekStart:1,weekdaysShort:"\u0627\u062A\u0648\u0627\u0631_\u067E\u06CC\u0631_\u0645\u0646\u06AF\u0644_\u0628\u062F\u06BE_\u062C\u0645\u0639\u0631\u0627\u062A_\u062C\u0645\u0639\u06C1_\u06C1\u0641\u062A\u06C1".split("_"),monthsShort:"\u062C\u0646\u0648\u0631\u06CC_\u0641\u0631\u0648\u0631\u06CC_\u0645\u0627\u0631\u0686_\u0627\u067E\u0631\u06CC\u0644_\u0645\u0626\u06CC_\u062C\u0648\u0646_\u062C\u0648\u0644\u0627\u0626\u06CC_\u0627\u06AF\u0633\u062A_\u0633\u062A\u0645\u0628\u0631_\u0627\u06A9\u062A\u0648\u0628\u0631_\u0646\u0648\u0645\u0628\u0631_\u062F\u0633\u0645\u0628\u0631".split("_"),weekdaysMin:"\u0627\u062A\u0648\u0627\u0631_\u067E\u06CC\u0631_\u0645\u0646\u06AF\u0644_\u0628\u062F\u06BE_\u062C\u0645\u0639\u0631\u0627\u062A_\u062C\u0645\u0639\u06C1_\u06C1\u0641\u062A\u06C1".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060C D MMMM YYYY HH:mm"},relativeTime:{future:"%s \u0628\u0639\u062F",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062F \u0633\u06CC\u06A9\u0646\u0688",m:"\u0627\u06CC\u06A9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06CC\u06A9 \u06AF\u06BE\u0646\u0679\u06C1",hh:"%d \u06AF\u06BE\u0646\u0679\u06D2",d:"\u0627\u06CC\u06A9 \u062F\u0646",dd:"%d \u062F\u0646",M:"\u0627\u06CC\u06A9 \u0645\u0627\u06C1",MM:"%d \u0645\u0627\u06C1",y:"\u0627\u06CC\u06A9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"}};return a.default.locale(i,null,!0),i}))});var qi=v((pn,Ln)=>{(function(n,t){typeof pn=="object"&&typeof Ln<"u"?Ln.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_vi=t(n.dayjs)})(pn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"vi",weekdays:"ch\u1EE7 nh\u1EADt_th\u1EE9 hai_th\u1EE9 ba_th\u1EE9 t\u01B0_th\u1EE9 n\u0103m_th\u1EE9 s\xE1u_th\u1EE9 b\u1EA3y".split("_"),months:"th\xE1ng 1_th\xE1ng 2_th\xE1ng 3_th\xE1ng 4_th\xE1ng 5_th\xE1ng 6_th\xE1ng 7_th\xE1ng 8_th\xE1ng 9_th\xE1ng 10_th\xE1ng 11_th\xE1ng 12".split("_"),weekStart:1,weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),ordinal:function(e){return e},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},relativeTime:{future:"%s t\u1EDBi",past:"%s tr\u01B0\u1EDBc",s:"v\xE0i gi\xE2y",m:"m\u1ED9t ph\xFAt",mm:"%d ph\xFAt",h:"m\u1ED9t gi\u1EDD",hh:"%d gi\u1EDD",d:"m\u1ED9t ng\xE0y",dd:"%d ng\xE0y",M:"m\u1ED9t th\xE1ng",MM:"%d th\xE1ng",y:"m\u1ED9t n\u0103m",yy:"%d n\u0103m"}};return a.default.locale(i,null,!0),i}))});var Ii=v((Dn,vn)=>{(function(n,t){typeof Dn=="object"&&typeof vn<"u"?vn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_cn=t(n.dayjs)})(Dn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"zh-cn",weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e,r){return r==="W"?e+"\u5468":e+"\u65E5"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5Ah\u70B9mm\u5206",LLLL:"YYYY\u5E74M\u6708D\u65E5ddddAh\u70B9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5185",past:"%s\u524D",s:"\u51E0\u79D2",m:"1 \u5206\u949F",mm:"%d \u5206\u949F",h:"1 \u5C0F\u65F6",hh:"%d \u5C0F\u65F6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4E2A\u6708",MM:"%d \u4E2A\u6708",y:"1 \u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var s=100*e+r;return s<600?"\u51CC\u6668":s<900?"\u65E9\u4E0A":s<1100?"\u4E0A\u5348":s<1300?"\u4E2D\u5348":s<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return a.default.locale(i,null,!0),i}))});var xi=v((gn,bn)=>{(function(n,t){typeof gn=="object"&&typeof bn<"u"?bn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_hk=t(n.dayjs)})(gn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"zh-hk",months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u9031\u65E5_\u9031\u4E00_\u9031\u4E8C_\u9031\u4E09_\u9031\u56DB_\u9031\u4E94_\u9031\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),ordinal:function(e,r){return r==="W"?e+"\u9031":e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5167",past:"%s\u524D",s:"\u5E7E\u79D2",m:"\u4E00\u5206\u9418",mm:"%d \u5206\u9418",h:"\u4E00\u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"\u4E00\u5929",dd:"%d \u5929",M:"\u4E00\u500B\u6708",MM:"%d \u500B\u6708",y:"\u4E00\u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var s=100*e+r;return s<600?"\u51CC\u6668":s<900?"\u65E9\u4E0A":s<1100?"\u4E0A\u5348":s<1300?"\u4E2D\u5348":s<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return a.default.locale(i,null,!0),i}))});var Ni=v((Sn,kn)=>{(function(n,t){typeof Sn=="object"&&typeof kn<"u"?kn.exports=t(k()):typeof define=="function"&&define.amd?define(["dayjs"],t):(n=typeof globalThis<"u"?globalThis:n||self).dayjs_locale_zh_tw=t(n.dayjs)})(Sn,(function(n){"use strict";function t(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var a=t(n),i={name:"zh-tw",weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u9031\u65E5_\u9031\u4E00_\u9031\u4E8C_\u9031\u4E09_\u9031\u56DB_\u9031\u4E94_\u9031\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),ordinal:function(e,r){return r==="W"?e+"\u9031":e+"\u65E5"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5 HH:mm",LLLL:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},relativeTime:{future:"%s\u5167",past:"%s\u524D",s:"\u5E7E\u79D2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5C0F\u6642",hh:"%d \u5C0F\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500B\u6708",MM:"%d \u500B\u6708",y:"1 \u5E74",yy:"%d \u5E74"},meridiem:function(e,r){var s=100*e+r;return s<600?"\u51CC\u6668":s<900?"\u65E9\u4E0A":s<1100?"\u4E0A\u5348":s<1300?"\u4E2D\u5348":s<1800?"\u4E0B\u5348":"\u665A\u4E0A"}};return a.default.locale(i,null,!0),i}))});var jn=60,Tn=jn*60,wn=Tn*24,Xi=wn*7,se=1e3,ce=jn*se,ge=Tn*se,$n=wn*se,Cn=Xi*se,_e="millisecond",te="second",ne="minute",ie="hour",V="day",de="week",G="month",he="quarter",K="year",re="date",On="YYYY-MM-DDTHH:mm:ssZ",be="Invalid Date",zn=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,An=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;var In={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var a=["th","st","nd","rd"],i=t%100;return"["+t+(a[(i-20)%10]||a[i]||a[0])+"]"}};var Se=function(t,a,i){var e=String(t);return!e||e.length>=a?t:""+Array(a+1-e.length).join(i)+t},Bi=function(t){var a=-t.utcOffset(),i=Math.abs(a),e=Math.floor(i/60),r=i%60;return(a<=0?"+":"-")+Se(e,2,"0")+":"+Se(r,2,"0")},er=function n(t,a){if(t.date()1)return n(s[0])}else{var _=t.name;ue[_]=t,e=_}return!i&&e&&(le=e),e||!i&&le},E=function(t,a){if(ke(t))return t.clone();var i=typeof a=="object"?a:{};return i.date=t,i.args=arguments,new Ye(i)},rr=function(t,a){return E(t,{locale:a.$L,utc:a.$u,x:a.$x,$offset:a.$offset})},z=xn;z.l=Me;z.i=ke;z.w=rr;var ar=function(t){var a=t.date,i=t.utc;if(a===null)return new Date(NaN);if(z.u(a))return new Date;if(a instanceof Date)return new Date(a);if(typeof a=="string"&&!/Z$/i.test(a)){var e=a.match(zn);if(e){var r=e[2]-1||0,s=(e[7]||"0").substring(0,3);return i?new Date(Date.UTC(e[1],r,e[3]||1,e[4]||0,e[5]||0,e[6]||0,s)):new Date(e[1],r,e[3]||1,e[4]||0,e[5]||0,e[6]||0,s)}}return new Date(a)},Ye=(function(){function n(a){this.$L=Me(a.locale,null,!0),this.parse(a),this.$x=this.$x||a.x||{},this[Nn]=!0}var t=n.prototype;return t.parse=function(i){this.$d=ar(i),this.init()},t.init=function(){var i=this.$d;this.$y=i.getFullYear(),this.$M=i.getMonth(),this.$D=i.getDate(),this.$W=i.getDay(),this.$H=i.getHours(),this.$m=i.getMinutes(),this.$s=i.getSeconds(),this.$ms=i.getMilliseconds()},t.$utils=function(){return z},t.isValid=function(){return this.$d.toString()!==be},t.isSame=function(i,e){var r=E(i);return this.startOf(e)<=r&&r<=this.endOf(e)},t.isAfter=function(i,e){return E(i){this.focusedDate??(this.focusedDate=(this.getDefaultFocusedDate()??O()).tz(_)),this.focusedMonth??(this.focusedMonth=this.focusedDate.month()),this.focusedYear??(this.focusedYear=this.focusedDate.year())});let d=this.getSelectedDate()??this.getDefaultFocusedDate()??O().tz(_).hour(0).minute(0).second(0);(this.getMaxDate()!==null&&d.isAfter(this.getMaxDate())||this.getMinDate()!==null&&d.isBefore(this.getMinDate()))&&(d=null),this.hour=d?.hour()??0,this.minute=d?.minute()??0,this.second=d?.second()??0,this.setDisplayText(),this.setMonths(),this.setDayLabels(),i&&this.$nextTick(()=>this.togglePanelVisibility(this.$refs.button)),this.$watch("focusedMonth",()=>{this.focusedMonth=+this.focusedMonth,this.focusedDate.month()!==this.focusedMonth&&(this.focusedDate=this.focusedDate.month(this.focusedMonth))}),this.$watch("focusedYear",()=>{if(this.focusedYear?.length>4&&(this.focusedYear=this.focusedYear.substring(0,4)),!this.focusedYear||this.focusedYear?.length!==4)return;let u=+this.focusedYear;Number.isInteger(u)||(u=O().tz(_).year(),this.focusedYear=u),this.focusedDate.year()!==u&&(this.focusedDate=this.focusedDate.year(u))}),this.$watch("focusedDate",()=>{let u=this.focusedDate.month(),o=this.focusedDate.year();this.focusedMonth!==u&&(this.focusedMonth=u),this.focusedYear!==o&&(this.focusedYear=o),this.setupDaysGrid()}),this.$watch("hour",()=>{let u=+this.hour;if(Number.isInteger(u)?u>23?this.hour=0:u<0?this.hour=23:this.hour=u:this.hour=0,this.isClearingState)return;let o=this.getSelectedDate()??this.focusedDate;this.setState(o.hour(this.hour??0))}),this.$watch("minute",()=>{let u=+this.minute;if(Number.isInteger(u)?u>59?this.minute=0:u<0?this.minute=59:this.minute=u:this.minute=0,this.isClearingState)return;let o=this.getSelectedDate()??this.focusedDate;this.setState(o.minute(this.minute??0))}),this.$watch("second",()=>{let u=+this.second;if(Number.isInteger(u)?u>59?this.second=0:u<0?this.second=59:this.second=u:this.second=0,this.isClearingState)return;let o=this.getSelectedDate()??this.focusedDate;this.setState(o.second(this.second??0))}),this.$watch("state",()=>{if(this.state===void 0)return;let u=this.getSelectedDate();if(u===null){this.clearState();return}this.getMaxDate()!==null&&u?.isAfter(this.getMaxDate())&&(u=null),this.getMinDate()!==null&&u?.isBefore(this.getMinDate())&&(u=null);let o=u?.hour()??0;this.hour!==o&&(this.hour=o);let f=u?.minute()??0;this.minute!==f&&(this.minute=f);let l=u?.second()??0;this.second!==l&&(this.second=l),this.setDisplayText()})},clearState(){this.isClearingState=!0,this.setState(null),this.hour=0,this.minute=0,this.second=0,this.$nextTick(()=>this.isClearingState=!1)},dateIsDisabled(d){return!!(this.$refs?.disabledDates&&JSON.parse(this.$refs.disabledDates.value??[]).some(u=>(u=O(u),u.isValid()?u.isSame(d,"day"):!1))||this.getMaxDate()&&d.isAfter(this.getMaxDate(),"day")||this.getMinDate()&&d.isBefore(this.getMinDate(),"day"))},dayIsDisabled(d){return this.focusedDate??(this.focusedDate=O().tz(_)),this.dateIsDisabled(this.focusedDate.date(d))},dayIsSelected(d){let u=this.getSelectedDate();return u===null?!1:(this.focusedDate??(this.focusedDate=O().tz(_)),u.date()===d&&u.month()===this.focusedDate.month()&&u.year()===this.focusedDate.year())},dayIsToday(d){let u=O().tz(_);return this.focusedDate??(this.focusedDate=u),u.date()===d&&u.month()===this.focusedDate.month()&&u.year()===this.focusedDate.year()},focusPreviousDay(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.subtract(1,"day")},focusPreviousWeek(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.subtract(1,"week")},focusNextDay(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.add(1,"day")},focusNextWeek(){this.focusedDate??(this.focusedDate=O().tz(_)),this.focusedDate=this.focusedDate.add(1,"week")},getDayLabels(){let d=O.weekdaysShort();return a===0?d:[...d.slice(a),...d.slice(0,a)]},getMaxDate(){let d=O(this.$refs.maxDate?.value);return d.isValid()?d:null},getMinDate(){let d=O(this.$refs.minDate?.value);return d.isValid()?d:null},getSelectedDate(){if(this.state===void 0||this.state===null)return null;let d=O(this.state);return d.isValid()?d:null},getDefaultFocusedDate(){if(this.defaultFocusedDate===null)return null;let d=O(this.defaultFocusedDate);return d.isValid()?d:null},togglePanelVisibility(){this.isOpen()||(this.focusedDate=this.getSelectedDate()??this.focusedDate??this.getMinDate()??O().tz(_),this.setupDaysGrid()),this.$refs.panel.toggle(this.$refs.button)},selectDate(d=null){d&&this.setFocusedDay(d),this.focusedDate??(this.focusedDate=O().tz(_)),this.setState(this.focusedDate),r&&this.togglePanelVisibility()},setDisplayText(){this.displayText=this.getSelectedDate()?this.getSelectedDate().format(t):""},setMonths(){this.months=O.months()},setDayLabels(){this.dayLabels=this.getDayLabels()},setupDaysGrid(){this.focusedDate??(this.focusedDate=O().tz(_)),this.emptyDaysInFocusedMonth=Array.from({length:this.focusedDate.date(8-a).day()},(d,u)=>u+1),this.daysInFocusedMonth=Array.from({length:this.focusedDate.daysInMonth()},(d,u)=>u+1)},setFocusedDay(d){this.focusedDate=(this.focusedDate??O().tz(_)).date(d)},setState(d){if(d===null){this.state=null,this.setDisplayText();return}this.dateIsDisabled(d)||(this.state=d.hour(this.hour??0).minute(this.minute??0).second(this.second??0).format("YYYY-MM-DD HH:mm:ss"),this.setDisplayText())},isOpen(){return this.$refs.panel?.style.display==="block"}}}var Fi={am:Gn(),ar:Rn(),bs:Zn(),ca:Vn(),ckb:Re(),cs:Qn(),cy:Xn(),da:Bn(),de:ei(),el:ti(),en:ni(),es:ii(),et:ri(),fa:ai(),fi:si(),fr:ui(),he:di(),hi:oi(),hu:_i(),hy:li(),id:fi(),it:mi(),ja:ci(),ka:hi(),km:Mi(),ku:Re(),lt:Yi(),lv:yi(),ms:pi(),my:Li(),nb:Di(),nl:vi(),pl:gi(),pt:bi(),pt_BR:Si(),ro:ki(),ru:Hi(),sl:ji(),sr_Cyrl:Ti(),sr_Latn:wi(),sv:$i(),th:Ci(),tr:Oi(),uk:zi(),ur:Ai(),vi:qi(),zh_CN:Ii(),zh_HK:xi(),zh_TW:Ni()};export{sr as default}; ================================================ FILE: public/js/filament/forms/components/file-upload.js ================================================ var vr=Object.defineProperty;var xr=(e,t)=>{for(var i in t)vr(e,i,{get:t[i],enumerable:!0})};var na={};xr(na,{FileOrigin:()=>Bt,FileStatus:()=>Tt,OptionTypes:()=>Gi,Status:()=>ll,create:()=>ft,destroy:()=>ht,find:()=>Hi,getOptions:()=>Wi,parse:()=>Ui,registerPlugin:()=>ve,setOptions:()=>Dt,supported:()=>Vi});var yr=e=>e instanceof HTMLElement,Rr=(e,t=[],i=[])=>{let a={...e},n=[],l=[],o=()=>({...a}),r=()=>{let g=[...n];return n.length=0,g},s=()=>{let g=[...l];l.length=0,g.forEach(({type:f,data:h})=>{p(f,h)})},p=(g,f,h)=>{if(h&&!document.hidden){l.push({type:g,data:f});return}u[g]&&u[g](f),n.push({type:g,data:f})},c=(g,...f)=>m[g]?m[g](...f):null,d={getState:o,processActionQueue:r,processDispatchQueue:s,dispatch:p,query:c},m={};t.forEach(g=>{m={...g(a),...m}});let u={};return i.forEach(g=>{u={...g(p,c,a),...u}}),d},Sr=(e,t,i)=>{if(typeof i=="function"){e[t]=i;return}Object.defineProperty(e,t,{...i})},te=(e,t)=>{for(let i in e)e.hasOwnProperty(i)&&t(i,e[i])},He=e=>{let t={};return te(e,i=>{Sr(t,i,e[i])}),t},se=(e,t,i=null)=>{if(i===null)return e.getAttribute(t)||e.hasAttribute(t);e.setAttribute(t,i)},_r="http://www.w3.org/2000/svg",wr=["svg","path"],Pa=e=>wr.includes(e),li=(e,t,i={})=>{typeof t=="object"&&(i=t,t=null);let a=Pa(e)?document.createElementNS(_r,e):document.createElement(e);return t&&(Pa(e)?se(a,"class",t):a.className=t),te(i,(n,l)=>{se(a,n,l)}),a},Lr=e=>(t,i)=>{typeof i<"u"&&e.children[i]?e.insertBefore(t,e.children[i]):e.appendChild(t)},Mr=(e,t)=>(i,a)=>(typeof a<"u"?t.splice(a,0,i):t.push(i),i),Ar=(e,t)=>i=>(t.splice(t.indexOf(i),1),i.element.parentNode&&e.removeChild(i.element),i),zr=typeof window<"u"&&typeof window.document<"u",En=()=>zr,Pr=En()?li("svg"):{},Fr="children"in Pr?e=>e.children.length:e=>e.childNodes.length,Tn=(e,t,i,a)=>{let n=i[0]||e.left,l=i[1]||e.top,o=n+e.width,r=l+e.height*(a[1]||1),s={element:{...e},inner:{left:e.left,top:e.top,right:e.right,bottom:e.bottom},outer:{left:n,top:l,right:o,bottom:r}};return t.filter(p=>!p.isRectIgnored()).map(p=>p.rect).forEach(p=>{Fa(s.inner,{...p.inner}),Fa(s.outer,{...p.outer})}),Oa(s.inner),s.outer.bottom+=s.element.marginBottom,s.outer.right+=s.element.marginRight,Oa(s.outer),s},Fa=(e,t)=>{t.top+=e.top,t.right+=e.left,t.bottom+=e.top,t.left+=e.left,t.bottom>e.bottom&&(e.bottom=t.bottom),t.right>e.right&&(e.right=t.right)},Oa=e=>{e.width=e.right-e.left,e.height=e.bottom-e.top},Xe=e=>typeof e=="number",Or=(e,t,i,a=.001)=>Math.abs(e-t){let a=null,n=null,l=0,o=!1,p=He({interpolate:(c,d)=>{if(o)return;if(!(Xe(a)&&Xe(n))){o=!0,l=0;return}let m=-(n-a)*e;l+=m/i,n+=l,l*=t,Or(n,a,l)||d?(n=a,l=0,o=!0,p.onupdate(n),p.oncomplete(n)):p.onupdate(n)},target:{set:c=>{if(Xe(c)&&!Xe(n)&&(n=c),a===null&&(a=c,n=c),a=c,n===a||typeof a>"u"){o=!0,l=0,p.onupdate(n),p.oncomplete(n);return}o=!1},get:()=>a},resting:{get:()=>o},onupdate:c=>{},oncomplete:c=>{}});return p};var Cr=e=>e<.5?2*e*e:-1+(4-2*e)*e,Br=({duration:e=500,easing:t=Cr,delay:i=0}={})=>{let a=null,n,l,o=!0,r=!1,s=null,c=He({interpolate:(d,m)=>{o||s===null||(a===null&&(a=d),!(d-a=e||m?(n=1,l=r?0:1,c.onupdate(l*s),c.oncomplete(l*s),o=!0):(l=n/e,c.onupdate((n>=0?t(r?1-l:l):0)*s))))},target:{get:()=>r?0:s,set:d=>{if(s===null){s=d,c.onupdate(d),c.oncomplete(d);return}do},onupdate:d=>{},oncomplete:d=>{}});return c},Da={spring:Dr,tween:Br},kr=(e,t,i)=>{let a=e[t]&&typeof e[t][i]=="object"?e[t][i]:e[t]||e,n=typeof a=="string"?a:a.type,l=typeof a=="object"?{...a}:{};return Da[n]?Da[n](l):null},ji=(e,t,i,a=!1)=>{t=Array.isArray(t)?t:[t],t.forEach(n=>{e.forEach(l=>{let o=l,r=()=>i[l],s=p=>i[l]=p;typeof l=="object"&&(o=l.key,r=l.getter||r,s=l.setter||s),!(n[o]&&!a)&&(n[o]={get:r,set:s})})})},Nr=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a})=>{let n={...t},l=[];return te(e,(o,r)=>{let s=kr(r);if(!s)return;s.onupdate=c=>{t[o]=c},s.target=n[o],ji([{key:o,setter:c=>{s.target!==c&&(s.target=c)},getter:()=>t[o]}],[i,a],t,!0),l.push(s)}),{write:o=>{let r=document.hidden,s=!0;return l.forEach(p=>{p.resting||(s=!1),p.interpolate(o,r)}),s},destroy:()=>{}}},Vr=e=>(t,i)=>{e.addEventListener(t,i)},Gr=e=>(t,i)=>{e.removeEventListener(t,i)},Ur=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a,viewState:n,view:l})=>{let o=[],r=Vr(l.element),s=Gr(l.element);return a.on=(p,c)=>{o.push({type:p,fn:c}),r(p,c)},a.off=(p,c)=>{o.splice(o.findIndex(d=>d.type===p&&d.fn===c),1),s(p,c)},{write:()=>!0,destroy:()=>{o.forEach(p=>{s(p.type,p.fn)})}}},Hr=({mixinConfig:e,viewProps:t,viewExternalAPI:i})=>{ji(e,i,t)},ue=e=>e!=null,Wr={opacity:1,scaleX:1,scaleY:1,translateX:0,translateY:0,rotateX:0,rotateY:0,rotateZ:0,originX:0,originY:0},jr=({mixinConfig:e,viewProps:t,viewInternalAPI:i,viewExternalAPI:a,view:n})=>{let l={...t},o={};ji(e,[i,a],t);let r=()=>[t.translateX||0,t.translateY||0],s=()=>[t.scaleX||0,t.scaleY||0],p=()=>n.rect?Tn(n.rect,n.childViews,r(),s()):null;return i.rect={get:p},a.rect={get:p},e.forEach(c=>{t[c]=typeof l[c]>"u"?Wr[c]:l[c]}),{write:()=>{if(Yr(o,t))return qr(n.element,t),Object.assign(o,{...t}),!0},destroy:()=>{}}},Yr=(e,t)=>{if(Object.keys(e).length!==Object.keys(t).length)return!0;for(let i in t)if(t[i]!==e[i])return!0;return!1},qr=(e,{opacity:t,perspective:i,translateX:a,translateY:n,scaleX:l,scaleY:o,rotateX:r,rotateY:s,rotateZ:p,originX:c,originY:d,width:m,height:u})=>{let g="",f="";(ue(c)||ue(d))&&(f+=`transform-origin: ${c||0}px ${d||0}px;`),ue(i)&&(g+=`perspective(${i}px) `),(ue(a)||ue(n))&&(g+=`translate3d(${a||0}px, ${n||0}px, 0) `),(ue(l)||ue(o))&&(g+=`scale3d(${ue(l)?l:1}, ${ue(o)?o:1}, 1) `),ue(p)&&(g+=`rotateZ(${p}rad) `),ue(r)&&(g+=`rotateX(${r}rad) `),ue(s)&&(g+=`rotateY(${s}rad) `),g.length&&(f+=`transform:${g};`),ue(t)&&(f+=`opacity:${t};`,t===0&&(f+="visibility:hidden;"),t<1&&(f+="pointer-events:none;")),ue(u)&&(f+=`height:${u}px;`),ue(m)&&(f+=`width:${m}px;`);let h=e.elementCurrentStyle||"";(f.length!==h.length||f!==h)&&(e.style.cssText=f,e.elementCurrentStyle=f)},$r={styles:jr,listeners:Ur,animations:Nr,apis:Hr},Ca=(e={},t={},i={})=>(t.layoutCalculated||(e.paddingTop=parseInt(i.paddingTop,10)||0,e.marginTop=parseInt(i.marginTop,10)||0,e.marginRight=parseInt(i.marginRight,10)||0,e.marginBottom=parseInt(i.marginBottom,10)||0,e.marginLeft=parseInt(i.marginLeft,10)||0,t.layoutCalculated=!0),e.left=t.offsetLeft||0,e.top=t.offsetTop||0,e.width=t.offsetWidth||0,e.height=t.offsetHeight||0,e.right=e.left+e.width,e.bottom=e.top+e.height,e.scrollTop=t.scrollTop,e.hidden=t.offsetParent===null,e),le=({tag:e="div",name:t=null,attributes:i={},read:a=()=>{},write:n=()=>{},create:l=()=>{},destroy:o=()=>{},filterFrameActionsForChild:r=(u,g)=>g,didCreateView:s=()=>{},didWriteView:p=()=>{},ignoreRect:c=!1,ignoreRectUpdate:d=!1,mixins:m=[]}={})=>(u,g={})=>{let f=li(e,`filepond--${t}`,i),h=window.getComputedStyle(f,null),I=Ca(),b=null,E=!1,v=[],y=[],T={},_={},x=[n],R=[a],P=[o],z=()=>f,A=()=>v.concat(),B=()=>T,w=V=>(W,$)=>W(V,$),F=()=>b||(b=Tn(I,v,[0,0],[1,1]),b),S=()=>h,L=()=>{b=null,v.forEach($=>$._read()),!(d&&I.width&&I.height)&&Ca(I,f,h);let W={root:Z,props:g,rect:I};R.forEach($=>$(W))},D=(V,W,$)=>{let ie=W.length===0;return x.forEach(ee=>{ee({props:g,root:Z,actions:W,timestamp:V,shouldOptimize:$})===!1&&(ie=!1)}),y.forEach(ee=>{ee.write(V)===!1&&(ie=!1)}),v.filter(ee=>!!ee.element.parentNode).forEach(ee=>{ee._write(V,r(ee,W),$)||(ie=!1)}),v.forEach((ee,pt)=>{ee.element.parentNode||(Z.appendChild(ee.element,pt),ee._read(),ee._write(V,r(ee,W),$),ie=!1)}),E=ie,p({props:g,root:Z,actions:W,timestamp:V}),ie},O=()=>{y.forEach(V=>V.destroy()),P.forEach(V=>{V({root:Z,props:g})}),v.forEach(V=>V._destroy())},U={element:{get:z},style:{get:S},childViews:{get:A}},C={...U,rect:{get:F},ref:{get:B},is:V=>t===V,appendChild:Lr(f),createChildView:w(u),linkView:V=>(v.push(V),V),unlinkView:V=>{v.splice(v.indexOf(V),1)},appendChildView:Mr(f,v),removeChildView:Ar(f,v),registerWriter:V=>x.push(V),registerReader:V=>R.push(V),registerDestroyer:V=>P.push(V),invalidateLayout:()=>f.layoutCalculated=!1,dispatch:u.dispatch,query:u.query},X={element:{get:z},childViews:{get:A},rect:{get:F},resting:{get:()=>E},isRectIgnored:()=>c,_read:L,_write:D,_destroy:O},K={...U,rect:{get:()=>I}};Object.keys(m).sort((V,W)=>V==="styles"?1:W==="styles"?-1:0).forEach(V=>{let W=$r[V]({mixinConfig:m[V],viewProps:g,viewState:_,viewInternalAPI:C,viewExternalAPI:X,view:He(K)});W&&y.push(W)});let Z=He(C);l({root:Z,props:g});let ce=Fr(f);return v.forEach((V,W)=>{Z.appendChild(V.element,ce+W)}),s(Z),He(X)},Xr=(e,t,i=60)=>{let a="__framePainter";if(window[a]){window[a].readers.push(e),window[a].writers.push(t);return}window[a]={readers:[e],writers:[t]};let n=window[a],l=1e3/i,o=null,r=null,s=null,p=null,c=()=>{document.hidden?(s=()=>window.setTimeout(()=>d(performance.now()),l),p=()=>window.clearTimeout(r)):(s=()=>window.requestAnimationFrame(d),p=()=>window.cancelAnimationFrame(r))};document.addEventListener("visibilitychange",()=>{p&&p(),c(),d(performance.now())});let d=m=>{r=s(d),o||(o=m);let u=m-o;u<=l||(o=m-u%l,n.readers.forEach(g=>g()),n.writers.forEach(g=>g(m)))};return c(),d(performance.now()),{pause:()=>{p(r)}}},fe=(e,t)=>({root:i,props:a,actions:n=[],timestamp:l,shouldOptimize:o})=>{n.filter(r=>e[r.type]).forEach(r=>e[r.type]({root:i,props:a,action:r.data,timestamp:l,shouldOptimize:o})),t&&t({root:i,props:a,actions:n,timestamp:l,shouldOptimize:o})},Ba=(e,t)=>t.parentNode.insertBefore(e,t),ka=(e,t)=>t.parentNode.insertBefore(e,t.nextSibling),ci=e=>Array.isArray(e),Ve=e=>e==null,Kr=e=>e.trim(),di=e=>""+e,Zr=(e,t=",")=>Ve(e)?[]:ci(e)?e:di(e).split(t).map(Kr).filter(i=>i.length),In=e=>typeof e=="boolean",vn=e=>In(e)?e:e==="true",ge=e=>typeof e=="string",xn=e=>Xe(e)?e:ge(e)?di(e).replace(/[a-z]+/gi,""):0,ni=e=>parseInt(xn(e),10),Na=e=>parseFloat(xn(e)),Et=e=>Xe(e)&&isFinite(e)&&Math.floor(e)===e,Va=(e,t=1e3)=>{if(Et(e))return e;let i=di(e).trim();return/MB$/i.test(i)?(i=i.replace(/MB$i/,"").trim(),ni(i)*t*t):/KB/i.test(i)?(i=i.replace(/KB$i/,"").trim(),ni(i)*t):ni(i)},Ke=e=>typeof e=="function",Qr=e=>{let t=self,i=e.split("."),a=null;for(;a=i.shift();)if(t=t[a],!t)return null;return t},Ga={process:"POST",patch:"PATCH",revert:"DELETE",fetch:"GET",restore:"GET",load:"GET"},Jr=e=>{let t={};return t.url=ge(e)?e:e.url||"",t.timeout=e.timeout?parseInt(e.timeout,10):0,t.headers=e.headers?e.headers:{},te(Ga,i=>{t[i]=es(i,e[i],Ga[i],t.timeout,t.headers)}),t.process=e.process||ge(e)||e.url?t.process:null,t.remove=e.remove||null,delete t.headers,t},es=(e,t,i,a,n)=>{if(t===null)return null;if(typeof t=="function")return t;let l={url:i==="GET"||i==="PATCH"?`?${e}=`:"",method:i,headers:n,withCredentials:!1,timeout:a,onload:null,ondata:null,onerror:null};if(ge(t))return l.url=t,l;if(Object.assign(l,t),ge(l.headers)){let o=l.headers.split(/:(.+)/);l.headers={header:o[0],value:o[1]}}return l.withCredentials=vn(l.withCredentials),l},ts=e=>Jr(e),is=e=>e===null,de=e=>typeof e=="object"&&e!==null,as=e=>de(e)&&ge(e.url)&&de(e.process)&&de(e.revert)&&de(e.restore)&&de(e.fetch),Pi=e=>ci(e)?"array":is(e)?"null":Et(e)?"int":/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(e)?"bytes":as(e)?"api":typeof e,ns=e=>e.replace(/{\s*'/g,'{"').replace(/'\s*}/g,'"}').replace(/'\s*:/g,'":').replace(/:\s*'/g,':"').replace(/,\s*'/g,',"').replace(/'\s*,/g,'",'),ls={array:Zr,boolean:vn,int:e=>Pi(e)==="bytes"?Va(e):ni(e),number:Na,float:Na,bytes:Va,string:e=>Ke(e)?e:di(e),function:e=>Qr(e),serverapi:ts,object:e=>{try{return JSON.parse(ns(e))}catch{return null}}},os=(e,t)=>ls[t](e),yn=(e,t,i)=>{if(e===t)return e;let a=Pi(e);if(a!==i){let n=os(e,i);if(a=Pi(n),n===null)throw`Trying to assign value with incorrect type to "${option}", allowed type: "${i}"`;e=n}return e},rs=(e,t)=>{let i=e;return{enumerable:!0,get:()=>i,set:a=>{i=yn(a,e,t)}}},ss=e=>{let t={};return te(e,i=>{let a=e[i];t[i]=rs(a[0],a[1])}),He(t)},cs=e=>({items:[],listUpdateTimeout:null,itemUpdateTimeout:null,processingQueue:[],options:ss(e)}),pi=(e,t="-")=>e.split(/(?=[A-Z])/).map(i=>i.toLowerCase()).join(t),ds=(e,t)=>{let i={};return te(t,a=>{i[a]={get:()=>e.getState().options[a],set:n=>{e.dispatch(`SET_${pi(a,"_").toUpperCase()}`,{value:n})}}}),i},ps=e=>(t,i,a)=>{let n={};return te(e,l=>{let o=pi(l,"_").toUpperCase();n[`SET_${o}`]=r=>{try{a.options[l]=r.value}catch{}t(`DID_SET_${o}`,{value:a.options[l]})}}),n},ms=e=>t=>{let i={};return te(e,a=>{i[`GET_${pi(a,"_").toUpperCase()}`]=n=>t.options[a]}),i},Re={API:1,DROP:2,BROWSE:3,PASTE:4,NONE:5},Yi=()=>Math.random().toString(36).substring(2,11),qi=(e,t)=>e.splice(t,1),us=(e,t)=>{t?e():document.hidden?Promise.resolve(1).then(e):setTimeout(e,0)},mi=()=>{let e=[],t=(a,n)=>{qi(e,e.findIndex(l=>l.event===a&&(l.cb===n||!n)))},i=(a,n,l)=>{e.filter(o=>o.event===a).map(o=>o.cb).forEach(o=>us(()=>o(...n),l))};return{fireSync:(a,...n)=>{i(a,n,!0)},fire:(a,...n)=>{i(a,n,!1)},on:(a,n)=>{e.push({event:a,cb:n})},onOnce:(a,n)=>{e.push({event:a,cb:(...l)=>{t(a,n),n(...l)}})},off:t}},Rn=(e,t,i)=>{Object.getOwnPropertyNames(e).filter(a=>!i.includes(a)).forEach(a=>Object.defineProperty(t,a,Object.getOwnPropertyDescriptor(e,a)))},gs=["fire","process","revert","load","on","off","onOnce","retryLoad","extend","archive","archived","release","released","requestProcessing","freeze"],he=e=>{let t={};return Rn(e,t,gs),t},fs=e=>{e.forEach((t,i)=>{t.released&&qi(e,i)})},H={INIT:1,IDLE:2,PROCESSING_QUEUED:9,PROCESSING:3,PROCESSING_COMPLETE:5,PROCESSING_ERROR:6,PROCESSING_REVERT_ERROR:10,LOADING:7,LOAD_ERROR:8},re={INPUT:1,LIMBO:2,LOCAL:3},Sn=e=>/[^0-9]+/.exec(e),_n=()=>Sn(1.1.toLocaleString())[0],hs=()=>{let e=_n(),t=1e3.toLocaleString();return t!=="1000"?Sn(t)[0]:e==="."?",":"."},M={BOOLEAN:"boolean",INT:"int",NUMBER:"number",STRING:"string",ARRAY:"array",OBJECT:"object",FUNCTION:"function",ACTION:"action",SERVER_API:"serverapi",REGEX:"regex"},$i=[],Ae=(e,t,i)=>new Promise((a,n)=>{let l=$i.filter(r=>r.key===e).map(r=>r.cb);if(l.length===0){a(t);return}let o=l.shift();l.reduce((r,s)=>r.then(p=>s(p,i)),o(t,i)).then(r=>a(r)).catch(r=>n(r))}),it=(e,t,i)=>$i.filter(a=>a.key===e).map(a=>a.cb(t,i)),bs=(e,t)=>$i.push({key:e,cb:t}),Es=e=>Object.assign(mt,e),oi=()=>({...mt}),Ts=e=>{te(e,(t,i)=>{mt[t]&&(mt[t][0]=yn(i,mt[t][0],mt[t][1]))})},mt={id:[null,M.STRING],name:["filepond",M.STRING],disabled:[!1,M.BOOLEAN],className:[null,M.STRING],required:[!1,M.BOOLEAN],captureMethod:[null,M.STRING],allowSyncAcceptAttribute:[!0,M.BOOLEAN],allowDrop:[!0,M.BOOLEAN],allowBrowse:[!0,M.BOOLEAN],allowPaste:[!0,M.BOOLEAN],allowMultiple:[!1,M.BOOLEAN],allowReplace:[!0,M.BOOLEAN],allowRevert:[!0,M.BOOLEAN],allowRemove:[!0,M.BOOLEAN],allowProcess:[!0,M.BOOLEAN],allowReorder:[!1,M.BOOLEAN],allowDirectoriesOnly:[!1,M.BOOLEAN],storeAsFile:[!1,M.BOOLEAN],forceRevert:[!1,M.BOOLEAN],maxFiles:[null,M.INT],checkValidity:[!1,M.BOOLEAN],itemInsertLocationFreedom:[!0,M.BOOLEAN],itemInsertLocation:["before",M.STRING],itemInsertInterval:[75,M.INT],dropOnPage:[!1,M.BOOLEAN],dropOnElement:[!0,M.BOOLEAN],dropValidation:[!1,M.BOOLEAN],ignoredFiles:[[".ds_store","thumbs.db","desktop.ini"],M.ARRAY],instantUpload:[!0,M.BOOLEAN],maxParallelUploads:[2,M.INT],allowMinimumUploadDuration:[!0,M.BOOLEAN],chunkUploads:[!1,M.BOOLEAN],chunkForce:[!1,M.BOOLEAN],chunkSize:[5e6,M.INT],chunkRetryDelays:[[500,1e3,3e3],M.ARRAY],server:[null,M.SERVER_API],fileSizeBase:[1e3,M.INT],labelFileSizeBytes:["bytes",M.STRING],labelFileSizeKilobytes:["KB",M.STRING],labelFileSizeMegabytes:["MB",M.STRING],labelFileSizeGigabytes:["GB",M.STRING],labelDecimalSeparator:[_n(),M.STRING],labelThousandsSeparator:[hs(),M.STRING],labelIdle:['Drag & Drop your files or Browse',M.STRING],labelInvalidField:["Field contains invalid files",M.STRING],labelFileWaitingForSize:["Waiting for size",M.STRING],labelFileSizeNotAvailable:["Size not available",M.STRING],labelFileCountSingular:["file in list",M.STRING],labelFileCountPlural:["files in list",M.STRING],labelFileLoading:["Loading",M.STRING],labelFileAdded:["Added",M.STRING],labelFileLoadError:["Error during load",M.STRING],labelFileRemoved:["Removed",M.STRING],labelFileRemoveError:["Error during remove",M.STRING],labelFileProcessing:["Uploading",M.STRING],labelFileProcessingComplete:["Upload complete",M.STRING],labelFileProcessingAborted:["Upload cancelled",M.STRING],labelFileProcessingError:["Error during upload",M.STRING],labelFileProcessingRevertError:["Error during revert",M.STRING],labelTapToCancel:["tap to cancel",M.STRING],labelTapToRetry:["tap to retry",M.STRING],labelTapToUndo:["tap to undo",M.STRING],labelButtonRemoveItem:["Remove",M.STRING],labelButtonAbortItemLoad:["Abort",M.STRING],labelButtonRetryItemLoad:["Retry",M.STRING],labelButtonAbortItemProcessing:["Cancel",M.STRING],labelButtonUndoItemProcessing:["Undo",M.STRING],labelButtonRetryItemProcessing:["Retry",M.STRING],labelButtonProcessItem:["Upload",M.STRING],iconRemove:['',M.STRING],iconProcess:['',M.STRING],iconRetry:['',M.STRING],iconUndo:['',M.STRING],iconDone:['',M.STRING],oninit:[null,M.FUNCTION],onwarning:[null,M.FUNCTION],onerror:[null,M.FUNCTION],onactivatefile:[null,M.FUNCTION],oninitfile:[null,M.FUNCTION],onaddfilestart:[null,M.FUNCTION],onaddfileprogress:[null,M.FUNCTION],onaddfile:[null,M.FUNCTION],onprocessfilestart:[null,M.FUNCTION],onprocessfileprogress:[null,M.FUNCTION],onprocessfileabort:[null,M.FUNCTION],onprocessfilerevert:[null,M.FUNCTION],onprocessfile:[null,M.FUNCTION],onprocessfiles:[null,M.FUNCTION],onremovefile:[null,M.FUNCTION],onpreparefile:[null,M.FUNCTION],onupdatefiles:[null,M.FUNCTION],onreorderfiles:[null,M.FUNCTION],beforeDropFile:[null,M.FUNCTION],beforeAddFile:[null,M.FUNCTION],beforeRemoveFile:[null,M.FUNCTION],beforePrepareFile:[null,M.FUNCTION],stylePanelLayout:[null,M.STRING],stylePanelAspectRatio:[null,M.STRING],styleItemPanelAspectRatio:[null,M.STRING],styleButtonRemoveItemPosition:["left",M.STRING],styleButtonProcessItemPosition:["right",M.STRING],styleLoadIndicatorPosition:["right",M.STRING],styleProgressIndicatorPosition:["right",M.STRING],styleButtonRemoveItemAlign:[!1,M.BOOLEAN],files:[[],M.ARRAY],credits:[["https://pqina.nl/","Powered by PQINA"],M.ARRAY]},Ze=(e,t)=>Ve(t)?e[0]||null:Et(t)?e[t]||null:(typeof t=="object"&&(t=t.id),e.find(i=>i.id===t)||null),wn=e=>{if(Ve(e))return e;if(/:/.test(e)){let t=e.split(":");return t[1]/t[0]}return parseFloat(e)},ze=e=>e.filter(t=>!t.archived),Ln={EMPTY:0,IDLE:1,ERROR:2,BUSY:3,READY:4},Qt=null,Is=()=>{if(Qt===null)try{let e=new DataTransfer;e.items.add(new File(["hello world"],"This_Works.txt"));let t=document.createElement("input");t.setAttribute("type","file"),t.files=e.files,Qt=t.files.length===1}catch{Qt=!1}return Qt},vs=[H.LOAD_ERROR,H.PROCESSING_ERROR,H.PROCESSING_REVERT_ERROR],xs=[H.LOADING,H.PROCESSING,H.PROCESSING_QUEUED,H.INIT],ys=[H.PROCESSING_COMPLETE],Rs=e=>vs.includes(e.status),Ss=e=>xs.includes(e.status),_s=e=>ys.includes(e.status),Ua=e=>de(e.options.server)&&(de(e.options.server.process)||Ke(e.options.server.process)),ws=e=>({GET_STATUS:()=>{let t=ze(e.items),{EMPTY:i,ERROR:a,BUSY:n,IDLE:l,READY:o}=Ln;return t.length===0?i:t.some(Rs)?a:t.some(Ss)?n:t.some(_s)?o:l},GET_ITEM:t=>Ze(e.items,t),GET_ACTIVE_ITEM:t=>Ze(ze(e.items),t),GET_ACTIVE_ITEMS:()=>ze(e.items),GET_ITEMS:()=>e.items,GET_ITEM_NAME:t=>{let i=Ze(e.items,t);return i?i.filename:null},GET_ITEM_SIZE:t=>{let i=Ze(e.items,t);return i?i.fileSize:null},GET_STYLES:()=>Object.keys(e.options).filter(t=>/^style/.test(t)).map(t=>({name:t,value:e.options[t]})),GET_PANEL_ASPECT_RATIO:()=>/circle/.test(e.options.stylePanelLayout)?1:wn(e.options.stylePanelAspectRatio),GET_ITEM_PANEL_ASPECT_RATIO:()=>e.options.styleItemPanelAspectRatio,GET_ITEMS_BY_STATUS:t=>ze(e.items).filter(i=>i.status===t),GET_TOTAL_ITEMS:()=>ze(e.items).length,SHOULD_UPDATE_FILE_INPUT:()=>e.options.storeAsFile&&Is()&&!Ua(e),IS_ASYNC:()=>Ua(e),GET_FILE_SIZE_LABELS:t=>({labelBytes:t("GET_LABEL_FILE_SIZE_BYTES")||void 0,labelKilobytes:t("GET_LABEL_FILE_SIZE_KILOBYTES")||void 0,labelMegabytes:t("GET_LABEL_FILE_SIZE_MEGABYTES")||void 0,labelGigabytes:t("GET_LABEL_FILE_SIZE_GIGABYTES")||void 0})}),Ls=e=>{let t=ze(e.items).length;if(!e.options.allowMultiple)return t===0;let i=e.options.maxFiles;return i===null||tMath.max(Math.min(i,e),t),Ms=(e,t,i)=>e.splice(t,0,i),As=(e,t,i)=>Ve(t)?null:typeof i>"u"?(e.push(t),t):(i=Mn(i,0,e.length),Ms(e,i,t),t),Fi=e=>/^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*)\s*$/i.test(e),Ct=e=>`${e}`.split("/").pop().split("?").shift(),ui=e=>e.split(".").pop(),zs=e=>{if(typeof e!="string")return"";let t=e.split("/").pop();return/svg/.test(t)?"svg":/zip|compressed/.test(t)?"zip":/plain/.test(t)?"txt":/msword/.test(t)?"doc":/[a-z]+/.test(t)?t==="jpeg"?"jpg":t:""},zt=(e,t="")=>(t+e).slice(-t.length),An=(e=new Date)=>`${e.getFullYear()}-${zt(e.getMonth()+1,"00")}-${zt(e.getDate(),"00")}_${zt(e.getHours(),"00")}-${zt(e.getMinutes(),"00")}-${zt(e.getSeconds(),"00")}`,bt=(e,t,i=null,a=null)=>{let n=typeof i=="string"?e.slice(0,e.size,i):e.slice(0,e.size,e.type);return n.lastModifiedDate=new Date,e._relativePath&&(n._relativePath=e._relativePath),ge(t)||(t=An()),t&&a===null&&ui(t)?n.name=t:(a=a||zs(n.type),n.name=t+(a?"."+a:"")),n},Ps=()=>window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,zn=(e,t)=>{let i=Ps();if(i){let a=new i;return a.append(e),a.getBlob(t)}return new Blob([e],{type:t})},Fs=(e,t)=>{let i=new ArrayBuffer(e.length),a=new Uint8Array(i);for(let n=0;n(/^data:(.+);/.exec(e)||[])[1]||null,Os=e=>e.split(",")[1].replace(/\s/g,""),Ds=e=>atob(Os(e)),Cs=e=>{let t=Pn(e),i=Ds(e);return Fs(i,t)},Bs=(e,t,i)=>bt(Cs(e),t,null,i),ks=e=>{if(!/^content-disposition:/i.test(e))return null;let t=e.split(/filename=|filename\*=.+''/).splice(1).map(i=>i.trim().replace(/^["']|[;"']{0,2}$/g,"")).filter(i=>i.length);return t.length?decodeURI(t[t.length-1]):null},Ns=e=>{if(/content-length:/i.test(e)){let t=e.match(/[0-9]+/)[0];return t?parseInt(t,10):null}return null},Vs=e=>/x-content-transfer-id:/i.test(e)&&(e.split(":")[1]||"").trim()||null,Xi=e=>{let t={source:null,name:null,size:null},i=e.split(` `);for(let a of i){let n=ks(a);if(n){t.name=n;continue}let l=Ns(a);if(l){t.size=l;continue}let o=Vs(a);if(o){t.source=o;continue}}return t},Gs=e=>{let t={source:null,complete:!1,progress:0,size:null,timestamp:null,duration:0,request:null},i=()=>t.progress,a=()=>{t.request&&t.request.abort&&t.request.abort()},n=()=>{let r=t.source;o.fire("init",r),r instanceof File?o.fire("load",r):r instanceof Blob?o.fire("load",bt(r,r.name)):Fi(r)?o.fire("load",Bs(r)):l(r)},l=r=>{if(!e){o.fire("error",{type:"error",body:"Can't load URL",code:400});return}t.timestamp=Date.now(),t.request=e(r,s=>{t.duration=Date.now()-t.timestamp,t.complete=!0,s instanceof Blob&&(s=bt(s,s.name||Ct(r))),o.fire("load",s instanceof Blob?s:s?s.body:null)},s=>{o.fire("error",typeof s=="string"?{type:"error",code:0,body:s}:s)},(s,p,c)=>{if(c&&(t.size=c),t.duration=Date.now()-t.timestamp,!s){t.progress=null;return}t.progress=p/c,o.fire("progress",t.progress)},()=>{o.fire("abort")},s=>{let p=Xi(typeof s=="string"?s:s.headers);o.fire("meta",{size:t.size||p.size,filename:p.name,source:p.source})})},o={...mi(),setSource:r=>t.source=r,getProgress:i,abort:a,load:n};return o},Ha=e=>/GET|HEAD/.test(e),Qe=(e,t,i)=>{let a={onheaders:()=>{},onprogress:()=>{},onload:()=>{},ontimeout:()=>{},onerror:()=>{},onabort:()=>{},abort:()=>{n=!0,o.abort()}},n=!1,l=!1;i={method:"POST",headers:{},withCredentials:!1,...i},t=encodeURI(t),Ha(i.method)&&e&&(t=`${t}${encodeURIComponent(typeof e=="string"?e:JSON.stringify(e))}`);let o=new XMLHttpRequest,r=Ha(i.method)?o:o.upload;return r.onprogress=s=>{n||a.onprogress(s.lengthComputable,s.loaded,s.total)},o.onreadystatechange=()=>{o.readyState<2||o.readyState===4&&o.status===0||l||(l=!0,a.onheaders(o))},o.onload=()=>{o.status>=200&&o.status<300?a.onload(o):a.onerror(o)},o.onerror=()=>a.onerror(o),o.onabort=()=>{n=!0,a.onabort()},o.ontimeout=()=>a.ontimeout(o),o.open(i.method,t,!0),Et(i.timeout)&&(o.timeout=i.timeout),Object.keys(i.headers).forEach(s=>{let p=unescape(encodeURIComponent(i.headers[s]));o.setRequestHeader(s,p)}),i.responseType&&(o.responseType=i.responseType),i.withCredentials&&(o.withCredentials=!0),o.send(e),a},ae=(e,t,i,a)=>({type:e,code:t,body:i,headers:a}),Je=e=>t=>{e(ae("error",0,"Timeout",t.getAllResponseHeaders()))},Wa=e=>/\?/.test(e),Ot=(...e)=>{let t="";return e.forEach(i=>{t+=Wa(t)&&Wa(i)?i.replace(/\?/,"&"):i}),t},_i=(e="",t)=>{if(typeof t=="function")return t;if(!t||!ge(t.url))return null;let i=t.onload||(n=>n),a=t.onerror||(n=>null);return(n,l,o,r,s,p)=>{let c=Qe(n,Ot(e,t.url),{...t,responseType:"blob"});return c.onload=d=>{let m=d.getAllResponseHeaders(),u=Xi(m).name||Ct(n);l(ae("load",d.status,t.method==="HEAD"?null:bt(i(d.response),u),m))},c.onerror=d=>{o(ae("error",d.status,a(d.response)||d.statusText,d.getAllResponseHeaders()))},c.onheaders=d=>{p(ae("headers",d.status,null,d.getAllResponseHeaders()))},c.ontimeout=Je(o),c.onprogress=r,c.onabort=s,c}},xe={QUEUED:0,COMPLETE:1,PROCESSING:2,ERROR:3,WAITING:4},Us=(e,t,i,a,n,l,o,r,s,p,c)=>{let d=[],{chunkTransferId:m,chunkServer:u,chunkSize:g,chunkRetryDelays:f}=c,h={serverId:m,aborted:!1},I=t.ondata||(w=>w),b=t.onload||((w,F)=>F==="HEAD"?w.getResponseHeader("Upload-Offset"):w.response),E=t.onerror||(w=>null),v=w=>{let F=new FormData;de(n)&&F.append(i,JSON.stringify(n));let S=typeof t.headers=="function"?t.headers(a,n):{...t.headers,"Upload-Length":a.size},L={...t,headers:S},D=Qe(I(F),Ot(e,t.url),L);D.onload=O=>w(b(O,L.method)),D.onerror=O=>o(ae("error",O.status,E(O.response)||O.statusText,O.getAllResponseHeaders())),D.ontimeout=Je(o)},y=w=>{let F=Ot(e,u.url,h.serverId),L={headers:typeof t.headers=="function"?t.headers(h.serverId):{...t.headers},method:"HEAD"},D=Qe(null,F,L);D.onload=O=>w(b(O,L.method)),D.onerror=O=>o(ae("error",O.status,E(O.response)||O.statusText,O.getAllResponseHeaders())),D.ontimeout=Je(o)},T=Math.floor(a.size/g);for(let w=0;w<=T;w++){let F=w*g,S=a.slice(F,F+g,"application/offset+octet-stream");d[w]={index:w,size:S.size,offset:F,data:S,file:a,progress:0,retries:[...f],status:xe.QUEUED,error:null,request:null,timeout:null}}let _=()=>l(h.serverId),x=w=>w.status===xe.QUEUED||w.status===xe.ERROR,R=w=>{if(h.aborted)return;if(w=w||d.find(x),!w){d.every(C=>C.status===xe.COMPLETE)&&_();return}w.status=xe.PROCESSING,w.progress=null;let F=u.ondata||(C=>C),S=u.onerror||(C=>null),L=u.onload||(()=>{}),D=Ot(e,u.url,h.serverId),O=typeof u.headers=="function"?u.headers(w):{...u.headers,"Content-Type":"application/offset+octet-stream","Upload-Offset":w.offset,"Upload-Length":a.size,"Upload-Name":a.name},U=w.request=Qe(F(w.data),D,{...u,headers:O});U.onload=C=>{L(C,w.index,d.length),w.status=xe.COMPLETE,w.request=null,A()},U.onprogress=(C,X,K)=>{w.progress=C?X:null,z()},U.onerror=C=>{w.status=xe.ERROR,w.request=null,w.error=S(C.response)||C.statusText,P(w)||o(ae("error",C.status,S(C.response)||C.statusText,C.getAllResponseHeaders()))},U.ontimeout=C=>{w.status=xe.ERROR,w.request=null,P(w)||Je(o)(C)},U.onabort=()=>{w.status=xe.QUEUED,w.request=null,s()}},P=w=>w.retries.length===0?!1:(w.status=xe.WAITING,clearTimeout(w.timeout),w.timeout=setTimeout(()=>{R(w)},w.retries.shift()),!0),z=()=>{let w=d.reduce((S,L)=>S===null||L.progress===null?null:S+L.progress,0);if(w===null)return r(!1,0,0);let F=d.reduce((S,L)=>S+L.size,0);r(!0,w,F)},A=()=>{d.filter(F=>F.status===xe.PROCESSING).length>=1||R()},B=()=>{d.forEach(w=>{clearTimeout(w.timeout),w.request&&w.request.abort()})};return h.serverId?y(w=>{h.aborted||(d.filter(F=>F.offset{F.status=xe.COMPLETE,F.progress=F.size}),A())}):v(w=>{h.aborted||(p(w),h.serverId=w,A())}),{abort:()=>{h.aborted=!0,B()}}},Hs=(e,t,i,a)=>(n,l,o,r,s,p,c)=>{if(!n)return;let d=a.chunkUploads,m=d&&n.size>a.chunkSize,u=d&&(m||a.chunkForce);if(n instanceof Blob&&u)return Us(e,t,i,n,l,o,r,s,p,c,a);let g=t.ondata||(y=>y),f=t.onload||(y=>y),h=t.onerror||(y=>null),I=typeof t.headers=="function"?t.headers(n,l)||{}:{...t.headers},b={...t,headers:I};var E=new FormData;de(l)&&E.append(i,JSON.stringify(l)),(n instanceof Blob?[{name:null,file:n}]:n).forEach(y=>{E.append(i,y.file,y.name===null?y.file.name:`${y.name}${y.file.name}`)});let v=Qe(g(E),Ot(e,t.url),b);return v.onload=y=>{o(ae("load",y.status,f(y.response),y.getAllResponseHeaders()))},v.onerror=y=>{r(ae("error",y.status,h(y.response)||y.statusText,y.getAllResponseHeaders()))},v.ontimeout=Je(r),v.onprogress=s,v.onabort=p,v},Ws=(e="",t,i,a)=>typeof t=="function"?(...n)=>t(i,...n,a):!t||!ge(t.url)?null:Hs(e,t,i,a),Pt=(e="",t)=>{if(typeof t=="function")return t;if(!t||!ge(t.url))return(n,l)=>l();let i=t.onload||(n=>n),a=t.onerror||(n=>null);return(n,l,o)=>{let r=Qe(n,e+t.url,t);return r.onload=s=>{l(ae("load",s.status,i(s.response),s.getAllResponseHeaders()))},r.onerror=s=>{o(ae("error",s.status,a(s.response)||s.statusText,s.getAllResponseHeaders()))},r.ontimeout=Je(o),r}},Fn=(e=0,t=1)=>e+Math.random()*(t-e),js=(e,t=1e3,i=0,a=25,n=250)=>{let l=null,o=Date.now(),r=()=>{let s=Date.now()-o,p=Fn(a,n);s+p>t&&(p=s+p-t);let c=s/t;if(c>=1||document.hidden){e(1);return}e(c),l=setTimeout(r,p)};return t>0&&r(),{clear:()=>{clearTimeout(l)}}},Ys=(e,t)=>{let i={complete:!1,perceivedProgress:0,perceivedPerformanceUpdater:null,progress:null,timestamp:null,perceivedDuration:0,duration:0,request:null,response:null},{allowMinimumUploadDuration:a}=t,n=(c,d)=>{let m=()=>{i.duration===0||i.progress===null||p.fire("progress",p.getProgress())},u=()=>{i.complete=!0,p.fire("load-perceived",i.response.body)};p.fire("start"),i.timestamp=Date.now(),i.perceivedPerformanceUpdater=js(g=>{i.perceivedProgress=g,i.perceivedDuration=Date.now()-i.timestamp,m(),i.response&&i.perceivedProgress===1&&!i.complete&&u()},a?Fn(750,1500):0),i.request=e(c,d,g=>{i.response=de(g)?g:{type:"load",code:200,body:`${g}`,headers:{}},i.duration=Date.now()-i.timestamp,i.progress=1,p.fire("load",i.response.body),(!a||a&&i.perceivedProgress===1)&&u()},g=>{i.perceivedPerformanceUpdater.clear(),p.fire("error",de(g)?g:{type:"error",code:0,body:`${g}`})},(g,f,h)=>{i.duration=Date.now()-i.timestamp,i.progress=g?f/h:null,m()},()=>{i.perceivedPerformanceUpdater.clear(),p.fire("abort",i.response?i.response.body:null)},g=>{p.fire("transfer",g)})},l=()=>{i.request&&(i.perceivedPerformanceUpdater.clear(),i.request.abort&&i.request.abort(),i.complete=!0)},o=()=>{l(),i.complete=!1,i.perceivedProgress=0,i.progress=0,i.timestamp=null,i.perceivedDuration=0,i.duration=0,i.request=null,i.response=null},r=a?()=>i.progress?Math.min(i.progress,i.perceivedProgress):null:()=>i.progress||null,s=a?()=>Math.min(i.duration,i.perceivedDuration):()=>i.duration,p={...mi(),process:n,abort:l,getProgress:r,getDuration:s,reset:o};return p},On=e=>e.substring(0,e.lastIndexOf("."))||e,qs=e=>{let t=[e.name,e.size,e.type];return e instanceof Blob||Fi(e)?t[0]=e.name||An():Fi(e)?(t[1]=e.length,t[2]=Pn(e)):ge(e)&&(t[0]=Ct(e),t[1]=0,t[2]="application/octet-stream"),{name:t[0],size:t[1],type:t[2]}},et=e=>!!(e instanceof File||e instanceof Blob&&e.name),Dn=e=>{if(!de(e))return e;let t=ci(e)?[]:{};for(let i in e){if(!e.hasOwnProperty(i))continue;let a=e[i];t[i]=a&&de(a)?Dn(a):a}return t},$s=(e=null,t=null,i=null)=>{let a=Yi(),n={archived:!1,frozen:!1,released:!1,source:null,file:i,serverFileReference:t,transferId:null,processingAborted:!1,status:t?H.PROCESSING_COMPLETE:H.INIT,activeLoader:null,activeProcessor:null},l=null,o={},r=x=>n.status=x,s=(x,...R)=>{n.released||n.frozen||T.fire(x,...R)},p=()=>ui(n.file.name),c=()=>n.file.type,d=()=>n.file.size,m=()=>n.file,u=(x,R,P)=>{if(n.source=x,T.fireSync("init"),n.file){T.fireSync("load-skip");return}n.file=qs(x),R.on("init",()=>{s("load-init")}),R.on("meta",z=>{n.file.size=z.size,n.file.filename=z.filename,z.source&&(e=re.LIMBO,n.serverFileReference=z.source,n.status=H.PROCESSING_COMPLETE),s("load-meta")}),R.on("progress",z=>{r(H.LOADING),s("load-progress",z)}),R.on("error",z=>{r(H.LOAD_ERROR),s("load-request-error",z)}),R.on("abort",()=>{r(H.INIT),s("load-abort")}),R.on("load",z=>{n.activeLoader=null;let A=w=>{n.file=et(w)?w:n.file,e===re.LIMBO&&n.serverFileReference?r(H.PROCESSING_COMPLETE):r(H.IDLE),s("load")},B=w=>{n.file=z,s("load-meta"),r(H.LOAD_ERROR),s("load-file-error",w)};if(n.serverFileReference){A(z);return}P(z,A,B)}),R.setSource(x),n.activeLoader=R,R.load()},g=()=>{n.activeLoader&&n.activeLoader.load()},f=()=>{if(n.activeLoader){n.activeLoader.abort();return}r(H.INIT),s("load-abort")},h=(x,R)=>{if(n.processingAborted){n.processingAborted=!1;return}if(r(H.PROCESSING),l=null,!(n.file instanceof Blob)){T.on("load",()=>{h(x,R)});return}x.on("load",A=>{n.transferId=null,n.serverFileReference=A}),x.on("transfer",A=>{n.transferId=A}),x.on("load-perceived",A=>{n.activeProcessor=null,n.transferId=null,n.serverFileReference=A,r(H.PROCESSING_COMPLETE),s("process-complete",A)}),x.on("start",()=>{s("process-start")}),x.on("error",A=>{n.activeProcessor=null,r(H.PROCESSING_ERROR),s("process-error",A)}),x.on("abort",A=>{n.activeProcessor=null,n.serverFileReference=A,r(H.IDLE),s("process-abort"),l&&l()}),x.on("progress",A=>{s("process-progress",A)});let P=A=>{n.archived||x.process(A,{...o})},z=console.error;R(n.file,P,z),n.activeProcessor=x},I=()=>{n.processingAborted=!1,r(H.PROCESSING_QUEUED)},b=()=>new Promise(x=>{if(!n.activeProcessor){n.processingAborted=!0,r(H.IDLE),s("process-abort"),x();return}l=()=>{x()},n.activeProcessor.abort()}),E=(x,R)=>new Promise((P,z)=>{let A=n.serverFileReference!==null?n.serverFileReference:n.transferId;if(A===null){P();return}x(A,()=>{n.serverFileReference=null,n.transferId=null,P()},B=>{if(!R){P();return}r(H.PROCESSING_REVERT_ERROR),s("process-revert-error"),z(B)}),r(H.IDLE),s("process-revert")}),v=(x,R,P)=>{let z=x.split("."),A=z[0],B=z.pop(),w=o;z.forEach(F=>w=w[F]),JSON.stringify(w[B])!==JSON.stringify(R)&&(w[B]=R,s("metadata-update",{key:A,value:o[A],silent:P}))},T={id:{get:()=>a},origin:{get:()=>e,set:x=>e=x},serverId:{get:()=>n.serverFileReference},transferId:{get:()=>n.transferId},status:{get:()=>n.status},filename:{get:()=>n.file.name},filenameWithoutExtension:{get:()=>On(n.file.name)},fileExtension:{get:p},fileType:{get:c},fileSize:{get:d},file:{get:m},relativePath:{get:()=>n.file._relativePath},source:{get:()=>n.source},getMetadata:x=>Dn(x?o[x]:o),setMetadata:(x,R,P)=>{if(de(x)){let z=x;return Object.keys(z).forEach(A=>{v(A,z[A],R)}),x}return v(x,R,P),R},extend:(x,R)=>_[x]=R,abortLoad:f,retryLoad:g,requestProcessing:I,abortProcessing:b,load:u,process:h,revert:E,...mi(),freeze:()=>n.frozen=!0,release:()=>n.released=!0,released:{get:()=>n.released},archive:()=>n.archived=!0,archived:{get:()=>n.archived},setFile:x=>n.file=x},_=He(T);return _},Xs=(e,t)=>Ve(t)?0:ge(t)?e.findIndex(i=>i.id===t):-1,ja=(e,t)=>{let i=Xs(e,t);if(!(i<0))return e[i]||null},Ya=(e,t,i,a,n,l)=>{let o=Qe(null,e,{method:"GET",responseType:"blob"});return o.onload=r=>{let s=r.getAllResponseHeaders(),p=Xi(s).name||Ct(e);t(ae("load",r.status,bt(r.response,p),s))},o.onerror=r=>{i(ae("error",r.status,r.statusText,r.getAllResponseHeaders()))},o.onheaders=r=>{l(ae("headers",r.status,null,r.getAllResponseHeaders()))},o.ontimeout=Je(i),o.onprogress=a,o.onabort=n,o},qa=e=>(e.indexOf("//")===0&&(e=location.protocol+e),e.toLowerCase().replace("blob:","").replace(/([a-z])?:\/\//,"$1").split("/")[0]),Ks=e=>(e.indexOf(":")>-1||e.indexOf("//")>-1)&&qa(location.href)!==qa(e),Jt=e=>(...t)=>Ke(e)?e(...t):e,Zs=e=>!et(e.file),wi=(e,t)=>{clearTimeout(t.listUpdateTimeout),t.listUpdateTimeout=setTimeout(()=>{e("DID_UPDATE_ITEMS",{items:ze(t.items)})},0)},$a=(e,...t)=>new Promise(i=>{if(!e)return i(!0);let a=e(...t);if(a==null)return i(!0);if(typeof a=="boolean")return i(a);typeof a.then=="function"&&a.then(i)}),Li=(e,t)=>{e.items.sort((i,a)=>t(he(i),he(a)))},ye=(e,t)=>({query:i,success:a=()=>{},failure:n=()=>{},...l}={})=>{let o=Ze(e.items,i);if(!o){n({error:ae("error",0,"Item not found"),file:null});return}t(o,a,n,l||{})},Qs=(e,t,i)=>({ABORT_ALL:()=>{ze(i.items).forEach(a=>{a.freeze(),a.abortLoad(),a.abortProcessing()})},DID_SET_FILES:({value:a=[]})=>{let n=a.map(o=>({source:o.source?o.source:o,options:o.options})),l=ze(i.items);l.forEach(o=>{n.find(r=>r.source===o.source||r.source===o.file)||e("REMOVE_ITEM",{query:o,remove:!1})}),l=ze(i.items),n.forEach((o,r)=>{l.find(s=>s.source===o.source||s.file===o.source)||e("ADD_ITEM",{...o,interactionMethod:Re.NONE,index:r})})},DID_UPDATE_ITEM_METADATA:({id:a,action:n,change:l})=>{l.silent||(clearTimeout(i.itemUpdateTimeout),i.itemUpdateTimeout=setTimeout(()=>{let o=ja(i.items,a);if(!t("IS_ASYNC")){Ae("SHOULD_PREPARE_OUTPUT",!1,{item:o,query:t,action:n,change:l}).then(c=>{let d=t("GET_BEFORE_PREPARE_FILE");d&&(c=d(o,c)),c&&e("REQUEST_PREPARE_OUTPUT",{query:a,item:o,success:m=>{e("DID_PREPARE_OUTPUT",{id:a,file:m})}},!0)});return}o.origin===re.LOCAL&&e("DID_LOAD_ITEM",{id:o.id,error:null,serverFileReference:o.source});let r=()=>{setTimeout(()=>{e("REQUEST_ITEM_PROCESSING",{query:a})},32)},s=c=>{o.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(c?r:()=>{}).catch(()=>{})},p=c=>{o.abortProcessing().then(c?r:()=>{})};if(o.status===H.PROCESSING_COMPLETE)return s(i.options.instantUpload);if(o.status===H.PROCESSING)return p(i.options.instantUpload);i.options.instantUpload&&r()},0))},MOVE_ITEM:({query:a,index:n})=>{let l=Ze(i.items,a);if(!l)return;let o=i.items.indexOf(l);n=Mn(n,0,i.items.length-1),o!==n&&i.items.splice(n,0,i.items.splice(o,1)[0])},SORT:({compare:a})=>{Li(i,a),e("DID_SORT_ITEMS",{items:t("GET_ACTIVE_ITEMS")})},ADD_ITEMS:({items:a,index:n,interactionMethod:l,success:o=()=>{},failure:r=()=>{}})=>{let s=n;if(n===-1||typeof n>"u"){let u=t("GET_ITEM_INSERT_LOCATION"),g=t("GET_TOTAL_ITEMS");s=u==="before"?0:g}let p=t("GET_IGNORED_FILES"),c=u=>et(u)?!p.includes(u.name.toLowerCase()):!Ve(u),m=a.filter(c).map(u=>new Promise((g,f)=>{e("ADD_ITEM",{interactionMethod:l,source:u.source||u,success:g,failure:f,index:s++,options:u.options||{}})}));Promise.all(m).then(o).catch(r)},ADD_ITEM:({source:a,index:n=-1,interactionMethod:l,success:o=()=>{},failure:r=()=>{},options:s={}})=>{if(Ve(a)){r({error:ae("error",0,"No source"),file:null});return}if(et(a)&&i.options.ignoredFiles.includes(a.name.toLowerCase()))return;if(!Ls(i)){if(i.options.allowMultiple||!i.options.allowMultiple&&!i.options.allowReplace){let b=ae("warning",0,"Max files");e("DID_THROW_MAX_FILES",{source:a,error:b}),r({error:b,file:null});return}let I=ze(i.items)[0];if(I.status===H.PROCESSING_COMPLETE||I.status===H.PROCESSING_REVERT_ERROR){let b=t("GET_FORCE_REVERT");if(I.revert(Pt(i.options.server.url,i.options.server.revert),b).then(()=>{b&&e("ADD_ITEM",{source:a,index:n,interactionMethod:l,success:o,failure:r,options:s})}).catch(()=>{}),b)return}e("REMOVE_ITEM",{query:I.id})}let p=s.type==="local"?re.LOCAL:s.type==="limbo"?re.LIMBO:re.INPUT,c=$s(p,p===re.INPUT?null:a,s.file);Object.keys(s.metadata||{}).forEach(I=>{c.setMetadata(I,s.metadata[I])}),it("DID_CREATE_ITEM",c,{query:t,dispatch:e});let d=t("GET_ITEM_INSERT_LOCATION");i.options.itemInsertLocationFreedom||(n=d==="before"?-1:i.items.length),As(i.items,c,n),Ke(d)&&a&&Li(i,d);let m=c.id;c.on("init",()=>{e("DID_INIT_ITEM",{id:m})}),c.on("load-init",()=>{e("DID_START_ITEM_LOAD",{id:m})}),c.on("load-meta",()=>{e("DID_UPDATE_ITEM_META",{id:m})}),c.on("load-progress",I=>{e("DID_UPDATE_ITEM_LOAD_PROGRESS",{id:m,progress:I})}),c.on("load-request-error",I=>{let b=Jt(i.options.labelFileLoadError)(I);if(I.code>=400&&I.code<500){e("DID_THROW_ITEM_INVALID",{id:m,error:I,status:{main:b,sub:`${I.code} (${I.body})`}}),r({error:I,file:he(c)});return}e("DID_THROW_ITEM_LOAD_ERROR",{id:m,error:I,status:{main:b,sub:i.options.labelTapToRetry}})}),c.on("load-file-error",I=>{e("DID_THROW_ITEM_INVALID",{id:m,error:I.status,status:I.status}),r({error:I.status,file:he(c)})}),c.on("load-abort",()=>{e("REMOVE_ITEM",{query:m})}),c.on("load-skip",()=>{c.on("metadata-update",I=>{et(c.file)&&e("DID_UPDATE_ITEM_METADATA",{id:m,change:I})}),e("COMPLETE_LOAD_ITEM",{query:m,item:c,data:{source:a,success:o}})}),c.on("load",()=>{let I=b=>{if(!b){e("REMOVE_ITEM",{query:m});return}c.on("metadata-update",E=>{e("DID_UPDATE_ITEM_METADATA",{id:m,change:E})}),Ae("SHOULD_PREPARE_OUTPUT",!1,{item:c,query:t}).then(E=>{let v=t("GET_BEFORE_PREPARE_FILE");v&&(E=v(c,E));let y=()=>{e("COMPLETE_LOAD_ITEM",{query:m,item:c,data:{source:a,success:o}}),wi(e,i)};if(E){e("REQUEST_PREPARE_OUTPUT",{query:m,item:c,success:T=>{e("DID_PREPARE_OUTPUT",{id:m,file:T}),y()}},!0);return}y()})};Ae("DID_LOAD_ITEM",c,{query:t,dispatch:e}).then(()=>{$a(t("GET_BEFORE_ADD_FILE"),he(c)).then(I)}).catch(b=>{if(!b||!b.error||!b.status)return I(!1);e("DID_THROW_ITEM_INVALID",{id:m,error:b.error,status:b.status})})}),c.on("process-start",()=>{e("DID_START_ITEM_PROCESSING",{id:m})}),c.on("process-progress",I=>{e("DID_UPDATE_ITEM_PROCESS_PROGRESS",{id:m,progress:I})}),c.on("process-error",I=>{e("DID_THROW_ITEM_PROCESSING_ERROR",{id:m,error:I,status:{main:Jt(i.options.labelFileProcessingError)(I),sub:i.options.labelTapToRetry}})}),c.on("process-revert-error",I=>{e("DID_THROW_ITEM_PROCESSING_REVERT_ERROR",{id:m,error:I,status:{main:Jt(i.options.labelFileProcessingRevertError)(I),sub:i.options.labelTapToRetry}})}),c.on("process-complete",I=>{e("DID_COMPLETE_ITEM_PROCESSING",{id:m,error:null,serverFileReference:I}),e("DID_DEFINE_VALUE",{id:m,value:I})}),c.on("process-abort",()=>{e("DID_ABORT_ITEM_PROCESSING",{id:m})}),c.on("process-revert",()=>{e("DID_REVERT_ITEM_PROCESSING",{id:m}),e("DID_DEFINE_VALUE",{id:m,value:null})}),e("DID_ADD_ITEM",{id:m,index:n,interactionMethod:l}),wi(e,i);let{url:u,load:g,restore:f,fetch:h}=i.options.server||{};c.load(a,Gs(p===re.INPUT?ge(a)&&Ks(a)&&h?_i(u,h):Ya:p===re.LIMBO?_i(u,f):_i(u,g)),(I,b,E)=>{Ae("LOAD_FILE",I,{query:t}).then(b).catch(E)})},REQUEST_PREPARE_OUTPUT:({item:a,success:n,failure:l=()=>{}})=>{let o={error:ae("error",0,"Item not found"),file:null};if(a.archived)return l(o);Ae("PREPARE_OUTPUT",a.file,{query:t,item:a}).then(r=>{Ae("COMPLETE_PREPARE_OUTPUT",r,{query:t,item:a}).then(s=>{if(a.archived)return l(o);n(s)})})},COMPLETE_LOAD_ITEM:({item:a,data:n})=>{let{success:l,source:o}=n,r=t("GET_ITEM_INSERT_LOCATION");if(Ke(r)&&o&&Li(i,r),e("DID_LOAD_ITEM",{id:a.id,error:null,serverFileReference:a.origin===re.INPUT?null:o}),l(he(a)),a.origin===re.LOCAL){e("DID_LOAD_LOCAL_ITEM",{id:a.id});return}if(a.origin===re.LIMBO){e("DID_COMPLETE_ITEM_PROCESSING",{id:a.id,error:null,serverFileReference:o}),e("DID_DEFINE_VALUE",{id:a.id,value:a.serverId||o});return}t("IS_ASYNC")&&i.options.instantUpload&&e("REQUEST_ITEM_PROCESSING",{query:a.id})},RETRY_ITEM_LOAD:ye(i,a=>{a.retryLoad()}),REQUEST_ITEM_PREPARE:ye(i,(a,n,l)=>{e("REQUEST_PREPARE_OUTPUT",{query:a.id,item:a,success:o=>{e("DID_PREPARE_OUTPUT",{id:a.id,file:o}),n({file:a,output:o})},failure:l},!0)}),REQUEST_ITEM_PROCESSING:ye(i,(a,n,l)=>{if(!(a.status===H.IDLE||a.status===H.PROCESSING_ERROR)){let r=()=>e("REQUEST_ITEM_PROCESSING",{query:a,success:n,failure:l}),s=()=>document.hidden?r():setTimeout(r,32);a.status===H.PROCESSING_COMPLETE||a.status===H.PROCESSING_REVERT_ERROR?a.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(s).catch(()=>{}):a.status===H.PROCESSING&&a.abortProcessing().then(s);return}a.status!==H.PROCESSING_QUEUED&&(a.requestProcessing(),e("DID_REQUEST_ITEM_PROCESSING",{id:a.id}),e("PROCESS_ITEM",{query:a,success:n,failure:l},!0))}),PROCESS_ITEM:ye(i,(a,n,l)=>{let o=t("GET_MAX_PARALLEL_UPLOADS");if(t("GET_ITEMS_BY_STATUS",H.PROCESSING).length===o){i.processingQueue.push({id:a.id,success:n,failure:l});return}if(a.status===H.PROCESSING)return;let s=()=>{let c=i.processingQueue.shift();if(!c)return;let{id:d,success:m,failure:u}=c,g=Ze(i.items,d);if(!g||g.archived){s();return}e("PROCESS_ITEM",{query:d,success:m,failure:u},!0)};a.onOnce("process-complete",()=>{n(he(a)),s();let c=i.options.server;if(i.options.instantUpload&&a.origin===re.LOCAL&&Ke(c.remove)){let u=()=>{};a.origin=re.LIMBO,i.options.server.remove(a.source,u,u)}t("GET_ITEMS_BY_STATUS",H.PROCESSING_COMPLETE).length===i.items.length&&e("DID_COMPLETE_ITEM_PROCESSING_ALL")}),a.onOnce("process-error",c=>{l({error:c,file:he(a)}),s()});let p=i.options;a.process(Ys(Ws(p.server.url,p.server.process,p.name,{chunkTransferId:a.transferId,chunkServer:p.server.patch,chunkUploads:p.chunkUploads,chunkForce:p.chunkForce,chunkSize:p.chunkSize,chunkRetryDelays:p.chunkRetryDelays}),{allowMinimumUploadDuration:t("GET_ALLOW_MINIMUM_UPLOAD_DURATION")}),(c,d,m)=>{Ae("PREPARE_OUTPUT",c,{query:t,item:a}).then(u=>{e("DID_PREPARE_OUTPUT",{id:a.id,file:u}),d(u)}).catch(m)})}),RETRY_ITEM_PROCESSING:ye(i,a=>{e("REQUEST_ITEM_PROCESSING",{query:a})}),REQUEST_REMOVE_ITEM:ye(i,a=>{$a(t("GET_BEFORE_REMOVE_FILE"),he(a)).then(n=>{n&&e("REMOVE_ITEM",{query:a})})}),RELEASE_ITEM:ye(i,a=>{a.release()}),REMOVE_ITEM:ye(i,(a,n,l,o)=>{let r=()=>{let p=a.id;ja(i.items,p).archive(),e("DID_REMOVE_ITEM",{error:null,id:p,item:a}),wi(e,i),n(he(a))},s=i.options.server;a.origin===re.LOCAL&&s&&Ke(s.remove)&&o.remove!==!1?(e("DID_START_ITEM_REMOVE",{id:a.id}),s.remove(a.source,()=>r(),p=>{e("DID_THROW_ITEM_REMOVE_ERROR",{id:a.id,error:ae("error",0,p,null),status:{main:Jt(i.options.labelFileRemoveError)(p),sub:i.options.labelTapToRetry}})})):((o.revert&&a.origin!==re.LOCAL&&a.serverId!==null||i.options.chunkUploads&&a.file.size>i.options.chunkSize||i.options.chunkUploads&&i.options.chunkForce)&&a.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")),r())}),ABORT_ITEM_LOAD:ye(i,a=>{a.abortLoad()}),ABORT_ITEM_PROCESSING:ye(i,a=>{if(a.serverId){e("REVERT_ITEM_PROCESSING",{id:a.id});return}a.abortProcessing().then(()=>{i.options.instantUpload&&e("REMOVE_ITEM",{query:a.id})})}),REQUEST_REVERT_ITEM_PROCESSING:ye(i,a=>{if(!i.options.instantUpload){e("REVERT_ITEM_PROCESSING",{query:a});return}let n=r=>{r&&e("REVERT_ITEM_PROCESSING",{query:a})},l=t("GET_BEFORE_REMOVE_FILE");if(!l)return n(!0);let o=l(he(a));if(o==null)return n(!0);if(typeof o=="boolean")return n(o);typeof o.then=="function"&&o.then(n)}),REVERT_ITEM_PROCESSING:ye(i,a=>{a.revert(Pt(i.options.server.url,i.options.server.revert),t("GET_FORCE_REVERT")).then(()=>{(i.options.instantUpload||Zs(a))&&e("REMOVE_ITEM",{query:a.id})}).catch(()=>{})}),SET_OPTIONS:({options:a})=>{let n=Object.keys(a),l=Js.filter(r=>n.includes(r));[...l,...Object.keys(a).filter(r=>!l.includes(r))].forEach(r=>{e(`SET_${pi(r,"_").toUpperCase()}`,{value:a[r]})})}}),Js=["server"],Ki=e=>e,Ge=e=>document.createElement(e),ne=(e,t)=>{let i=e.childNodes[0];i?t!==i.nodeValue&&(i.nodeValue=t):(i=document.createTextNode(t),e.appendChild(i))},Xa=(e,t,i,a)=>{let n=(a%360-90)*Math.PI/180;return{x:e+i*Math.cos(n),y:t+i*Math.sin(n)}},ec=(e,t,i,a,n,l)=>{let o=Xa(e,t,i,n),r=Xa(e,t,i,a);return["M",o.x,o.y,"A",i,i,0,l,0,r.x,r.y].join(" ")},tc=(e,t,i,a,n)=>{let l=1;return n>a&&n-a<=.5&&(l=0),a>n&&a-n>=.5&&(l=0),ec(e,t,i,Math.min(.9999,a)*360,Math.min(.9999,n)*360,l)},ic=({root:e,props:t})=>{t.spin=!1,t.progress=0,t.opacity=0;let i=li("svg");e.ref.path=li("path",{"stroke-width":2,"stroke-linecap":"round"}),i.appendChild(e.ref.path),e.ref.svg=i,e.appendChild(i)},ac=({root:e,props:t})=>{if(t.opacity===0)return;t.align&&(e.element.dataset.align=t.align);let i=parseInt(se(e.ref.path,"stroke-width"),10),a=e.rect.element.width*.5,n=0,l=0;t.spin?(n=0,l=.5):(n=0,l=t.progress);let o=tc(a,a,a-i,n,l);se(e.ref.path,"d",o),se(e.ref.path,"stroke-opacity",t.spin||t.progress>0?1:0)},Ka=le({tag:"div",name:"progress-indicator",ignoreRectUpdate:!0,ignoreRect:!0,create:ic,write:ac,mixins:{apis:["progress","spin","align"],styles:["opacity"],animations:{opacity:{type:"tween",duration:500},progress:{type:"spring",stiffness:.95,damping:.65,mass:10}}}}),nc=({root:e,props:t})=>{e.element.innerHTML=(t.icon||"")+`${t.label}`,t.isDisabled=!1},lc=({root:e,props:t})=>{let{isDisabled:i}=t,a=e.query("GET_DISABLED")||t.opacity===0;a&&!i?(t.isDisabled=!0,se(e.element,"disabled","disabled")):!a&&i&&(t.isDisabled=!1,e.element.removeAttribute("disabled"))},Cn=le({tag:"button",attributes:{type:"button"},ignoreRect:!0,ignoreRectUpdate:!0,name:"file-action-button",mixins:{apis:["label"],styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}},listeners:!0},create:nc,write:lc}),Bn=(e,t=".",i=1e3,a={})=>{let{labelBytes:n="bytes",labelKilobytes:l="KB",labelMegabytes:o="MB",labelGigabytes:r="GB"}=a;e=Math.round(Math.abs(e));let s=i,p=i*i,c=i*i*i;return ee.toFixed(t).split(".").filter(a=>a!=="0").join(i),oc=({root:e,props:t})=>{let i=Ge("span");i.className="filepond--file-info-main",se(i,"aria-hidden","true"),e.appendChild(i),e.ref.fileName=i;let a=Ge("span");a.className="filepond--file-info-sub",e.appendChild(a),e.ref.fileSize=a,ne(a,e.query("GET_LABEL_FILE_WAITING_FOR_SIZE")),ne(i,Ki(e.query("GET_ITEM_NAME",t.id)))},Oi=({root:e,props:t})=>{ne(e.ref.fileSize,Bn(e.query("GET_ITEM_SIZE",t.id),".",e.query("GET_FILE_SIZE_BASE"),e.query("GET_FILE_SIZE_LABELS",e.query))),ne(e.ref.fileName,Ki(e.query("GET_ITEM_NAME",t.id)))},Qa=({root:e,props:t})=>{if(Et(e.query("GET_ITEM_SIZE",t.id))){Oi({root:e,props:t});return}ne(e.ref.fileSize,e.query("GET_LABEL_FILE_SIZE_NOT_AVAILABLE"))},rc=le({name:"file-info",ignoreRect:!0,ignoreRectUpdate:!0,write:fe({DID_LOAD_ITEM:Oi,DID_UPDATE_ITEM_META:Oi,DID_THROW_ITEM_LOAD_ERROR:Qa,DID_THROW_ITEM_INVALID:Qa}),didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},create:oc,mixins:{styles:["translateX","translateY"],animations:{translateX:"spring",translateY:"spring"}}}),kn=e=>Math.round(e*100),sc=({root:e})=>{let t=Ge("span");t.className="filepond--file-status-main",e.appendChild(t),e.ref.main=t;let i=Ge("span");i.className="filepond--file-status-sub",e.appendChild(i),e.ref.sub=i,Nn({root:e,action:{progress:null}})},Nn=({root:e,action:t})=>{let i=t.progress===null?e.query("GET_LABEL_FILE_LOADING"):`${e.query("GET_LABEL_FILE_LOADING")} ${kn(t.progress)}%`;ne(e.ref.main,i),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},cc=({root:e,action:t})=>{let i=t.progress===null?e.query("GET_LABEL_FILE_PROCESSING"):`${e.query("GET_LABEL_FILE_PROCESSING")} ${kn(t.progress)}%`;ne(e.ref.main,i),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},dc=({root:e})=>{ne(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING")),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_CANCEL"))},pc=({root:e})=>{ne(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING_ABORTED")),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_RETRY"))},mc=({root:e})=>{ne(e.ref.main,e.query("GET_LABEL_FILE_PROCESSING_COMPLETE")),ne(e.ref.sub,e.query("GET_LABEL_TAP_TO_UNDO"))},Ja=({root:e})=>{ne(e.ref.main,""),ne(e.ref.sub,"")},Ft=({root:e,action:t})=>{ne(e.ref.main,t.status.main),ne(e.ref.sub,t.status.sub)},uc=le({name:"file-status",ignoreRect:!0,ignoreRectUpdate:!0,write:fe({DID_LOAD_ITEM:Ja,DID_REVERT_ITEM_PROCESSING:Ja,DID_REQUEST_ITEM_PROCESSING:dc,DID_ABORT_ITEM_PROCESSING:pc,DID_COMPLETE_ITEM_PROCESSING:mc,DID_UPDATE_ITEM_PROCESS_PROGRESS:cc,DID_UPDATE_ITEM_LOAD_PROGRESS:Nn,DID_THROW_ITEM_LOAD_ERROR:Ft,DID_THROW_ITEM_INVALID:Ft,DID_THROW_ITEM_PROCESSING_ERROR:Ft,DID_THROW_ITEM_PROCESSING_REVERT_ERROR:Ft,DID_THROW_ITEM_REMOVE_ERROR:Ft}),didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},create:sc,mixins:{styles:["translateX","translateY","opacity"],animations:{opacity:{type:"tween",duration:250},translateX:"spring",translateY:"spring"}}}),Di={AbortItemLoad:{label:"GET_LABEL_BUTTON_ABORT_ITEM_LOAD",action:"ABORT_ITEM_LOAD",className:"filepond--action-abort-item-load",align:"LOAD_INDICATOR_POSITION"},RetryItemLoad:{label:"GET_LABEL_BUTTON_RETRY_ITEM_LOAD",action:"RETRY_ITEM_LOAD",icon:"GET_ICON_RETRY",className:"filepond--action-retry-item-load",align:"BUTTON_PROCESS_ITEM_POSITION"},RemoveItem:{label:"GET_LABEL_BUTTON_REMOVE_ITEM",action:"REQUEST_REMOVE_ITEM",icon:"GET_ICON_REMOVE",className:"filepond--action-remove-item",align:"BUTTON_REMOVE_ITEM_POSITION"},ProcessItem:{label:"GET_LABEL_BUTTON_PROCESS_ITEM",action:"REQUEST_ITEM_PROCESSING",icon:"GET_ICON_PROCESS",className:"filepond--action-process-item",align:"BUTTON_PROCESS_ITEM_POSITION"},AbortItemProcessing:{label:"GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING",action:"ABORT_ITEM_PROCESSING",className:"filepond--action-abort-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"},RetryItemProcessing:{label:"GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING",action:"RETRY_ITEM_PROCESSING",icon:"GET_ICON_RETRY",className:"filepond--action-retry-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"},RevertItemProcessing:{label:"GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING",action:"REQUEST_REVERT_ITEM_PROCESSING",icon:"GET_ICON_UNDO",className:"filepond--action-revert-item-processing",align:"BUTTON_PROCESS_ITEM_POSITION"}},Ci=[];te(Di,e=>{Ci.push(e)});var Ie=e=>{if(Bi(e)==="right")return 0;let t=e.ref.buttonRemoveItem.rect.element;return t.hidden?null:t.width+t.left},gc=e=>e.ref.buttonAbortItemLoad.rect.element.width,ei=e=>Math.floor(e.ref.buttonRemoveItem.rect.element.height/4),fc=e=>Math.floor(e.ref.buttonRemoveItem.rect.element.left/2),hc=e=>e.query("GET_STYLE_LOAD_INDICATOR_POSITION"),bc=e=>e.query("GET_STYLE_PROGRESS_INDICATOR_POSITION"),Bi=e=>e.query("GET_STYLE_BUTTON_REMOVE_ITEM_POSITION"),Ec={buttonAbortItemLoad:{opacity:0},buttonRetryItemLoad:{opacity:0},buttonRemoveItem:{opacity:0},buttonProcessItem:{opacity:0},buttonAbortItemProcessing:{opacity:0},buttonRetryItemProcessing:{opacity:0},buttonRevertItemProcessing:{opacity:0},loadProgressIndicator:{opacity:0,align:hc},processProgressIndicator:{opacity:0,align:bc},processingCompleteIndicator:{opacity:0,scaleX:.75,scaleY:.75},info:{translateX:0,translateY:0,opacity:0},status:{translateX:0,translateY:0,opacity:0}},en={buttonRemoveItem:{opacity:1},buttonProcessItem:{opacity:1},info:{translateX:Ie},status:{translateX:Ie}},Mi={buttonAbortItemProcessing:{opacity:1},processProgressIndicator:{opacity:1},status:{opacity:1}},ut={DID_THROW_ITEM_INVALID:{buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{translateX:Ie,opacity:1}},DID_START_ITEM_LOAD:{buttonAbortItemLoad:{opacity:1},loadProgressIndicator:{opacity:1},status:{opacity:1}},DID_THROW_ITEM_LOAD_ERROR:{buttonRetryItemLoad:{opacity:1},buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{opacity:1}},DID_START_ITEM_REMOVE:{processProgressIndicator:{opacity:1,align:Bi},info:{translateX:Ie},status:{opacity:0}},DID_THROW_ITEM_REMOVE_ERROR:{processProgressIndicator:{opacity:0,align:Bi},buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{opacity:1,translateX:Ie}},DID_LOAD_ITEM:en,DID_LOAD_LOCAL_ITEM:{buttonRemoveItem:{opacity:1},info:{translateX:Ie},status:{translateX:Ie}},DID_START_ITEM_PROCESSING:Mi,DID_REQUEST_ITEM_PROCESSING:Mi,DID_UPDATE_ITEM_PROCESS_PROGRESS:Mi,DID_COMPLETE_ITEM_PROCESSING:{buttonRevertItemProcessing:{opacity:1},info:{opacity:1},status:{opacity:1}},DID_THROW_ITEM_PROCESSING_ERROR:{buttonRemoveItem:{opacity:1},buttonRetryItemProcessing:{opacity:1},status:{opacity:1},info:{translateX:Ie}},DID_THROW_ITEM_PROCESSING_REVERT_ERROR:{buttonRevertItemProcessing:{opacity:1},status:{opacity:1},info:{opacity:1}},DID_ABORT_ITEM_PROCESSING:{buttonRemoveItem:{opacity:1},buttonProcessItem:{opacity:1},info:{translateX:Ie},status:{opacity:1}},DID_REVERT_ITEM_PROCESSING:en},Tc=le({create:({root:e})=>{e.element.innerHTML=e.query("GET_ICON_DONE")},name:"processing-complete-indicator",ignoreRect:!0,mixins:{styles:["scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",opacity:{type:"tween",duration:250}}}}),Ic=({root:e,props:t})=>{let i=Object.keys(Di).reduce((g,f)=>(g[f]={...Di[f]},g),{}),{id:a}=t,n=e.query("GET_ALLOW_REVERT"),l=e.query("GET_ALLOW_REMOVE"),o=e.query("GET_ALLOW_PROCESS"),r=e.query("GET_INSTANT_UPLOAD"),s=e.query("IS_ASYNC"),p=e.query("GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN"),c;s?o&&!n?c=g=>!/RevertItemProcessing/.test(g):!o&&n?c=g=>!/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(g):!o&&!n&&(c=g=>!/Process/.test(g)):c=g=>!/Process/.test(g);let d=c?Ci.filter(c):Ci.concat();if(r&&n&&(i.RevertItemProcessing.label="GET_LABEL_BUTTON_REMOVE_ITEM",i.RevertItemProcessing.icon="GET_ICON_REMOVE"),s&&!n){let g=ut.DID_COMPLETE_ITEM_PROCESSING;g.info.translateX=fc,g.info.translateY=ei,g.status.translateY=ei,g.processingCompleteIndicator={opacity:1,scaleX:1,scaleY:1}}if(s&&!o&&(["DID_START_ITEM_PROCESSING","DID_REQUEST_ITEM_PROCESSING","DID_UPDATE_ITEM_PROCESS_PROGRESS","DID_THROW_ITEM_PROCESSING_ERROR"].forEach(g=>{ut[g].status.translateY=ei}),ut.DID_THROW_ITEM_PROCESSING_ERROR.status.translateX=gc),p&&n){i.RevertItemProcessing.align="BUTTON_REMOVE_ITEM_POSITION";let g=ut.DID_COMPLETE_ITEM_PROCESSING;g.info.translateX=Ie,g.status.translateY=ei,g.processingCompleteIndicator={opacity:1,scaleX:1,scaleY:1}}l||(i.RemoveItem.disabled=!0),te(i,(g,f)=>{let h=e.createChildView(Cn,{label:e.query(f.label),icon:e.query(f.icon),opacity:0});d.includes(g)&&e.appendChildView(h),f.disabled&&(h.element.setAttribute("disabled","disabled"),h.element.setAttribute("hidden","hidden")),h.element.dataset.align=e.query(`GET_STYLE_${f.align}`),h.element.classList.add(f.className),h.on("click",I=>{I.stopPropagation(),!f.disabled&&e.dispatch(f.action,{query:a})}),e.ref[`button${g}`]=h}),e.ref.processingCompleteIndicator=e.appendChildView(e.createChildView(Tc)),e.ref.processingCompleteIndicator.element.dataset.align=e.query("GET_STYLE_BUTTON_PROCESS_ITEM_POSITION"),e.ref.info=e.appendChildView(e.createChildView(rc,{id:a})),e.ref.status=e.appendChildView(e.createChildView(uc,{id:a}));let m=e.appendChildView(e.createChildView(Ka,{opacity:0,align:e.query("GET_STYLE_LOAD_INDICATOR_POSITION")}));m.element.classList.add("filepond--load-indicator"),e.ref.loadProgressIndicator=m;let u=e.appendChildView(e.createChildView(Ka,{opacity:0,align:e.query("GET_STYLE_PROGRESS_INDICATOR_POSITION")}));u.element.classList.add("filepond--process-indicator"),e.ref.processProgressIndicator=u,e.ref.activeStyles=[]},vc=({root:e,actions:t,props:i})=>{xc({root:e,actions:t,props:i});let a=t.concat().filter(n=>/^DID_/.test(n.type)).reverse().find(n=>ut[n.type]);if(a){e.ref.activeStyles=[];let n=ut[a.type];te(Ec,(l,o)=>{let r=e.ref[l];te(o,(s,p)=>{let c=n[l]&&typeof n[l][s]<"u"?n[l][s]:p;e.ref.activeStyles.push({control:r,key:s,value:c})})})}e.ref.activeStyles.forEach(({control:n,key:l,value:o})=>{n[l]=typeof o=="function"?o(e):o})},xc=fe({DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING:({root:e,action:t})=>{e.ref.buttonAbortItemProcessing.label=t.value},DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD:({root:e,action:t})=>{e.ref.buttonAbortItemLoad.label=t.value},DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL:({root:e,action:t})=>{e.ref.buttonAbortItemRemoval.label=t.value},DID_REQUEST_ITEM_PROCESSING:({root:e})=>{e.ref.processProgressIndicator.spin=!0,e.ref.processProgressIndicator.progress=0},DID_START_ITEM_LOAD:({root:e})=>{e.ref.loadProgressIndicator.spin=!0,e.ref.loadProgressIndicator.progress=0},DID_START_ITEM_REMOVE:({root:e})=>{e.ref.processProgressIndicator.spin=!0,e.ref.processProgressIndicator.progress=0},DID_UPDATE_ITEM_LOAD_PROGRESS:({root:e,action:t})=>{e.ref.loadProgressIndicator.spin=!1,e.ref.loadProgressIndicator.progress=t.progress},DID_UPDATE_ITEM_PROCESS_PROGRESS:({root:e,action:t})=>{e.ref.processProgressIndicator.spin=!1,e.ref.processProgressIndicator.progress=t.progress}}),yc=le({create:Ic,write:vc,didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},name:"file"}),Rc=({root:e,props:t})=>{e.ref.fileName=Ge("legend"),e.appendChild(e.ref.fileName),e.ref.file=e.appendChildView(e.createChildView(yc,{id:t.id})),e.ref.data=!1},Sc=({root:e,props:t})=>{ne(e.ref.fileName,Ki(e.query("GET_ITEM_NAME",t.id)))},_c=le({create:Rc,ignoreRect:!0,write:fe({DID_LOAD_ITEM:Sc}),didCreateView:e=>{it("CREATE_VIEW",{...e,view:e})},tag:"fieldset",name:"file-wrapper"}),tn={type:"spring",damping:.6,mass:7},wc=({root:e,props:t})=>{[{name:"top"},{name:"center",props:{translateY:null,scaleY:null},mixins:{animations:{scaleY:tn},styles:["translateY","scaleY"]}},{name:"bottom",props:{translateY:null},mixins:{animations:{translateY:tn},styles:["translateY"]}}].forEach(i=>{Lc(e,i,t.name)}),e.element.classList.add(`filepond--${t.name}`),e.ref.scalable=null},Lc=(e,t,i)=>{let a=le({name:`panel-${t.name} filepond--${i}`,mixins:t.mixins,ignoreRectUpdate:!0}),n=e.createChildView(a,t.props);e.ref[t.name]=e.appendChildView(n)},Mc=({root:e,props:t})=>{if((e.ref.scalable===null||t.scalable!==e.ref.scalable)&&(e.ref.scalable=In(t.scalable)?t.scalable:!0,e.element.dataset.scalable=e.ref.scalable),!t.height)return;let i=e.ref.top.rect.element,a=e.ref.bottom.rect.element,n=Math.max(i.height+a.height,t.height);e.ref.center.translateY=i.height,e.ref.center.scaleY=(n-i.height-a.height)/100,e.ref.bottom.translateY=n-a.height},Vn=le({name:"panel",read:({root:e,props:t})=>t.heightCurrent=e.ref.bottom.translateY,write:Mc,create:wc,ignoreRect:!0,mixins:{apis:["height","heightCurrent","scalable"]}}),Ac=e=>{let t=e.map(a=>a.id),i;return{setIndex:a=>{i=a},getIndex:()=>i,getItemIndex:a=>t.indexOf(a.id)}},an={type:"spring",stiffness:.75,damping:.45,mass:10},nn="spring",ln={DID_START_ITEM_LOAD:"busy",DID_UPDATE_ITEM_LOAD_PROGRESS:"loading",DID_THROW_ITEM_INVALID:"load-invalid",DID_THROW_ITEM_LOAD_ERROR:"load-error",DID_LOAD_ITEM:"idle",DID_THROW_ITEM_REMOVE_ERROR:"remove-error",DID_START_ITEM_REMOVE:"busy",DID_START_ITEM_PROCESSING:"busy processing",DID_REQUEST_ITEM_PROCESSING:"busy processing",DID_UPDATE_ITEM_PROCESS_PROGRESS:"processing",DID_COMPLETE_ITEM_PROCESSING:"processing-complete",DID_THROW_ITEM_PROCESSING_ERROR:"processing-error",DID_THROW_ITEM_PROCESSING_REVERT_ERROR:"processing-revert-error",DID_ABORT_ITEM_PROCESSING:"cancelled",DID_REVERT_ITEM_PROCESSING:"idle"},zc=({root:e,props:t})=>{if(e.ref.handleClick=a=>e.dispatch("DID_ACTIVATE_ITEM",{id:t.id}),e.element.id=`filepond--item-${t.id}`,e.element.addEventListener("click",e.ref.handleClick),e.ref.container=e.appendChildView(e.createChildView(_c,{id:t.id})),e.ref.panel=e.appendChildView(e.createChildView(Vn,{name:"item-panel"})),e.ref.panel.height=null,t.markedForRemoval=!1,!e.query("GET_ALLOW_REORDER"))return;e.element.dataset.dragState="idle";let i=a=>{if(!a.isPrimary)return;let n=!1,l={x:a.pageX,y:a.pageY};t.dragOrigin={x:e.translateX,y:e.translateY},t.dragCenter={x:a.offsetX,y:a.offsetY};let o=Ac(e.query("GET_ACTIVE_ITEMS"));e.dispatch("DID_GRAB_ITEM",{id:t.id,dragState:o});let r=d=>{if(!d.isPrimary)return;d.stopPropagation(),d.preventDefault(),t.dragOffset={x:d.pageX-l.x,y:d.pageY-l.y},t.dragOffset.x*t.dragOffset.x+t.dragOffset.y*t.dragOffset.y>16&&!n&&(n=!0,e.element.removeEventListener("click",e.ref.handleClick)),e.dispatch("DID_DRAG_ITEM",{id:t.id,dragState:o})},s=d=>{d.isPrimary&&(t.dragOffset={x:d.pageX-l.x,y:d.pageY-l.y},c())},p=()=>{c()},c=()=>{document.removeEventListener("pointercancel",p),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",s),e.dispatch("DID_DROP_ITEM",{id:t.id,dragState:o}),n&&setTimeout(()=>e.element.addEventListener("click",e.ref.handleClick),0)};document.addEventListener("pointercancel",p),document.addEventListener("pointermove",r),document.addEventListener("pointerup",s)};e.element.addEventListener("pointerdown",i)},Pc=fe({DID_UPDATE_PANEL_HEIGHT:({root:e,action:t})=>{e.height=t.height}}),Fc=fe({DID_GRAB_ITEM:({root:e,props:t})=>{t.dragOrigin={x:e.translateX,y:e.translateY}},DID_DRAG_ITEM:({root:e})=>{e.element.dataset.dragState="drag"},DID_DROP_ITEM:({root:e,props:t})=>{t.dragOffset=null,t.dragOrigin=null,e.element.dataset.dragState="drop"}},({root:e,actions:t,props:i,shouldOptimize:a})=>{e.element.dataset.dragState==="drop"&&e.scaleX<=1&&(e.element.dataset.dragState="idle");let n=t.concat().filter(o=>/^DID_/.test(o.type)).reverse().find(o=>ln[o.type]);n&&n.type!==i.currentState&&(i.currentState=n.type,e.element.dataset.filepondItemState=ln[i.currentState]||"");let l=e.query("GET_ITEM_PANEL_ASPECT_RATIO")||e.query("GET_PANEL_ASPECT_RATIO");l?a||(e.height=e.rect.element.width*l):(Pc({root:e,actions:t,props:i}),!e.height&&e.ref.container.rect.element.height>0&&(e.height=e.ref.container.rect.element.height)),a&&(e.ref.panel.height=null),e.ref.panel.height=e.height}),Oc=le({create:zc,write:Fc,destroy:({root:e,props:t})=>{e.element.removeEventListener("click",e.ref.handleClick),e.dispatch("RELEASE_ITEM",{query:t.id})},tag:"li",name:"item",mixins:{apis:["id","interactionMethod","markedForRemoval","spawnDate","dragCenter","dragOrigin","dragOffset"],styles:["translateX","translateY","scaleX","scaleY","opacity","height"],animations:{scaleX:nn,scaleY:nn,translateX:an,translateY:an,opacity:{type:"tween",duration:150}}}}),Zi=(e,t)=>Math.max(1,Math.floor((e+1)/t)),Qi=(e,t,i)=>{if(!i)return;let a=e.rect.element.width,n=t.length,l=null;if(n===0||i.topb){if(i.left{se(e.element,"role","list"),e.ref.lastItemSpanwDate=Date.now()},Cc=({root:e,action:t})=>{let{id:i,index:a,interactionMethod:n}=t;e.ref.addIndex=a;let l=Date.now(),o=l,r=1;if(n!==Re.NONE){r=0;let s=e.query("GET_ITEM_INSERT_INTERVAL"),p=l-e.ref.lastItemSpanwDate;o=p{e.dragOffset?(e.translateX=null,e.translateY=null,e.translateX=e.dragOrigin.x+e.dragOffset.x,e.translateY=e.dragOrigin.y+e.dragOffset.y,e.scaleX=1.025,e.scaleY=1.025):(e.translateX=t,e.translateY=i,Date.now()>e.spawnDate&&(e.opacity===0&&Bc(e,t,i,a,n),e.scaleX=1,e.scaleY=1,e.opacity=1))},Bc=(e,t,i,a,n)=>{e.interactionMethod===Re.NONE?(e.translateX=null,e.translateX=t,e.translateY=null,e.translateY=i):e.interactionMethod===Re.DROP?(e.translateX=null,e.translateX=t-a*20,e.translateY=null,e.translateY=i-n*10,e.scaleX=.8,e.scaleY=.8):e.interactionMethod===Re.BROWSE?(e.translateY=null,e.translateY=i-30):e.interactionMethod===Re.API&&(e.translateX=null,e.translateX=t-30,e.translateY=null)},kc=({root:e,action:t})=>{let{id:i}=t,a=e.childViews.find(n=>n.id===i);a&&(a.scaleX=.9,a.scaleY=.9,a.opacity=0,a.markedForRemoval=!0)},Ai=e=>e.rect.element.height+e.rect.element.marginBottom+e.rect.element.marginTop,Nc=e=>e.rect.element.width+e.rect.element.marginLeft*.5+e.rect.element.marginRight*.5,Vc=({root:e,action:t})=>{let{id:i,dragState:a}=t,n=e.query("GET_ITEM",{id:i}),l=e.childViews.find(h=>h.id===i),o=e.childViews.length,r=a.getItemIndex(n);if(!l)return;let s={x:l.dragOrigin.x+l.dragOffset.x+l.dragCenter.x,y:l.dragOrigin.y+l.dragOffset.y+l.dragCenter.y},p=Ai(l),c=Nc(l),d=Math.floor(e.rect.outer.width/c);d>o&&(d=o);let m=Math.floor(o/d+1);ti.setHeight=p*m,ti.setWidth=c*d;var u={y:Math.floor(s.y/p),x:Math.floor(s.x/c),getGridIndex:function(){return s.y>ti.getHeight||s.y<0||s.x>ti.getWidth||s.x<0?r:this.y*d+this.x},getColIndex:function(){let I=e.query("GET_ACTIVE_ITEMS"),b=e.childViews.filter(z=>z.rect.element.height),E=I.map(z=>b.find(A=>A.id===z.id)),v=E.findIndex(z=>z===l),y=Ai(l),T=E.length,_=T,x=0,R=0,P=0;for(let z=0;zz){if(s.y1?u.getGridIndex():u.getColIndex();e.dispatch("MOVE_ITEM",{query:l,index:g});let f=a.getIndex();if(f===void 0||f!==g){if(a.setIndex(g),f===void 0)return;e.dispatch("DID_REORDER_ITEMS",{items:e.query("GET_ACTIVE_ITEMS"),origin:r,target:g})}},Gc=fe({DID_ADD_ITEM:Cc,DID_REMOVE_ITEM:kc,DID_DRAG_ITEM:Vc}),Uc=({root:e,props:t,actions:i,shouldOptimize:a})=>{Gc({root:e,props:t,actions:i});let{dragCoordinates:n}=t,l=e.rect.element.width,o=e.childViews.filter(E=>E.rect.element.height),r=e.query("GET_ACTIVE_ITEMS").map(E=>o.find(v=>v.id===E.id)).filter(E=>E),s=n?Qi(e,r,n):null,p=e.ref.addIndex||null;e.ref.addIndex=null;let c=0,d=0,m=0;if(r.length===0)return;let u=r[0].rect.element,g=u.marginTop+u.marginBottom,f=u.marginLeft+u.marginRight,h=u.width+f,I=u.height+g,b=Zi(l,h);if(b===1){let E=0,v=0;r.forEach((y,T)=>{if(s){let R=T-s;R===-2?v=-g*.25:R===-1?v=-g*.75:R===0?v=g*.75:R===1?v=g*.25:v=0}a&&(y.translateX=null,y.translateY=null),y.markedForRemoval||on(y,0,E+v);let x=(y.rect.element.height+g)*(y.markedForRemoval?y.opacity:1);E+=x})}else{let E=0,v=0;r.forEach((y,T)=>{T===s&&(c=1),T===p&&(m+=1),y.markedForRemoval&&y.opacity<.5&&(d-=1);let _=T+m+c+d,x=_%b,R=Math.floor(_/b),P=x*h,z=R*I,A=Math.sign(P-E),B=Math.sign(z-v);E=P,v=z,!y.markedForRemoval&&(a&&(y.translateX=null,y.translateY=null),on(y,P,z,A,B))})}},Hc=(e,t)=>t.filter(i=>i.data&&i.data.id?e.id===i.data.id:!0),Wc=le({create:Dc,write:Uc,tag:"ul",name:"list",didWriteView:({root:e})=>{e.childViews.filter(t=>t.markedForRemoval&&t.opacity===0&&t.resting).forEach(t=>{t._destroy(),e.removeChildView(t)})},filterFrameActionsForChild:Hc,mixins:{apis:["dragCoordinates"]}}),jc=({root:e,props:t})=>{e.ref.list=e.appendChildView(e.createChildView(Wc)),t.dragCoordinates=null,t.overflowing=!1},Yc=({root:e,props:t,action:i})=>{e.query("GET_ITEM_INSERT_LOCATION_FREEDOM")&&(t.dragCoordinates={left:i.position.scopeLeft-e.ref.list.rect.element.left,top:i.position.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},qc=({props:e})=>{e.dragCoordinates=null},$c=fe({DID_DRAG:Yc,DID_END_DRAG:qc}),Xc=({root:e,props:t,actions:i})=>{if($c({root:e,props:t,actions:i}),e.ref.list.dragCoordinates=t.dragCoordinates,t.overflowing&&!t.overflow&&(t.overflowing=!1,e.element.dataset.state="",e.height=null),t.overflow){let a=Math.round(t.overflow);a!==e.height&&(t.overflowing=!0,e.element.dataset.state="overflow",e.height=a)}},Kc=le({create:jc,write:Xc,name:"list-scroller",mixins:{apis:["overflow","dragCoordinates"],styles:["height","translateY"],animations:{translateY:"spring"}}}),Pe=(e,t,i,a="")=>{i?se(e,t,a):e.removeAttribute(t)},Zc=e=>{if(!(!e||e.value==="")){try{e.value=""}catch{}if(e.value){let t=Ge("form"),i=e.parentNode,a=e.nextSibling;t.appendChild(e),t.reset(),a?i.insertBefore(e,a):i.appendChild(e)}}},Qc=({root:e,props:t})=>{e.element.id=`filepond--browser-${t.id}`,se(e.element,"name",e.query("GET_NAME")),se(e.element,"aria-controls",`filepond--assistant-${t.id}`),se(e.element,"aria-labelledby",`filepond--drop-label-${t.id}`),Gn({root:e,action:{value:e.query("GET_ACCEPTED_FILE_TYPES")}}),Un({root:e,action:{value:e.query("GET_ALLOW_MULTIPLE")}}),Hn({root:e,action:{value:e.query("GET_ALLOW_DIRECTORIES_ONLY")}}),ki({root:e}),Wn({root:e,action:{value:e.query("GET_REQUIRED")}}),jn({root:e,action:{value:e.query("GET_CAPTURE_METHOD")}}),e.ref.handleChange=i=>{if(!e.element.value)return;let a=Array.from(e.element.files).map(n=>(n._relativePath=n.webkitRelativePath,n));setTimeout(()=>{t.onload(a),Zc(e.element)},250)},e.element.addEventListener("change",e.ref.handleChange)},Gn=({root:e,action:t})=>{e.query("GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE")&&Pe(e.element,"accept",!!t.value,t.value?t.value.join(","):"")},Un=({root:e,action:t})=>{Pe(e.element,"multiple",t.value)},Hn=({root:e,action:t})=>{Pe(e.element,"webkitdirectory",t.value)},ki=({root:e})=>{let t=e.query("GET_DISABLED"),i=e.query("GET_ALLOW_BROWSE"),a=t||!i;Pe(e.element,"disabled",a)},Wn=({root:e,action:t})=>{t.value?e.query("GET_TOTAL_ITEMS")===0&&Pe(e.element,"required",!0):Pe(e.element,"required",!1)},jn=({root:e,action:t})=>{Pe(e.element,"capture",!!t.value,t.value===!0?"":t.value)},rn=({root:e})=>{let{element:t}=e;if(e.query("GET_TOTAL_ITEMS")>0){Pe(t,"required",!1),Pe(t,"name",!1);let i=e.query("GET_ACTIVE_ITEMS"),a=!1;for(let n=0;n{e.query("GET_CHECK_VALIDITY")&&e.element.setCustomValidity(e.query("GET_LABEL_INVALID_FIELD"))},ed=le({tag:"input",name:"browser",ignoreRect:!0,ignoreRectUpdate:!0,attributes:{type:"file"},create:Qc,destroy:({root:e})=>{e.element.removeEventListener("change",e.ref.handleChange)},write:fe({DID_LOAD_ITEM:rn,DID_REMOVE_ITEM:rn,DID_THROW_ITEM_INVALID:Jc,DID_SET_DISABLED:ki,DID_SET_ALLOW_BROWSE:ki,DID_SET_ALLOW_DIRECTORIES_ONLY:Hn,DID_SET_ALLOW_MULTIPLE:Un,DID_SET_ACCEPTED_FILE_TYPES:Gn,DID_SET_CAPTURE_METHOD:jn,DID_SET_REQUIRED:Wn})}),sn={ENTER:13,SPACE:32},td=({root:e,props:t})=>{let i=Ge("label");se(i,"for",`filepond--browser-${t.id}`),se(i,"id",`filepond--drop-label-${t.id}`),e.ref.handleKeyDown=a=>{(a.keyCode===sn.ENTER||a.keyCode===sn.SPACE)&&(a.preventDefault(),e.ref.label.click())},e.ref.handleClick=a=>{a.target===i||i.contains(a.target)||e.ref.label.click()},i.addEventListener("keydown",e.ref.handleKeyDown),e.element.addEventListener("click",e.ref.handleClick),Yn(i,t.caption),e.appendChild(i),e.ref.label=i},Yn=(e,t)=>{e.innerHTML=t;let i=e.querySelector(".filepond--label-action");return i&&se(i,"tabindex","0"),t},id=le({name:"drop-label",ignoreRect:!0,create:td,destroy:({root:e})=>{e.ref.label.addEventListener("keydown",e.ref.handleKeyDown),e.element.removeEventListener("click",e.ref.handleClick)},write:fe({DID_SET_LABEL_IDLE:({root:e,action:t})=>{Yn(e.ref.label,t.value)}}),mixins:{styles:["opacity","translateX","translateY"],animations:{opacity:{type:"tween",duration:150},translateX:"spring",translateY:"spring"}}}),ad=le({name:"drip-blob",ignoreRect:!0,mixins:{styles:["translateX","translateY","scaleX","scaleY","opacity"],animations:{scaleX:"spring",scaleY:"spring",translateX:"spring",translateY:"spring",opacity:{type:"tween",duration:250}}}}),nd=({root:e})=>{let t=e.rect.element.width*.5,i=e.rect.element.height*.5;e.ref.blob=e.appendChildView(e.createChildView(ad,{opacity:0,scaleX:2.5,scaleY:2.5,translateX:t,translateY:i}))},ld=({root:e,action:t})=>{if(!e.ref.blob){nd({root:e});return}e.ref.blob.translateX=t.position.scopeLeft,e.ref.blob.translateY=t.position.scopeTop,e.ref.blob.scaleX=1,e.ref.blob.scaleY=1,e.ref.blob.opacity=1},od=({root:e})=>{e.ref.blob&&(e.ref.blob.opacity=0)},rd=({root:e})=>{e.ref.blob&&(e.ref.blob.scaleX=2.5,e.ref.blob.scaleY=2.5,e.ref.blob.opacity=0)},sd=({root:e,props:t,actions:i})=>{cd({root:e,props:t,actions:i});let{blob:a}=e.ref;i.length===0&&a&&a.opacity===0&&(e.removeChildView(a),e.ref.blob=null)},cd=fe({DID_DRAG:ld,DID_DROP:rd,DID_END_DRAG:od}),dd=le({ignoreRect:!0,ignoreRectUpdate:!0,name:"drip",write:sd}),qn=(e,t)=>{try{let i=new DataTransfer;t.forEach(a=>{a instanceof File?i.items.add(a):i.items.add(new File([a],a.name,{type:a.type}))}),e.files=i.files}catch{return!1}return!0},pd=({root:e})=>{e.ref.fields={};let t=document.createElement("legend");t.textContent="Files",e.element.appendChild(t)},gi=(e,t)=>e.ref.fields[t],Ji=e=>{e.query("GET_ACTIVE_ITEMS").forEach(t=>{e.ref.fields[t.id]&&e.element.appendChild(e.ref.fields[t.id])})},cn=({root:e})=>Ji(e),md=({root:e,action:t})=>{let n=!(e.query("GET_ITEM",t.id).origin===re.LOCAL)&&e.query("SHOULD_UPDATE_FILE_INPUT"),l=Ge("input");l.type=n?"file":"hidden",l.name=e.query("GET_NAME"),e.ref.fields[t.id]=l,Ji(e)},ud=({root:e,action:t})=>{let i=gi(e,t.id);if(!i||(t.serverFileReference!==null&&(i.value=t.serverFileReference),!e.query("SHOULD_UPDATE_FILE_INPUT")))return;let a=e.query("GET_ITEM",t.id);qn(i,[a.file])},gd=({root:e,action:t})=>{e.query("SHOULD_UPDATE_FILE_INPUT")&&setTimeout(()=>{let i=gi(e,t.id);i&&qn(i,[t.file])},0)},fd=({root:e})=>{e.element.disabled=e.query("GET_DISABLED")},hd=({root:e,action:t})=>{let i=gi(e,t.id);i&&(i.parentNode&&i.parentNode.removeChild(i),delete e.ref.fields[t.id])},bd=({root:e,action:t})=>{let i=gi(e,t.id);i&&(t.value===null?i.removeAttribute("value"):i.type!="file"&&(i.value=t.value),Ji(e))},Ed=fe({DID_SET_DISABLED:fd,DID_ADD_ITEM:md,DID_LOAD_ITEM:ud,DID_REMOVE_ITEM:hd,DID_DEFINE_VALUE:bd,DID_PREPARE_OUTPUT:gd,DID_REORDER_ITEMS:cn,DID_SORT_ITEMS:cn}),Td=le({tag:"fieldset",name:"data",create:pd,write:Ed,ignoreRect:!0}),Id=e=>"getRootNode"in e?e.getRootNode():document,vd=["jpg","jpeg","png","gif","bmp","webp","svg","tiff"],xd=["css","csv","html","txt"],yd={zip:"zip|compressed",epub:"application/epub+zip"},$n=(e="")=>(e=e.toLowerCase(),vd.includes(e)?"image/"+(e==="jpg"?"jpeg":e==="svg"?"svg+xml":e):xd.includes(e)?"text/"+e:yd[e]||""),ea=e=>new Promise((t,i)=>{let a=zd(e);if(a.length&&!Rd(e))return t(a);Sd(e).then(t)}),Rd=e=>e.files?e.files.length>0:!1,Sd=e=>new Promise((t,i)=>{let a=(e.items?Array.from(e.items):[]).filter(n=>_d(n)).map(n=>wd(n));if(!a.length){t(e.files?Array.from(e.files):[]);return}Promise.all(a).then(n=>{let l=[];n.forEach(o=>{l.push.apply(l,o)}),t(l.filter(o=>o).map(o=>(o._relativePath||(o._relativePath=o.webkitRelativePath),o)))}).catch(console.error)}),_d=e=>{if(Xn(e)){let t=ta(e);if(t)return t.isFile||t.isDirectory}return e.kind==="file"},wd=e=>new Promise((t,i)=>{if(Ad(e)){Ld(ta(e)).then(t).catch(i);return}t([e.getAsFile()])}),Ld=e=>new Promise((t,i)=>{let a=[],n=0,l=0,o=()=>{l===0&&n===0&&t(a)},r=s=>{n++;let p=s.createReader(),c=()=>{p.readEntries(d=>{if(d.length===0){n--,o();return}d.forEach(m=>{m.isDirectory?r(m):(l++,m.file(u=>{let g=Md(u);m.fullPath&&(g._relativePath=m.fullPath),a.push(g),l--,o()}))}),c()},i)};c()};r(e)}),Md=e=>{if(e.type.length)return e;let t=e.lastModifiedDate,i=e.name,a=$n(ui(e.name));return a.length&&(e=e.slice(0,e.size,a),e.name=i,e.lastModifiedDate=t),e},Ad=e=>Xn(e)&&(ta(e)||{}).isDirectory,Xn=e=>"webkitGetAsEntry"in e,ta=e=>e.webkitGetAsEntry(),zd=e=>{let t=[];try{if(t=Fd(e),t.length)return t;t=Pd(e)}catch{}return t},Pd=e=>{let t=e.getData("url");return typeof t=="string"&&t.length?[t]:[]},Fd=e=>{let t=e.getData("text/html");if(typeof t=="string"&&t.length){let i=t.match(/src\s*=\s*"(.+?)"/);if(i)return[i[1]]}return[]},ri=[],tt=e=>({pageLeft:e.pageX,pageTop:e.pageY,scopeLeft:e.offsetX||e.layerX,scopeTop:e.offsetY||e.layerY}),Od=(e,t,i)=>{let a=Dd(t),n={element:e,filterElement:i,state:null,ondrop:()=>{},onenter:()=>{},ondrag:()=>{},onexit:()=>{},onload:()=>{},allowdrop:()=>{}};return n.destroy=a.addListener(n),n},Dd=e=>{let t=ri.find(a=>a.element===e);if(t)return t;let i=Cd(e);return ri.push(i),i},Cd=e=>{let t=[],i={dragenter:kd,dragover:Nd,dragleave:Gd,drop:Vd},a={};te(i,(l,o)=>{a[l]=o(e,t),e.addEventListener(l,a[l],!1)});let n={element:e,addListener:l=>(t.push(l),()=>{t.splice(t.indexOf(l),1),t.length===0&&(ri.splice(ri.indexOf(n),1),te(i,o=>{e.removeEventListener(o,a[o],!1)}))})};return n},Bd=(e,t)=>("elementFromPoint"in e||(e=document),e.elementFromPoint(t.x,t.y)),ia=(e,t)=>{let i=Id(t),a=Bd(i,{x:e.pageX-window.pageXOffset,y:e.pageY-window.pageYOffset});return a===t||t.contains(a)},Kn=null,ii=(e,t)=>{try{e.dropEffect=t}catch{}},kd=(e,t)=>i=>{i.preventDefault(),Kn=i.target,t.forEach(a=>{let{element:n,onenter:l}=a;ia(i,n)&&(a.state="enter",l(tt(i)))})},Nd=(e,t)=>i=>{i.preventDefault();let a=i.dataTransfer;ea(a).then(n=>{let l=!1;t.some(o=>{let{filterElement:r,element:s,onenter:p,onexit:c,ondrag:d,allowdrop:m}=o;ii(a,"copy");let u=m(n);if(!u){ii(a,"none");return}if(ia(i,s)){if(l=!0,o.state===null){o.state="enter",p(tt(i));return}if(o.state="over",r&&!u){ii(a,"none");return}d(tt(i))}else r&&!l&&ii(a,"none"),o.state&&(o.state=null,c(tt(i)))})})},Vd=(e,t)=>i=>{i.preventDefault();let a=i.dataTransfer;ea(a).then(n=>{t.forEach(l=>{let{filterElement:o,element:r,ondrop:s,onexit:p,allowdrop:c}=l;if(l.state=null,!(o&&!ia(i,r))){if(!c(n))return p(tt(i));s(tt(i),n)}})})},Gd=(e,t)=>i=>{Kn===i.target&&t.forEach(a=>{let{onexit:n}=a;a.state=null,n(tt(i))})},Ud=(e,t,i)=>{e.classList.add("filepond--hopper");let{catchesDropsOnPage:a,requiresDropOnElement:n,filterItems:l=c=>c}=i,o=Od(e,a?document.documentElement:e,n),r="",s="";o.allowdrop=c=>t(l(c)),o.ondrop=(c,d)=>{let m=l(d);if(!t(m)){p.ondragend(c);return}s="drag-drop",p.onload(m,c)},o.ondrag=c=>{p.ondrag(c)},o.onenter=c=>{s="drag-over",p.ondragstart(c)},o.onexit=c=>{s="drag-exit",p.ondragend(c)};let p={updateHopperState:()=>{r!==s&&(e.dataset.hopperState=s,r=s)},onload:()=>{},ondragstart:()=>{},ondrag:()=>{},ondragend:()=>{},destroy:()=>{o.destroy()}};return p},Ni=!1,gt=[],Zn=e=>{let t=document.activeElement;if(t&&(/textarea|input/i.test(t.nodeName)||t.getAttribute("contenteditable")==="true"||t.getAttribute("contenteditable")==="")){let a=!1,n=t;for(;n!==document.body;){if(n.classList.contains("filepond--root")){a=!0;break}n=n.parentNode}if(!a)return}ea(e.clipboardData).then(a=>{a.length&>.forEach(n=>n(a))})},Hd=e=>{gt.includes(e)||(gt.push(e),!Ni&&(Ni=!0,document.addEventListener("paste",Zn)))},Wd=e=>{qi(gt,gt.indexOf(e)),gt.length===0&&(document.removeEventListener("paste",Zn),Ni=!1)},jd=()=>{let e=i=>{t.onload(i)},t={destroy:()=>{Wd(e)},onload:()=>{}};return Hd(e),t},Yd=({root:e,props:t})=>{e.element.id=`filepond--assistant-${t.id}`,se(e.element,"role","alert"),se(e.element,"aria-live","polite"),se(e.element,"aria-relevant","additions")},dn=null,pn=null,zi=[],fi=(e,t)=>{e.element.textContent=t},qd=e=>{e.element.textContent=""},Qn=(e,t,i)=>{let a=e.query("GET_TOTAL_ITEMS");fi(e,`${i} ${t}, ${a} ${a===1?e.query("GET_LABEL_FILE_COUNT_SINGULAR"):e.query("GET_LABEL_FILE_COUNT_PLURAL")}`),clearTimeout(pn),pn=setTimeout(()=>{qd(e)},1500)},Jn=e=>e.element.parentNode.contains(document.activeElement),$d=({root:e,action:t})=>{if(!Jn(e))return;e.element.textContent="";let i=e.query("GET_ITEM",t.id);zi.push(i.filename),clearTimeout(dn),dn=setTimeout(()=>{Qn(e,zi.join(", "),e.query("GET_LABEL_FILE_ADDED")),zi.length=0},750)},Xd=({root:e,action:t})=>{if(!Jn(e))return;let i=t.item;Qn(e,i.filename,e.query("GET_LABEL_FILE_REMOVED"))},Kd=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename,n=e.query("GET_LABEL_FILE_PROCESSING_COMPLETE");fi(e,`${a} ${n}`)},mn=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename,n=e.query("GET_LABEL_FILE_PROCESSING_ABORTED");fi(e,`${a} ${n}`)},ai=({root:e,action:t})=>{let a=e.query("GET_ITEM",t.id).filename;fi(e,`${t.status.main} ${a} ${t.status.sub}`)},Zd=le({create:Yd,ignoreRect:!0,ignoreRectUpdate:!0,write:fe({DID_LOAD_ITEM:$d,DID_REMOVE_ITEM:Xd,DID_COMPLETE_ITEM_PROCESSING:Kd,DID_ABORT_ITEM_PROCESSING:mn,DID_REVERT_ITEM_PROCESSING:mn,DID_THROW_ITEM_REMOVE_ERROR:ai,DID_THROW_ITEM_LOAD_ERROR:ai,DID_THROW_ITEM_INVALID:ai,DID_THROW_ITEM_PROCESSING_ERROR:ai}),tag:"span",name:"assistant"}),el=(e,t="-")=>e.replace(new RegExp(`${t}.`,"g"),i=>i.charAt(1).toUpperCase()),tl=(e,t=16,i=!0)=>{let a=Date.now(),n=null;return(...l)=>{clearTimeout(n);let o=Date.now()-a,r=()=>{a=Date.now(),e(...l)};oe.preventDefault(),Jd=({root:e,props:t})=>{let i=e.query("GET_ID");i&&(e.element.id=i);let a=e.query("GET_CLASS_NAME");a&&a.split(" ").filter(s=>s.length).forEach(s=>{e.element.classList.add(s)}),e.ref.label=e.appendChildView(e.createChildView(id,{...t,translateY:null,caption:e.query("GET_LABEL_IDLE")})),e.ref.list=e.appendChildView(e.createChildView(Kc,{translateY:null})),e.ref.panel=e.appendChildView(e.createChildView(Vn,{name:"panel-root"})),e.ref.assistant=e.appendChildView(e.createChildView(Zd,{...t})),e.ref.data=e.appendChildView(e.createChildView(Td,{...t})),e.ref.measure=Ge("div"),e.ref.measure.style.height="100%",e.element.appendChild(e.ref.measure),e.ref.bounds=null,e.query("GET_STYLES").filter(s=>!Ve(s.value)).map(({name:s,value:p})=>{e.element.dataset[s]=p}),e.ref.widthPrevious=null,e.ref.widthUpdated=tl(()=>{e.ref.updateHistory=[],e.dispatch("DID_RESIZE_ROOT")},250),e.ref.previousAspectRatio=null,e.ref.updateHistory=[];let n=window.matchMedia("(pointer: fine) and (hover: hover)").matches,l="PointerEvent"in window;e.query("GET_ALLOW_REORDER")&&l&&!n&&(e.element.addEventListener("touchmove",si,{passive:!1}),e.element.addEventListener("gesturestart",si));let o=e.query("GET_CREDITS");if(o.length===2){let s=document.createElement("a");s.className="filepond--credits",s.href=o[0],s.tabIndex=-1,s.target="_blank",s.rel="noopener noreferrer nofollow",s.textContent=o[1],e.element.appendChild(s),e.ref.credits=s}},ep=({root:e,props:t,actions:i})=>{if(lp({root:e,props:t,actions:i}),i.filter(T=>/^DID_SET_STYLE_/.test(T.type)).filter(T=>!Ve(T.data.value)).map(({type:T,data:_})=>{let x=el(T.substring(8).toLowerCase(),"_");e.element.dataset[x]=_.value,e.invalidateLayout()}),e.rect.element.hidden)return;e.rect.element.width!==e.ref.widthPrevious&&(e.ref.widthPrevious=e.rect.element.width,e.ref.widthUpdated());let a=e.ref.bounds;a||(a=e.ref.bounds=ap(e),e.element.removeChild(e.ref.measure),e.ref.measure=null);let{hopper:n,label:l,list:o,panel:r}=e.ref;n&&n.updateHopperState();let s=e.query("GET_PANEL_ASPECT_RATIO"),p=e.query("GET_ALLOW_MULTIPLE"),c=e.query("GET_TOTAL_ITEMS"),d=p?e.query("GET_MAX_FILES")||Qd:1,m=c===d,u=i.find(T=>T.type==="DID_ADD_ITEM");if(m&&u){let T=u.data.interactionMethod;l.opacity=0,p?l.translateY=-40:T===Re.API?l.translateX=40:T===Re.BROWSE?l.translateY=40:l.translateY=30}else m||(l.opacity=1,l.translateX=0,l.translateY=0);let g=tp(e),f=ip(e),h=l.rect.element.height,I=!p||m?0:h,b=m?o.rect.element.marginTop:0,E=c===0?0:o.rect.element.marginBottom,v=I+b+f.visual+E,y=I+b+f.bounds+E;if(o.translateY=Math.max(0,I-o.rect.element.marginTop)-g.top,s){let T=e.rect.element.width,_=T*s;s!==e.ref.previousAspectRatio&&(e.ref.previousAspectRatio=s,e.ref.updateHistory=[]);let x=e.ref.updateHistory;x.push(T);let R=2;if(x.length>R*2){let z=x.length,A=z-10,B=0;for(let w=z;w>=A;w--)if(x[w]===x[w-2]&&B++,B>=R)return}r.scalable=!1,r.height=_;let P=_-I-(E-g.bottom)-(m?b:0);f.visual>P?o.overflow=P:o.overflow=null,e.height=_}else if(a.fixedHeight){r.scalable=!1;let T=a.fixedHeight-I-(E-g.bottom)-(m?b:0);f.visual>T?o.overflow=T:o.overflow=null}else if(a.cappedHeight){let T=v>=a.cappedHeight,_=Math.min(a.cappedHeight,v);r.scalable=!0,r.height=T?_:_-g.top-g.bottom;let x=_-I-(E-g.bottom)-(m?b:0);v>a.cappedHeight&&f.visual>x?o.overflow=x:o.overflow=null,e.height=Math.min(a.cappedHeight,y-g.top-g.bottom)}else{let T=c>0?g.top+g.bottom:0;r.scalable=!0,r.height=Math.max(h,v-T),e.height=Math.max(h,y-T)}e.ref.credits&&r.heightCurrent&&(e.ref.credits.style.transform=`translateY(${r.heightCurrent}px)`)},tp=e=>{let t=e.ref.list.childViews[0].childViews[0];return t?{top:t.rect.element.marginTop,bottom:t.rect.element.marginBottom}:{top:0,bottom:0}},ip=e=>{let t=0,i=0,a=e.ref.list,n=a.childViews[0],l=n.childViews.filter(b=>b.rect.element.height),o=e.query("GET_ACTIVE_ITEMS").map(b=>l.find(E=>E.id===b.id)).filter(b=>b);if(o.length===0)return{visual:t,bounds:i};let r=n.rect.element.width,s=Qi(n,o,a.dragCoordinates),p=o[0].rect.element,c=p.marginTop+p.marginBottom,d=p.marginLeft+p.marginRight,m=p.width+d,u=p.height+c,g=typeof s<"u"&&s>=0?1:0,f=o.find(b=>b.markedForRemoval&&b.opacity<.45)?-1:0,h=o.length+g+f,I=Zi(r,m);return I===1?o.forEach(b=>{let E=b.rect.element.height+c;i+=E,t+=E*b.opacity}):(i=Math.ceil(h/I)*u,t=i),{visual:t,bounds:i}},ap=e=>{let t=e.ref.measureHeight||null;return{cappedHeight:parseInt(e.style.maxHeight,10)||null,fixedHeight:t===0?null:t}},aa=(e,t)=>{let i=e.query("GET_ALLOW_REPLACE"),a=e.query("GET_ALLOW_MULTIPLE"),n=e.query("GET_TOTAL_ITEMS"),l=e.query("GET_MAX_FILES"),o=t.length;return!a&&o>1?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ae("warning",0,"Max files")}),!0):(l=a?l:1,!a&&i?!1:Et(l)&&n+o>l?(e.dispatch("DID_THROW_MAX_FILES",{source:t,error:ae("warning",0,"Max files")}),!0):!1)},np=(e,t,i)=>{let a=e.childViews[0];return Qi(a,t,{left:i.scopeLeft-a.rect.element.left,top:i.scopeTop-(e.rect.outer.top+e.rect.element.marginTop+e.rect.element.scrollTop)})},un=e=>{let t=e.query("GET_ALLOW_DROP"),i=e.query("GET_DISABLED"),a=t&&!i;if(a&&!e.ref.hopper){let n=Ud(e.element,l=>{let o=e.query("GET_BEFORE_DROP_FILE")||(()=>!0);return e.query("GET_DROP_VALIDATION")?l.every(s=>it("ALLOW_HOPPER_ITEM",s,{query:e.query}).every(p=>p===!0)&&o(s)):!0},{filterItems:l=>{let o=e.query("GET_IGNORED_FILES");return l.filter(r=>et(r)?!o.includes(r.name.toLowerCase()):!0)},catchesDropsOnPage:e.query("GET_DROP_ON_PAGE"),requiresDropOnElement:e.query("GET_DROP_ON_ELEMENT")});n.onload=(l,o)=>{let s=e.ref.list.childViews[0].childViews.filter(c=>c.rect.element.height),p=e.query("GET_ACTIVE_ITEMS").map(c=>s.find(d=>d.id===c.id)).filter(c=>c);Ae("ADD_ITEMS",l,{dispatch:e.dispatch}).then(c=>{if(aa(e,c))return!1;e.dispatch("ADD_ITEMS",{items:c,index:np(e.ref.list,p,o),interactionMethod:Re.DROP})}),e.dispatch("DID_DROP",{position:o}),e.dispatch("DID_END_DRAG",{position:o})},n.ondragstart=l=>{e.dispatch("DID_START_DRAG",{position:l})},n.ondrag=tl(l=>{e.dispatch("DID_DRAG",{position:l})}),n.ondragend=l=>{e.dispatch("DID_END_DRAG",{position:l})},e.ref.hopper=n,e.ref.drip=e.appendChildView(e.createChildView(dd))}else!a&&e.ref.hopper&&(e.ref.hopper.destroy(),e.ref.hopper=null,e.removeChildView(e.ref.drip))},gn=(e,t)=>{let i=e.query("GET_ALLOW_BROWSE"),a=e.query("GET_DISABLED"),n=i&&!a;n&&!e.ref.browser?e.ref.browser=e.appendChildView(e.createChildView(ed,{...t,onload:l=>{Ae("ADD_ITEMS",l,{dispatch:e.dispatch}).then(o=>{if(aa(e,o))return!1;e.dispatch("ADD_ITEMS",{items:o,index:-1,interactionMethod:Re.BROWSE})})}}),0):!n&&e.ref.browser&&(e.removeChildView(e.ref.browser),e.ref.browser=null)},fn=e=>{let t=e.query("GET_ALLOW_PASTE"),i=e.query("GET_DISABLED"),a=t&&!i;a&&!e.ref.paster?(e.ref.paster=jd(),e.ref.paster.onload=n=>{Ae("ADD_ITEMS",n,{dispatch:e.dispatch}).then(l=>{if(aa(e,l))return!1;e.dispatch("ADD_ITEMS",{items:l,index:-1,interactionMethod:Re.PASTE})})}):!a&&e.ref.paster&&(e.ref.paster.destroy(),e.ref.paster=null)},lp=fe({DID_SET_ALLOW_BROWSE:({root:e,props:t})=>{gn(e,t)},DID_SET_ALLOW_DROP:({root:e})=>{un(e)},DID_SET_ALLOW_PASTE:({root:e})=>{fn(e)},DID_SET_DISABLED:({root:e,props:t})=>{un(e),fn(e),gn(e,t),e.query("GET_DISABLED")?e.element.dataset.disabled="disabled":e.element.removeAttribute("data-disabled")}}),op=le({name:"root",read:({root:e})=>{e.ref.measure&&(e.ref.measureHeight=e.ref.measure.offsetHeight)},create:Jd,write:ep,destroy:({root:e})=>{e.ref.paster&&e.ref.paster.destroy(),e.ref.hopper&&e.ref.hopper.destroy(),e.element.removeEventListener("touchmove",si),e.element.removeEventListener("gesturestart",si)},mixins:{styles:["height"]}}),rp=(e={})=>{let t=null,i=oi(),a=Rr(cs(i),[ws,ms(i)],[Qs,ps(i)]);a.dispatch("SET_OPTIONS",{options:e});let n=()=>{document.hidden||a.dispatch("KICK")};document.addEventListener("visibilitychange",n);let l=null,o=!1,r=!1,s=null,p=null,c=()=>{o||(o=!0),clearTimeout(l),l=setTimeout(()=>{o=!1,s=null,p=null,r&&(r=!1,a.dispatch("DID_STOP_RESIZE"))},500)};window.addEventListener("resize",c);let d=op(a,{id:Yi()}),m=!1,u=!1,g={_read:()=>{o&&(p=window.innerWidth,s||(s=p),!r&&p!==s&&(a.dispatch("DID_START_RESIZE"),r=!0)),u&&m&&(m=d.element.offsetParent===null),!m&&(d._read(),u=d.rect.element.hidden)},_write:S=>{let L=a.processActionQueue().filter(D=>!/^SET_/.test(D.type));m&&!L.length||(b(L),m=d._write(S,L,r),fs(a.query("GET_ITEMS")),m&&a.processDispatchQueue())}},f=S=>L=>{let D={type:S};if(!L)return D;if(L.hasOwnProperty("error")&&(D.error=L.error?{...L.error}:null),L.status&&(D.status={...L.status}),L.file&&(D.output=L.file),L.source)D.file=L.source;else if(L.item||L.id){let O=L.item?L.item:a.query("GET_ITEM",L.id);D.file=O?he(O):null}return L.items&&(D.items=L.items.map(he)),/progress/.test(S)&&(D.progress=L.progress),L.hasOwnProperty("origin")&&L.hasOwnProperty("target")&&(D.origin=L.origin,D.target=L.target),D},h={DID_DESTROY:f("destroy"),DID_INIT:f("init"),DID_THROW_MAX_FILES:f("warning"),DID_INIT_ITEM:f("initfile"),DID_START_ITEM_LOAD:f("addfilestart"),DID_UPDATE_ITEM_LOAD_PROGRESS:f("addfileprogress"),DID_LOAD_ITEM:f("addfile"),DID_THROW_ITEM_INVALID:[f("error"),f("addfile")],DID_THROW_ITEM_LOAD_ERROR:[f("error"),f("addfile")],DID_THROW_ITEM_REMOVE_ERROR:[f("error"),f("removefile")],DID_PREPARE_OUTPUT:f("preparefile"),DID_START_ITEM_PROCESSING:f("processfilestart"),DID_UPDATE_ITEM_PROCESS_PROGRESS:f("processfileprogress"),DID_ABORT_ITEM_PROCESSING:f("processfileabort"),DID_COMPLETE_ITEM_PROCESSING:f("processfile"),DID_COMPLETE_ITEM_PROCESSING_ALL:f("processfiles"),DID_REVERT_ITEM_PROCESSING:f("processfilerevert"),DID_THROW_ITEM_PROCESSING_ERROR:[f("error"),f("processfile")],DID_REMOVE_ITEM:f("removefile"),DID_UPDATE_ITEMS:f("updatefiles"),DID_ACTIVATE_ITEM:f("activatefile"),DID_REORDER_ITEMS:f("reorderfiles")},I=S=>{let L={pond:F,...S};delete L.type,d.element.dispatchEvent(new CustomEvent(`FilePond:${S.type}`,{detail:L,bubbles:!0,cancelable:!0,composed:!0}));let D=[];S.hasOwnProperty("error")&&D.push(S.error),S.hasOwnProperty("file")&&D.push(S.file);let O=["type","error","file"];Object.keys(S).filter(C=>!O.includes(C)).forEach(C=>D.push(S[C])),F.fire(S.type,...D);let U=a.query(`GET_ON${S.type.toUpperCase()}`);U&&U(...D)},b=S=>{S.length&&S.filter(L=>h[L.type]).forEach(L=>{let D=h[L.type];(Array.isArray(D)?D:[D]).forEach(O=>{L.type==="DID_INIT_ITEM"?I(O(L.data)):setTimeout(()=>{I(O(L.data))},0)})})},E=S=>a.dispatch("SET_OPTIONS",{options:S}),v=S=>a.query("GET_ACTIVE_ITEM",S),y=S=>new Promise((L,D)=>{a.dispatch("REQUEST_ITEM_PREPARE",{query:S,success:O=>{L(O)},failure:O=>{D(O)}})}),T=(S,L={})=>new Promise((D,O)=>{R([{source:S,options:L}],{index:L.index}).then(U=>D(U&&U[0])).catch(O)}),_=S=>S.file&&S.id,x=(S,L)=>(typeof S=="object"&&!_(S)&&!L&&(L=S,S=void 0),a.dispatch("REMOVE_ITEM",{...L,query:S}),a.query("GET_ACTIVE_ITEM",S)===null),R=(...S)=>new Promise((L,D)=>{let O=[],U={};if(ci(S[0]))O.push.apply(O,S[0]),Object.assign(U,S[1]||{});else{let C=S[S.length-1];typeof C=="object"&&!(C instanceof Blob)&&Object.assign(U,S.pop()),O.push(...S)}a.dispatch("ADD_ITEMS",{items:O,index:U.index,interactionMethod:Re.API,success:L,failure:D})}),P=()=>a.query("GET_ACTIVE_ITEMS"),z=S=>new Promise((L,D)=>{a.dispatch("REQUEST_ITEM_PROCESSING",{query:S,success:O=>{L(O)},failure:O=>{D(O)}})}),A=(...S)=>{let L=Array.isArray(S[0])?S[0]:S,D=L.length?L:P();return Promise.all(D.map(y))},B=(...S)=>{let L=Array.isArray(S[0])?S[0]:S;if(!L.length){let D=P().filter(O=>!(O.status===H.IDLE&&O.origin===re.LOCAL)&&O.status!==H.PROCESSING&&O.status!==H.PROCESSING_COMPLETE&&O.status!==H.PROCESSING_REVERT_ERROR);return Promise.all(D.map(z))}return Promise.all(L.map(z))},w=(...S)=>{let L=Array.isArray(S[0])?S[0]:S,D;typeof L[L.length-1]=="object"?D=L.pop():Array.isArray(S[0])&&(D=S[1]);let O=P();return L.length?L.map(C=>Xe(C)?O[C]?O[C].id:null:C).filter(C=>C).map(C=>x(C,D)):Promise.all(O.map(C=>x(C,D)))},F={...mi(),...g,...ds(a,i),setOptions:E,addFile:T,addFiles:R,getFile:v,processFile:z,prepareFile:y,removeFile:x,moveFile:(S,L)=>a.dispatch("MOVE_ITEM",{query:S,index:L}),getFiles:P,processFiles:B,removeFiles:w,prepareFiles:A,sort:S=>a.dispatch("SORT",{compare:S}),browse:()=>{var S=d.element.querySelector("input[type=file]");S&&S.click()},destroy:()=>{F.fire("destroy",d.element),a.dispatch("ABORT_ALL"),d._destroy(),window.removeEventListener("resize",c),document.removeEventListener("visibilitychange",n),a.dispatch("DID_DESTROY")},insertBefore:S=>Ba(d.element,S),insertAfter:S=>ka(d.element,S),appendTo:S=>S.appendChild(d.element),replaceElement:S=>{Ba(d.element,S),S.parentNode.removeChild(S),t=S},restoreElement:()=>{t&&(ka(t,d.element),d.element.parentNode.removeChild(d.element),t=null)},isAttachedTo:S=>d.element===S||t===S,element:{get:()=>d.element},status:{get:()=>a.query("GET_STATUS")}};return a.dispatch("DID_INIT"),He(F)},il=(e={})=>{let t={};return te(oi(),(a,n)=>{t[a]=n[0]}),rp({...t,...e})},sp=e=>e.charAt(0).toLowerCase()+e.slice(1),cp=e=>el(e.replace(/^data-/,"")),al=(e,t)=>{te(t,(i,a)=>{te(e,(n,l)=>{let o=new RegExp(i);if(!o.test(n)||(delete e[n],a===!1))return;if(ge(a)){e[a]=l;return}let s=a.group;de(a)&&!e[s]&&(e[s]={}),e[s][sp(n.replace(o,""))]=l}),a.mapping&&al(e[a.group],a.mapping)})},dp=(e,t={})=>{let i=[];te(e.attributes,n=>{i.push(e.attributes[n])});let a=i.filter(n=>n.name).reduce((n,l)=>{let o=se(e,l.name);return n[cp(l.name)]=o===l.name?!0:o,n},{});return al(a,t),a},pp=(e,t={})=>{let i={"^class$":"className","^multiple$":"allowMultiple","^capture$":"captureMethod","^webkitdirectory$":"allowDirectoriesOnly","^server":{group:"server",mapping:{"^process":{group:"process"},"^revert":{group:"revert"},"^fetch":{group:"fetch"},"^restore":{group:"restore"},"^load":{group:"load"}}},"^type$":!1,"^files$":!1};it("SET_ATTRIBUTE_TO_OPTION_MAP",i);let a={...t},n=dp(e.nodeName==="FIELDSET"?e.querySelector("input[type=file]"):e,i);Object.keys(n).forEach(o=>{de(n[o])?(de(a[o])||(a[o]={}),Object.assign(a[o],n[o])):a[o]=n[o]}),a.files=(t.files||[]).concat(Array.from(e.querySelectorAll("input:not([type=file])")).map(o=>({source:o.value,options:{type:o.dataset.type}})));let l=il(a);return e.files&&Array.from(e.files).forEach(o=>{l.addFile(o)}),l.replaceElement(e),l},mp=(...e)=>yr(e[0])?pp(...e):il(...e),up=["fire","_read","_write"],hn=e=>{let t={};return Rn(e,t,up),t},gp=(e,t)=>e.replace(/(?:{([a-zA-Z]+)})/g,(i,a)=>t[a]),fp=e=>{let t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),i=URL.createObjectURL(t),a=new Worker(i);return{transfer:(n,l)=>{},post:(n,l,o)=>{let r=Yi();a.onmessage=s=>{s.data.id===r&&l(s.data.message)},a.postMessage({id:r,message:n},o)},terminate:()=>{a.terminate(),URL.revokeObjectURL(i)}}},hp=e=>new Promise((t,i)=>{let a=new Image;a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),nl=(e,t)=>{let i=e.slice(0,e.size,e.type);return i.lastModifiedDate=e.lastModifiedDate,i.name=t,i},bp=e=>nl(e,e.name),bn=[],Ep=e=>{if(bn.includes(e))return;bn.push(e);let t=e({addFilter:bs,utils:{Type:M,forin:te,isString:ge,isFile:et,toNaturalFileSize:Bn,replaceInString:gp,getExtensionFromFilename:ui,getFilenameWithoutExtension:On,guesstimateMimeType:$n,getFileFromBlob:bt,getFilenameFromURL:Ct,createRoute:fe,createWorker:fp,createView:le,createItemAPI:he,loadImage:hp,copyFile:bp,renameFile:nl,createBlob:zn,applyFilterChain:Ae,text:ne,getNumericAspectRatioFromString:wn},views:{fileActionButton:Cn}});Es(t.options)},Tp=()=>Object.prototype.toString.call(window.operamini)==="[object OperaMini]",Ip=()=>"Promise"in window,vp=()=>"slice"in Blob.prototype,xp=()=>"URL"in window&&"createObjectURL"in window.URL,yp=()=>"visibilityState"in document,Rp=()=>"performance"in window,Sp=()=>"supports"in(window.CSS||{}),_p=()=>/MSIE|Trident/.test(window.navigator.userAgent),Vi=(()=>{let e=En()&&!Tp()&&yp()&&Ip()&&vp()&&xp()&&Rp()&&(Sp()||_p());return()=>e})(),Ue={apps:[]},wp="filepond",at=()=>{},ll={},Tt={},Bt={},Gi={},ft=at,ht=at,Ui=at,Hi=at,ve=at,Wi=at,Dt=at;if(Vi()){Xr(()=>{Ue.apps.forEach(i=>i._read())},i=>{Ue.apps.forEach(a=>a._write(i))});let e=()=>{document.dispatchEvent(new CustomEvent("FilePond:loaded",{detail:{supported:Vi,create:ft,destroy:ht,parse:Ui,find:Hi,registerPlugin:ve,setOptions:Dt}})),document.removeEventListener("DOMContentLoaded",e)};document.readyState!=="loading"?setTimeout(()=>e(),0):document.addEventListener("DOMContentLoaded",e);let t=()=>te(oi(),(i,a)=>{Gi[i]=a[1]});ll={...Ln},Bt={...re},Tt={...H},Gi={},t(),ft=(...i)=>{let a=mp(...i);return a.on("destroy",ht),Ue.apps.push(a),hn(a)},ht=i=>{let a=Ue.apps.findIndex(n=>n.isAttachedTo(i));return a>=0?(Ue.apps.splice(a,1)[0].restoreElement(),!0):!1},Ui=i=>Array.from(i.querySelectorAll(`.${wp}`)).filter(l=>!Ue.apps.find(o=>o.isAttachedTo(l))).map(l=>ft(l)),Hi=i=>{let a=Ue.apps.find(n=>n.isAttachedTo(i));return a?hn(a):null},ve=(...i)=>{i.forEach(Ep),t()},Wi=()=>{let i={};return te(oi(),(a,n)=>{i[a]=n[0]}),i},Dt=i=>(de(i)&&(Ue.apps.forEach(a=>{a.setOptions(i)}),Ts(i)),Wi())}function ol(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),i.push.apply(i,a)}return i}function xl(e){for(var t=1;te.length)&&(t=e.length);for(var i=0,a=new Array(t);i
',jp=Number.isNaN||De.isNaN;function Y(e){return typeof e=="number"&&!jp(e)}var Tl=function(t){return t>0&&t<1/0};function la(e){return typeof e>"u"}function ot(e){return ra(e)==="object"&&e!==null}var Yp=Object.prototype.hasOwnProperty;function vt(e){if(!ot(e))return!1;try{var t=e.constructor,i=t.prototype;return t&&i&&Yp.call(i,"isPrototypeOf")}catch{return!1}}function be(e){return typeof e=="function"}var qp=Array.prototype.slice;function Pl(e){return Array.from?Array.from(e):qp.call(e)}function oe(e,t){return e&&be(t)&&(Array.isArray(e)||Y(e.length)?Pl(e).forEach(function(i,a){t.call(e,i,a,e)}):ot(e)&&Object.keys(e).forEach(function(i){t.call(e,e[i],i,e)})),e}var J=Object.assign||function(t){for(var i=arguments.length,a=new Array(i>1?i-1:0),n=1;n0&&a.forEach(function(l){ot(l)&&Object.keys(l).forEach(function(o){t[o]=l[o]})}),t},$p=/\.\d*(?:0|9){12}\d*$/;function yt(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1e11;return $p.test(e)?Math.round(e*t)/t:e}var Xp=/^width|height|left|top|marginLeft|marginTop$/;function je(e,t){var i=e.style;oe(t,function(a,n){Xp.test(n)&&Y(a)&&(a="".concat(a,"px")),i[n]=a})}function Kp(e,t){return e.classList?e.classList.contains(t):e.className.indexOf(t)>-1}function pe(e,t){if(t){if(Y(e.length)){oe(e,function(a){pe(a,t)});return}if(e.classList){e.classList.add(t);return}var i=e.className.trim();i?i.indexOf(t)<0&&(e.className="".concat(i," ").concat(t)):e.className=t}}function Oe(e,t){if(t){if(Y(e.length)){oe(e,function(i){Oe(i,t)});return}if(e.classList){e.classList.remove(t);return}e.className.indexOf(t)>=0&&(e.className=e.className.replace(t,""))}}function xt(e,t,i){if(t){if(Y(e.length)){oe(e,function(a){xt(a,t,i)});return}i?pe(e,t):Oe(e,t)}}var Zp=/([a-z\d])([A-Z])/g;function va(e){return e.replace(Zp,"$1-$2").toLowerCase()}function ha(e,t){return ot(e[t])?e[t]:e.dataset?e.dataset[t]:e.getAttribute("data-".concat(va(t)))}function Wt(e,t,i){ot(i)?e[t]=i:e.dataset?e.dataset[t]=i:e.setAttribute("data-".concat(va(t)),i)}function Qp(e,t){if(ot(e[t]))try{delete e[t]}catch{e[t]=void 0}else if(e.dataset)try{delete e.dataset[t]}catch{e.dataset[t]=void 0}else e.removeAttribute("data-".concat(va(t)))}var Fl=/\s\s*/,Ol=(function(){var e=!1;if(Ti){var t=!1,i=function(){},a=Object.defineProperty({},"once",{get:function(){return e=!0,t},set:function(l){t=l}});De.addEventListener("test",i,a),De.removeEventListener("test",i,a)}return e})();function Fe(e,t,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},n=i;t.trim().split(Fl).forEach(function(l){if(!Ol){var o=e.listeners;o&&o[l]&&o[l][i]&&(n=o[l][i],delete o[l][i],Object.keys(o[l]).length===0&&delete o[l],Object.keys(o).length===0&&delete e.listeners)}e.removeEventListener(l,n,a)})}function Se(e,t,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},n=i;t.trim().split(Fl).forEach(function(l){if(a.once&&!Ol){var o=e.listeners,r=o===void 0?{}:o;n=function(){delete r[l][i],e.removeEventListener(l,n,a);for(var p=arguments.length,c=new Array(p),d=0;dMath.abs(i)&&(i=m)})}),i}function bi(e,t){var i=e.pageX,a=e.pageY,n={endX:i,endY:a};return t?n:xl({startX:i,startY:a},n)}function tm(e){var t=0,i=0,a=0;return oe(e,function(n){var l=n.startX,o=n.startY;t+=l,i+=o,a+=1}),t/=a,i/=a,{pageX:t,pageY:i}}function Ye(e){var t=e.aspectRatio,i=e.height,a=e.width,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"contain",l=Tl(a),o=Tl(i);if(l&&o){var r=i*t;n==="contain"&&r>a||n==="cover"&&r90?{width:s,height:r}:{width:r,height:s}}function am(e,t,i,a){var n=t.aspectRatio,l=t.naturalWidth,o=t.naturalHeight,r=t.rotate,s=r===void 0?0:r,p=t.scaleX,c=p===void 0?1:p,d=t.scaleY,m=d===void 0?1:d,u=i.aspectRatio,g=i.naturalWidth,f=i.naturalHeight,h=a.fillColor,I=h===void 0?"transparent":h,b=a.imageSmoothingEnabled,E=b===void 0?!0:b,v=a.imageSmoothingQuality,y=v===void 0?"low":v,T=a.maxWidth,_=T===void 0?1/0:T,x=a.maxHeight,R=x===void 0?1/0:x,P=a.minWidth,z=P===void 0?0:P,A=a.minHeight,B=A===void 0?0:A,w=document.createElement("canvas"),F=w.getContext("2d"),S=Ye({aspectRatio:u,width:_,height:R}),L=Ye({aspectRatio:u,width:z,height:B},"cover"),D=Math.min(S.width,Math.max(L.width,g)),O=Math.min(S.height,Math.max(L.height,f)),U=Ye({aspectRatio:n,width:_,height:R}),C=Ye({aspectRatio:n,width:z,height:B},"cover"),X=Math.min(U.width,Math.max(C.width,l)),K=Math.min(U.height,Math.max(C.height,o)),Z=[-X/2,-K/2,X,K];return w.width=yt(D),w.height=yt(O),F.fillStyle=I,F.fillRect(0,0,D,O),F.save(),F.translate(D/2,O/2),F.rotate(s*Math.PI/180),F.scale(c,m),F.imageSmoothingEnabled=E,F.imageSmoothingQuality=y,F.drawImage.apply(F,[e].concat(Rl(Z.map(function(ce){return Math.floor(yt(ce))})))),F.restore(),w}var Cl=String.fromCharCode;function nm(e,t,i){var a="";i+=t;for(var n=t;n0;)i.push(Cl.apply(null,Pl(n.subarray(0,a)))),n=n.subarray(a);return"data:".concat(t,";base64,").concat(btoa(i.join("")))}function sm(e){var t=new DataView(e),i;try{var a,n,l;if(t.getUint8(0)===255&&t.getUint8(1)===216)for(var o=t.byteLength,r=2;r+1=8&&(l=p+d)}}}if(l){var m=t.getUint16(l,a),u,g;for(g=0;g=0?l:Al),height:Math.max(a.offsetHeight,o>=0?o:zl)};this.containerData=r,je(n,{width:r.width,height:r.height}),pe(t,Ee),Oe(n,Ee)},initCanvas:function(){var t=this.containerData,i=this.imageData,a=this.options.viewMode,n=Math.abs(i.rotate)%180===90,l=n?i.naturalHeight:i.naturalWidth,o=n?i.naturalWidth:i.naturalHeight,r=l/o,s=t.width,p=t.height;t.height*r>t.width?a===3?s=t.height*r:p=t.width/r:a===3?p=t.width/r:s=t.height*r;var c={aspectRatio:r,naturalWidth:l,naturalHeight:o,width:s,height:p};this.canvasData=c,this.limited=a===1||a===2,this.limitCanvas(!0,!0),c.width=Math.min(Math.max(c.width,c.minWidth),c.maxWidth),c.height=Math.min(Math.max(c.height,c.minHeight),c.maxHeight),c.left=(t.width-c.width)/2,c.top=(t.height-c.height)/2,c.oldLeft=c.left,c.oldTop=c.top,this.initialCanvasData=J({},c)},limitCanvas:function(t,i){var a=this.options,n=this.containerData,l=this.canvasData,o=this.cropBoxData,r=a.viewMode,s=l.aspectRatio,p=this.cropped&&o;if(t){var c=Number(a.minCanvasWidth)||0,d=Number(a.minCanvasHeight)||0;r>1?(c=Math.max(c,n.width),d=Math.max(d,n.height),r===3&&(d*s>c?c=d*s:d=c/s)):r>0&&(c?c=Math.max(c,p?o.width:0):d?d=Math.max(d,p?o.height:0):p&&(c=o.width,d=o.height,d*s>c?c=d*s:d=c/s));var m=Ye({aspectRatio:s,width:c,height:d});c=m.width,d=m.height,l.minWidth=c,l.minHeight=d,l.maxWidth=1/0,l.maxHeight=1/0}if(i)if(r>(p?0:1)){var u=n.width-l.width,g=n.height-l.height;l.minLeft=Math.min(0,u),l.minTop=Math.min(0,g),l.maxLeft=Math.max(0,u),l.maxTop=Math.max(0,g),p&&this.limited&&(l.minLeft=Math.min(o.left,o.left+(o.width-l.width)),l.minTop=Math.min(o.top,o.top+(o.height-l.height)),l.maxLeft=o.left,l.maxTop=o.top,r===2&&(l.width>=n.width&&(l.minLeft=Math.min(0,u),l.maxLeft=Math.max(0,u)),l.height>=n.height&&(l.minTop=Math.min(0,g),l.maxTop=Math.max(0,g))))}else l.minLeft=-l.width,l.minTop=-l.height,l.maxLeft=n.width,l.maxTop=n.height},renderCanvas:function(t,i){var a=this.canvasData,n=this.imageData;if(i){var l=im({width:n.naturalWidth*Math.abs(n.scaleX||1),height:n.naturalHeight*Math.abs(n.scaleY||1),degree:n.rotate||0}),o=l.width,r=l.height,s=a.width*(o/a.naturalWidth),p=a.height*(r/a.naturalHeight);a.left-=(s-a.width)/2,a.top-=(p-a.height)/2,a.width=s,a.height=p,a.aspectRatio=o/r,a.naturalWidth=o,a.naturalHeight=r,this.limitCanvas(!0,!1)}(a.width>a.maxWidth||a.widtha.maxHeight||a.heighti.width?l.height=l.width/a:l.width=l.height*a),this.cropBoxData=l,this.limitCropBox(!0,!0),l.width=Math.min(Math.max(l.width,l.minWidth),l.maxWidth),l.height=Math.min(Math.max(l.height,l.minHeight),l.maxHeight),l.width=Math.max(l.minWidth,l.width*n),l.height=Math.max(l.minHeight,l.height*n),l.left=i.left+(i.width-l.width)/2,l.top=i.top+(i.height-l.height)/2,l.oldLeft=l.left,l.oldTop=l.top,this.initialCropBoxData=J({},l)},limitCropBox:function(t,i){var a=this.options,n=this.containerData,l=this.canvasData,o=this.cropBoxData,r=this.limited,s=a.aspectRatio;if(t){var p=Number(a.minCropBoxWidth)||0,c=Number(a.minCropBoxHeight)||0,d=r?Math.min(n.width,l.width,l.width+l.left,n.width-l.left):n.width,m=r?Math.min(n.height,l.height,l.height+l.top,n.height-l.top):n.height;p=Math.min(p,n.width),c=Math.min(c,n.height),s&&(p&&c?c*s>p?c=p/s:p=c*s:p?c=p/s:c&&(p=c*s),m*s>d?m=d/s:d=m*s),o.minWidth=Math.min(p,d),o.minHeight=Math.min(c,m),o.maxWidth=d,o.maxHeight=m}i&&(r?(o.minLeft=Math.max(0,l.left),o.minTop=Math.max(0,l.top),o.maxLeft=Math.min(n.width,l.left+l.width)-o.width,o.maxTop=Math.min(n.height,l.top+l.height)-o.height):(o.minLeft=0,o.minTop=0,o.maxLeft=n.width-o.width,o.maxTop=n.height-o.height))},renderCropBox:function(){var t=this.options,i=this.containerData,a=this.cropBoxData;(a.width>a.maxWidth||a.widtha.maxHeight||a.height=i.width&&a.height>=i.height?_l:Ta),je(this.cropBox,J({width:a.width,height:a.height},Ut({translateX:a.left,translateY:a.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),Rt(this.element,pa,this.getData())}},pm={initPreview:function(){var t=this.element,i=this.crossOrigin,a=this.options.preview,n=i?this.crossOriginUrl:this.url,l=t.alt||"The image to preview",o=document.createElement("img");if(i&&(o.crossOrigin=i),o.src=n,o.alt=l,this.viewBox.appendChild(o),this.viewBoxImage=o,!!a){var r=a;typeof a=="string"?r=t.ownerDocument.querySelectorAll(a):a.querySelector&&(r=[a]),this.previews=r,oe(r,function(s){var p=document.createElement("img");Wt(s,hi,{width:s.offsetWidth,height:s.offsetHeight,html:s.innerHTML}),i&&(p.crossOrigin=i),p.src=n,p.alt=l,p.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',s.innerHTML="",s.appendChild(p)})}},resetPreview:function(){oe(this.previews,function(t){var i=ha(t,hi);je(t,{width:i.width,height:i.height}),t.innerHTML=i.html,Qp(t,hi)})},preview:function(){var t=this.imageData,i=this.canvasData,a=this.cropBoxData,n=a.width,l=a.height,o=t.width,r=t.height,s=a.left-i.left-t.left,p=a.top-i.top-t.top;!this.cropped||this.disabled||(je(this.viewBoxImage,J({width:o,height:r},Ut(J({translateX:-s,translateY:-p},t)))),oe(this.previews,function(c){var d=ha(c,hi),m=d.width,u=d.height,g=m,f=u,h=1;n&&(h=m/n,f=l*h),l&&f>u&&(h=u/l,g=n*h,f=u),je(c,{width:g,height:f}),je(c.getElementsByTagName("img")[0],J({width:o*h,height:r*h},Ut(J({translateX:-s*h,translateY:-p*h},t))))}))}},mm={bind:function(){var t=this.element,i=this.options,a=this.cropper;be(i.cropstart)&&Se(t,ga,i.cropstart),be(i.cropmove)&&Se(t,ua,i.cropmove),be(i.cropend)&&Se(t,ma,i.cropend),be(i.crop)&&Se(t,pa,i.crop),be(i.zoom)&&Se(t,fa,i.zoom),Se(a,pl,this.onCropStart=this.cropStart.bind(this)),i.zoomable&&i.zoomOnWheel&&Se(a,hl,this.onWheel=this.wheel.bind(this),{passive:!1,capture:!0}),i.toggleDragModeOnDblclick&&Se(a,dl,this.onDblclick=this.dblclick.bind(this)),Se(t.ownerDocument,ml,this.onCropMove=this.cropMove.bind(this)),Se(t.ownerDocument,ul,this.onCropEnd=this.cropEnd.bind(this)),i.responsive&&Se(window,fl,this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,i=this.options,a=this.cropper;be(i.cropstart)&&Fe(t,ga,i.cropstart),be(i.cropmove)&&Fe(t,ua,i.cropmove),be(i.cropend)&&Fe(t,ma,i.cropend),be(i.crop)&&Fe(t,pa,i.crop),be(i.zoom)&&Fe(t,fa,i.zoom),Fe(a,pl,this.onCropStart),i.zoomable&&i.zoomOnWheel&&Fe(a,hl,this.onWheel,{passive:!1,capture:!0}),i.toggleDragModeOnDblclick&&Fe(a,dl,this.onDblclick),Fe(t.ownerDocument,ml,this.onCropMove),Fe(t.ownerDocument,ul,this.onCropEnd),i.responsive&&Fe(window,fl,this.onResize)}},um={resize:function(){if(!this.disabled){var t=this.options,i=this.container,a=this.containerData,n=i.offsetWidth/a.width,l=i.offsetHeight/a.height,o=Math.abs(n-1)>Math.abs(l-1)?n:l;if(o!==1){var r,s;t.restore&&(r=this.getCanvasData(),s=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(oe(r,function(p,c){r[c]=p*o})),this.setCropBoxData(oe(s,function(p,c){s[c]=p*o})))}}},dblclick:function(){this.disabled||this.options.dragMode===Ml||this.setDragMode(Kp(this.dragBox,ca)?Ll:Ia)},wheel:function(t){var i=this,a=Number(this.options.wheelZoomRatio)||.1,n=1;this.disabled||(t.preventDefault(),!this.wheeling&&(this.wheeling=!0,setTimeout(function(){i.wheeling=!1},50),t.deltaY?n=t.deltaY>0?1:-1:t.wheelDelta?n=-t.wheelDelta/120:t.detail&&(n=t.detail>0?1:-1),this.zoom(-n*a,t)))},cropStart:function(t){var i=t.buttons,a=t.button;if(!(this.disabled||(t.type==="mousedown"||t.type==="pointerdown"&&t.pointerType==="mouse")&&(Y(i)&&i!==1||Y(a)&&a!==0||t.ctrlKey))){var n=this.options,l=this.pointers,o;t.changedTouches?oe(t.changedTouches,function(r){l[r.identifier]=bi(r)}):l[t.pointerId||0]=bi(t),Object.keys(l).length>1&&n.zoomable&&n.zoomOnTouch?o=wl:o=ha(t.target,Ht),Vp.test(o)&&Rt(this.element,ga,{originalEvent:t,action:o})!==!1&&(t.preventDefault(),this.action=o,this.cropping=!1,o===Sl&&(this.cropping=!0,pe(this.dragBox,Ei)))}},cropMove:function(t){var i=this.action;if(!(this.disabled||!i)){var a=this.pointers;t.preventDefault(),Rt(this.element,ua,{originalEvent:t,action:i})!==!1&&(t.changedTouches?oe(t.changedTouches,function(n){J(a[n.identifier]||{},bi(n,!0))}):J(a[t.pointerId||0]||{},bi(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var i=this.action,a=this.pointers;t.changedTouches?oe(t.changedTouches,function(n){delete a[n.identifier]}):delete a[t.pointerId||0],i&&(t.preventDefault(),Object.keys(a).length||(this.action=""),this.cropping&&(this.cropping=!1,xt(this.dragBox,Ei,this.cropped&&this.options.modal)),Rt(this.element,ma,{originalEvent:t,action:i}))}}},gm={change:function(t){var i=this.options,a=this.canvasData,n=this.containerData,l=this.cropBoxData,o=this.pointers,r=this.action,s=i.aspectRatio,p=l.left,c=l.top,d=l.width,m=l.height,u=p+d,g=c+m,f=0,h=0,I=n.width,b=n.height,E=!0,v;!s&&t.shiftKey&&(s=d&&m?d/m:1),this.limited&&(f=l.minLeft,h=l.minTop,I=f+Math.min(n.width,a.width,a.left+a.width),b=h+Math.min(n.height,a.height,a.top+a.height));var y=o[Object.keys(o)[0]],T={x:y.endX-y.startX,y:y.endY-y.startY},_=function(R){switch(R){case nt:u+T.x>I&&(T.x=I-u);break;case lt:p+T.xb&&(T.y=b-g);break}};switch(r){case Ta:p+=T.x,c+=T.y;break;case nt:if(T.x>=0&&(u>=I||s&&(c<=h||g>=b))){E=!1;break}_(nt),d+=T.x,d<0&&(r=lt,d=-d,p-=d),s&&(m=d/s,c+=(l.height-m)/2);break;case We:if(T.y<=0&&(c<=h||s&&(p<=f||u>=I))){E=!1;break}_(We),m-=T.y,c+=T.y,m<0&&(r=It,m=-m,c-=m),s&&(d=m*s,p+=(l.width-d)/2);break;case lt:if(T.x<=0&&(p<=f||s&&(c<=h||g>=b))){E=!1;break}_(lt),d-=T.x,p+=T.x,d<0&&(r=nt,d=-d,p-=d),s&&(m=d/s,c+=(l.height-m)/2);break;case It:if(T.y>=0&&(g>=b||s&&(p<=f||u>=I))){E=!1;break}_(It),m+=T.y,m<0&&(r=We,m=-m,c-=m),s&&(d=m*s,p+=(l.width-d)/2);break;case kt:if(s){if(T.y<=0&&(c<=h||u>=I)){E=!1;break}_(We),m-=T.y,c+=T.y,d=m*s}else _(We),_(nt),T.x>=0?uh&&(m-=T.y,c+=T.y):(m-=T.y,c+=T.y);d<0&&m<0?(r=Gt,m=-m,d=-d,c-=m,p-=d):d<0?(r=Nt,d=-d,p-=d):m<0&&(r=Vt,m=-m,c-=m);break;case Nt:if(s){if(T.y<=0&&(c<=h||p<=f)){E=!1;break}_(We),m-=T.y,c+=T.y,d=m*s,p+=l.width-d}else _(We),_(lt),T.x<=0?p>f?(d-=T.x,p+=T.x):T.y<=0&&c<=h&&(E=!1):(d-=T.x,p+=T.x),T.y<=0?c>h&&(m-=T.y,c+=T.y):(m-=T.y,c+=T.y);d<0&&m<0?(r=Vt,m=-m,d=-d,c-=m,p-=d):d<0?(r=kt,d=-d,p-=d):m<0&&(r=Gt,m=-m,c-=m);break;case Gt:if(s){if(T.x<=0&&(p<=f||g>=b)){E=!1;break}_(lt),d-=T.x,p+=T.x,m=d/s}else _(It),_(lt),T.x<=0?p>f?(d-=T.x,p+=T.x):T.y>=0&&g>=b&&(E=!1):(d-=T.x,p+=T.x),T.y>=0?g=0&&(u>=I||g>=b)){E=!1;break}_(nt),d+=T.x,m=d/s}else _(It),_(nt),T.x>=0?u=0&&g>=b&&(E=!1):d+=T.x,T.y>=0?g0?r=T.y>0?Vt:kt:T.x<0&&(p-=d,r=T.y>0?Gt:Nt),T.y<0&&(c-=m),this.cropped||(Oe(this.cropBox,Ee),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0));break}E&&(l.width=d,l.height=m,l.left=p,l.top=c,this.action=r,this.renderCropBox()),oe(o,function(x){x.startX=x.endX,x.startY=x.endY})}},fm={crop:function(){return this.ready&&!this.cropped&&!this.disabled&&(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&pe(this.dragBox,Ei),Oe(this.cropBox,Ee),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=J({},this.initialImageData),this.canvasData=J({},this.initialCanvasData),this.cropBoxData=J({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(J(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),Oe(this.dragBox,Ei),pe(this.cropBox,Ee)),this},replace:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return!this.disabled&&t&&(this.isImg&&(this.element.src=t),i?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,oe(this.previews,function(a){a.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,Oe(this.cropper,sl)),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,pe(this.cropper,sl)),this},destroy:function(){var t=this.element;return t[Q]?(t[Q]=void 0,this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),this):this},move:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.canvasData,n=a.left,l=a.top;return this.moveTo(la(t)?t:n+Number(t),la(i)?i:l+Number(i))},moveTo:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.canvasData,n=!1;return t=Number(t),i=Number(i),this.ready&&!this.disabled&&this.options.movable&&(Y(t)&&(a.left=t,n=!0),Y(i)&&(a.top=i,n=!0),n&&this.renderCanvas(!0)),this},zoom:function(t,i){var a=this.canvasData;return t=Number(t),t<0?t=1/(1-t):t=1+t,this.zoomTo(a.width*t/a.naturalWidth,null,i)},zoomTo:function(t,i,a){var n=this.options,l=this.canvasData,o=l.width,r=l.height,s=l.naturalWidth,p=l.naturalHeight;if(t=Number(t),t>=0&&this.ready&&!this.disabled&&n.zoomable){var c=s*t,d=p*t;if(Rt(this.element,fa,{ratio:t,oldRatio:o/s,originalEvent:a})===!1)return this;if(a){var m=this.pointers,u=Dl(this.cropper),g=m&&Object.keys(m).length?tm(m):{pageX:a.pageX,pageY:a.pageY};l.left-=(c-o)*((g.pageX-u.left-l.left)/o),l.top-=(d-r)*((g.pageY-u.top-l.top)/r)}else vt(i)&&Y(i.x)&&Y(i.y)?(l.left-=(c-o)*((i.x-l.left)/o),l.top-=(d-r)*((i.y-l.top)/r)):(l.left-=(c-o)/2,l.top-=(d-r)/2);l.width=c,l.height=d,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return t=Number(t),Y(t)&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var i=this.imageData.scaleY;return this.scale(t,Y(i)?i:1)},scaleY:function(t){var i=this.imageData.scaleX;return this.scale(Y(i)?i:1,t)},scale:function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:t,a=this.imageData,n=!1;return t=Number(t),i=Number(i),this.ready&&!this.disabled&&this.options.scalable&&(Y(t)&&(a.scaleX=t,n=!0),Y(i)&&(a.scaleY=i,n=!0),n&&this.renderCanvas(!0,!0)),this},getData:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,i=this.options,a=this.imageData,n=this.canvasData,l=this.cropBoxData,o;if(this.ready&&this.cropped){o={x:l.left-n.left,y:l.top-n.top,width:l.width,height:l.height};var r=a.width/a.naturalWidth;if(oe(o,function(c,d){o[d]=c/r}),t){var s=Math.round(o.y+o.height),p=Math.round(o.x+o.width);o.x=Math.round(o.x),o.y=Math.round(o.y),o.width=p-o.x,o.height=s-o.y}}else o={x:0,y:0,width:0,height:0};return i.rotatable&&(o.rotate=a.rotate||0),i.scalable&&(o.scaleX=a.scaleX||1,o.scaleY=a.scaleY||1),o},setData:function(t){var i=this.options,a=this.imageData,n=this.canvasData,l={};if(this.ready&&!this.disabled&&vt(t)){var o=!1;i.rotatable&&Y(t.rotate)&&t.rotate!==a.rotate&&(a.rotate=t.rotate,o=!0),i.scalable&&(Y(t.scaleX)&&t.scaleX!==a.scaleX&&(a.scaleX=t.scaleX,o=!0),Y(t.scaleY)&&t.scaleY!==a.scaleY&&(a.scaleY=t.scaleY,o=!0)),o&&this.renderCanvas(!0,!0);var r=a.width/a.naturalWidth;Y(t.x)&&(l.left=t.x*r+n.left),Y(t.y)&&(l.top=t.y*r+n.top),Y(t.width)&&(l.width=t.width*r),Y(t.height)&&(l.height=t.height*r),this.setCropBoxData(l)}return this},getContainerData:function(){return this.ready?J({},this.containerData):{}},getImageData:function(){return this.sized?J({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,i={};return this.ready&&oe(["left","top","width","height","naturalWidth","naturalHeight"],function(a){i[a]=t[a]}),i},setCanvasData:function(t){var i=this.canvasData,a=i.aspectRatio;return this.ready&&!this.disabled&&vt(t)&&(Y(t.left)&&(i.left=t.left),Y(t.top)&&(i.top=t.top),Y(t.width)?(i.width=t.width,i.height=t.width/a):Y(t.height)&&(i.height=t.height,i.width=t.height*a),this.renderCanvas(!0)),this},getCropBoxData:function(){var t=this.cropBoxData,i;return this.ready&&this.cropped&&(i={left:t.left,top:t.top,width:t.width,height:t.height}),i||{}},setCropBoxData:function(t){var i=this.cropBoxData,a=this.options.aspectRatio,n,l;return this.ready&&this.cropped&&!this.disabled&&vt(t)&&(Y(t.left)&&(i.left=t.left),Y(t.top)&&(i.top=t.top),Y(t.width)&&t.width!==i.width&&(n=!0,i.width=t.width),Y(t.height)&&t.height!==i.height&&(l=!0,i.height=t.height),a&&(n?i.height=i.width/a:l&&(i.width=i.height*a)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var i=this.canvasData,a=am(this.image,this.imageData,i,t);if(!this.cropped)return a;var n=this.getData(t.rounded),l=n.x,o=n.y,r=n.width,s=n.height,p=a.width/Math.floor(i.naturalWidth);p!==1&&(l*=p,o*=p,r*=p,s*=p);var c=r/s,d=Ye({aspectRatio:c,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),m=Ye({aspectRatio:c,width:t.minWidth||0,height:t.minHeight||0},"cover"),u=Ye({aspectRatio:c,width:t.width||(p!==1?a.width:r),height:t.height||(p!==1?a.height:s)}),g=u.width,f=u.height;g=Math.min(d.width,Math.max(m.width,g)),f=Math.min(d.height,Math.max(m.height,f));var h=document.createElement("canvas"),I=h.getContext("2d");h.width=yt(g),h.height=yt(f),I.fillStyle=t.fillColor||"transparent",I.fillRect(0,0,g,f);var b=t.imageSmoothingEnabled,E=b===void 0?!0:b,v=t.imageSmoothingQuality;I.imageSmoothingEnabled=E,v&&(I.imageSmoothingQuality=v);var y=a.width,T=a.height,_=l,x=o,R,P,z,A,B,w;_<=-r||_>y?(_=0,R=0,z=0,B=0):_<=0?(z=-_,_=0,R=Math.min(y,r+_),B=R):_<=y&&(z=0,R=Math.min(r,y-_),B=R),R<=0||x<=-s||x>T?(x=0,P=0,A=0,w=0):x<=0?(A=-x,x=0,P=Math.min(T,s+x),w=P):x<=T&&(A=0,P=Math.min(s,T-x),w=P);var F=[_,x,R,P];if(B>0&&w>0){var S=g/r;F.push(z*S,A*S,B*S,w*S)}return I.drawImage.apply(I,[a].concat(Rl(F.map(function(L){return Math.floor(yt(L))})))),h},setAspectRatio:function(t){var i=this.options;return!this.disabled&&!la(t)&&(i.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var i=this.options,a=this.dragBox,n=this.face;if(this.ready&&!this.disabled){var l=t===Ia,o=i.movable&&t===Ll;t=l||o?t:Ml,i.dragMode=t,Wt(a,Ht,t),xt(a,ca,l),xt(a,da,o),i.cropBoxMovable||(Wt(n,Ht,t),xt(n,ca,l),xt(n,da,o))}return this}},hm=De.Cropper,xa=(function(){function e(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(Mp(this,e),!t||!Hp.test(t.tagName))throw new Error("The first argument is required and must be an or element.");this.element=t,this.options=J({},El,vt(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return Ap(e,[{key:"init",value:function(){var i=this.element,a=i.tagName.toLowerCase(),n;if(!i[Q]){if(i[Q]=this,a==="img"){if(this.isImg=!0,n=i.getAttribute("src")||"",this.originalUrl=n,!n)return;n=i.src}else a==="canvas"&&window.HTMLCanvasElement&&(n=i.toDataURL());this.load(n)}}},{key:"load",value:function(i){var a=this;if(i){this.url=i,this.imageData={};var n=this.element,l=this.options;if(!l.rotatable&&!l.scalable&&(l.checkOrientation=!1),!l.checkOrientation||!window.ArrayBuffer){this.clone();return}if(Gp.test(i)){Up.test(i)?this.read(om(i)):this.clone();return}var o=new XMLHttpRequest,r=this.clone.bind(this);this.reloading=!0,this.xhr=o,o.onabort=r,o.onerror=r,o.ontimeout=r,o.onprogress=function(){o.getResponseHeader("content-type")!==bl&&o.abort()},o.onload=function(){a.read(o.response)},o.onloadend=function(){a.reloading=!1,a.xhr=null},l.checkCrossOrigin&&Il(i)&&n.crossOrigin&&(i=vl(i)),o.open("GET",i,!0),o.responseType="arraybuffer",o.withCredentials=n.crossOrigin==="use-credentials",o.send()}}},{key:"read",value:function(i){var a=this.options,n=this.imageData,l=sm(i),o=0,r=1,s=1;if(l>1){this.url=rm(i,bl);var p=cm(l);o=p.rotate,r=p.scaleX,s=p.scaleY}a.rotatable&&(n.rotate=o),a.scalable&&(n.scaleX=r,n.scaleY=s),this.clone()}},{key:"clone",value:function(){var i=this.element,a=this.url,n=i.crossOrigin,l=a;this.options.checkCrossOrigin&&Il(a)&&(n||(n="anonymous"),l=vl(a)),this.crossOrigin=n,this.crossOriginUrl=l;var o=document.createElement("img");n&&(o.crossOrigin=n),o.src=l||a,o.alt=i.alt||"The image to crop",this.image=o,o.onload=this.start.bind(this),o.onerror=this.stop.bind(this),pe(o,cl),i.parentNode.insertBefore(o,i.nextSibling)}},{key:"start",value:function(){var i=this,a=this.image;a.onload=null,a.onerror=null,this.sizing=!0;var n=De.navigator&&/(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(De.navigator.userAgent),l=function(p,c){J(i.imageData,{naturalWidth:p,naturalHeight:c,aspectRatio:p/c}),i.initialImageData=J({},i.imageData),i.sizing=!1,i.sized=!0,i.build()};if(a.naturalWidth&&!n){l(a.naturalWidth,a.naturalHeight);return}var o=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=o,o.onload=function(){l(o.width,o.height),n||r.removeChild(o)},o.src=a.src,n||(o.style.cssText="left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;",r.appendChild(o))}},{key:"stop",value:function(){var i=this.image;i.onload=null,i.onerror=null,i.parentNode.removeChild(i),this.image=null}},{key:"build",value:function(){if(!(!this.sized||this.ready)){var i=this.element,a=this.options,n=this.image,l=i.parentNode,o=document.createElement("div");o.innerHTML=Wp;var r=o.querySelector(".".concat(Q,"-container")),s=r.querySelector(".".concat(Q,"-canvas")),p=r.querySelector(".".concat(Q,"-drag-box")),c=r.querySelector(".".concat(Q,"-crop-box")),d=c.querySelector(".".concat(Q,"-face"));this.container=l,this.cropper=r,this.canvas=s,this.dragBox=p,this.cropBox=c,this.viewBox=r.querySelector(".".concat(Q,"-view-box")),this.face=d,s.appendChild(n),pe(i,Ee),l.insertBefore(r,i.nextSibling),Oe(n,cl),this.initPreview(),this.bind(),a.initialAspectRatio=Math.max(0,a.initialAspectRatio)||NaN,a.aspectRatio=Math.max(0,a.aspectRatio)||NaN,a.viewMode=Math.max(0,Math.min(3,Math.round(a.viewMode)))||0,pe(c,Ee),a.guides||pe(c.getElementsByClassName("".concat(Q,"-dashed")),Ee),a.center||pe(c.getElementsByClassName("".concat(Q,"-center")),Ee),a.background&&pe(r,"".concat(Q,"-bg")),a.highlight||pe(d,Cp),a.cropBoxMovable&&(pe(d,da),Wt(d,Ht,Ta)),a.cropBoxResizable||(pe(c.getElementsByClassName("".concat(Q,"-line")),Ee),pe(c.getElementsByClassName("".concat(Q,"-point")),Ee)),this.render(),this.ready=!0,this.setDragMode(a.dragMode),a.autoCrop&&this.crop(),this.setData(a.data),be(a.ready)&&Se(i,gl,a.ready,{once:!0}),Rt(i,gl)}}},{key:"unbuild",value:function(){if(this.ready){this.ready=!1,this.unbind(),this.resetPreview();var i=this.cropper.parentNode;i&&i.removeChild(this.cropper),Oe(this.element,Ee)}}},{key:"uncreate",value:function(){this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?(this.xhr.onabort=null,this.xhr.abort()):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=hm,e}},{key:"setDefaults",value:function(i){J(El,vt(i)&&i)}}])})();J(xa.prototype,dm,pm,mm,um,gm,fm);var Bl={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.autodesk.fbx":["fbx"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dcmp+xml":["dcmp"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.slides":["ggs"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.drawing":["gdraw"],"application/vnd.google-apps.form":["gform"],"application/vnd.google-apps.jam":["gjam"],"application/vnd.google-apps.map":["gmap"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.script":["gscript"],"application/vnd.google-apps.site":["gsite"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.gov.sk.xmldatacontainer+xml":["xdcf"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-visio.viewer":["vdx"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.nato.bindingdataobject+xml":["bdo"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.procrate.brushset":["brushset"],"application/vnd.procreate.brush":["brush"],"application/vnd.procreate.dream":["drm"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw","vsdx","vtx"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blender":["blend"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-compressed":["*rar"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-ipynb+json":["ipynb"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zip-compressed":["*zip"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.blockfact.facti":["facti"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-adobe-dng":["dng"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.bary":["bary"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["*mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(Bl);var kl=Bl;var Nl={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/dicom":["dcm"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg","one","onea"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"application/zip+dotlottie":["lottie"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a","m4b"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/ief":["ief"],"image/jaii":["jaii"],"image/jais":["jais"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpg","jpeg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxl":["jxl"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/pjpeg":["jfif"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime","mht","mhtml"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step":["step","stp","stpnc","p21","210"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts","m2t","m2ts","mts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(Nl);var Vl=Nl;var _e=function(e,t,i,a){if(i==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof t=="function"?e!==t||!a:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?a:i==="a"?a.call(e):a?a.value:t.get(e)},St,jt,rt,ya=class{constructor(...t){St.set(this,new Map),jt.set(this,new Map),rt.set(this,new Map);for(let i of t)this.define(i)}define(t,i=!1){for(let[a,n]of Object.entries(t)){a=a.toLowerCase(),n=n.map(r=>r.toLowerCase()),_e(this,rt,"f").has(a)||_e(this,rt,"f").set(a,new Set);let l=_e(this,rt,"f").get(a),o=!0;for(let r of n){let s=r.startsWith("*");if(r=s?r.slice(1):r,l?.add(r),o&&_e(this,jt,"f").set(a,r),o=!1,s)continue;let p=_e(this,St,"f").get(r);if(p&&p!=a&&!i)throw new Error(`"${a} -> ${r}" conflicts with "${p} -> ${r}". Pass \`force=true\` to override this definition.`);_e(this,St,"f").set(r,a)}}return this}getType(t){if(typeof t!="string")return null;let i=t.replace(/^.*[/\\]/s,"").toLowerCase(),a=i.replace(/^.*\./s,"").toLowerCase(),n=i.length{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let t of _e(this,rt,"f").values())Object.freeze(t);return this}_getTestState(){return{types:_e(this,St,"f"),extensions:_e(this,jt,"f")}}};St=new WeakMap,jt=new WeakMap,rt=new WeakMap;var Ra=ya;var Gl=new Ra(Vl,kl)._freeze();var Ul=({addFilter:e,utils:t})=>{let{Type:i,replaceInString:a,toNaturalFileSize:n}=t;return e("ALLOW_HOPPER_ITEM",(l,{query:o})=>{if(!o("GET_ALLOW_FILE_SIZE_VALIDATION"))return!0;let r=o("GET_MAX_FILE_SIZE");if(r!==null&&l.size>r)return!1;let s=o("GET_MIN_FILE_SIZE");return!(s!==null&&l.sizenew Promise((r,s)=>{if(!o("GET_ALLOW_FILE_SIZE_VALIDATION"))return r(l);let p=o("GET_FILE_VALIDATE_SIZE_FILTER");if(p&&!p(l))return r(l);let c=o("GET_MAX_FILE_SIZE");if(c!==null&&l.size>c){s({status:{main:o("GET_LABEL_MAX_FILE_SIZE_EXCEEDED"),sub:a(o("GET_LABEL_MAX_FILE_SIZE"),{filesize:n(c,".",o("GET_FILE_SIZE_BASE"),o("GET_FILE_SIZE_LABELS",o))})}});return}let d=o("GET_MIN_FILE_SIZE");if(d!==null&&l.sizeg+f.fileSize,0)>m){s({status:{main:o("GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED"),sub:a(o("GET_LABEL_MAX_TOTAL_FILE_SIZE"),{filesize:n(m,".",o("GET_FILE_SIZE_BASE"),o("GET_FILE_SIZE_LABELS",o))})}});return}r(l)})),{options:{allowFileSizeValidation:[!0,i.BOOLEAN],maxFileSize:[null,i.INT],minFileSize:[null,i.INT],maxTotalFileSize:[null,i.INT],fileValidateSizeFilter:[null,i.FUNCTION],labelMinFileSizeExceeded:["File is too small",i.STRING],labelMinFileSize:["Minimum file size is {filesize}",i.STRING],labelMaxFileSizeExceeded:["File is too large",i.STRING],labelMaxFileSize:["Maximum file size is {filesize}",i.STRING],labelMaxTotalFileSizeExceeded:["Maximum total size exceeded",i.STRING],labelMaxTotalFileSize:["Maximum total file size is {filesize}",i.STRING]}}},bm=typeof window<"u"&&typeof window.document<"u";bm&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Ul}));var Hl=Ul;var Wl=({addFilter:e,utils:t})=>{let{Type:i,isString:a,replaceInString:n,guesstimateMimeType:l,getExtensionFromFilename:o,getFilenameFromURL:r}=t,s=(u,g)=>{let f=(/^[^/]+/.exec(u)||[]).pop(),h=g.slice(0,-2);return f===h},p=(u,g)=>u.some(f=>/\*$/.test(f)?s(g,f):f===g),c=u=>{let g="";if(a(u)){let f=r(u),h=o(f);h&&(g=l(h))}else g=u.type;return g},d=(u,g,f)=>{if(g.length===0)return!0;let h=c(u);return f?new Promise((I,b)=>{f(u,h).then(E=>{p(g,E)?I():b()}).catch(b)}):p(g,h)},m=u=>g=>u[g]===null?!1:u[g]||g;return e("SET_ATTRIBUTE_TO_OPTION_MAP",u=>Object.assign(u,{accept:"acceptedFileTypes"})),e("ALLOW_HOPPER_ITEM",(u,{query:g})=>g("GET_ALLOW_FILE_TYPE_VALIDATION")?d(u,g("GET_ACCEPTED_FILE_TYPES")):!0),e("LOAD_FILE",(u,{query:g})=>new Promise((f,h)=>{if(!g("GET_ALLOW_FILE_TYPE_VALIDATION")){f(u);return}let I=g("GET_ACCEPTED_FILE_TYPES"),b=g("GET_FILE_VALIDATE_TYPE_DETECT_TYPE"),E=d(u,I,b),v=()=>{let y=I.map(m(g("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP"))).filter(_=>_!==!1),T=y.filter((_,x)=>y.indexOf(_)===x);h({status:{main:g("GET_LABEL_FILE_TYPE_NOT_ALLOWED"),sub:n(g("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES"),{allTypes:T.join(", "),allButLastType:T.slice(0,-1).join(", "),lastType:T[T.length-1]})}})};if(typeof E=="boolean")return E?f(u):v();E.then(()=>{f(u)}).catch(v)})),{options:{allowFileTypeValidation:[!0,i.BOOLEAN],acceptedFileTypes:[[],i.ARRAY],labelFileTypeNotAllowed:["File is of invalid type",i.STRING],fileValidateTypeLabelExpectedTypes:["Expects {allButLastType} or {lastType}",i.STRING],fileValidateTypeLabelExpectedTypesMap:[{},i.OBJECT],fileValidateTypeDetectType:[null,i.FUNCTION]}}},Em=typeof window<"u"&&typeof window.document<"u";Em&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Wl}));var jl=Wl;var Yl=e=>/^image/.test(e.type),ql=({addFilter:e,utils:t})=>{let{Type:i,isFile:a,getNumericAspectRatioFromString:n}=t,l=(p,c)=>!(!Yl(p.file)||!c("GET_ALLOW_IMAGE_CROP")),o=p=>typeof p=="object",r=p=>typeof p=="number",s=(p,c)=>p.setMetadata("crop",Object.assign({},p.getMetadata("crop"),c));return e("DID_CREATE_ITEM",(p,{query:c})=>{p.extend("setImageCrop",d=>{if(!(!l(p,c)||!o(center)))return p.setMetadata("crop",d),d}),p.extend("setImageCropCenter",d=>{if(!(!l(p,c)||!o(d)))return s(p,{center:d})}),p.extend("setImageCropZoom",d=>{if(!(!l(p,c)||!r(d)))return s(p,{zoom:Math.max(1,d)})}),p.extend("setImageCropRotation",d=>{if(!(!l(p,c)||!r(d)))return s(p,{rotation:d})}),p.extend("setImageCropFlip",d=>{if(!(!l(p,c)||!o(d)))return s(p,{flip:d})}),p.extend("setImageCropAspectRatio",d=>{if(!l(p,c)||typeof d>"u")return;let m=p.getMetadata("crop"),u=n(d),g={center:{x:.5,y:.5},flip:m?Object.assign({},m.flip):{horizontal:!1,vertical:!1},rotation:0,zoom:1,aspectRatio:u};return p.setMetadata("crop",g),g})}),e("DID_LOAD_ITEM",(p,{query:c})=>new Promise((d,m)=>{let u=p.file;if(!a(u)||!Yl(u)||!c("GET_ALLOW_IMAGE_CROP")||p.getMetadata("crop"))return d(p);let f=c("GET_IMAGE_CROP_ASPECT_RATIO");p.setMetadata("crop",{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},rotation:0,zoom:1,aspectRatio:f?n(f):null}),d(p)})),{options:{allowImageCrop:[!0,i.BOOLEAN],imageCropAspectRatio:[null,i.STRING]}}},Tm=typeof window<"u"&&typeof window.document<"u";Tm&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:ql}));var $l=ql;var Sa=e=>/^image/.test(e.type),Xl=e=>{let{addFilter:t,utils:i,views:a}=e,{Type:n,createRoute:l,createItemAPI:o=c=>c}=i,{fileActionButton:r}=a;t("SHOULD_REMOVE_ON_REVERT",(c,{item:d,query:m})=>new Promise(u=>{let{file:g}=d,f=m("GET_ALLOW_IMAGE_EDIT")&&m("GET_IMAGE_EDIT_ALLOW_EDIT")&&Sa(g);u(!f)})),t("DID_LOAD_ITEM",(c,{query:d,dispatch:m})=>new Promise((u,g)=>{if(c.origin>1){u(c);return}let{file:f}=c;if(!d("GET_ALLOW_IMAGE_EDIT")||!d("GET_IMAGE_EDIT_INSTANT_EDIT")){u(c);return}if(!Sa(f)){u(c);return}let h=(b,E,v)=>y=>{s.shift(),y?E(b):v(b),m("KICK"),I()},I=()=>{if(!s.length)return;let{item:b,resolve:E,reject:v}=s[0];m("EDIT_ITEM",{id:b.id,handleEditorResponse:h(b,E,v)})};p({item:c,resolve:u,reject:g}),s.length===1&&I()})),t("DID_CREATE_ITEM",(c,{query:d,dispatch:m})=>{c.extend("edit",()=>{m("EDIT_ITEM",{id:c.id})})});let s=[],p=c=>(s.push(c),c);return t("CREATE_VIEW",c=>{let{is:d,view:m,query:u}=c;if(!u("GET_ALLOW_IMAGE_EDIT"))return;let g=u("GET_ALLOW_IMAGE_PREVIEW");if(!(d("file-info")&&!g||d("file")&&g))return;let h=u("GET_IMAGE_EDIT_EDITOR");if(!h)return;h.filepondCallbackBridge||(h.outputData=!0,h.outputFile=!1,h.filepondCallbackBridge={onconfirm:h.onconfirm||(()=>{}),oncancel:h.oncancel||(()=>{})});let I=({root:v,props:y,action:T})=>{let{id:_}=y,{handleEditorResponse:x}=T;h.cropAspectRatio=v.query("GET_IMAGE_CROP_ASPECT_RATIO")||h.cropAspectRatio,h.outputCanvasBackgroundColor=v.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||h.outputCanvasBackgroundColor;let R=v.query("GET_ITEM",_);if(!R)return;let P=R.file,z=R.getMetadata("crop"),A={center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},B=R.getMetadata("resize"),w=R.getMetadata("filter")||null,F=R.getMetadata("filters")||null,S=R.getMetadata("colors")||null,L=R.getMetadata("markup")||null,D={crop:z||A,size:B?{upscale:B.upscale,mode:B.mode,width:B.size.width,height:B.size.height}:null,filter:F?F.id||F.matrix:v.query("GET_ALLOW_IMAGE_FILTER")&&v.query("GET_IMAGE_FILTER_COLOR_MATRIX")&&!S?w:null,color:S,markup:L};h.onconfirm=({data:O})=>{let{crop:U,size:C,filter:X,color:K,colorMatrix:Z,markup:ce}=O,V={};if(U&&(V.crop=U),C){let W=(R.getMetadata("resize")||{}).size,$={width:C.width,height:C.height};!($.width&&$.height)&&W&&($.width=W.width,$.height=W.height),($.width||$.height)&&(V.resize={upscale:C.upscale,mode:C.mode,size:$})}ce&&(V.markup=ce),V.colors=K,V.filters=X,V.filter=Z,R.setMetadata(V),h.filepondCallbackBridge.onconfirm(O,o(R)),x&&(h.onclose=()=>{x(!0),h.onclose=null})},h.oncancel=()=>{h.filepondCallbackBridge.oncancel(o(R)),x&&(h.onclose=()=>{x(!1),h.onclose=null})},h.open(P,D)},b=({root:v,props:y})=>{if(!u("GET_IMAGE_EDIT_ALLOW_EDIT"))return;let{id:T}=y,_=u("GET_ITEM",T);if(!_)return;let x=_.file;if(Sa(x))if(v.ref.handleEdit=R=>{R.stopPropagation(),v.dispatch("EDIT_ITEM",{id:T})},g){let R=m.createChildView(r,{label:"edit",icon:u("GET_IMAGE_EDIT_ICON_EDIT"),opacity:0});R.element.classList.add("filepond--action-edit-item"),R.element.dataset.align=u("GET_STYLE_IMAGE_EDIT_BUTTON_EDIT_ITEM_POSITION"),R.on("click",v.ref.handleEdit),v.ref.buttonEditItem=m.appendChildView(R)}else{let R=m.element.querySelector(".filepond--file-info-main"),P=document.createElement("button");P.className="filepond--action-edit-item-alt",P.innerHTML=u("GET_IMAGE_EDIT_ICON_EDIT")+"edit",P.addEventListener("click",v.ref.handleEdit),R.appendChild(P),v.ref.editButton=P}};m.registerDestroyer(({root:v})=>{v.ref.buttonEditItem&&v.ref.buttonEditItem.off("click",v.ref.handleEdit),v.ref.editButton&&v.ref.editButton.removeEventListener("click",v.ref.handleEdit)});let E={EDIT_ITEM:I,DID_LOAD_ITEM:b};if(g){let v=({root:y})=>{y.ref.buttonEditItem&&(y.ref.buttonEditItem.opacity=1)};E.DID_IMAGE_PREVIEW_SHOW=v}m.registerWriter(l(E))}),{options:{allowImageEdit:[!0,n.BOOLEAN],styleImageEditButtonEditItemPosition:["bottom center",n.STRING],imageEditInstantEdit:[!1,n.BOOLEAN],imageEditAllowEdit:[!0,n.BOOLEAN],imageEditIconEdit:['',n.STRING],imageEditEditor:[null,n.OBJECT]}}},Im=typeof window<"u"&&typeof window.document<"u";Im&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Xl}));var Kl=Xl;var vm=e=>/^image\/jpeg/.test(e.type),st={JPEG:65496,APP1:65505,EXIF:1165519206,TIFF:18761,Orientation:274,Unknown:65280},ct=(e,t,i=!1)=>e.getUint16(t,i),Zl=(e,t,i=!1)=>e.getUint32(t,i),xm=e=>new Promise((t,i)=>{let a=new FileReader;a.onload=function(n){let l=new DataView(n.target.result);if(ct(l,0)!==st.JPEG){t(-1);return}let o=l.byteLength,r=2;for(;rym,Sm="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QA6RXhpZgAATU0AKgAAAAgAAwESAAMAAAABAAYAAAEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////wAALCAABAAIBASIA/8QAJgABAAAAAAAAAAAAAAAAAAAAAxABAAAAAAAAAAAAAAAAAAAAAP/aAAgBAQAAPwBH/9k=",Ql,Ii=Rm()?new Image:{};Ii.onload=()=>Ql=Ii.naturalWidth>Ii.naturalHeight;Ii.src=Sm;var _m=()=>Ql,Jl=({addFilter:e,utils:t})=>{let{Type:i,isFile:a}=t;return e("DID_LOAD_ITEM",(n,{query:l})=>new Promise((o,r)=>{let s=n.file;if(!a(s)||!vm(s)||!l("GET_ALLOW_IMAGE_EXIF_ORIENTATION")||!_m())return o(n);xm(s).then(p=>{n.setMetadata("exif",{orientation:p}),o(n)})})),{options:{allowImageExifOrientation:[!0,i.BOOLEAN]}}},wm=typeof window<"u"&&typeof window.document<"u";wm&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Jl}));var eo=Jl;var Lm=e=>/^image/.test(e.type),to=(e,t)=>qt(e.x*t,e.y*t),io=(e,t)=>qt(e.x+t.x,e.y+t.y),Mm=e=>{let t=Math.sqrt(e.x*e.x+e.y*e.y);return t===0?{x:0,y:0}:qt(e.x/t,e.y/t)},vi=(e,t,i)=>{let a=Math.cos(t),n=Math.sin(t),l=qt(e.x-i.x,e.y-i.y);return qt(i.x+a*l.x-n*l.y,i.y+n*l.x+a*l.y)},qt=(e=0,t=0)=>({x:e,y:t}),Te=(e,t,i=1,a)=>{if(typeof e=="string")return parseFloat(e)*i;if(typeof e=="number")return e*(a?t[a]:Math.min(t.width,t.height))},Am=(e,t,i)=>{let a=e.borderStyle||e.lineStyle||"solid",n=e.backgroundColor||e.fontColor||"transparent",l=e.borderColor||e.lineColor||"transparent",o=Te(e.borderWidth||e.lineWidth,t,i),r=e.lineCap||"round",s=e.lineJoin||"round",p=typeof a=="string"?"":a.map(d=>Te(d,t,i)).join(","),c=e.opacity||1;return{"stroke-linecap":r,"stroke-linejoin":s,"stroke-width":o||0,"stroke-dasharray":p,stroke:l,fill:n,opacity:c}},we=e=>e!=null,zm=(e,t,i=1)=>{let a=Te(e.x,t,i,"width")||Te(e.left,t,i,"width"),n=Te(e.y,t,i,"height")||Te(e.top,t,i,"height"),l=Te(e.width,t,i,"width"),o=Te(e.height,t,i,"height"),r=Te(e.right,t,i,"width"),s=Te(e.bottom,t,i,"height");return we(n)||(we(o)&&we(s)?n=t.height-o-s:n=s),we(a)||(we(l)&&we(r)?a=t.width-l-r:a=r),we(l)||(we(a)&&we(r)?l=t.width-a-r:l=0),we(o)||(we(n)&&we(s)?o=t.height-n-s:o=0),{x:a||0,y:n||0,width:l||0,height:o||0}},Pm=e=>e.map((t,i)=>`${i===0?"M":"L"} ${t.x} ${t.y}`).join(" "),Be=(e,t)=>Object.keys(t).forEach(i=>e.setAttribute(i,t[i])),Fm="http://www.w3.org/2000/svg",_t=(e,t)=>{let i=document.createElementNS(Fm,e);return t&&Be(i,t),i},Om=e=>Be(e,{...e.rect,...e.styles}),Dm=e=>{let t=e.rect.x+e.rect.width*.5,i=e.rect.y+e.rect.height*.5,a=e.rect.width*.5,n=e.rect.height*.5;return Be(e,{cx:t,cy:i,rx:a,ry:n,...e.styles})},Cm={contain:"xMidYMid meet",cover:"xMidYMid slice"},Bm=(e,t)=>{Be(e,{...e.rect,...e.styles,preserveAspectRatio:Cm[t.fit]||"none"})},km={left:"start",center:"middle",right:"end"},Nm=(e,t,i,a)=>{let n=Te(t.fontSize,i,a),l=t.fontFamily||"sans-serif",o=t.fontWeight||"normal",r=km[t.textAlign]||"start";Be(e,{...e.rect,...e.styles,"stroke-width":0,"font-weight":o,"font-size":n,"font-family":l,"text-anchor":r}),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},Vm=(e,t,i,a)=>{Be(e,{...e.rect,...e.styles,fill:"none"});let n=e.childNodes[0],l=e.childNodes[1],o=e.childNodes[2],r=e.rect,s={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(Be(n,{x1:r.x,y1:r.y,x2:s.x,y2:s.y}),!t.lineDecoration)return;l.style.display="none",o.style.display="none";let p=Mm({x:s.x-r.x,y:s.y-r.y}),c=Te(.05,i,a);if(t.lineDecoration.indexOf("arrow-begin")!==-1){let d=to(p,c),m=io(r,d),u=vi(r,2,m),g=vi(r,-2,m);Be(l,{style:"display:block;",d:`M${u.x},${u.y} L${r.x},${r.y} L${g.x},${g.y}`})}if(t.lineDecoration.indexOf("arrow-end")!==-1){let d=to(p,-c),m=io(s,d),u=vi(s,2,m),g=vi(s,-2,m);Be(o,{style:"display:block;",d:`M${u.x},${u.y} L${s.x},${s.y} L${g.x},${g.y}`})}},Gm=(e,t,i,a)=>{Be(e,{...e.styles,fill:"none",d:Pm(t.points.map(n=>({x:Te(n.x,i,a,"width"),y:Te(n.y,i,a,"height")})))})},xi=e=>t=>_t(e,{id:t.id}),Um=e=>{let t=_t("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=()=>{t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},Hm=e=>{let t=_t("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=_t("line");t.appendChild(i);let a=_t("path");t.appendChild(a);let n=_t("path");return t.appendChild(n),t},Wm={image:Um,rect:xi("rect"),ellipse:xi("ellipse"),text:xi("text"),path:xi("path"),line:Hm},jm={rect:Om,ellipse:Dm,image:Bm,text:Nm,path:Gm,line:Vm},Ym=(e,t)=>Wm[e](t),qm=(e,t,i,a,n)=>{t!=="path"&&(e.rect=zm(i,a,n)),e.styles=Am(i,a,n),jm[t](e,i,a,n)},$m=["x","y","left","top","right","bottom","width","height"],Xm=e=>typeof e=="string"&&/%/.test(e)?parseFloat(e)/100:e,Km=e=>{let[t,i]=e,a=i.points?{}:$m.reduce((n,l)=>(n[l]=Xm(i[l]),n),{});return[t,{zIndex:0,...i,...a}]},Zm=(e,t)=>e[1].zIndex>t[1].zIndex?1:e[1].zIndexe.utils.createView({name:"image-preview-markup",tag:"svg",ignoreRect:!0,mixins:{apis:["width","height","crop","markup","resize","dirty"]},write:({root:t,props:i})=>{if(!i.dirty)return;let{crop:a,resize:n,markup:l}=i,o=i.width,r=i.height,s=a.width,p=a.height;if(n){let{size:u}=n,g=u&&u.width,f=u&&u.height,h=n.mode,I=n.upscale;g&&!f&&(f=g),f&&!g&&(g=f);let b=s{let[g,f]=u,h=Ym(g,f);qm(h,g,f,c,d),t.element.appendChild(h)})}}),Yt=(e,t)=>({x:e,y:t}),Jm=(e,t)=>e.x*t.x+e.y*t.y,ao=(e,t)=>Yt(e.x-t.x,e.y-t.y),eu=(e,t)=>Jm(ao(e,t),ao(e,t)),no=(e,t)=>Math.sqrt(eu(e,t)),lo=(e,t)=>{let i=e,a=1.5707963267948966,n=t,l=1.5707963267948966-t,o=Math.sin(a),r=Math.sin(n),s=Math.sin(l),p=Math.cos(l),c=i/o,d=c*r,m=c*s;return Yt(p*d,p*m)},tu=(e,t)=>{let i=e.width,a=e.height,n=lo(i,t),l=lo(a,t),o=Yt(e.x+Math.abs(n.x),e.y-Math.abs(n.y)),r=Yt(e.x+e.width+Math.abs(l.y),e.y+Math.abs(l.x)),s=Yt(e.x-Math.abs(l.y),e.y+e.height-Math.abs(l.x));return{width:no(o,r),height:no(o,s)}},iu=(e,t,i=1)=>{let a=e.height/e.width,n=1,l=t,o=1,r=a;r>l&&(r=l,o=r/a);let s=Math.max(n/o,l/r),p=e.width/(i*s*o),c=p*t;return{width:p,height:c}},ro=(e,t,i,a)=>{let n=a.x>.5?1-a.x:a.x,l=a.y>.5?1-a.y:a.y,o=n*2*e.width,r=l*2*e.height,s=tu(t,i);return Math.max(s.width/o,s.height/r)},so=(e,t)=>{let i=e.width,a=i*t;a>e.height&&(a=e.height,i=a/t);let n=(e.width-i)*.5,l=(e.height-a)*.5;return{x:n,y:l,width:i,height:a}},au=(e,t={})=>{let{zoom:i,rotation:a,center:n,aspectRatio:l}=t;l||(l=e.height/e.width);let o=iu(e,l,i),r={x:o.width*.5,y:o.height*.5},s={x:0,y:0,width:o.width,height:o.height,center:r},p=typeof t.scaleToFit>"u"||t.scaleToFit,c=ro(e,so(s,l),a,p?n:{x:.5,y:.5}),d=i*c;return{widthFloat:o.width/d,heightFloat:o.height/d,width:Math.round(o.width/d),height:Math.round(o.height/d)}},Ce={type:"spring",stiffness:.5,damping:.45,mass:10},nu=e=>e.utils.createView({name:"image-bitmap",ignoreRect:!0,mixins:{styles:["scaleX","scaleY"]},create:({root:t,props:i})=>{t.appendChild(i.image)}}),lu=e=>e.utils.createView({name:"image-canvas-wrapper",tag:"div",ignoreRect:!0,mixins:{apis:["crop","width","height"],styles:["originX","originY","translateX","translateY","scaleX","scaleY","rotateZ"],animations:{originX:Ce,originY:Ce,scaleX:Ce,scaleY:Ce,translateX:Ce,translateY:Ce,rotateZ:Ce}},create:({root:t,props:i})=>{i.width=i.image.width,i.height=i.image.height,t.ref.bitmap=t.appendChildView(t.createChildView(nu(e),{image:i.image}))},write:({root:t,props:i})=>{let{flip:a}=i.crop,{bitmap:n}=t.ref;n.scaleX=a.horizontal?-1:1,n.scaleY=a.vertical?-1:1}}),ou=e=>e.utils.createView({name:"image-clip",tag:"div",ignoreRect:!0,mixins:{apis:["crop","markup","resize","width","height","dirty","background"],styles:["width","height","opacity"],animations:{opacity:{type:"tween",duration:250}}},didWriteView:function({root:t,props:i}){i.background&&(t.element.style.backgroundColor=i.background)},create:({root:t,props:i})=>{t.ref.image=t.appendChildView(t.createChildView(lu(e),Object.assign({},i))),t.ref.createMarkup=()=>{t.ref.markup||(t.ref.markup=t.appendChildView(t.createChildView(Qm(e),Object.assign({},i))))},t.ref.destroyMarkup=()=>{t.ref.markup&&(t.removeChildView(t.ref.markup),t.ref.markup=null)};let a=t.query("GET_IMAGE_PREVIEW_TRANSPARENCY_INDICATOR");a!==null&&(a==="grid"?t.element.dataset.transparencyIndicator=a:t.element.dataset.transparencyIndicator="color")},write:({root:t,props:i,shouldOptimize:a})=>{let{crop:n,markup:l,resize:o,dirty:r,width:s,height:p}=i;t.ref.image.crop=n;let c={x:0,y:0,width:s,height:p,center:{x:s*.5,y:p*.5}},d={width:t.ref.image.width,height:t.ref.image.height},m={x:n.center.x*d.width,y:n.center.y*d.height},u={x:c.center.x-d.width*n.center.x,y:c.center.y-d.height*n.center.y},g=Math.PI*2+n.rotation%(Math.PI*2),f=n.aspectRatio||d.height/d.width,h=typeof n.scaleToFit>"u"||n.scaleToFit,I=ro(d,so(c,f),g,h?n.center:{x:.5,y:.5}),b=n.zoom*I;l&&l.length?(t.ref.createMarkup(),t.ref.markup.width=s,t.ref.markup.height=p,t.ref.markup.resize=o,t.ref.markup.dirty=r,t.ref.markup.markup=l,t.ref.markup.crop=au(d,n)):t.ref.markup&&t.ref.destroyMarkup();let E=t.ref.image;if(a){E.originX=null,E.originY=null,E.translateX=null,E.translateY=null,E.rotateZ=null,E.scaleX=null,E.scaleY=null;return}E.originX=m.x,E.originY=m.y,E.translateX=u.x,E.translateY=u.y,E.rotateZ=g,E.scaleX=b,E.scaleY=b}}),ru=e=>e.utils.createView({name:"image-preview",tag:"div",ignoreRect:!0,mixins:{apis:["image","crop","markup","resize","dirty","background"],styles:["translateY","scaleX","scaleY","opacity"],animations:{scaleX:Ce,scaleY:Ce,translateY:Ce,opacity:{type:"tween",duration:400}}},create:({root:t,props:i})=>{t.ref.clip=t.appendChildView(t.createChildView(ou(e),{id:i.id,image:i.image,crop:i.crop,markup:i.markup,resize:i.resize,dirty:i.dirty,background:i.background}))},write:({root:t,props:i,shouldOptimize:a})=>{let{clip:n}=t.ref,{image:l,crop:o,markup:r,resize:s,dirty:p}=i;if(n.crop=o,n.markup=r,n.resize=s,n.dirty=p,n.opacity=a?0:1,a||t.rect.element.hidden)return;let c=l.height/l.width,d=o.aspectRatio||c,m=t.rect.inner.width,u=t.rect.inner.height,g=t.query("GET_IMAGE_PREVIEW_HEIGHT"),f=t.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),h=t.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),I=t.query("GET_PANEL_ASPECT_RATIO"),b=t.query("GET_ALLOW_MULTIPLE");I&&!b&&(g=m*I,d=I);let E=g!==null?g:Math.max(f,Math.min(m*d,h)),v=E/d;v>m&&(v=m,E=v*d),E>u&&(E=u,v=u/d),n.width=v,n.height=E}}),su=` `,oo=0,cu=e=>e.utils.createView({name:"image-preview-overlay",tag:"div",ignoreRect:!0,create:({root:t,props:i})=>{let a=su;if(document.querySelector("base")){let n=new URL(window.location.href.replace(window.location.hash,"")).href;a=a.replace(/url\(\#/g,"url("+n+"#")}oo++,t.element.classList.add(`filepond--image-preview-overlay-${i.status}`),t.element.innerHTML=a.replace(/__UID__/g,oo)},mixins:{styles:["opacity"],animations:{opacity:{type:"spring",mass:25}}}}),du=function(){self.onmessage=e=>{createImageBitmap(e.data.message.file).then(t=>{self.postMessage({id:e.data.id,message:t},[t])})}},pu=function(){self.onmessage=e=>{let t=e.data.message.imageData,i=e.data.message.colorMatrix,a=t.data,n=a.length,l=i[0],o=i[1],r=i[2],s=i[3],p=i[4],c=i[5],d=i[6],m=i[7],u=i[8],g=i[9],f=i[10],h=i[11],I=i[12],b=i[13],E=i[14],v=i[15],y=i[16],T=i[17],_=i[18],x=i[19],R=0,P=0,z=0,A=0,B=0;for(;R{let i=new Image;i.onload=()=>{let a=i.naturalWidth,n=i.naturalHeight;i=null,t(a,n)},i.src=e},uu={1:()=>[1,0,0,1,0,0],2:e=>[-1,0,0,1,e,0],3:(e,t)=>[-1,0,0,-1,e,t],4:(e,t)=>[1,0,0,-1,0,t],5:()=>[0,1,1,0,0,0],6:(e,t)=>[0,1,-1,0,t,0],7:(e,t)=>[0,-1,-1,0,t,e],8:e=>[0,-1,1,0,0,e]},gu=(e,t,i,a)=>{a!==-1&&e.transform.apply(e,uu[a](t,i))},fu=(e,t,i,a)=>{t=Math.round(t),i=Math.round(i);let n=document.createElement("canvas");n.width=t,n.height=i;let l=n.getContext("2d");return a>=5&&a<=8&&([t,i]=[i,t]),gu(l,t,i,a),l.drawImage(e,0,0,t,i),n},co=e=>/^image/.test(e.type)&&!/svg/.test(e.type),hu=10,bu=10,Eu=e=>{let t=Math.min(hu/e.width,bu/e.height),i=document.createElement("canvas"),a=i.getContext("2d"),n=i.width=Math.ceil(e.width*t),l=i.height=Math.ceil(e.height*t);a.drawImage(e,0,0,n,l);let o=null;try{o=a.getImageData(0,0,n,l).data}catch{return null}let r=o.length,s=0,p=0,c=0,d=0;for(;dMath.floor(Math.sqrt(e/(t/4))),Tu=(e,t)=>(t=t||document.createElement("canvas"),t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t),Iu=e=>{let t;try{t=new ImageData(e.width,e.height)}catch{t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(new Uint8ClampedArray(e.data)),t},vu=e=>new Promise((t,i)=>{let a=new Image;a.crossOrigin="Anonymous",a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),xu=e=>{let t=cu(e),i=ru(e),{createWorker:a}=e.utils,n=(b,E,v)=>new Promise(y=>{b.ref.imageData||(b.ref.imageData=v.getContext("2d").getImageData(0,0,v.width,v.height));let T=Iu(b.ref.imageData);if(!E||E.length!==20)return v.getContext("2d").putImageData(T,0,0),y();let _=a(pu);_.post({imageData:T,colorMatrix:E},x=>{v.getContext("2d").putImageData(x,0,0),_.terminate(),y()},[T.data.buffer])}),l=(b,E)=>{b.removeChildView(E),E.image.width=1,E.image.height=1,E._destroy()},o=({root:b})=>{let E=b.ref.images.shift();return E.opacity=0,E.translateY=-15,b.ref.imageViewBin.push(E),E},r=({root:b,props:E,image:v})=>{let y=E.id,T=b.query("GET_ITEM",{id:y});if(!T)return;let _=T.getMetadata("crop")||{center:{x:.5,y:.5},flip:{horizontal:!1,vertical:!1},zoom:1,rotation:0,aspectRatio:null},x=b.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),R,P,z=!1;b.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(R=T.getMetadata("markup")||[],P=T.getMetadata("resize"),z=!0);let A=b.appendChildView(b.createChildView(i,{id:y,image:v,crop:_,resize:P,markup:R,dirty:z,background:x,opacity:0,scaleX:1.15,scaleY:1.15,translateY:15}),b.childViews.length);b.ref.images.push(A),A.opacity=1,A.scaleX=1,A.scaleY=1,A.translateY=0,setTimeout(()=>{b.dispatch("DID_IMAGE_PREVIEW_SHOW",{id:y})},250)},s=({root:b,props:E})=>{let v=b.query("GET_ITEM",{id:E.id});if(!v)return;let y=b.ref.images[b.ref.images.length-1];y.crop=v.getMetadata("crop"),y.background=b.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"),b.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")&&(y.dirty=!0,y.resize=v.getMetadata("resize"),y.markup=v.getMetadata("markup"))},p=({root:b,props:E,action:v})=>{if(!/crop|filter|markup|resize/.test(v.change.key)||!b.ref.images.length)return;let y=b.query("GET_ITEM",{id:E.id});if(y){if(/filter/.test(v.change.key)){let T=b.ref.images[b.ref.images.length-1];n(b,v.change.value,T.image);return}if(/crop|markup|resize/.test(v.change.key)){let T=y.getMetadata("crop"),_=b.ref.images[b.ref.images.length-1];if(T&&T.aspectRatio&&_.crop&&_.crop.aspectRatio&&Math.abs(T.aspectRatio-_.crop.aspectRatio)>1e-5){let x=o({root:b});r({root:b,props:E,image:Tu(x.image)})}else s({root:b,props:E})}}},c=b=>{let v=window.navigator.userAgent.match(/Firefox\/([0-9]+)\./),y=v?parseInt(v[1]):null;return y!==null&&y<=58?!1:"createImageBitmap"in window&&co(b)},d=({root:b,props:E})=>{let{id:v}=E,y=b.query("GET_ITEM",v);if(!y)return;let T=URL.createObjectURL(y.file);mu(T,(_,x)=>{b.dispatch("DID_IMAGE_PREVIEW_CALCULATE_SIZE",{id:v,width:_,height:x})})},m=({root:b,props:E})=>{let{id:v}=E,y=b.query("GET_ITEM",v);if(!y)return;let T=URL.createObjectURL(y.file),_=()=>{vu(T).then(x)},x=R=>{URL.revokeObjectURL(T);let z=(y.getMetadata("exif")||{}).orientation||-1,{width:A,height:B}=R;if(!A||!B)return;z>=5&&z<=8&&([A,B]=[B,A]);let w=Math.max(1,window.devicePixelRatio*.75),S=b.query("GET_IMAGE_PREVIEW_ZOOM_FACTOR")*w,L=B/A,D=b.rect.element.width,O=b.rect.element.height,U=D,C=U*L;L>1?(U=Math.min(A,D*S),C=U*L):(C=Math.min(B,O*S),U=C/L);let X=fu(R,U,C,z),K=()=>{let ce=b.query("GET_IMAGE_PREVIEW_CALCULATE_AVERAGE_IMAGE_COLOR")?Eu(data):null;y.setMetadata("color",ce,!0),"close"in R&&R.close(),b.ref.overlayShadow.opacity=1,r({root:b,props:E,image:X})},Z=y.getMetadata("filter");Z?n(b,Z,X).then(K):K()};if(c(y.file)){let R=a(du);R.post({file:y.file},P=>{if(R.terminate(),!P){_();return}x(P)})}else _()},u=({root:b})=>{let E=b.ref.images[b.ref.images.length-1];E.translateY=0,E.scaleX=1,E.scaleY=1,E.opacity=1},g=({root:b})=>{b.ref.overlayShadow.opacity=1,b.ref.overlayError.opacity=0,b.ref.overlaySuccess.opacity=0},f=({root:b})=>{b.ref.overlayShadow.opacity=.25,b.ref.overlayError.opacity=1},h=({root:b})=>{b.ref.overlayShadow.opacity=.25,b.ref.overlaySuccess.opacity=1},I=({root:b})=>{b.ref.images=[],b.ref.imageData=null,b.ref.imageViewBin=[],b.ref.overlayShadow=b.appendChildView(b.createChildView(t,{opacity:0,status:"idle"})),b.ref.overlaySuccess=b.appendChildView(b.createChildView(t,{opacity:0,status:"success"})),b.ref.overlayError=b.appendChildView(b.createChildView(t,{opacity:0,status:"failure"}))};return e.utils.createView({name:"image-preview-wrapper",create:I,styles:["height"],apis:["height"],destroy:({root:b})=>{b.ref.images.forEach(E=>{E.image.width=1,E.image.height=1})},didWriteView:({root:b})=>{b.ref.images.forEach(E=>{E.dirty=!1})},write:e.utils.createRoute({DID_IMAGE_PREVIEW_DRAW:u,DID_IMAGE_PREVIEW_CONTAINER_CREATE:d,DID_FINISH_CALCULATE_PREVIEWSIZE:m,DID_UPDATE_ITEM_METADATA:p,DID_THROW_ITEM_LOAD_ERROR:f,DID_THROW_ITEM_PROCESSING_ERROR:f,DID_THROW_ITEM_INVALID:f,DID_COMPLETE_ITEM_PROCESSING:h,DID_START_ITEM_PROCESSING:g,DID_REVERT_ITEM_PROCESSING:g},({root:b})=>{let E=b.ref.imageViewBin.filter(v=>v.opacity===0);b.ref.imageViewBin=b.ref.imageViewBin.filter(v=>v.opacity>0),E.forEach(v=>l(b,v)),E.length=0})})},po=e=>{let{addFilter:t,utils:i}=e,{Type:a,createRoute:n,isFile:l}=i,o=xu(e);return t("CREATE_VIEW",r=>{let{is:s,view:p,query:c}=r;if(!s("file")||!c("GET_ALLOW_IMAGE_PREVIEW"))return;let d=({root:h,props:I})=>{let{id:b}=I,E=c("GET_ITEM",b);if(!E||!l(E.file)||E.archived)return;let v=E.file;if(!Lm(v)||!c("GET_IMAGE_PREVIEW_FILTER_ITEM")(E))return;let y="createImageBitmap"in(window||{}),T=c("GET_IMAGE_PREVIEW_MAX_FILE_SIZE");if(!y&&T&&v.size>T)return;h.ref.imagePreview=p.appendChildView(p.createChildView(o,{id:b}));let _=h.query("GET_IMAGE_PREVIEW_HEIGHT");_&&h.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:E.id,height:_});let x=!y&&v.size>c("GET_IMAGE_PREVIEW_MAX_INSTANT_PREVIEW_FILE_SIZE");h.dispatch("DID_IMAGE_PREVIEW_CONTAINER_CREATE",{id:b},x)},m=(h,I)=>{if(!h.ref.imagePreview)return;let{id:b}=I,E=h.query("GET_ITEM",{id:b});if(!E)return;let v=h.query("GET_PANEL_ASPECT_RATIO"),y=h.query("GET_ITEM_PANEL_ASPECT_RATIO"),T=h.query("GET_IMAGE_PREVIEW_HEIGHT");if(v||y||T)return;let{imageWidth:_,imageHeight:x}=h.ref;if(!_||!x)return;let R=h.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"),P=h.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"),A=(E.getMetadata("exif")||{}).orientation||-1;if(A>=5&&A<=8&&([_,x]=[x,_]),!co(E.file)||h.query("GET_IMAGE_PREVIEW_UPSCALE")){let D=2048/_;_*=D,x*=D}let B=x/_,w=(E.getMetadata("crop")||{}).aspectRatio||B,F=Math.max(R,Math.min(x,P)),S=h.rect.element.width,L=Math.min(S*w,F);h.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:E.id,height:L})},u=({root:h})=>{h.ref.shouldRescale=!0},g=({root:h,action:I})=>{I.change.key==="crop"&&(h.ref.shouldRescale=!0)},f=({root:h,action:I})=>{h.ref.imageWidth=I.width,h.ref.imageHeight=I.height,h.ref.shouldRescale=!0,h.ref.shouldDrawPreview=!0,h.dispatch("KICK")};p.registerWriter(n({DID_RESIZE_ROOT:u,DID_STOP_RESIZE:u,DID_LOAD_ITEM:d,DID_IMAGE_PREVIEW_CALCULATE_SIZE:f,DID_UPDATE_ITEM_METADATA:g},({root:h,props:I})=>{h.ref.imagePreview&&(h.rect.element.hidden||(h.ref.shouldRescale&&(m(h,I),h.ref.shouldRescale=!1),h.ref.shouldDrawPreview&&(requestAnimationFrame(()=>{requestAnimationFrame(()=>{h.dispatch("DID_FINISH_CALCULATE_PREVIEWSIZE",{id:I.id})})}),h.ref.shouldDrawPreview=!1)))}))}),{options:{allowImagePreview:[!0,a.BOOLEAN],imagePreviewFilterItem:[()=>!0,a.FUNCTION],imagePreviewHeight:[null,a.INT],imagePreviewMinHeight:[44,a.INT],imagePreviewMaxHeight:[256,a.INT],imagePreviewMaxFileSize:[null,a.INT],imagePreviewZoomFactor:[2,a.INT],imagePreviewUpscale:[!1,a.BOOLEAN],imagePreviewMaxInstantPreviewFileSize:[1e6,a.INT],imagePreviewTransparencyIndicator:[null,a.STRING],imagePreviewCalculateAverageImageColor:[!1,a.BOOLEAN],imagePreviewMarkupShow:[!0,a.BOOLEAN],imagePreviewMarkupFilter:[()=>!0,a.FUNCTION]}}},yu=typeof window<"u"&&typeof window.document<"u";yu&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:po}));var mo=po;var Ru=e=>/^image/.test(e.type),Su=(e,t)=>{let i=new Image;i.onload=()=>{let a=i.naturalWidth,n=i.naturalHeight;i=null,t({width:a,height:n})},i.onerror=()=>t(null),i.src=e},uo=({addFilter:e,utils:t})=>{let{Type:i}=t;return e("DID_LOAD_ITEM",(a,{query:n})=>new Promise((l,o)=>{let r=a.file;if(!Ru(r)||!n("GET_ALLOW_IMAGE_RESIZE"))return l(a);let s=n("GET_IMAGE_RESIZE_MODE"),p=n("GET_IMAGE_RESIZE_TARGET_WIDTH"),c=n("GET_IMAGE_RESIZE_TARGET_HEIGHT"),d=n("GET_IMAGE_RESIZE_UPSCALE");if(p===null&&c===null)return l(a);let m=p===null?c:p,u=c===null?m:c,g=URL.createObjectURL(r);Su(g,f=>{if(URL.revokeObjectURL(g),!f)return l(a);let{width:h,height:I}=f,b=(a.getMetadata("exif")||{}).orientation||-1;if(b>=5&&b<=8&&([h,I]=[I,h]),h===m&&I===u)return l(a);if(!d){if(s==="cover"){if(h<=m||I<=u)return l(a)}else if(h<=m&&I<=m)return l(a)}a.setMetadata("resize",{mode:s,upscale:d,size:{width:m,height:u}}),l(a)})})),{options:{allowImageResize:[!0,i.BOOLEAN],imageResizeMode:["cover",i.STRING],imageResizeUpscale:[!0,i.BOOLEAN],imageResizeTargetWidth:[null,i.INT],imageResizeTargetHeight:[null,i.INT]}}},_u=typeof window<"u"&&typeof window.document<"u";_u&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:uo}));var go=uo;var wu=e=>/^image/.test(e.type),Lu=e=>e.substr(0,e.lastIndexOf("."))||e,Mu={jpeg:"jpg","svg+xml":"svg"},Au=(e,t)=>{let i=Lu(e),a=t.split("/")[1],n=Mu[a]||a;return`${i}.${n}`},zu=e=>/jpeg|png|svg\+xml/.test(e)?e:"image/jpeg",Pu=e=>/^image/.test(e.type),Fu={1:()=>[1,0,0,1,0,0],2:e=>[-1,0,0,1,e,0],3:(e,t)=>[-1,0,0,-1,e,t],4:(e,t)=>[1,0,0,-1,0,t],5:()=>[0,1,1,0,0,0],6:(e,t)=>[0,1,-1,0,t,0],7:(e,t)=>[0,-1,-1,0,t,e],8:e=>[0,-1,1,0,0,e]},Ou=(e,t,i)=>(i===-1&&(i=1),Fu[i](e,t)),$t=(e,t)=>({x:e,y:t}),Du=(e,t)=>e.x*t.x+e.y*t.y,fo=(e,t)=>$t(e.x-t.x,e.y-t.y),Cu=(e,t)=>Du(fo(e,t),fo(e,t)),ho=(e,t)=>Math.sqrt(Cu(e,t)),bo=(e,t)=>{let i=e,a=1.5707963267948966,n=t,l=1.5707963267948966-t,o=Math.sin(a),r=Math.sin(n),s=Math.sin(l),p=Math.cos(l),c=i/o,d=c*r,m=c*s;return $t(p*d,p*m)},Bu=(e,t)=>{let i=e.width,a=e.height,n=bo(i,t),l=bo(a,t),o=$t(e.x+Math.abs(n.x),e.y-Math.abs(n.y)),r=$t(e.x+e.width+Math.abs(l.y),e.y+Math.abs(l.x)),s=$t(e.x-Math.abs(l.y),e.y+e.height-Math.abs(l.x));return{width:ho(o,r),height:ho(o,s)}},Io=(e,t,i=0,a={x:.5,y:.5})=>{let n=a.x>.5?1-a.x:a.x,l=a.y>.5?1-a.y:a.y,o=n*2*e.width,r=l*2*e.height,s=Bu(t,i);return Math.max(s.width/o,s.height/r)},vo=(e,t)=>{let i=e.width,a=i*t;a>e.height&&(a=e.height,i=a/t);let n=(e.width-i)*.5,l=(e.height-a)*.5;return{x:n,y:l,width:i,height:a}},Eo=(e,t,i=1)=>{let a=e.height/e.width,n=1,l=t,o=1,r=a;r>l&&(r=l,o=r/a);let s=Math.max(n/o,l/r),p=e.width/(i*s*o),c=p*t;return{width:p,height:c}},xo=e=>{e.width=1,e.height=1,e.getContext("2d").clearRect(0,0,1,1)},To=e=>e&&(e.horizontal||e.vertical),ku=(e,t,i)=>{if(t<=1&&!To(i))return e.width=e.naturalWidth,e.height=e.naturalHeight,e;let a=document.createElement("canvas"),n=e.naturalWidth,l=e.naturalHeight,o=t>=5&&t<=8;o?(a.width=l,a.height=n):(a.width=n,a.height=l);let r=a.getContext("2d");if(t&&r.transform.apply(r,Ou(n,l,t)),To(i)){let s=[1,0,0,1,0,0];(!o&&i.horizontal||o&i.vertical)&&(s[0]=-1,s[4]=n),(!o&&i.vertical||o&&i.horizontal)&&(s[3]=-1,s[5]=l),r.transform(...s)}return r.drawImage(e,0,0,n,l),a},Nu=(e,t,i={},a={})=>{let{canvasMemoryLimit:n,background:l=null}=a,o=i.zoom||1,r=ku(e,t,i.flip),s={width:r.width,height:r.height},p=i.aspectRatio||s.height/s.width,c=Eo(s,p,o);if(n){let E=c.width*c.height;if(E>n){let v=Math.sqrt(n)/Math.sqrt(E);s.width=Math.floor(s.width*v),s.height=Math.floor(s.height*v),c=Eo(s,p,o)}}let d=document.createElement("canvas"),m={x:c.width*.5,y:c.height*.5},u={x:0,y:0,width:c.width,height:c.height,center:m},g=typeof i.scaleToFit>"u"||i.scaleToFit,f=o*Io(s,vo(u,p),i.rotation,g?i.center:{x:.5,y:.5});d.width=Math.round(c.width/f),d.height=Math.round(c.height/f),m.x/=f,m.y/=f;let h={x:m.x-s.width*(i.center?i.center.x:.5),y:m.y-s.height*(i.center?i.center.y:.5)},I=d.getContext("2d");l&&(I.fillStyle=l,I.fillRect(0,0,d.width,d.height)),I.translate(m.x,m.y),I.rotate(i.rotation||0),I.drawImage(r,h.x-m.x,h.y-m.y,s.width,s.height);let b=I.getImageData(0,0,d.width,d.height);return xo(d),b},Vu=typeof window<"u"&&typeof window.document<"u";Vu&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,i){var a=this.toDataURL(t,i).split(",")[1];setTimeout(function(){for(var n=atob(a),l=n.length,o=new Uint8Array(l),r=0;rnew Promise(a=>{let n=i?i(e):e;Promise.resolve(n).then(l=>{l.toBlob(a,t.type,t.quality)})}),Ri=(e,t)=>Xt(e.x*t,e.y*t),Si=(e,t)=>Xt(e.x+t.x,e.y+t.y),yo=e=>{let t=Math.sqrt(e.x*e.x+e.y*e.y);return t===0?{x:0,y:0}:Xt(e.x/t,e.y/t)},qe=(e,t,i)=>{let a=Math.cos(t),n=Math.sin(t),l=Xt(e.x-i.x,e.y-i.y);return Xt(i.x+a*l.x-n*l.y,i.y+n*l.x+a*l.y)},Xt=(e=0,t=0)=>({x:e,y:t}),me=(e,t,i=1,a)=>{if(typeof e=="string")return parseFloat(e)*i;if(typeof e=="number")return e*(a?t[a]:Math.min(t.width,t.height))},dt=(e,t,i)=>{let a=e.borderStyle||e.lineStyle||"solid",n=e.backgroundColor||e.fontColor||"transparent",l=e.borderColor||e.lineColor||"transparent",o=me(e.borderWidth||e.lineWidth,t,i),r=e.lineCap||"round",s=e.lineJoin||"round",p=typeof a=="string"?"":a.map(d=>me(d,t,i)).join(","),c=e.opacity||1;return{"stroke-linecap":r,"stroke-linejoin":s,"stroke-width":o||0,"stroke-dasharray":p,stroke:l,fill:n,opacity:c}},Le=e=>e!=null,Lt=(e,t,i=1)=>{let a=me(e.x,t,i,"width")||me(e.left,t,i,"width"),n=me(e.y,t,i,"height")||me(e.top,t,i,"height"),l=me(e.width,t,i,"width"),o=me(e.height,t,i,"height"),r=me(e.right,t,i,"width"),s=me(e.bottom,t,i,"height");return Le(n)||(Le(o)&&Le(s)?n=t.height-o-s:n=s),Le(a)||(Le(l)&&Le(r)?a=t.width-l-r:a=r),Le(l)||(Le(a)&&Le(r)?l=t.width-a-r:l=0),Le(o)||(Le(n)&&Le(s)?o=t.height-n-s:o=0),{x:a||0,y:n||0,width:l||0,height:o||0}},Uu=e=>e.map((t,i)=>`${i===0?"M":"L"} ${t.x} ${t.y}`).join(" "),ke=(e,t)=>Object.keys(t).forEach(i=>e.setAttribute(i,t[i])),Hu="http://www.w3.org/2000/svg",wt=(e,t)=>{let i=document.createElementNS(Hu,e);return t&&ke(i,t),i},Wu=e=>ke(e,{...e.rect,...e.styles}),ju=e=>{let t=e.rect.x+e.rect.width*.5,i=e.rect.y+e.rect.height*.5,a=e.rect.width*.5,n=e.rect.height*.5;return ke(e,{cx:t,cy:i,rx:a,ry:n,...e.styles})},Yu={contain:"xMidYMid meet",cover:"xMidYMid slice"},qu=(e,t)=>{ke(e,{...e.rect,...e.styles,preserveAspectRatio:Yu[t.fit]||"none"})},$u={left:"start",center:"middle",right:"end"},Xu=(e,t,i,a)=>{let n=me(t.fontSize,i,a),l=t.fontFamily||"sans-serif",o=t.fontWeight||"normal",r=$u[t.textAlign]||"start";ke(e,{...e.rect,...e.styles,"stroke-width":0,"font-weight":o,"font-size":n,"font-family":l,"text-anchor":r}),e.text!==t.text&&(e.text=t.text,e.textContent=t.text.length?t.text:" ")},Ku=(e,t,i,a)=>{ke(e,{...e.rect,...e.styles,fill:"none"});let n=e.childNodes[0],l=e.childNodes[1],o=e.childNodes[2],r=e.rect,s={x:e.rect.x+e.rect.width,y:e.rect.y+e.rect.height};if(ke(n,{x1:r.x,y1:r.y,x2:s.x,y2:s.y}),!t.lineDecoration)return;l.style.display="none",o.style.display="none";let p=yo({x:s.x-r.x,y:s.y-r.y}),c=me(.05,i,a);if(t.lineDecoration.indexOf("arrow-begin")!==-1){let d=Ri(p,c),m=Si(r,d),u=qe(r,2,m),g=qe(r,-2,m);ke(l,{style:"display:block;",d:`M${u.x},${u.y} L${r.x},${r.y} L${g.x},${g.y}`})}if(t.lineDecoration.indexOf("arrow-end")!==-1){let d=Ri(p,-c),m=Si(s,d),u=qe(s,2,m),g=qe(s,-2,m);ke(o,{style:"display:block;",d:`M${u.x},${u.y} L${s.x},${s.y} L${g.x},${g.y}`})}},Zu=(e,t,i,a)=>{ke(e,{...e.styles,fill:"none",d:Uu(t.points.map(n=>({x:me(n.x,i,a,"width"),y:me(n.y,i,a,"height")})))})},yi=e=>t=>wt(e,{id:t.id}),Qu=e=>{let t=wt("image",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round",opacity:"0"});return t.onload=()=>{t.setAttribute("opacity",e.opacity||1)},t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e.src),t},Ju=e=>{let t=wt("g",{id:e.id,"stroke-linecap":"round","stroke-linejoin":"round"}),i=wt("line");t.appendChild(i);let a=wt("path");t.appendChild(a);let n=wt("path");return t.appendChild(n),t},eg={image:Qu,rect:yi("rect"),ellipse:yi("ellipse"),text:yi("text"),path:yi("path"),line:Ju},tg={rect:Wu,ellipse:ju,image:qu,text:Xu,path:Zu,line:Ku},ig=(e,t)=>eg[e](t),ag=(e,t,i,a,n)=>{t!=="path"&&(e.rect=Lt(i,a,n)),e.styles=dt(i,a,n),tg[t](e,i,a,n)},Ro=(e,t)=>e[1].zIndex>t[1].zIndex?1:e[1].zIndexnew Promise(n=>{let{background:l=null}=a,o=new FileReader;o.onloadend=()=>{let r=o.result,s=document.createElement("div");s.style.cssText="position:absolute;pointer-events:none;width:0;height:0;visibility:hidden;",s.innerHTML=r;let p=s.querySelector("svg");document.body.appendChild(s);let c=p.getBBox();s.parentNode.removeChild(s);let d=s.querySelector("title"),m=p.getAttribute("viewBox")||"",u=p.getAttribute("width")||"",g=p.getAttribute("height")||"",f=parseFloat(u)||null,h=parseFloat(g)||null,I=(u.match(/[a-z]+/)||[])[0]||"",b=(g.match(/[a-z]+/)||[])[0]||"",E=m.split(" ").map(parseFloat),v=E.length?{x:E[0],y:E[1],width:E[2],height:E[3]}:c,y=f??v.width,T=h??v.height;p.style.overflow="visible",p.setAttribute("width",y),p.setAttribute("height",T);let _="";if(i&&i.length){let Z={width:y,height:T};_=i.sort(Ro).reduce((ce,V)=>{let W=ig(V[0],V[1]);return ag(W,V[0],V[1],Z),W.removeAttribute("id"),W.getAttribute("opacity")===1&&W.removeAttribute("opacity"),ce+` `+W.outerHTML+` `},""),_=` ${_.replace(/ /g," ")} `}let x=t.aspectRatio||T/y,R=y,P=R*x,z=typeof t.scaleToFit>"u"||t.scaleToFit,A=t.center?t.center.x:.5,B=t.center?t.center.y:.5,w=Io({width:y,height:T},vo({width:R,height:P},x),t.rotation,z?{x:A,y:B}:{x:.5,y:.5}),F=t.zoom*w,S=t.rotation*(180/Math.PI),L={x:R*.5,y:P*.5},D={x:L.x-y*A,y:L.y-T*B},O=[`rotate(${S} ${L.x} ${L.y})`,`translate(${L.x} ${L.y})`,`scale(${F})`,`translate(${-L.x} ${-L.y})`,`translate(${D.x} ${D.y})`],U=t.flip&&t.flip.horizontal,C=t.flip&&t.flip.vertical,X=[`scale(${U?-1:1} ${C?-1:1})`,`translate(${U?-y:0} ${C?-T:0})`],K=` ${d?d.textContent:""} ${p.outerHTML}${_} `;n(K)},o.readAsText(e)}),lg=e=>{let t;try{t=new ImageData(e.width,e.height)}catch{t=document.createElement("canvas").getContext("2d").createImageData(e.width,e.height)}return t.data.set(e.data),t},og=()=>{let e={resize:c,filter:p},t=(d,m)=>(d.forEach(u=>{m=e[u.type](m,u.data)}),m),i=(d,m)=>{let u=d.transforms,g=null;if(u.forEach(f=>{f.type==="filter"&&(g=f)}),g){let f=null;u.forEach(h=>{h.type==="resize"&&(f=h)}),f&&(f.data.matrix=g.data,u=u.filter(h=>h.type!=="filter"))}m(t(u,d.imageData))};self.onmessage=d=>{i(d.data.message,m=>{self.postMessage({id:d.data.id,message:m},[m.data.buffer])})};let a=1,n=1,l=1;function o(d,m,u){let g=m[d]/255,f=m[d+1]/255,h=m[d+2]/255,I=m[d+3]/255,b=g*u[0]+f*u[1]+h*u[2]+I*u[3]+u[4],E=g*u[5]+f*u[6]+h*u[7]+I*u[8]+u[9],v=g*u[10]+f*u[11]+h*u[12]+I*u[13]+u[14],y=g*u[15]+f*u[16]+h*u[17]+I*u[18]+u[19],T=Math.max(0,b*y)+a*(1-y),_=Math.max(0,E*y)+n*(1-y),x=Math.max(0,v*y)+l*(1-y);m[d]=Math.max(0,Math.min(1,T))*255,m[d+1]=Math.max(0,Math.min(1,_))*255,m[d+2]=Math.max(0,Math.min(1,x))*255}let r=self.JSON.stringify([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]);function s(d){return self.JSON.stringify(d||[])===r}function p(d,m){if(!m||s(m))return d;let u=d.data,g=u.length,f=m[0],h=m[1],I=m[2],b=m[3],E=m[4],v=m[5],y=m[6],T=m[7],_=m[8],x=m[9],R=m[10],P=m[11],z=m[12],A=m[13],B=m[14],w=m[15],F=m[16],S=m[17],L=m[18],D=m[19],O=0,U=0,C=0,X=0,K=0,Z=0,ce=0,V=0,W=0,$=0,ie=0,ee=0;for(;O1&&g===!1)return p(d,I);f=d.width*w,h=d.height*w}let b=d.width,E=d.height,v=Math.round(f),y=Math.round(h),T=d.data,_=new Uint8ClampedArray(v*y*4),x=b/v,R=E/y,P=Math.ceil(x*.5),z=Math.ceil(R*.5);for(let A=0;A=-1&&ie<=1&&(F=2*ie*ie*ie-3*ie*ie+1,F>0)){$=4*(W+K*b);let ee=T[$+3];C+=F*ee,L+=F,ee<255&&(F=F*ee/250),D+=F*T[$],O+=F*T[$+1],U+=F*T[$+2],S+=F}}}_[w]=D/S,_[w+1]=O/S,_[w+2]=U/S,_[w+3]=C/L,I&&o(w,_,I)}return{data:_,width:v,height:y}}},rg=(e,t)=>{if(e.getUint32(t+4,!1)!==1165519206)return;t+=4;let i=e.getUint16(t+=6,!1)===18761;t+=e.getUint32(t+4,i);let a=e.getUint16(t,i);t+=2;for(let n=0;n{let t=new DataView(e);if(t.getUint16(0)!==65496)return null;let i=2,a,n,l=!1;for(;i=65504&&a<=65519||a===65534)||(l||(l=rg(t,i,n)),i+n>t.byteLength)));)i+=n;return e.slice(0,i)},cg=e=>new Promise(t=>{let i=new FileReader;i.onload=()=>t(sg(i.result)||null),i.readAsArrayBuffer(e.slice(0,256*1024))}),dg=()=>window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,pg=(e,t)=>{let i=dg();if(i){let a=new i;return a.append(e),a.getBlob(t)}return new Blob([e],{type:t})},mg=()=>Math.random().toString(36).substr(2,9),ug=e=>{let t=new Blob(["(",e.toString(),")()"],{type:"application/javascript"}),i=URL.createObjectURL(t),a=new Worker(i),n=[];return{transfer:()=>{},post:(l,o,r)=>{let s=mg();n[s]=o,a.onmessage=p=>{let c=n[p.data.id];c&&(c(p.data.message),delete n[p.data.id])},a.postMessage({id:s,message:l},r)},terminate:()=>{a.terminate(),URL.revokeObjectURL(i)}}},gg=e=>new Promise((t,i)=>{let a=new Image;a.onload=()=>{t(a)},a.onerror=n=>{i(n)},a.src=e}),fg=e=>e.reduce((t,i)=>t.then(a=>i().then(Array.prototype.concat.bind(a))),Promise.resolve([])),hg=(e,t)=>new Promise(i=>{let a={width:e.width,height:e.height},n=e.getContext("2d"),l=t.sort(Ro).map(o=>()=>new Promise(r=>{yg[o[0]](n,a,o[1],r)&&r()}));fg(l).then(()=>i(e))}),Mt=(e,t)=>{e.beginPath(),e.lineCap=t["stroke-linecap"],e.lineJoin=t["stroke-linejoin"],e.lineWidth=t["stroke-width"],t["stroke-dasharray"].length&&e.setLineDash(t["stroke-dasharray"].split(",")),e.fillStyle=t.fill,e.strokeStyle=t.stroke,e.globalAlpha=t.opacity||1},At=e=>{e.fill(),e.stroke(),e.globalAlpha=1},bg=(e,t,i)=>{let a=Lt(i,t),n=dt(i,t);return Mt(e,n),e.rect(a.x,a.y,a.width,a.height),At(e,n),!0},Eg=(e,t,i)=>{let a=Lt(i,t),n=dt(i,t);Mt(e,n);let l=a.x,o=a.y,r=a.width,s=a.height,p=.5522848,c=r/2*p,d=s/2*p,m=l+r,u=o+s,g=l+r/2,f=o+s/2;return e.moveTo(l,f),e.bezierCurveTo(l,f-d,g-c,o,g,o),e.bezierCurveTo(g+c,o,m,f-d,m,f),e.bezierCurveTo(m,f+d,g+c,u,g,u),e.bezierCurveTo(g-c,u,l,f+d,l,f),At(e,n),!0},Tg=(e,t,i,a)=>{let n=Lt(i,t),l=dt(i,t);Mt(e,l);let o=new Image;new URL(i.src,window.location.href).origin!==window.location.origin&&(o.crossOrigin=""),o.onload=()=>{if(i.fit==="cover"){let s=n.width/n.height,p=s>1?o.width:o.height*s,c=s>1?o.width/s:o.height,d=o.width*.5-p*.5,m=o.height*.5-c*.5;e.drawImage(o,d,m,p,c,n.x,n.y,n.width,n.height)}else if(i.fit==="contain"){let s=Math.min(n.width/o.width,n.height/o.height),p=s*o.width,c=s*o.height,d=n.x+n.width*.5-p*.5,m=n.y+n.height*.5-c*.5;e.drawImage(o,0,0,o.width,o.height,d,m,p,c)}else e.drawImage(o,0,0,o.width,o.height,n.x,n.y,n.width,n.height);At(e,l),a()},o.src=i.src},Ig=(e,t,i)=>{let a=Lt(i,t),n=dt(i,t);Mt(e,n);let l=me(i.fontSize,t),o=i.fontFamily||"sans-serif",r=i.fontWeight||"normal",s=i.textAlign||"left";return e.font=`${r} ${l}px ${o}`,e.textAlign=s,e.fillText(i.text,a.x,a.y),At(e,n),!0},vg=(e,t,i)=>{let a=dt(i,t);Mt(e,a),e.beginPath();let n=i.points.map(o=>({x:me(o.x,t,1,"width"),y:me(o.y,t,1,"height")}));e.moveTo(n[0].x,n[0].y);let l=n.length;for(let o=1;o{let a=Lt(i,t),n=dt(i,t);Mt(e,n),e.beginPath();let l={x:a.x,y:a.y},o={x:a.x+a.width,y:a.y+a.height};e.moveTo(l.x,l.y),e.lineTo(o.x,o.y);let r=yo({x:o.x-l.x,y:o.y-l.y}),s=.04*Math.min(t.width,t.height);if(i.lineDecoration.indexOf("arrow-begin")!==-1){let p=Ri(r,s),c=Si(l,p),d=qe(l,2,c),m=qe(l,-2,c);e.moveTo(d.x,d.y),e.lineTo(l.x,l.y),e.lineTo(m.x,m.y)}if(i.lineDecoration.indexOf("arrow-end")!==-1){let p=Ri(r,-s),c=Si(o,p),d=qe(o,2,c),m=qe(o,-2,c);e.moveTo(d.x,d.y),e.lineTo(o.x,o.y),e.lineTo(m.x,m.y)}return At(e,n),!0},yg={rect:bg,ellipse:Eg,image:Tg,text:Ig,line:xg,path:vg},Rg=e=>{let t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").putImageData(e,0,0),t},Sg=(e,t,i={})=>new Promise((a,n)=>{if(!e||!Pu(e))return n({status:"not an image file",file:e});let{stripImageHead:l,beforeCreateBlob:o,afterCreateBlob:r,canvasMemoryLimit:s}=i,{crop:p,size:c,filter:d,markup:m,output:u}=t,g=t.image&&t.image.orientation?Math.max(1,Math.min(8,t.image.orientation)):null,f=u&&u.quality,h=f===null?null:f/100,I=u&&u.type||null,b=u&&u.background||null,E=[];c&&(typeof c.width=="number"||typeof c.height=="number")&&E.push({type:"resize",data:c}),d&&d.length===20&&E.push({type:"filter",data:d});let v=_=>{let x=r?r(_):_;Promise.resolve(x).then(a)},y=(_,x)=>{let R=Rg(_),P=m.length?hg(R,m):R;Promise.resolve(P).then(z=>{Gu(z,x,o).then(A=>{if(xo(z),l)return v(A);cg(e).then(B=>{B!==null&&(A=new Blob([B,A.slice(20)],{type:A.type})),v(A)})}).catch(n)})};if(/svg/.test(e.type)&&I===null)return ng(e,p,m,{background:b}).then(_=>{a(pg(_,"image/svg+xml"))});let T=URL.createObjectURL(e);gg(T).then(_=>{URL.revokeObjectURL(T);let x=Nu(_,g,p,{canvasMemoryLimit:s,background:b}),R={quality:h,type:I||e.type};if(!E.length)return y(x,R);let P=ug(og);P.post({transforms:E,imageData:x},z=>{y(lg(z),R),P.terminate()},[x.data.buffer])}).catch(n)}),_g=["x","y","left","top","right","bottom","width","height"],wg=e=>typeof e=="string"&&/%/.test(e)?parseFloat(e)/100:e,Lg=e=>{let[t,i]=e,a=i.points?{}:_g.reduce((n,l)=>(n[l]=wg(i[l]),n),{});return[t,{zIndex:0,...i,...a}]},Mg=e=>new Promise((t,i)=>{let a=new Image;a.src=URL.createObjectURL(e);let n=()=>{let o=a.naturalWidth,r=a.naturalHeight;o&&r&&(URL.revokeObjectURL(a.src),clearInterval(l),t({width:o,height:r}))};a.onerror=o=>{URL.revokeObjectURL(a.src),clearInterval(l),i(o)};let l=setInterval(n,1);n()});typeof window<"u"&&typeof window.document<"u"&&(HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,i){let a=this;setTimeout(()=>{let n=a.toDataURL(t,i).split(",")[1],l=atob(n),o=l.length,r=new Uint8Array(o);for(;o--;)r[o]=l.charCodeAt(o);e(new Blob([r],{type:t||"image/png"}))})}}));var wa=typeof window<"u"&&typeof window.document<"u",Ag=wa&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,So=({addFilter:e,utils:t})=>{let{Type:i,forin:a,getFileFromBlob:n,isFile:l}=t,o=["crop","resize","filter","markup","output"],r=c=>(d,m,u)=>d(m,c?c(u):u),s=c=>c.aspectRatio===null&&c.rotation===0&&c.zoom===1&&c.center&&c.center.x===.5&&c.center.y===.5&&c.flip&&c.flip.horizontal===!1&&c.flip.vertical===!1;e("SHOULD_PREPARE_OUTPUT",(c,{query:d})=>new Promise(m=>{m(!d("IS_ASYNC"))}));let p=(c,d,m)=>new Promise(u=>{if(!c("GET_ALLOW_IMAGE_TRANSFORM")||m.archived||!l(d)||!wu(d))return u(!1);Mg(d).then(()=>{let g=c("GET_IMAGE_TRANSFORM_IMAGE_FILTER");if(g){let f=g(d);if(f==null)return handleRevert(!0);if(typeof f=="boolean")return u(f);if(typeof f.then=="function")return f.then(u)}u(!0)}).catch(g=>{u(!1)})});return e("DID_CREATE_ITEM",(c,{query:d,dispatch:m})=>{d("GET_ALLOW_IMAGE_TRANSFORM")&&c.extend("requestPrepare",()=>new Promise((u,g)=>{m("REQUEST_PREPARE_OUTPUT",{query:c.id,item:c,success:u,failure:g},!0)}))}),e("PREPARE_OUTPUT",(c,{query:d,item:m})=>new Promise(u=>{p(d,c,m).then(g=>{if(!g)return u(c);let f=[];d("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_ORIGINAL")&&f.push(()=>new Promise(x=>{x({name:d("GET_IMAGE_TRANSFORM_VARIANTS_ORIGINAL_NAME"),file:c})})),d("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_DEFAULT")&&f.push((x,R,P)=>new Promise(z=>{x(R,P).then(A=>z({name:d("GET_IMAGE_TRANSFORM_VARIANTS_DEFAULT_NAME"),file:A}))}));let h=d("GET_IMAGE_TRANSFORM_VARIANTS")||{};a(h,(x,R)=>{let P=r(R);f.push((z,A,B)=>new Promise(w=>{P(z,A,B).then(F=>w({name:x,file:F}))}))});let I=d("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY"),b=d("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY_MODE"),E=I===null?null:I/100,v=d("GET_IMAGE_TRANSFORM_OUTPUT_MIME_TYPE"),y=d("GET_IMAGE_TRANSFORM_CLIENT_TRANSFORMS")||o;m.setMetadata("output",{type:v,quality:E,client:y},!0);let T=(x,R)=>new Promise((P,z)=>{let A={...R};Object.keys(A).filter(C=>C!=="exif").forEach(C=>{y.indexOf(C)===-1&&delete A[C]});let{resize:B,exif:w,output:F,crop:S,filter:L,markup:D}=A,O={image:{orientation:w?w.orientation:null},output:F&&(F.type||typeof F.quality=="number"||F.background)?{type:F.type,quality:typeof F.quality=="number"?F.quality*100:null,background:F.background||d("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR")||null}:void 0,size:B&&(B.size.width||B.size.height)?{mode:B.mode,upscale:B.upscale,...B.size}:void 0,crop:S&&!s(S)?{...S}:void 0,markup:D&&D.length?D.map(Lg):[],filter:L};if(O.output){let C=F.type?F.type!==x.type:!1,X=/\/jpe?g$/.test(x.type),K=F.quality!==null?X&&b==="always":!1;if(!!!(O.size||O.crop||O.filter||C||K))return P(x)}let U={beforeCreateBlob:d("GET_IMAGE_TRANSFORM_BEFORE_CREATE_BLOB"),afterCreateBlob:d("GET_IMAGE_TRANSFORM_AFTER_CREATE_BLOB"),canvasMemoryLimit:d("GET_IMAGE_TRANSFORM_CANVAS_MEMORY_LIMIT"),stripImageHead:d("GET_IMAGE_TRANSFORM_OUTPUT_STRIP_IMAGE_HEAD")};Sg(x,O,U).then(C=>{let X=n(C,Au(x.name,zu(C.type)));P(X)}).catch(z)}),_=f.map(x=>x(T,c,m.getMetadata()));Promise.all(_).then(x=>{u(x.length===1&&x[0].name===null?x[0].file:x)})})})),{options:{allowImageTransform:[!0,i.BOOLEAN],imageTransformImageFilter:[null,i.FUNCTION],imageTransformOutputMimeType:[null,i.STRING],imageTransformOutputQuality:[null,i.INT],imageTransformOutputStripImageHead:[!0,i.BOOLEAN],imageTransformClientTransforms:[null,i.ARRAY],imageTransformOutputQualityMode:["always",i.STRING],imageTransformVariants:[null,i.OBJECT],imageTransformVariantsIncludeDefault:[!0,i.BOOLEAN],imageTransformVariantsDefaultName:[null,i.STRING],imageTransformVariantsIncludeOriginal:[!1,i.BOOLEAN],imageTransformVariantsOriginalName:["original_",i.STRING],imageTransformBeforeCreateBlob:[null,i.FUNCTION],imageTransformAfterCreateBlob:[null,i.FUNCTION],imageTransformCanvasMemoryLimit:[wa&&Ag?4096*4096:null,i.INT],imageTransformCanvasBackgroundColor:[null,i.STRING]}}};wa&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:So}));var _o=So;var La=e=>/^video/.test(e.type),Kt=e=>/^audio/.test(e.type),Ma=class{constructor(t,i){this.mediaEl=t,this.audioElems=i,this.onplayhead=!1,this.duration=0,this.timelineWidth=this.audioElems.timeline.offsetWidth-this.audioElems.playhead.offsetWidth,this.moveplayheadFn=this.moveplayhead.bind(this),this.registerListeners()}registerListeners(){this.mediaEl.addEventListener("timeupdate",this.timeUpdate.bind(this),!1),this.mediaEl.addEventListener("canplaythrough",()=>this.duration=this.mediaEl.duration,!1),this.audioElems.timeline.addEventListener("click",this.timelineClicked.bind(this),!1),this.audioElems.button.addEventListener("click",this.play.bind(this)),this.audioElems.playhead.addEventListener("mousedown",this.mouseDown.bind(this),!1),window.addEventListener("mouseup",this.mouseUp.bind(this),!1)}play(){this.mediaEl.paused?this.mediaEl.play():this.mediaEl.pause(),this.audioElems.button.classList.toggle("play"),this.audioElems.button.classList.toggle("pause")}timeUpdate(){let t=this.mediaEl.currentTime/this.duration*100;this.audioElems.playhead.style.marginLeft=t+"%",this.mediaEl.currentTime===this.duration&&(this.audioElems.button.classList.toggle("play"),this.audioElems.button.classList.toggle("pause"))}moveplayhead(t){let i=t.clientX-this.getPosition(this.audioElems.timeline);i>=0&&i<=this.timelineWidth&&(this.audioElems.playhead.style.marginLeft=i+"px"),i<0&&(this.audioElems.playhead.style.marginLeft="0px"),i>this.timelineWidth&&(this.audioElems.playhead.style.marginLeft=this.timelineWidth-4+"px")}timelineClicked(t){this.moveplayhead(t),this.mediaEl.currentTime=this.duration*this.clickPercent(t)}mouseDown(){this.onplayhead=!0,window.addEventListener("mousemove",this.moveplayheadFn,!0),this.mediaEl.removeEventListener("timeupdate",this.timeUpdate.bind(this),!1)}mouseUp(t){window.removeEventListener("mousemove",this.moveplayheadFn,!0),this.onplayhead==!0&&(this.moveplayhead(t),this.mediaEl.currentTime=this.duration*this.clickPercent(t),this.mediaEl.addEventListener("timeupdate",this.timeUpdate.bind(this),!1)),this.onplayhead=!1}clickPercent(t){return(t.clientX-this.getPosition(this.audioElems.timeline))/this.timelineWidth}getPosition(t){return t.getBoundingClientRect().left}},zg=e=>e.utils.createView({name:"media-preview",tag:"div",ignoreRect:!0,create:({root:t,props:i})=>{let{id:a}=i,n=t.query("GET_ITEM",{id:i.id}),l=Kt(n.file)?"audio":"video";if(t.ref.media=document.createElement(l),t.ref.media.setAttribute("controls",!0),t.element.appendChild(t.ref.media),Kt(n.file)){let o=document.createDocumentFragment();t.ref.audio=[],t.ref.audio.container=document.createElement("div"),t.ref.audio.button=document.createElement("span"),t.ref.audio.timeline=document.createElement("div"),t.ref.audio.playhead=document.createElement("div"),t.ref.audio.container.className="audioplayer",t.ref.audio.button.className="playpausebtn play",t.ref.audio.timeline.className="timeline",t.ref.audio.playhead.className="playhead",t.ref.audio.timeline.appendChild(t.ref.audio.playhead),t.ref.audio.container.appendChild(t.ref.audio.button),t.ref.audio.container.appendChild(t.ref.audio.timeline),o.appendChild(t.ref.audio.container),t.element.appendChild(o)}},write:e.utils.createRoute({DID_MEDIA_PREVIEW_LOAD:({root:t,props:i})=>{let{id:a}=i,n=t.query("GET_ITEM",{id:i.id});if(!n)return;let l=window.URL||window.webkitURL,o=new Blob([n.file],{type:n.file.type});t.ref.media.type=n.file.type,t.ref.media.src=n.file.mock&&n.file.url||l.createObjectURL(o),Kt(n.file)&&new Ma(t.ref.media,t.ref.audio),t.ref.media.addEventListener("loadeddata",()=>{let r=75;if(La(n.file)){let s=t.ref.media.offsetWidth,p=t.ref.media.videoWidth/s;r=t.ref.media.videoHeight/p}t.dispatch("DID_UPDATE_PANEL_HEIGHT",{id:i.id,height:r})},!1)}})}),Pg=e=>{let t=({root:a,props:n})=>{let{id:l}=n;a.query("GET_ITEM",l)&&a.dispatch("DID_MEDIA_PREVIEW_LOAD",{id:l})},i=({root:a,props:n})=>{let l=zg(e);a.ref.media=a.appendChildView(a.createChildView(l,{id:n.id}))};return e.utils.createView({name:"media-preview-wrapper",create:i,write:e.utils.createRoute({DID_MEDIA_PREVIEW_CONTAINER_CREATE:t})})},Aa=e=>{let{addFilter:t,utils:i}=e,{Type:a,createRoute:n}=i,l=Pg(e);return t("CREATE_VIEW",o=>{let{is:r,view:s,query:p}=o;if(!r("file"))return;let c=({root:d,props:m})=>{let{id:u}=m,g=p("GET_ITEM",u),f=p("GET_ALLOW_VIDEO_PREVIEW"),h=p("GET_ALLOW_AUDIO_PREVIEW");!g||g.archived||(!La(g.file)||!f)&&(!Kt(g.file)||!h)||(d.ref.mediaPreview=s.appendChildView(s.createChildView(l,{id:u})),d.dispatch("DID_MEDIA_PREVIEW_CONTAINER_CREATE",{id:u}))};s.registerWriter(n({DID_LOAD_ITEM:c},({root:d,props:m})=>{let{id:u}=m,g=p("GET_ITEM",u),f=d.query("GET_ALLOW_VIDEO_PREVIEW"),h=d.query("GET_ALLOW_AUDIO_PREVIEW");!g||(!La(g.file)||!f)&&(!Kt(g.file)||!h)||d.rect.element.hidden}))}),{options:{allowVideoPreview:[!0,a.BOOLEAN],allowAudioPreview:[!0,a.BOOLEAN]}}},Fg=typeof window<"u"&&typeof window.document<"u";Fg&&document.dispatchEvent(new CustomEvent("FilePond:pluginloaded",{detail:Aa}));var wo={labelIdle:'\u134B\u12ED\u120E\u127D \u1235\u1260\u12CD \u12A5\u12DA\u1205 \u130B\u122D \u12ED\u120D\u1240\u1241\u1275 \u12C8\u12ED\u121D \u134B\u12ED\u1209\u1295 \u12ED\u121D\u1228\u1321 ',labelInvalidField:"\u1218\u1235\u12A9 \u120D\u12AD \u12EB\u120D\u1206\u1291 \u134B\u12ED\u120E\u127D\u1295 \u12ED\u12DF\u120D",labelFileWaitingForSize:"\u12E8\u134B\u12ED\u1209\u1295 \u1218\u1320\u1295 \u1260\u1218\u1320\u1263\u1260\u1245 \u120B\u12ED",labelFileSizeNotAvailable:"\u12E8\u134B\u12ED\u1209\u1295 \u1218\u1320\u1295 \u120A\u1308\u129D \u12A0\u120D\u127B\u1208\u121D",labelFileLoading:"\u1260\u121B\u1295\u1260\u1265 \u120B\u12ED",labelFileLoadError:"\u1260\u121B\u1295\u1260\u1265 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelFileProcessing:"\u134B\u12ED\u1209\u1295 \u1260\u1218\u132B\u1295 \u120B\u12ED",labelFileProcessingComplete:"\u134B\u12ED\u1209\u1295 \u1218\u132B\u1295 \u1270\u1320\u1293\u1245\u124B\u120D",labelFileProcessingAborted:"\u134B\u12ED\u1209\u1295 \u1218\u132B\u1295 \u1270\u124B\u122D\u1327\u120D",labelFileProcessingError:"\u134B\u12ED\u1209\u1295 \u1260\u1218\u132B\u1295 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelFileProcessingRevertError:"\u1348\u12ED\u1209\u1295 \u1260\u1218\u1240\u120D\u1260\u1235 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelFileRemoveError:"\u1260\u121B\u1325\u134B\u1275 \u120B\u12ED \u127D\u130D\u122D \u1270\u1348\u1325\u122F\u120D",labelTapToCancel:"\u1208\u121B\u124B\u1228\u1325 \u1290\u12AB \u12EB\u12F5\u122D\u1309",labelTapToRetry:"\u12F0\u130D\u121E \u1208\u1218\u121E\u12A8\u122D \u1290\u12AB \u12EB\u12F5\u122D\u1309",labelTapToUndo:"\u12C8\u12F0\u1290\u1260\u1228\u1260\u1275 \u1208\u1218\u1218\u1208\u1235 \u1290\u12AB \u12EB\u12F5\u122D\u1309",labelButtonRemoveItem:"\u120B\u1325\u134B",labelButtonAbortItemLoad:"\u120B\u124B\u122D\u1325",labelButtonRetryItemLoad:"\u12F0\u130D\u121C \u120D\u121E\u12AD\u122D",labelButtonAbortItemProcessing:"\u12ED\u1245\u122D",labelButtonUndoItemProcessing:"\u12C8\u12F0\u1290\u1260\u1228\u1260\u1275 \u120D\u1218\u120D\u1235",labelButtonRetryItemProcessing:"\u12F0\u130D\u121C \u120D\u121E\u12AD\u122D",labelButtonProcessItem:"\u120D\u132B\u1295",labelMaxFileSizeExceeded:"\u134B\u12ED\u1209 \u1270\u120D\u124B\u120D",labelMaxFileSize:"\u12E8\u134B\u12ED\u120D \u1218\u1320\u1295 \u12A8 {filesize} \u1218\u1265\u1208\u1325 \u12A0\u12ED\u1348\u1240\u12F5\u121D",labelMaxTotalFileSizeExceeded:"\u12E8\u121A\u1348\u1240\u12F0\u12CD\u1295 \u1320\u1245\u120B\u120B \u12E8\u134B\u12ED\u120D \u1218\u1320\u1295 \u12A0\u120D\u1348\u12CB\u120D",labelMaxTotalFileSize:"\u1320\u1245\u120B\u120B \u12E8\u134B\u12ED\u120D \u1218\u1320\u1295 \u12A8 {filesize} \u1218\u1265\u1208\u1325 \u12A0\u12ED\u1348\u1240\u12F5\u121D",labelFileTypeNotAllowed:"\u12E8\u1270\u1233\u1233\u1270 \u12E8\u134B\u12ED\u120D \u12A0\u12ED\u1290\u1275 \u1290\u12CD",fileValidateTypeLabelExpectedTypes:"\u12E8\u134B\u12ED\u120D \u12A0\u12ED\u1290\u1271 \u1218\u1206\u1295 \u12E8\u121A\u1308\u1263\u12CD {allButLastType} \u12A5\u1293 {lastType} \u1290\u12CD",imageValidateSizeLabelFormatError:"\u12E8\u121D\u1235\u120D \u12A0\u12ED\u1290\u1271 \u1208\u1218\u132B\u1295 \u12A0\u12ED\u1206\u1295\u121D",imageValidateSizeLabelImageSizeTooSmall:"\u121D\u1235\u1209 \u1260\u1323\u121D \u12A0\u1295\u1237\u120D",imageValidateSizeLabelImageSizeTooBig:"\u121D\u1235\u1209 \u1260\u1323\u121D \u1270\u120D\u124B\u120D",imageValidateSizeLabelExpectedMinSize:"\u12DD\u1245\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u120D\u12AC\u1275 {minWidth} \xD7 {minHeight} \u1290\u12CD",imageValidateSizeLabelExpectedMaxSize:"\u12A8\u134D\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u120D\u12AC\u1275 {maxWidth} \xD7 {maxHeight} \u1290\u12CD",imageValidateSizeLabelImageResolutionTooLow:"\u12E8\u121D\u1235\u1209 \u1325\u122B\u1275 \u1260\u1323\u121D \u12DD\u1245\u1270\u129B \u1290\u12CD",imageValidateSizeLabelImageResolutionTooHigh:"\u12E8\u121D\u1235\u1209 \u1325\u122B\u1275 \u1260\u1323\u121D \u12A8\u134D\u1270\u129B \u1290\u12CD",imageValidateSizeLabelExpectedMinResolution:"\u12DD\u1245\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u1325\u122B\u1275 {minResolution} \u1290\u12CD",imageValidateSizeLabelExpectedMaxResolution:"\u12A8\u134D\u1270\u129B\u12CD \u12E8\u121D\u1235\u120D \u1325\u122B\u1275 {maxResolution} \u1290\u12CD"};var Lo={labelIdle:'\u0627\u0633\u062D\u0628 \u0648 \u0627\u062F\u0631\u062C \u0645\u0644\u0641\u0627\u062A\u0643 \u0623\u0648 \u062A\u0635\u0641\u062D ',labelInvalidField:"\u0627\u0644\u062D\u0642\u0644 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u063A\u064A\u0631 \u0635\u0627\u0644\u062D\u0629",labelFileWaitingForSize:"\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u062D\u062C\u0645",labelFileSizeNotAvailable:"\u0627\u0644\u062D\u062C\u0645 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D",labelFileLoading:"\u0628\u0627\u0644\u0625\u0646\u062A\u0638\u0627\u0631",labelFileLoadError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u062D\u0645\u064A\u0644",labelFileProcessing:"\u064A\u062A\u0645 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingComplete:"\u062A\u0645 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingAborted:"\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639",labelFileProcessingRevertError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u0631\u0627\u062C\u0639",labelFileRemoveError:"\u062D\u062F\u062B \u062E\u0637\u0623 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062D\u0630\u0641",labelTapToCancel:"\u0627\u0646\u0642\u0631 \u0644\u0644\u0625\u0644\u063A\u0627\u0621",labelTapToRetry:"\u0627\u0646\u0642\u0631 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",labelTapToUndo:"\u0627\u0646\u0642\u0631 \u0644\u0644\u062A\u0631\u0627\u062C\u0639",labelButtonRemoveItem:"\u0645\u0633\u062D",labelButtonAbortItemLoad:"\u0625\u0644\u063A\u0627\u0621",labelButtonRetryItemLoad:"\u0625\u0639\u0627\u062F\u0629",labelButtonAbortItemProcessing:"\u0625\u0644\u063A\u0627\u0621",labelButtonUndoItemProcessing:"\u062A\u0631\u0627\u062C\u0639",labelButtonRetryItemProcessing:"\u0625\u0639\u0627\u062F\u0629",labelButtonProcessItem:"\u0631\u0641\u0639",labelMaxFileSizeExceeded:"\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064A\u0631 \u062C\u062F\u0627",labelMaxFileSize:"\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0623\u0642\u0635\u0649: {filesize}",labelMaxTotalFileSizeExceeded:"\u062A\u0645 \u062A\u062C\u0627\u0648\u0632 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u062D\u062C\u0645 \u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A",labelMaxTotalFileSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u062D\u062C\u0645 \u0627\u0644\u0645\u0644\u0641: {filesize}",labelFileTypeNotAllowed:"\u0645\u0644\u0641 \u0645\u0646 \u0646\u0648\u0639 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",fileValidateTypeLabelExpectedTypes:"\u062A\u062A\u0648\u0642\u0639 {allButLastType} \u0645\u0646 {lastType}",imageValidateSizeLabelFormatError:"\u0646\u0648\u0639 \u0627\u0644\u0635\u0648\u0631\u0629 \u063A\u064A\u0631 \u0645\u062F\u0639\u0648\u0645",imageValidateSizeLabelImageSizeTooSmall:"\u0627\u0644\u0635\u0648\u0631\u0629 \u0635\u063A\u064A\u0631 \u062C\u062F\u0627",imageValidateSizeLabelImageSizeTooBig:"\u0627\u0644\u0635\u0648\u0631\u0629 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u0627",imageValidateSizeLabelExpectedMinSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u0623\u0628\u0639\u0627\u062F \u0647\u0648: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0623\u0628\u0639\u0627\u062F \u0647\u0648: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0627\u0644\u062F\u0642\u0629 \u0636\u0639\u064A\u0641\u0629 \u062C\u062F\u0627",imageValidateSizeLabelImageResolutionTooHigh:"\u0627\u0644\u062F\u0642\u0629 \u0645\u0631\u062A\u0641\u0639\u0629 \u062C\u062F\u0627",imageValidateSizeLabelExpectedMinResolution:"\u0623\u0642\u0644 \u062F\u0642\u0629: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0623\u0642\u0635\u0649 \u062F\u0642\u0629: {maxResolution}"};var Mo={labelIdle:'Fayl\u0131n\u0131z\u0131 S\xFCr\xFC\u015Fd\xFCr\xFCn & Burax\u0131n ya da Se\xE7in ',labelInvalidField:"Sah\u0259d\u0259 etibars\u0131z fayllar var",labelFileWaitingForSize:"\xD6l\xE7\xFC hesablan\u0131r",labelFileSizeNotAvailable:"\xD6l\xE7\xFC m\xF6vcud deyil",labelFileLoading:"Y\xFCkl\u0259nir",labelFileLoadError:"Y\xFCkl\u0259m\u0259 \u0259snas\u0131nda x\u0259ta ba\u015F verdi",labelFileProcessing:"Y\xFCkl\u0259nir",labelFileProcessingComplete:"Y\xFCkl\u0259m\u0259 tamamland\u0131",labelFileProcessingAborted:"Y\xFCkl\u0259m\u0259 l\u0259\u011Fv edildi",labelFileProcessingError:"Y\xFCk\u0259y\u0259rk\u0259n x\u0259ta ba\u015F verdi",labelFileProcessingRevertError:"Geri \xE7\u0259k\u0259rk\u0259n x\u0259ta ba\u015F verdi",labelFileRemoveError:"\xC7\u0131xarark\u0259n x\u0259ta ba\u015F verdi",labelTapToCancel:"\u0130mtina etm\u0259k \xFC\xE7\xFCn klikl\u0259yin",labelTapToRetry:"T\u0259krar yoxlamaq \xFC\xE7\xFCn klikl\u0259yin",labelTapToUndo:"Geri almaq \xFC\xE7\xFCn klikl\u0259yin",labelButtonRemoveItem:"\xC7\u0131xar",labelButtonAbortItemLoad:"\u0130mtina Et",labelButtonRetryItemLoad:"T\u0259krar yoxla",labelButtonAbortItemProcessing:"\u0130mtina et",labelButtonUndoItemProcessing:"Geri Al",labelButtonRetryItemProcessing:"T\u0259krar yoxla",labelButtonProcessItem:"Y\xFCkl\u0259",labelMaxFileSizeExceeded:"Fayl \xE7ox b\xF6y\xFCkd\xFCr",labelMaxFileSize:"\u018Fn b\xF6y\xFCk fayl \xF6l\xE7\xFCs\xFC: {filesize}",labelMaxTotalFileSizeExceeded:"Maksimum \xF6l\xE7\xFC ke\xE7ildi",labelMaxTotalFileSize:"Maksimum fayl \xF6l\xE7\xFCs\xFC :{filesize}",labelFileTypeNotAllowed:"Etibars\u0131z fayl tipi",fileValidateTypeLabelExpectedTypes:"Bu {allButLastType} ya da bu fayl olmas\u0131 laz\u0131md\u0131r: {lastType}",imageValidateSizeLabelFormatError:"\u015E\u0259kil tipi d\u0259st\u0259kl\u0259nmir",imageValidateSizeLabelImageSizeTooSmall:"\u015E\u0259kil \xE7ox ki\xE7ik",imageValidateSizeLabelImageSizeTooBig:"\u015E\u0259kil \xE7ox b\xF6y\xFCk",imageValidateSizeLabelExpectedMinSize:"Minimum \xF6l\xE7\xFC {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimum \xF6l\xE7\xFC {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"G\xF6r\xFCnt\xFC imkan\u0131 \xE7ox a\u015Fa\u011F\u0131",imageValidateSizeLabelImageResolutionTooHigh:"G\xF6r\xFCnt\xFC imkan\u0131 \xE7ox y\xFCks\u0259k",imageValidateSizeLabelExpectedMinResolution:"Minimum g\xF6r\xFCnt\xFC imkan\u0131 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum g\xF6r\xFCnt\xFC imkan\u0131 {maxResolution}"};var Ao={labelIdle:'Arrossega i deixa anar els teus fitxers o Navega ',labelInvalidField:"El camp cont\xE9 fitxers inv\xE0lids",labelFileWaitingForSize:"Esperant mida",labelFileSizeNotAvailable:"Mida no disponible",labelFileLoading:"Carregant",labelFileLoadError:"Error durant la c\xE0rrega",labelFileProcessing:"Pujant",labelFileProcessingComplete:"Pujada completada",labelFileProcessingAborted:"Pujada cancel\xB7lada",labelFileProcessingError:"Error durant la pujada",labelFileProcessingRevertError:"Error durant la reversi\xF3",labelFileRemoveError:"Error durant l'eliminaci\xF3",labelTapToCancel:"toca per cancel\xB7lar",labelTapToRetry:"toca per reintentar",labelTapToUndo:"toca per desfer",labelButtonRemoveItem:"Eliminar",labelButtonAbortItemLoad:"Cancel\xB7lar",labelButtonRetryItemLoad:"Reintentar",labelButtonAbortItemProcessing:"Cancel\xB7lar",labelButtonUndoItemProcessing:"Desfer",labelButtonRetryItemProcessing:"Reintentar",labelButtonProcessItem:"Pujar",labelMaxFileSizeExceeded:"El fitxer \xE9s massa gran",labelMaxFileSize:"La mida m\xE0xima del fitxer \xE9s {filesize}",labelMaxTotalFileSizeExceeded:"Mida m\xE0xima total excedida",labelMaxTotalFileSize:"La mida m\xE0xima total del fitxer \xE9s {filesize}",labelFileTypeNotAllowed:"Fitxer de tipus inv\xE0lid",fileValidateTypeLabelExpectedTypes:"Espera {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipus d'imatge no suportada",imageValidateSizeLabelImageSizeTooSmall:"La imatge \xE9s massa petita",imageValidateSizeLabelImageSizeTooBig:"La imatge \xE9s massa gran",imageValidateSizeLabelExpectedMinSize:"La mida m\xEDnima \xE9s {minWidth} x {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La mida m\xE0xima \xE9s {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La resoluci\xF3 \xE9s massa baixa",imageValidateSizeLabelImageResolutionTooHigh:"La resoluci\xF3 \xE9s massa alta",imageValidateSizeLabelExpectedMinResolution:"La resoluci\xF3 m\xEDnima \xE9s {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La resoluci\xF3 m\xE0xima \xE9s {maxResolution}"};var zo={labelIdle:'\u067E\u06D5\u0695\u06AF\u06D5\u06A9\u0627\u0646 \u0641\u0695\u06CE \u0628\u062F\u06D5 \u0626\u06CE\u0631\u06D5 \u0628\u06C6 \u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u06CC\u0627\u0646 \u0647\u06D5\u06B5\u0628\u0698\u06CE\u0631\u06D5 ',labelInvalidField:"\u067E\u06D5\u0695\u06AF\u06D5\u06CC \u0646\u0627\u062F\u0631\u0648\u0633\u062A\u06CC \u062A\u06CE\u062F\u0627\u06CC\u06D5",labelFileWaitingForSize:"\u0686\u0627\u0648\u06D5\u0695\u0648\u0627\u0646\u06CC\u06CC \u0642\u06D5\u0628\u0627\u0631\u06D5",labelFileSizeNotAvailable:"\u0642\u06D5\u0628\u0627\u0631\u06D5 \u0628\u06D5\u0631\u062F\u06D5\u0633\u062A \u0646\u06CC\u06D5",labelFileLoading:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileLoadError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5\u0645\u0627\u0648\u06D5\u06CC \u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileProcessing:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelFileProcessingComplete:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u062A\u06D5\u0648\u0627\u0648 \u0628\u0648\u0648",labelFileProcessingAborted:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646 \u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u06CC\u06D5\u0648\u06D5",labelFileProcessingError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5\u06A9\u0627\u062A\u06CC \u0628\u0627\u0631\u06A9\u0631\u062F\u0646\u062F\u0627",labelFileProcessingRevertError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5 \u06A9\u0627\u062A\u06CC \u06AF\u06D5\u0695\u0627\u0646\u06D5\u0648\u06D5",labelFileRemoveError:"\u0647\u06D5\u06B5\u06D5 \u0644\u06D5 \u06A9\u0627\u062A\u06CC \u0633\u0695\u06CC\u0646\u06D5\u0648\u06D5",labelTapToCancel:"\u0628\u06C6 \u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5 Tab \u062F\u0627\u0628\u06AF\u0631\u06D5",labelTapToRetry:"tap \u062F\u0627\u0628\u06AF\u0631\u06D5 \u0628\u06C6 \u062F\u0648\u0648\u0628\u0627\u0631\u06D5\u06A9\u0631\u062F\u0646\u06D5\u0648\u06D5",labelTapToUndo:"tap \u062F\u0627\u0628\u06AF\u0631\u06D5 \u0628\u06C6 \u06AF\u06D5\u0695\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRemoveItem:"\u0633\u0695\u06CC\u0646\u06D5\u0648\u06D5",labelButtonAbortItemLoad:"\u0647\u06D5\u06B5\u0648\u06D5\u0634\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRetryItemLoad:"\u0647\u06D5\u0648\u06B5\u062F\u0627\u0646\u06D5\u0648\u06D5",labelButtonAbortItemProcessing:"\u067E\u06D5\u0634\u06CC\u0645\u0627\u0646\u0628\u0648\u0648\u0646\u06D5\u0648\u06D5",labelButtonUndoItemProcessing:"\u06AF\u06D5\u0695\u0627\u0646\u062F\u0646\u06D5\u0648\u06D5",labelButtonRetryItemProcessing:"\u0647\u06D5\u0648\u06B5\u062F\u0627\u0646\u06D5\u0648\u06D5",labelButtonProcessItem:"\u0628\u0627\u0631\u06A9\u0631\u062F\u0646",labelMaxFileSizeExceeded:"\u067E\u06D5\u0695\u06AF\u06D5 \u0632\u06C6\u0631 \u06AF\u06D5\u0648\u0631\u06D5\u06CC\u06D5",labelMaxFileSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {filesize}",labelMaxTotalFileSizeExceeded:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5\u06CC \u06A9\u06C6\u06CC \u06AF\u0634\u062A\u06CC \u062A\u06CE\u067E\u06D5\u0695\u06CE\u0646\u062F\u0631\u0627",labelMaxTotalFileSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5\u06CC \u06A9\u06C6\u06CC \u067E\u06D5\u0695\u06AF\u06D5 {filesize}",labelFileTypeNotAllowed:"\u062C\u06C6\u0631\u06CC \u067E\u06D5\u0695\u06AF\u06D5\u06A9\u06D5 \u0646\u0627\u062F\u0631\u0648\u0633\u062A\u06D5",fileValidateTypeLabelExpectedTypes:"\u062C\u06AF\u06D5 \u0644\u06D5 {allButLastType} \u06CC\u0627\u0646 {lastType}",imageValidateSizeLabelFormatError:"\u062C\u06C6\u0631\u06CC \u0648\u06CE\u0646\u06D5 \u067E\u0627\u06B5\u067E\u0634\u062A\u06CC\u06CC \u0646\u06D5\u06A9\u0631\u0627\u0648\u06D5",imageValidateSizeLabelImageSizeTooSmall:"\u0648\u06CE\u0646\u06D5\u06A9\u06D5 \u0632\u06C6\u0631 \u0628\u0686\u0648\u0648\u06A9\u06D5",imageValidateSizeLabelImageSizeTooBig:"\u0648\u06CE\u0646\u06D5\u06A9\u06D5 \u0632\u06C6\u0631 \u06AF\u06D5\u0648\u0631\u06D5\u06CC\u06D5",imageValidateSizeLabelExpectedMinSize:"\u06A9\u06D5\u0645\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0642\u06D5\u0628\u0627\u0631\u06D5 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC\u06D5\u06A9\u06D5\u06CC \u0632\u06C6\u0631 \u06A9\u06D5\u0645\u06D5",imageValidateSizeLabelImageResolutionTooHigh:"\u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC\u06D5\u06A9\u06D5\u06CC \u0632\u06C6\u0631 \u0628\u06D5\u0631\u0632\u06D5",imageValidateSizeLabelExpectedMinResolution:"\u06A9\u06D5\u0645\u062A\u0631\u06CC\u0646 \u0648\u0631\u062F\u0628\u06CC\u0646\u06CC\u06CC {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0632\u06C6\u0631\u062A\u0631\u06CC\u0646 \u0648\u0631\u062F\u0628\u06CC\u0646\u06CC {maxResolution}"};var Po={labelIdle:'P\u0159et\xE1hn\u011Bte soubor sem (drag&drop) nebo Vyhledat ',labelInvalidField:"Pole obsahuje chybn\xE9 soubory",labelFileWaitingForSize:"Zji\u0161\u0165uje se velikost",labelFileSizeNotAvailable:"Velikost nen\xED zn\xE1m\xE1",labelFileLoading:"P\u0159en\xE1\u0161\xED se",labelFileLoadError:"Chyba p\u0159i p\u0159enosu",labelFileProcessing:"Prob\xEDh\xE1 upload",labelFileProcessingComplete:"Upload dokon\u010Den",labelFileProcessingAborted:"Upload stornov\xE1n",labelFileProcessingError:"Chyba p\u0159i uploadu",labelFileProcessingRevertError:"Chyba p\u0159i obnov\u011B",labelFileRemoveError:"Chyba p\u0159i odstran\u011Bn\xED",labelTapToCancel:"klepn\u011Bte pro storno",labelTapToRetry:"klepn\u011Bte pro opakov\xE1n\xED",labelTapToUndo:"klepn\u011Bte pro vr\xE1cen\xED",labelButtonRemoveItem:"Odstranit",labelButtonAbortItemLoad:"Storno",labelButtonRetryItemLoad:"Opakovat",labelButtonAbortItemProcessing:"Zp\u011Bt",labelButtonUndoItemProcessing:"Vr\xE1tit",labelButtonRetryItemProcessing:"Opakovat",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Soubor je p\u0159\xEDli\u0161 velk\xFD",labelMaxFileSize:"Nejv\u011Bt\u0161\xED velikost souboru je {filesize}",labelMaxTotalFileSizeExceeded:"P\u0159ekro\u010Dena maxim\xE1ln\xED celkov\xE1 velikost souboru",labelMaxTotalFileSize:"Maxim\xE1ln\xED celkov\xE1 velikost souboru je {filesize}",labelFileTypeNotAllowed:"Soubor je nespr\xE1vn\xE9ho typu",fileValidateTypeLabelExpectedTypes:"O\u010Dek\xE1v\xE1 se {allButLastType} nebo {lastType}",imageValidateSizeLabelFormatError:"Obr\xE1zek tohoto typu nen\xED podporov\xE1n",imageValidateSizeLabelImageSizeTooSmall:"Obr\xE1zek je p\u0159\xEDli\u0161 mal\xFD",imageValidateSizeLabelImageSizeTooBig:"Obr\xE1zek je p\u0159\xEDli\u0161 velk\xFD",imageValidateSizeLabelExpectedMinSize:"Minim\xE1ln\xED rozm\u011Br je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maxim\xE1ln\xED rozm\u011Br je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozli\u0161en\xED je p\u0159\xEDli\u0161 mal\xE9",imageValidateSizeLabelImageResolutionTooHigh:"Rozli\u0161en\xED je p\u0159\xEDli\u0161 velk\xE9",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1ln\xED rozli\u0161en\xED je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1ln\xED rozli\u0161en\xED je {maxResolution}"};var Fo={labelIdle:'Tr\xE6k & slip filer eller Gennemse ',labelInvalidField:"Felt indeholder ugyldige filer",labelFileWaitingForSize:"Venter p\xE5 st\xF8rrelse",labelFileSizeNotAvailable:"St\xF8rrelse ikke tilg\xE6ngelig",labelFileLoading:"Loader",labelFileLoadError:"Load fejlede",labelFileProcessing:"Uploader",labelFileProcessingComplete:"Upload f\xE6rdig",labelFileProcessingAborted:"Upload annulleret",labelFileProcessingError:"Upload fejlede",labelFileProcessingRevertError:"Fortryd fejlede",labelFileRemoveError:"Fjern fejlede",labelTapToCancel:"tryk for at annullere",labelTapToRetry:"tryk for at pr\xF8ve igen",labelTapToUndo:"tryk for at fortryde",labelButtonRemoveItem:"Fjern",labelButtonAbortItemLoad:"Annuller",labelButtonRetryItemLoad:"Fors\xF8g igen",labelButtonAbortItemProcessing:"Annuller",labelButtonUndoItemProcessing:"Fortryd",labelButtonRetryItemProcessing:"Pr\xF8v igen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Filen er for stor",labelMaxFileSize:"Maksimal filst\xF8rrelse er {filesize}",labelMaxTotalFileSizeExceeded:"Maksimal totalst\xF8rrelse overskredet",labelMaxTotalFileSize:"Maksimal total filst\xF8rrelse er {filesize}",labelFileTypeNotAllowed:"Ugyldig filtype",fileValidateTypeLabelExpectedTypes:"Forventer {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Ugyldigt format",imageValidateSizeLabelImageSizeTooSmall:"Billedet er for lille",imageValidateSizeLabelImageSizeTooBig:"Billedet er for stort",imageValidateSizeLabelExpectedMinSize:"Minimum st\xF8rrelse er {minBredde} \xD7 {minH\xF8jde}",imageValidateSizeLabelExpectedMaxSize:"Maksimal st\xF8rrelse er {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"For lav opl\xF8sning",imageValidateSizeLabelImageResolutionTooHigh:"For h\xF8j opl\xF8sning",imageValidateSizeLabelExpectedMinResolution:"Minimum opl\xF8sning er {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimal opl\xF8sning er {maxResolution}"};var Oo={labelIdle:'Dateien ablegen oder ausw\xE4hlen ',labelInvalidField:"Feld beinhaltet ung\xFCltige Dateien",labelFileWaitingForSize:"Dateigr\xF6\xDFe berechnen",labelFileSizeNotAvailable:"Dateigr\xF6\xDFe nicht verf\xFCgbar",labelFileLoading:"Laden",labelFileLoadError:"Fehler beim Laden",labelFileProcessing:"Upload l\xE4uft",labelFileProcessingComplete:"Upload abgeschlossen",labelFileProcessingAborted:"Upload abgebrochen",labelFileProcessingError:"Fehler beim Upload",labelFileProcessingRevertError:"Fehler beim Wiederherstellen",labelFileRemoveError:"Fehler beim L\xF6schen",labelTapToCancel:"abbrechen",labelTapToRetry:"erneut versuchen",labelTapToUndo:"r\xFCckg\xE4ngig",labelButtonRemoveItem:"Entfernen",labelButtonAbortItemLoad:"Verwerfen",labelButtonRetryItemLoad:"Erneut versuchen",labelButtonAbortItemProcessing:"Abbrechen",labelButtonUndoItemProcessing:"R\xFCckg\xE4ngig",labelButtonRetryItemProcessing:"Erneut versuchen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Datei ist zu gro\xDF",labelMaxFileSize:"Maximale Dateigr\xF6\xDFe: {filesize}",labelMaxTotalFileSizeExceeded:"Maximale gesamte Dateigr\xF6\xDFe \xFCberschritten",labelMaxTotalFileSize:"Maximale gesamte Dateigr\xF6\xDFe: {filesize}",labelFileTypeNotAllowed:"Dateityp ung\xFCltig",fileValidateTypeLabelExpectedTypes:"Erwartet {allButLastType} oder {lastType}",imageValidateSizeLabelFormatError:"Bildtyp nicht unterst\xFCtzt",imageValidateSizeLabelImageSizeTooSmall:"Bild ist zu klein",imageValidateSizeLabelImageSizeTooBig:"Bild ist zu gro\xDF",imageValidateSizeLabelExpectedMinSize:"Mindestgr\xF6\xDFe: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximale Gr\xF6\xDFe: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Aufl\xF6sung ist zu niedrig",imageValidateSizeLabelImageResolutionTooHigh:"Aufl\xF6sung ist zu hoch",imageValidateSizeLabelExpectedMinResolution:"Mindestaufl\xF6sung: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximale Aufl\xF6sung: {maxResolution}"};var Do={labelIdle:'\u03A3\u03CD\u03C1\u03B5\u03C4\u03B5 \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C3\u03B1\u03C2 \u03C3\u03C4\u03BF \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF \u03AE \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 ',labelInvalidField:"\u03A4\u03BF \u03C0\u03B5\u03B4\u03AF\u03BF \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BC\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1",labelFileWaitingForSize:"\u03A3\u03B5 \u03B1\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03B3\u03B9\u03B1 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2",labelFileSizeNotAvailable:"\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03BC\u03B7 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03BF",labelFileLoading:"\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03C3\u03B5 \u03B5\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7",labelFileLoadError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7",labelFileProcessing:"\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1",labelFileProcessingComplete:"\u0397 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5",labelFileProcessingAborted:"\u0397 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B1\u03BA\u03C5\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5",labelFileProcessingError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1",labelFileProcessingRevertError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC",labelFileRemoveError:"\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE",labelTapToCancel:"\u03C0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03B1\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7",labelTapToRetry:"\u03C0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7",labelTapToUndo:"\u03C0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03B1\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7",labelButtonRemoveItem:"\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7",labelButtonAbortItemLoad:"\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7",labelButtonRetryItemLoad:"\u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7",labelButtonAbortItemProcessing:"\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7",labelButtonUndoItemProcessing:"\u0391\u03BD\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7",labelButtonRetryItemProcessing:"\u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7",labelButtonProcessItem:"\u039C\u03B5\u03C4\u03B1\u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7",labelMaxFileSizeExceeded:"\u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF",labelMaxFileSize:"\u03A4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 {filesize}",labelMaxTotalFileSizeExceeded:"\u03A5\u03C0\u03AD\u03C1\u03B2\u03B1\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C5 \u03C3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03BF\u03CD \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2",labelMaxTotalFileSize:"\u03A4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03C3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 {filesize}",labelFileTypeNotAllowed:"\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5",fileValidateTypeLabelExpectedTypes:"\u03A4\u03B1 \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 {allButLastType} \u03AE {lastType}",imageValidateSizeLabelFormatError:"\u039F \u03C4\u03CD\u03C0\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B4\u03B5\u03BD \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9",imageValidateSizeLabelImageSizeTooSmall:"\u0397 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B9\u03BA\u03C1\u03AE",imageValidateSizeLabelImageSizeTooBig:"\u0397 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7",imageValidateSizeLabelExpectedMinSize:"\u03A4\u03BF \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u03A4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03CC \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0397 \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03C7\u03B1\u03BC\u03B7\u03BB\u03AE",imageValidateSizeLabelImageResolutionTooHigh:"\u0397 \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03C5\u03C8\u03B7\u03BB\u03AE",imageValidateSizeLabelExpectedMinResolution:"\u0397 \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03AE \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0397 \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03AE \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 {maxResolution}"};var Co={labelIdle:'Drag & Drop your files or Browse ',labelInvalidField:"Field contains invalid files",labelFileWaitingForSize:"Waiting for size",labelFileSizeNotAvailable:"Size not available",labelFileLoading:"Loading",labelFileLoadError:"Error during load",labelFileProcessing:"Uploading",labelFileProcessingComplete:"Upload complete",labelFileProcessingAborted:"Upload cancelled",labelFileProcessingError:"Error during upload",labelFileProcessingRevertError:"Error during revert",labelFileRemoveError:"Error during remove",labelTapToCancel:"tap to cancel",labelTapToRetry:"tap to retry",labelTapToUndo:"tap to undo",labelButtonRemoveItem:"Remove",labelButtonAbortItemLoad:"Abort",labelButtonRetryItemLoad:"Retry",labelButtonAbortItemProcessing:"Cancel",labelButtonUndoItemProcessing:"Undo",labelButtonRetryItemProcessing:"Retry",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"File is too large",labelMaxFileSize:"Maximum file size is {filesize}",labelMaxTotalFileSizeExceeded:"Maximum total size exceeded",labelMaxTotalFileSize:"Maximum total file size is {filesize}",labelFileTypeNotAllowed:"File of invalid type",fileValidateTypeLabelExpectedTypes:"Expects {allButLastType} or {lastType}",imageValidateSizeLabelFormatError:"Image type not supported",imageValidateSizeLabelImageSizeTooSmall:"Image is too small",imageValidateSizeLabelImageSizeTooBig:"Image is too big",imageValidateSizeLabelExpectedMinSize:"Minimum size is {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum size is {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolution is too low",imageValidateSizeLabelImageResolutionTooHigh:"Resolution is too high",imageValidateSizeLabelExpectedMinResolution:"Minimum resolution is {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum resolution is {maxResolution}"};var Bo={labelIdle:'Arrastra y suelta tus archivos o Examina ',labelInvalidField:"El campo contiene archivos inv\xE1lidos",labelFileWaitingForSize:"Esperando tama\xF1o",labelFileSizeNotAvailable:"Tama\xF1o no disponible",labelFileLoading:"Cargando",labelFileLoadError:"Error durante la carga",labelFileProcessing:"Subiendo",labelFileProcessingComplete:"Subida completa",labelFileProcessingAborted:"Subida cancelada",labelFileProcessingError:"Error durante la subida",labelFileProcessingRevertError:"Error durante la reversi\xF3n",labelFileRemoveError:"Error durante la eliminaci\xF3n",labelTapToCancel:"toca para cancelar",labelTapToRetry:"tocar para reintentar",labelTapToUndo:"tocar para deshacer",labelButtonRemoveItem:"Eliminar",labelButtonAbortItemLoad:"Cancelar",labelButtonRetryItemLoad:"Reintentar",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Deshacer",labelButtonRetryItemProcessing:"Reintentar",labelButtonProcessItem:"Subir",labelMaxFileSizeExceeded:"El archivo es demasiado grande",labelMaxFileSize:"El tama\xF1o m\xE1ximo del archivo es {filesize}",labelMaxTotalFileSizeExceeded:"Tama\xF1o total m\xE1ximo excedido",labelMaxTotalFileSize:"El tama\xF1o total m\xE1ximo del archivo es {filesize}",labelFileTypeNotAllowed:"Archivo de tipo inv\xE1lido",fileValidateTypeLabelExpectedTypes:"Espera {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagen no soportada",imageValidateSizeLabelImageSizeTooSmall:"La imagen es demasiado peque\xF1a",imageValidateSizeLabelImageSizeTooBig:"La imagen es demasiado grande",imageValidateSizeLabelExpectedMinSize:"El tama\xF1o m\xEDnimo es {minWidth} x {minHeight}",imageValidateSizeLabelExpectedMaxSize:"El tama\xF1o m\xE1ximo es {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La resoluci\xF3n es demasiado baja",imageValidateSizeLabelImageResolutionTooHigh:"La resoluci\xF3n es demasiado alta",imageValidateSizeLabelExpectedMinResolution:"La resoluci\xF3n m\xEDnima es {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La resoluci\xF3n m\xE1xima es {maxResolution}"};var ko={labelIdle:'\u0641\u0627\u06CC\u0644 \u0631\u0627 \u0627\u06CC\u0646\u062C\u0627 \u0628\u06A9\u0634\u06CC\u062F \u0648 \u0631\u0647\u0627 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u062C\u0633\u062A\u062C\u0648 \u06A9\u0646\u06CC\u062F ',labelInvalidField:"\u0641\u06CC\u0644\u062F \u062F\u0627\u0631\u0627\u06CC \u0641\u0627\u06CC\u0644 \u0647\u0627\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",labelFileWaitingForSize:"Waiting for size",labelFileSizeNotAvailable:"\u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 \u0645\u062C\u0627\u0632 \u0646\u06CC\u0633\u062A",labelFileLoading:"\u062F\u0631\u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileLoadError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0627\u062C\u0631\u0627",labelFileProcessing:"\u062F\u0631\u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileProcessingComplete:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u06A9\u0627\u0645\u0644 \u0634\u062F",labelFileProcessingAborted:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0644\u063A\u0648 \u0634\u062F",labelFileProcessingError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelFileProcessingRevertError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u062D\u0630\u0641",labelFileRemoveError:"\u062E\u0637\u0627 \u062F\u0631 \u0632\u0645\u0627\u0646 \u062D\u0630\u0641",labelTapToCancel:"\u0628\u0631\u0627\u06CC \u0644\u063A\u0648 \u0636\u0631\u0628\u0647 \u0628\u0632\u0646\u06CC\u062F",labelTapToRetry:"\u0628\u0631\u0627\u06CC \u062A\u06A9\u0631\u0627\u0631 \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",labelTapToUndo:"\u0628\u0631\u0627\u06CC \u0628\u0631\u06AF\u0634\u062A \u06A9\u0644\u06CC\u06A9 \u06A9\u0646\u06CC\u062F",labelButtonRemoveItem:"\u062D\u0630\u0641",labelButtonAbortItemLoad:"\u0644\u063A\u0648",labelButtonRetryItemLoad:"\u062A\u06A9\u0631\u0627\u0631",labelButtonAbortItemProcessing:"\u0644\u063A\u0648",labelButtonUndoItemProcessing:"\u0628\u0631\u06AF\u0634\u062A",labelButtonRetryItemProcessing:"\u062A\u06A9\u0631\u0627\u0631",labelButtonProcessItem:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC",labelMaxFileSizeExceeded:"\u0641\u0627\u06CC\u0644 \u0628\u0633\u06CC\u0627\u0631 \u062D\u062C\u06CC\u0645 \u0627\u0633\u062A",labelMaxFileSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0645\u062C\u0627\u0632 \u0641\u0627\u06CC\u0644 {filesize} \u0627\u0633\u062A",labelMaxTotalFileSizeExceeded:"\u0627\u0632 \u062D\u062F\u0627\u06A9\u062B\u0631 \u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 \u0628\u06CC\u0634\u062A\u0631 \u0634\u062F",labelMaxTotalFileSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u062D\u062C\u0645 \u0641\u0627\u06CC\u0644 {filesize} \u0627\u0633\u062A",labelFileTypeNotAllowed:"\u0646\u0648\u0639 \u0641\u0627\u06CC\u0644 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A",fileValidateTypeLabelExpectedTypes:"\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 {allButLastType} \u06CC\u0627 {lastType}",imageValidateSizeLabelFormatError:"\u0641\u0631\u0645\u062A \u062A\u0635\u0648\u06CC\u0631 \u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0646\u0645\u06CC \u0634\u0648\u062F",imageValidateSizeLabelImageSizeTooSmall:"\u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u06A9\u0648\u0686\u06A9 \u0627\u0633\u062A",imageValidateSizeLabelImageSizeTooBig:"\u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u0628\u0632\u0631\u06AF \u0627\u0633\u062A",imageValidateSizeLabelExpectedMinSize:"\u062D\u062F\u0627\u0642\u0644 \u0627\u0646\u062F\u0627\u0632\u0647 {minWidth} \xD7 {minHeight} \u0627\u0633\u062A",imageValidateSizeLabelExpectedMaxSize:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0627\u0646\u062F\u0627\u0632\u0647 {maxWidth} \xD7 {maxHeight} \u0627\u0633\u062A",imageValidateSizeLabelImageResolutionTooLow:"\u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u06A9\u0645 \u0627\u0633\u062A",imageValidateSizeLabelImageResolutionTooHigh:"\u0648\u0636\u0648\u0639 \u062A\u0635\u0648\u06CC\u0631 \u0628\u0633\u06CC\u0627\u0631 \u0632\u06CC\u0627\u062F \u0627\u0633\u062A",imageValidateSizeLabelExpectedMinResolution:"\u062D\u062F\u0627\u0642\u0644 \u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 {minResolution} \u0627\u0633\u062A",imageValidateSizeLabelExpectedMaxResolution:"\u062D\u062F\u0627\u06A9\u062B\u0631 \u0648\u0636\u0648\u062D \u062A\u0635\u0648\u06CC\u0631 {maxResolution} \u0627\u0633\u062A"};var No={labelIdle:'Ved\xE4 ja pudota tiedostoja tai Selaa ',labelInvalidField:"Kent\xE4ss\xE4 on virheellisi\xE4 tiedostoja",labelFileWaitingForSize:"Odotetaan kokoa",labelFileSizeNotAvailable:"Kokoa ei saatavilla",labelFileLoading:"Ladataan",labelFileLoadError:"Virhe latauksessa",labelFileProcessing:"L\xE4hetet\xE4\xE4n",labelFileProcessingComplete:"L\xE4hetys valmis",labelFileProcessingAborted:"L\xE4hetys peruttu",labelFileProcessingError:"Virhe l\xE4hetyksess\xE4",labelFileProcessingRevertError:"Virhe palautuksessa",labelFileRemoveError:"Virhe poistamisessa",labelTapToCancel:"peruuta napauttamalla",labelTapToRetry:"yrit\xE4 uudelleen napauttamalla",labelTapToUndo:"kumoa napauttamalla",labelButtonRemoveItem:"Poista",labelButtonAbortItemLoad:"Keskeyt\xE4",labelButtonRetryItemLoad:"Yrit\xE4 uudelleen",labelButtonAbortItemProcessing:"Peruuta",labelButtonUndoItemProcessing:"Kumoa",labelButtonRetryItemProcessing:"Yrit\xE4 uudelleen",labelButtonProcessItem:"L\xE4het\xE4",labelMaxFileSizeExceeded:"Tiedoston koko on liian suuri",labelMaxFileSize:"Tiedoston maksimikoko on {filesize}",labelMaxTotalFileSizeExceeded:"Tiedostojen yhdistetty maksimikoko ylitetty",labelMaxTotalFileSize:"Tiedostojen yhdistetty maksimikoko on {filesize}",labelFileTypeNotAllowed:"Tiedostotyyppi\xE4 ei sallita",fileValidateTypeLabelExpectedTypes:"Sallitaan {allButLastType} tai {lastType}",imageValidateSizeLabelFormatError:"Kuvatyyppi\xE4 ei tueta",imageValidateSizeLabelImageSizeTooSmall:"Kuva on liian pieni",imageValidateSizeLabelImageSizeTooBig:"Kuva on liian suuri",imageValidateSizeLabelExpectedMinSize:"Minimikoko on {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimikoko on {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resoluutio on liian pieni",imageValidateSizeLabelImageResolutionTooHigh:"Resoluutio on liian suuri",imageValidateSizeLabelExpectedMinResolution:"Minimiresoluutio on {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimiresoluutio on {maxResolution}"};var Vo={labelIdle:'Faites glisser vos fichiers ou Parcourir ',labelInvalidField:"Le champ contient des fichiers invalides",labelFileWaitingForSize:"En attente de taille",labelFileSizeNotAvailable:"Taille non disponible",labelFileLoading:"Chargement",labelFileLoadError:"Erreur durant le chargement",labelFileProcessing:"Traitement",labelFileProcessingComplete:"Traitement effectu\xE9",labelFileProcessingAborted:"Traitement interrompu",labelFileProcessingError:"Erreur durant le traitement",labelFileProcessingRevertError:"Erreur durant la restauration",labelFileRemoveError:"Erreur durant la suppression",labelTapToCancel:"appuyer pour annuler",labelTapToRetry:"appuyer pour r\xE9essayer",labelTapToUndo:"appuyer pour revenir en arri\xE8re",labelButtonRemoveItem:"Retirer",labelButtonAbortItemLoad:"Annuler",labelButtonRetryItemLoad:"Recommencer",labelButtonAbortItemProcessing:"Annuler",labelButtonUndoItemProcessing:"Revenir en arri\xE8re",labelButtonRetryItemProcessing:"Recommencer",labelButtonProcessItem:"Transf\xE9rer",labelMaxFileSizeExceeded:"Le fichier est trop volumineux",labelMaxFileSize:"La taille maximale de fichier est {filesize}",labelMaxTotalFileSizeExceeded:"Taille totale maximale d\xE9pass\xE9e",labelMaxTotalFileSize:"La taille totale maximale des fichiers est {filesize}",labelFileTypeNotAllowed:"Fichier non valide",fileValidateTypeLabelExpectedTypes:"Attendu {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Type d'image non pris en charge",imageValidateSizeLabelImageSizeTooSmall:"L'image est trop petite",imageValidateSizeLabelImageSizeTooBig:"L'image est trop grande",imageValidateSizeLabelExpectedMinSize:"La taille minimale est {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La taille maximale est {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La r\xE9solution est trop faible",imageValidateSizeLabelImageResolutionTooHigh:"La r\xE9solution est trop \xE9lev\xE9e",imageValidateSizeLabelExpectedMinResolution:"La r\xE9solution minimale est {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La r\xE9solution maximale est {maxResolution}"};var Go={labelIdle:'\u05D2\u05E8\u05D5\u05E8 \u05D5\u05E9\u05D7\u05E8\u05E8 \u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05DB\u05D0\u05DF \u05D0\u05D5 \u05DC\u05D7\u05E5 \u05DB\u05D0\u05DF \u05DC\u05D1\u05D7\u05D9\u05E8\u05D4 ',labelInvalidField:"\u05E7\u05D5\u05D1\u05E5 \u05DC\u05D0 \u05D7\u05D5\u05E7\u05D9",labelFileWaitingForSize:"\u05DE\u05D7\u05E9\u05D1 \u05D0\u05EA \u05D2\u05D5\u05D3\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileSizeNotAvailable:"\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E7\u05D1\u05D5\u05E2 \u05D0\u05EA \u05D2\u05D5\u05D3\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileLoading:"\u05D8\u05D5\u05E2\u05DF...",labelFileLoadError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileProcessing:"\u05DE\u05E2\u05DC\u05D4 \u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileProcessingComplete:"\u05D4\u05E2\u05DC\u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4",labelFileProcessingAborted:"\u05D4\u05E2\u05DC\u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D1\u05D5\u05D8\u05DC\u05D4",labelFileProcessingError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05D4\u05E2\u05DC\u05D0\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileProcessingRevertError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05E9\u05D7\u05D6\u05D5\u05E8 \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD",labelFileRemoveError:"\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D0\u05E8\u05E2\u05D4 \u05D1\u05E2\u05EA \u05D4\u05E1\u05E8\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5",labelTapToCancel:"\u05D4\u05E7\u05DC\u05E7 \u05DC\u05D1\u05D9\u05D8\u05D5\u05DC",labelTapToRetry:"\u05D4\u05E7\u05DC\u05E7 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05E0\u05D9\u05EA",labelTapToUndo:"\u05D4\u05E7\u05DC\u05E7 \u05DC\u05E9\u05D7\u05D6\u05E8",labelButtonRemoveItem:"\u05D4\u05E1\u05E8",labelButtonAbortItemLoad:"\u05D1\u05D8\u05DC",labelButtonRetryItemLoad:"\u05D8\u05E2\u05DF \u05E9\u05E0\u05D9\u05EA",labelButtonAbortItemProcessing:"\u05D1\u05D8\u05DC",labelButtonUndoItemProcessing:"\u05E9\u05D7\u05D6\u05E8",labelButtonRetryItemProcessing:"\u05E0\u05E1\u05D4 \u05E9\u05E0\u05D9\u05EA",labelButtonProcessItem:"\u05D4\u05E2\u05DC\u05D4 \u05E7\u05D5\u05D1\u05E5",labelMaxFileSizeExceeded:"\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9",labelMaxFileSize:"\u05D2\u05D5\u05D3\u05DC \u05D4\u05DE\u05D9\u05E8\u05D1\u05D9 \u05D4\u05DE\u05D5\u05EA\u05E8 \u05D4\u05D5\u05D0: {filesize}",labelMaxTotalFileSizeExceeded:"\u05D2\u05D5\u05D3\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D7\u05D5\u05E8\u05D2 \u05DE\u05D4\u05DB\u05DE\u05D5\u05EA \u05D4\u05DE\u05D5\u05EA\u05E8\u05EA",labelMaxTotalFileSize:"\u05D4\u05D2\u05D5\u05D3\u05DC \u05D4\u05DE\u05D9\u05E8\u05D1\u05D9 \u05E9\u05DC \u05E1\u05DA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD: {filesize}",labelFileTypeNotAllowed:"\u05E7\u05D5\u05D1\u05E5 \u05DE\u05E1\u05D5\u05D2 \u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05EA\u05E8",fileValidateTypeLabelExpectedTypes:"\u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D4\u05DE\u05D5\u05EA\u05E8\u05D9\u05DD \u05D4\u05DD {allButLastType} \u05D0\u05D5 {lastType}",imageValidateSizeLabelFormatError:"\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 \u05D6\u05D4 \u05D0\u05D9\u05E0\u05D4 \u05E0\u05EA\u05DE\u05DB\u05EA",imageValidateSizeLabelImageSizeTooSmall:"\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05E7\u05D8\u05E0\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelImageSizeTooBig:"\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05D2\u05D3\u05D5\u05DC\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelExpectedMinSize:"\u05D4\u05D2\u05D5\u05D3\u05DC \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA \u05DC\u05E4\u05D7\u05D5\u05EA: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u05D4\u05D2\u05D5\u05D3\u05DC \u05D4\u05DE\u05E8\u05D1\u05D9 \u05D4\u05DE\u05D5\u05EA\u05E8: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05E9\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05E0\u05DE\u05D5\u05DB\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelImageResolutionTooHigh:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05E9\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4 \u05D6\u05D5 \u05D2\u05D1\u05D5\u05D4\u05D4 \u05DE\u05D3\u05D9",imageValidateSizeLabelExpectedMinResolution:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05D9\u05D5\u05EA \u05DC\u05E4\u05D7\u05D5\u05EA: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u05D4\u05E8\u05D6\u05D5\u05DC\u05D5\u05E6\u05D9\u05D4 \u05D4\u05DE\u05D9\u05E8\u05D1\u05D9\u05EA \u05D4\u05DE\u05D5\u05EA\u05E8\u05EA \u05D4\u05D9\u05D0: {maxResolution}"};var Uo={labelIdle:'Ovdje "ispusti" datoteku ili Pretra\u017Ei ',labelInvalidField:"Polje sadr\u017Ei neispravne datoteke",labelFileWaitingForSize:"\u010Cekanje na veli\u010Dinu datoteke",labelFileSizeNotAvailable:"Veli\u010Dina datoteke nije dostupna",labelFileLoading:"U\u010Ditavanje",labelFileLoadError:"Gre\u0161ka tijekom u\u010Ditavanja",labelFileProcessing:"Prijenos",labelFileProcessingComplete:"Prijenos zavr\u0161en",labelFileProcessingAborted:"Prijenos otkazan",labelFileProcessingError:"Gre\u0161ka tijekom prijenosa",labelFileProcessingRevertError:"Gre\u0161ka tijekom vra\u0107anja",labelFileRemoveError:"Gre\u0161ka tijekom uklananja datoteke",labelTapToCancel:"Dodirni za prekid",labelTapToRetry:"Dodirni za ponovno",labelTapToUndo:"Dodirni za vra\u0107anje",labelButtonRemoveItem:"Ukloni",labelButtonAbortItemLoad:"Odbaci",labelButtonRetryItemLoad:"Ponovi",labelButtonAbortItemProcessing:"Prekini",labelButtonUndoItemProcessing:"Vrati",labelButtonRetryItemProcessing:"Ponovi",labelButtonProcessItem:"Prijenos",labelMaxFileSizeExceeded:"Datoteka je prevelika",labelMaxFileSize:"Maksimalna veli\u010Dina datoteke je {filesize}",labelMaxTotalFileSizeExceeded:"Maksimalna ukupna veli\u010Dina datoteke prekora\u010Dena",labelMaxTotalFileSize:"Maksimalna ukupna veli\u010Dina datoteke je {filesize}",labelFileTypeNotAllowed:"Tip datoteke nije podr\u017Ean",fileValidateTypeLabelExpectedTypes:"O\u010Dekivan {allButLastType} ili {lastType}",imageValidateSizeLabelFormatError:"Tip slike nije podr\u017Ean",imageValidateSizeLabelImageSizeTooSmall:"Slika je premala",imageValidateSizeLabelImageSizeTooBig:"Slika je prevelika",imageValidateSizeLabelExpectedMinSize:"Minimalna veli\u010Dina je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimalna veli\u010Dina je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezolucija je preniska",imageValidateSizeLabelImageResolutionTooHigh:"Rezolucija je previsoka",imageValidateSizeLabelExpectedMinResolution:"Minimalna rezolucija je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimalna rezolucija je {maxResolution}"};var Ho={labelIdle:'Mozgasd ide a f\xE1jlt a felt\xF6lt\xE9shez, vagy tall\xF3z\xE1s ',labelInvalidField:"A mez\u0151 \xE9rv\xE9nytelen f\xE1jlokat tartalmaz",labelFileWaitingForSize:"F\xE1ljm\xE9ret kisz\xE1mol\xE1sa",labelFileSizeNotAvailable:"A f\xE1jlm\xE9ret nem el\xE9rhet\u0151",labelFileLoading:"T\xF6lt\xE9s",labelFileLoadError:"Hiba a bet\xF6lt\xE9s sor\xE1n",labelFileProcessing:"Felt\xF6lt\xE9s",labelFileProcessingComplete:"Sikeres felt\xF6lt\xE9s",labelFileProcessingAborted:"A felt\xF6lt\xE9s megszak\xEDtva",labelFileProcessingError:"Hiba t\xF6rt\xE9nt a felt\xF6lt\xE9s sor\xE1n",labelFileProcessingRevertError:"Hiba a vissza\xE1ll\xEDt\xE1s sor\xE1n",labelFileRemoveError:"Hiba t\xF6rt\xE9nt az elt\xE1vol\xEDt\xE1s sor\xE1n",labelTapToCancel:"koppints a t\xF6rl\xE9shez",labelTapToRetry:"koppints az \xFAjrakezd\xE9shez",labelTapToUndo:"koppints a visszavon\xE1shoz",labelButtonRemoveItem:"Elt\xE1vol\xEDt\xE1s",labelButtonAbortItemLoad:"Megszak\xEDt\xE1s",labelButtonRetryItemLoad:"\xDAjrapr\xF3b\xE1lkoz\xE1s",labelButtonAbortItemProcessing:"Megszak\xEDt\xE1s",labelButtonUndoItemProcessing:"Visszavon\xE1s",labelButtonRetryItemProcessing:"\xDAjrapr\xF3b\xE1lkoz\xE1s",labelButtonProcessItem:"Felt\xF6lt\xE9s",labelMaxFileSizeExceeded:"A f\xE1jl t\xFAll\xE9pte a maxim\xE1lis m\xE9retet",labelMaxFileSize:"Maxim\xE1lis f\xE1jlm\xE9ret: {filesize}",labelMaxTotalFileSizeExceeded:"T\xFAll\xE9pte a maxim\xE1lis teljes m\xE9retet",labelMaxTotalFileSize:"A maxim\xE1is teljes f\xE1jlm\xE9ret: {filesize}",labelFileTypeNotAllowed:"\xC9rv\xE9nytelen t\xEDpus\xFA f\xE1jl",fileValidateTypeLabelExpectedTypes:"Enged\xE9lyezett t\xEDpusok {allButLastType} vagy {lastType}",imageValidateSizeLabelFormatError:"A k\xE9pt\xEDpus nem t\xE1mogatott",imageValidateSizeLabelImageSizeTooSmall:"A k\xE9p t\xFAl kicsi",imageValidateSizeLabelImageSizeTooBig:"A k\xE9p t\xFAl nagy",imageValidateSizeLabelExpectedMinSize:"Minimum m\xE9ret: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum m\xE9ret: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"A felbont\xE1s t\xFAl alacsony",imageValidateSizeLabelImageResolutionTooHigh:"A felbont\xE1s t\xFAl magas",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1is felbont\xE1s: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1lis felbont\xE1s: {maxResolution}"};var Wo={labelIdle:'Seret & Jatuhkan berkas Anda atau Jelajahi',labelInvalidField:"Isian berisi berkas yang tidak valid",labelFileWaitingForSize:"Menunggu ukuran berkas",labelFileSizeNotAvailable:"Ukuran berkas tidak tersedia",labelFileLoading:"Memuat",labelFileLoadError:"Kesalahan saat memuat",labelFileProcessing:"Mengunggah",labelFileProcessingComplete:"Pengunggahan selesai",labelFileProcessingAborted:"Pengunggahan dibatalkan",labelFileProcessingError:"Kesalahan saat pengunggahan",labelFileProcessingRevertError:"Kesalahan saat pemulihan",labelFileRemoveError:"Kesalahan saat penghapusan",labelTapToCancel:"ketuk untuk membatalkan",labelTapToRetry:"ketuk untuk mencoba lagi",labelTapToUndo:"ketuk untuk mengurungkan",labelButtonRemoveItem:"Hapus",labelButtonAbortItemLoad:"Batalkan",labelButtonRetryItemLoad:"Coba Kembali",labelButtonAbortItemProcessing:"Batalkan",labelButtonUndoItemProcessing:"Urungkan",labelButtonRetryItemProcessing:"Coba Kembali",labelButtonProcessItem:"Unggah",labelMaxFileSizeExceeded:"Berkas terlalu besar",labelMaxFileSize:"Ukuran berkas maksimum adalah {filesize}",labelMaxTotalFileSizeExceeded:"Jumlah berkas maksimum terlampaui",labelMaxTotalFileSize:"Jumlah berkas maksimum adalah {filesize}",labelFileTypeNotAllowed:"Jenis berkas tidak valid",fileValidateTypeLabelExpectedTypes:"Mengharapkan {allButLastType} atau {lastType}",imageValidateSizeLabelFormatError:"Jenis citra tidak didukung",imageValidateSizeLabelImageSizeTooSmall:"Citra terlalu kecil",imageValidateSizeLabelImageSizeTooBig:"Citra terlalu besar",imageValidateSizeLabelExpectedMinSize:"Ukuran minimum adalah {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Ukuran maksimum adalah {minWidth} \xD7 {minHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolusi terlalu rendah",imageValidateSizeLabelImageResolutionTooHigh:"Resolusi terlalu tinggi",imageValidateSizeLabelExpectedMinResolution:"Resolusi minimum adalah {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Resolusi maksimum adalah {maxResolution}"};var jo={labelIdle:'Trascina e rilascia i tuoi file oppure Sfoglia ',labelInvalidField:"Il campo contiene dei file non validi",labelFileWaitingForSize:"In attesa della dimensione",labelFileSizeNotAvailable:"Dimensione non disponibile",labelFileLoading:"Caricamento",labelFileLoadError:"Errore durante il caricamento",labelFileProcessing:"Caricamento",labelFileProcessingComplete:"Caricamento completato",labelFileProcessingAborted:"Caricamento cancellato",labelFileProcessingError:"Errore durante il caricamento",labelFileProcessingRevertError:"Errore durante il ripristino",labelFileRemoveError:"Errore durante l'eliminazione",labelTapToCancel:"tocca per cancellare",labelTapToRetry:"tocca per riprovare",labelTapToUndo:"tocca per ripristinare",labelButtonRemoveItem:"Elimina",labelButtonAbortItemLoad:"Cancella",labelButtonRetryItemLoad:"Ritenta",labelButtonAbortItemProcessing:"Cancella",labelButtonUndoItemProcessing:"Indietro",labelButtonRetryItemProcessing:"Ritenta",labelButtonProcessItem:"Carica",labelMaxFileSizeExceeded:"La dimensione del file \xE8 eccessiva",labelMaxFileSize:"La dimensione massima del file \xE8 {filesize}",labelMaxTotalFileSizeExceeded:"Dimensione totale massima superata",labelMaxTotalFileSize:"La dimensione massima totale dei file \xE8 {filesize}",labelFileTypeNotAllowed:"File non supportato",fileValidateTypeLabelExpectedTypes:"Aspetta {allButLastType} o {lastType}",imageValidateSizeLabelFormatError:"Tipo di immagine non supportata",imageValidateSizeLabelImageSizeTooSmall:"L'immagine \xE8 troppo piccola",imageValidateSizeLabelImageSizeTooBig:"L'immagine \xE8 troppo grande",imageValidateSizeLabelExpectedMinSize:"La dimensione minima \xE8 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"La dimensione massima \xE8 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"La risoluzione \xE8 troppo bassa",imageValidateSizeLabelImageResolutionTooHigh:"La risoluzione \xE8 troppo alta",imageValidateSizeLabelExpectedMinResolution:"La risoluzione minima \xE8 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"La risoluzione massima \xE8 {maxResolution}"};var Yo={labelIdle:'\u30D5\u30A1\u30A4\u30EB\u3092\u30C9\u30E9\u30C3\u30B0&\u30C9\u30ED\u30C3\u30D7\u53C8\u306F\u30D5\u30A1\u30A4\u30EB\u9078\u629E',labelInvalidField:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3067\u304D\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059",labelFileWaitingForSize:"\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u3092\u5F85\u3063\u3066\u3044\u307E\u3059",labelFileSizeNotAvailable:"\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u304C\u307F\u3064\u304B\u308A\u307E\u305B\u3093",labelFileLoading:"\u8AAD\u8FBC\u4E2D...",labelFileLoadError:"\u8AAD\u8FBC\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelFileProcessing:"\u8AAD\u8FBC\u4E2D...",labelFileProcessingComplete:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u5B8C\u4E86",labelFileProcessingAborted:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F",labelFileProcessingError:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelFileProcessingRevertError:"\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelFileRemoveError:"\u524A\u9664\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F",labelTapToCancel:"\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30AD\u30E3\u30F3\u30BB\u30EB",labelTapToRetry:"\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u4E0B\u3055\u3044",labelTapToUndo:"\u5143\u306B\u623B\u3059\u306B\u306F\u30BF\u30C3\u30D7\u3057\u307E\u3059",labelButtonRemoveItem:"\u524A\u9664",labelButtonAbortItemLoad:"\u4E2D\u65AD",labelButtonRetryItemLoad:"\u3082\u3046\u4E00\u5EA6\u5B9F\u884C",labelButtonAbortItemProcessing:"\u30AD\u30E3\u30F3\u30BB\u30EB",labelButtonUndoItemProcessing:"\u5143\u306B\u623B\u3059",labelButtonRetryItemProcessing:"\u3082\u3046\u4E00\u5EA6\u5B9F\u884C",labelButtonProcessItem:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9",labelMaxFileSizeExceeded:"\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u304C\u5927\u304D\u3059\u304E\u307E\u3059",labelMaxFileSize:"\u6700\u5927\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u306F {filesize} \u3067\u3059",labelMaxTotalFileSizeExceeded:"\u6700\u5927\u5408\u8A08\u30B5\u30A4\u30BA\u3092\u8D85\u3048\u307E\u3057\u305F",labelMaxTotalFileSize:"\u6700\u5927\u5408\u8A08\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u306F {filesize} \u3067\u3059",labelFileTypeNotAllowed:"\u7121\u52B9\u306A\u30D5\u30A1\u30A4\u30EB\u3067\u3059",fileValidateTypeLabelExpectedTypes:"\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u308B\u30D5\u30A1\u30A4\u30EB\u306F {allButLastType} \u53C8\u306F {lastType} \u3067\u3059",imageValidateSizeLabelFormatError:"\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u306A\u3044\u753B\u50CF\u3067\u3059",imageValidateSizeLabelImageSizeTooSmall:"\u753B\u50CF\u304C\u5C0F\u3055\u3059\u304E\u307E\u3059",imageValidateSizeLabelImageSizeTooBig:"\u753B\u50CF\u304C\u5927\u304D\u3059\u304E\u307E\u3059",imageValidateSizeLabelExpectedMinSize:"\u753B\u50CF\u306E\u6700\u5C0F\u30B5\u30A4\u30BA\u306F{minWidth}\xD7{minHeight}\u3067\u3059",imageValidateSizeLabelExpectedMaxSize:"\u753B\u50CF\u306E\u6700\u5927\u30B5\u30A4\u30BA\u306F{maxWidth} \xD7 {maxHeight}\u3067\u3059",imageValidateSizeLabelImageResolutionTooLow:"\u753B\u50CF\u306E\u89E3\u50CF\u5EA6\u304C\u4F4E\u3059\u304E\u307E\u3059",imageValidateSizeLabelImageResolutionTooHigh:"\u753B\u50CF\u306E\u89E3\u50CF\u5EA6\u304C\u9AD8\u3059\u304E\u307E\u3059",imageValidateSizeLabelExpectedMinResolution:"\u753B\u50CF\u306E\u6700\u5C0F\u89E3\u50CF\u5EA6\u306F{minResolution}\u3067\u3059",imageValidateSizeLabelExpectedMaxResolution:"\u753B\u50CF\u306E\u6700\u5927\u89E3\u50CF\u5EA6\u306F{maxResolution}\u3067\u3059"};var qo={labelIdle:'\u1791\u17B6\u1789&\u178A\u17B6\u1780\u17CB\u17A0\u17D2\u179C\u17B6\u179B\u17CB\u17AF\u1780\u179F\u17B6\u179A\u179A\u1794\u179F\u17CB\u17A2\u17D2\u1793\u1780 \u17AC \u179F\u17D2\u179C\u17C2\u1784\u179A\u1780 ',labelInvalidField:"\u1785\u1793\u17D2\u179B\u17C4\u17C7\u1798\u17B6\u1793\u17AF\u1780\u179F\u17B6\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",labelFileWaitingForSize:"\u1780\u17C6\u1796\u17BB\u1784\u179A\u1784\u17CB\u1785\u17B6\u17C6\u1791\u17C6\u17A0\u17C6",labelFileSizeNotAvailable:"\u1791\u17C6\u17A0\u17C6\u1798\u17B7\u1793\u17A2\u17B6\u1785\u1794\u17D2\u179A\u17BE\u1794\u17B6\u1793",labelFileLoading:"\u1780\u17C6\u1796\u17BB\u1784\u178A\u17C6\u178E\u17BE\u179A\u1780\u17B6\u179A",labelFileLoadError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178A\u17C6\u178E\u17BE\u179A\u1780\u17B6\u179A",labelFileProcessing:"\u1780\u17C6\u1796\u17BB\u1784\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelFileProcessingComplete:"\u1780\u17B6\u179A\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784\u1796\u17C1\u1789\u179B\u17C1\u1789",labelFileProcessingAborted:"\u1780\u17B6\u179A\u1794\u1784\u17D2\u17A0\u17C4\u17C7\u178F\u17D2\u179A\u17BC\u179C\u1794\u17B6\u1793\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelFileProcessingError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u1780\u17C6\u1796\u17BB\u1784\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelFileProcessingRevertError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178F\u17D2\u179A\u17A1\u1794\u17CB",labelFileRemoveError:"\u1798\u17B6\u1793\u1794\u1789\u17D2\u17A0\u17B6\u1780\u17C6\u17A1\u17BB\u1784\u1796\u17C1\u179B\u178A\u1780\u1785\u17C1\u1789",labelTapToCancel:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelTapToRetry:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelTapToUndo:"\u1785\u17BB\u1785\u178A\u17BE\u1798\u17D2\u1794\u17B8\u1798\u17B7\u1793\u1792\u17D2\u179C\u17BE\u179C\u17B7\u1789",labelButtonRemoveItem:"\u1799\u1780\u1785\u17C1\u1789",labelButtonAbortItemLoad:"\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelButtonRetryItemLoad:"\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelButtonAbortItemProcessing:"\u1794\u17C4\u17C7\u1794\u1784\u17CB",labelButtonUndoItemProcessing:"\u1798\u17B7\u1793\u1792\u17D2\u179C\u17BE\u179C\u17B7\u1789",labelButtonRetryItemProcessing:"\u1796\u17D2\u1799\u17B6\u1799\u17B6\u1798\u1798\u17D2\u178F\u1784\u1791\u17C0\u178F",labelButtonProcessItem:"\u1795\u17D2\u1791\u17BB\u1780\u17A1\u17BE\u1784",labelMaxFileSizeExceeded:"\u17AF\u1780\u179F\u17B6\u179A\u1792\u17C6\u1796\u17C1\u1780",labelMaxFileSize:"\u1791\u17C6\u17A0\u17C6\u17AF\u1780\u179F\u17B6\u179A\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {filesize}",labelMaxTotalFileSizeExceeded:"\u179B\u17BE\u179F\u1791\u17C6\u17A0\u17C6\u179F\u179A\u17BB\u1794\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6",labelMaxTotalFileSize:"\u1791\u17C6\u17A0\u17C6\u17AF\u1780\u179F\u17B6\u179A\u179F\u179A\u17BB\u1794\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {filesize}",labelFileTypeNotAllowed:"\u1794\u17D2\u179A\u1797\u17C1\u1791\u17AF\u1780\u179F\u17B6\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",fileValidateTypeLabelExpectedTypes:"\u179A\u17C6\u1796\u17B9\u1784\u1790\u17B6 {allButLastType} \u17AC {lastType}",imageValidateSizeLabelFormatError:"\u1794\u17D2\u179A\u1797\u17C1\u1791\u179A\u17BC\u1794\u1797\u17B6\u1796\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C",imageValidateSizeLabelImageSizeTooSmall:"\u179A\u17BC\u1794\u1797\u17B6\u1796\u178F\u17BC\u1785\u1796\u17C1\u1780",imageValidateSizeLabelImageSizeTooBig:"\u179A\u17BC\u1794\u1797\u17B6\u1796\u1792\u17C6\u1796\u17C1\u1780",imageValidateSizeLabelExpectedMinSize:"\u1791\u17C6\u17A0\u17C6\u17A2\u1794\u17D2\u1794\u1794\u179A\u1798\u17B6\u1782\u17BA {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u1791\u17C6\u17A0\u17C6\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u1791\u17B6\u1794\u1796\u17C1\u1780",imageValidateSizeLabelImageResolutionTooHigh:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u1781\u17D2\u1796\u179F\u17CB\u1796\u17C1\u1780",imageValidateSizeLabelExpectedMinResolution:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u17A2\u1794\u17D2\u1794\u1794\u179A\u1798\u17B6\u1782\u17BA {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u1782\u17BB\u178E\u1797\u17B6\u1796\u1794\u1784\u17D2\u17A0\u17B6\u1789\u17A2\u178F\u17B7\u1794\u179A\u1798\u17B6\u1782\u17BA {maxResolution}"};var $o={labelIdle:'\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8 \uD558\uAC70\uB098 \uCC3E\uC544\uBCF4\uAE30 ',labelInvalidField:"\uD544\uB4DC\uC5D0 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uD30C\uC77C\uC774 \uC788\uC2B5\uB2C8\uB2E4.",labelFileWaitingForSize:"\uC6A9\uB7C9 \uD655\uC778\uC911",labelFileSizeNotAvailable:"\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uC6A9\uB7C9",labelFileLoading:"\uBD88\uB7EC\uC624\uB294 \uC911",labelFileLoadError:"\uD30C\uC77C \uBD88\uB7EC\uC624\uAE30 \uC2E4\uD328",labelFileProcessing:"\uC5C5\uB85C\uB4DC \uC911",labelFileProcessingComplete:"\uC5C5\uB85C\uB4DC \uC131\uACF5",labelFileProcessingAborted:"\uC5C5\uB85C\uB4DC \uCDE8\uC18C\uB428",labelFileProcessingError:"\uD30C\uC77C \uC5C5\uB85C\uB4DC \uC2E4\uD328",labelFileProcessingRevertError:"\uB418\uB3CC\uB9AC\uAE30 \uC2E4\uD328",labelFileRemoveError:"\uC81C\uAC70 \uC2E4\uD328",labelTapToCancel:"\uD0ED\uD558\uC5EC \uCDE8\uC18C",labelTapToRetry:"\uD0ED\uD558\uC5EC \uC7AC\uC2DC\uC791",labelTapToUndo:"\uD0ED\uD558\uC5EC \uC2E4\uD589 \uCDE8\uC18C",labelButtonRemoveItem:"\uC81C\uAC70",labelButtonAbortItemLoad:"\uC911\uB2E8",labelButtonRetryItemLoad:"\uC7AC\uC2DC\uC791",labelButtonAbortItemProcessing:"\uCDE8\uC18C",labelButtonUndoItemProcessing:"\uC2E4\uD589 \uCDE8\uC18C",labelButtonRetryItemProcessing:"\uC7AC\uC2DC\uC791",labelButtonProcessItem:"\uC5C5\uB85C\uB4DC",labelMaxFileSizeExceeded:"\uD30C\uC77C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4.",labelMaxFileSize:"\uCD5C\uB300 \uD30C\uC77C \uC6A9\uB7C9\uC740 {filesize} \uC785\uB2C8\uB2E4.",labelMaxTotalFileSizeExceeded:"\uCD5C\uB300 \uC804\uCCB4 \uD30C\uC77C \uC6A9\uB7C9 \uCD08\uACFC\uD558\uC600\uC2B5\uB2C8\uB2E4.",labelMaxTotalFileSize:"\uCD5C\uB300 \uC804\uCCB4 \uD30C\uC77C \uC6A9\uB7C9\uC740 {filesize} \uC785\uB2C8\uB2E4.",labelFileTypeNotAllowed:"\uC798\uBABB\uB41C \uD615\uC2DD\uC758 \uD30C\uC77C",fileValidateTypeLabelExpectedTypes:"{allButLastType} \uB610\uB294 {lastType}",imageValidateSizeLabelFormatError:"\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uC774\uBBF8\uC9C0 \uC720\uD615",imageValidateSizeLabelImageSizeTooSmall:"\uC774\uBBF8\uC9C0\uAC00 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4.",imageValidateSizeLabelImageSizeTooBig:"\uC774\uBBF8\uC9C0\uAC00 \uB108\uBB34 \uD07D\uB2C8\uB2E4.",imageValidateSizeLabelExpectedMinSize:"\uC774\uBBF8\uC9C0 \uCD5C\uC18C \uD06C\uAE30\uB294 {minWidth} \xD7 {minHeight} \uC785\uB2C8\uB2E4",imageValidateSizeLabelExpectedMaxSize:"\uC774\uBBF8\uC9C0 \uCD5C\uB300 \uD06C\uAE30\uB294 {maxWidth} \xD7 {maxHeight} \uC785\uB2C8\uB2E4",imageValidateSizeLabelImageResolutionTooLow:"\uD574\uC0C1\uB3C4\uAC00 \uB108\uBB34 \uB0AE\uC2B5\uB2C8\uB2E4.",imageValidateSizeLabelImageResolutionTooHigh:"\uD574\uC0C1\uB3C4\uAC00 \uB108\uBB34 \uB192\uC2B5\uB2C8\uB2E4.",imageValidateSizeLabelExpectedMinResolution:"\uCD5C\uC18C \uD574\uC0C1\uB3C4\uB294 {minResolution} \uC785\uB2C8\uB2E4.",imageValidateSizeLabelExpectedMaxResolution:"\uCD5C\uB300 \uD574\uC0C1\uB3C4\uB294 {maxResolution} \uC785\uB2C8\uB2E4."};var Xo={labelIdle:'\u012Ed\u0117kite failus \u010Dia arba Ie\u0161kokite ',labelInvalidField:"Laukelis talpina netinkamus failus",labelFileWaitingForSize:"Laukiama dyd\u017Eio",labelFileSizeNotAvailable:"Dydis ne\u017Einomas",labelFileLoading:"Kraunama",labelFileLoadError:"Klaida \u012Fkeliant",labelFileProcessing:"\u012Ekeliama",labelFileProcessingComplete:"\u012Ek\u0117limas s\u0117kmingas",labelFileProcessingAborted:"\u012Ek\u0117limas at\u0161auktas",labelFileProcessingError:"\u012Ekeliant \u012Fvyko klaida",labelFileProcessingRevertError:"At\u0161aukiant \u012Fvyko klaida",labelFileRemoveError:"I\u0161trinant \u012Fvyko klaida",labelTapToCancel:"Palieskite nor\u0117dami at\u0161aukti",labelTapToRetry:"Palieskite nor\u0117dami pakartoti",labelTapToUndo:"Palieskite nor\u0117dami at\u0161aukti",labelButtonRemoveItem:"I\u0161trinti",labelButtonAbortItemLoad:"Sustabdyti",labelButtonRetryItemLoad:"Pakartoti",labelButtonAbortItemProcessing:"At\u0161aukti",labelButtonUndoItemProcessing:"At\u0161aukti",labelButtonRetryItemProcessing:"Pakartoti",labelButtonProcessItem:"\u012Ekelti",labelMaxFileSizeExceeded:"Failas per didelis",labelMaxFileSize:"Maksimalus failo dydis yra {filesize}",labelMaxTotalFileSizeExceeded:"Vir\u0161ijote maksimal\u0173 leistin\u0105 dyd\u012F",labelMaxTotalFileSize:"Maksimalus leistinas dydis yra {filesize}",labelFileTypeNotAllowed:"Netinkamas failas",fileValidateTypeLabelExpectedTypes:"Tikisi {allButLastType} arba {lastType}",imageValidateSizeLabelFormatError:"Nuotraukos formatas nepalaikomas",imageValidateSizeLabelImageSizeTooSmall:"Nuotrauka per ma\u017Ea",imageValidateSizeLabelImageSizeTooBig:"Nuotrauka per didel\u0117",imageValidateSizeLabelExpectedMinSize:"Minimalus dydis yra {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimalus dydis yra {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezoliucija per ma\u017Ea",imageValidateSizeLabelImageResolutionTooHigh:"Rezoliucija per didel\u0117",imageValidateSizeLabelExpectedMinResolution:"Minimali rezoliucija yra {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimali rezoliucija yra {maxResolution}"};var Ko={labelIdle:'I file hn\xFBkl\xFBt rawh, emaw Zawnna ',labelInvalidField:"Hemi hian files diklo a kengtel",labelFileWaitingForSize:"A lenzawng a ngh\xE2k mek",labelFileSizeNotAvailable:"A lenzawng a awmlo",labelFileLoading:"Loading",labelFileLoadError:"Load laiin dik lo a awm",labelFileProcessing:"Uploading",labelFileProcessingComplete:"Upload a zo",labelFileProcessingAborted:"Upload s\xFBt a ni",labelFileProcessingError:"Upload laiin dik lo a awm",labelFileProcessingRevertError:"Dahk\xEEr laiin dik lo a awm",labelFileRemoveError:"Paih laiin dik lo a awm",labelTapToCancel:"S\xFBt turin hmet rawh",labelTapToRetry:"Tinawn turin hmet rawh",labelTapToUndo:"Tilet turin hmet rawh",labelButtonRemoveItem:"Paihna",labelButtonAbortItemLoad:"Tihtlawlhna",labelButtonRetryItemLoad:"Tihnawnna",labelButtonAbortItemProcessing:"S\xFBtna",labelButtonUndoItemProcessing:"Tihletna",labelButtonRetryItemProcessing:"Tihnawnna",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"File a lian lutuk",labelMaxFileSize:"File lenzawng tam ber chu {filesize} ani",labelMaxTotalFileSizeExceeded:"A lenzawng belh kh\xE2wm tam ber a p\xEAl",labelMaxTotalFileSize:"File lenzawng belh kh\xE2wm tam ber chu {filesize} a ni",labelFileTypeNotAllowed:"File type dik lo a ni",fileValidateTypeLabelExpectedTypes:"{allButLastType} emaw {lastType} emaw beisei a ni",imageValidateSizeLabelFormatError:"Thlal\xE2k type a thl\xE2wplo",imageValidateSizeLabelImageSizeTooSmall:"Thlal\xE2k hi a t\xEA lutuk",imageValidateSizeLabelImageSizeTooBig:"Thlal\xE2k hi a lian lutuk",imageValidateSizeLabelExpectedMinSize:"A lenzawng tl\xEAm ber chu {minWidth} x {minHeight} a ni",imageValidateSizeLabelExpectedMaxSize:"A lenzawng tam ber chu {maxWidth} x {maxHeight} a ni",imageValidateSizeLabelImageResolutionTooLow:"Resolution a hniam lutuk",imageValidateSizeLabelImageResolutionTooHigh:"Resolution a s\xE2ng lutuk",imageValidateSizeLabelExpectedMinResolution:"Resolution hniam ber chu {minResolution} a ni",imageValidateSizeLabelExpectedMaxResolution:"Resolution s\xE2ng ber chu {maxResolution} a ni"};var Zo={labelIdle:'Ievelciet savus failus vai p\u0101rl\u016Bkojiet \u0161eit ',labelInvalidField:"Lauks satur neder\u012Bgus failus",labelFileWaitingForSize:"Gaid\u0101m faila izm\u0113ru",labelFileSizeNotAvailable:"Izm\u0113rs nav pieejams",labelFileLoading:"Notiek iel\u0101de",labelFileLoadError:"Notika k\u013C\u016Bda iel\u0101des laik\u0101",labelFileProcessing:"Notiek aug\u0161upiel\u0101de",labelFileProcessingComplete:"Aug\u0161upiel\u0101de pabeigta",labelFileProcessingAborted:"Aug\u0161upiel\u0101de atcelta",labelFileProcessingError:"Notika k\u013C\u016Bda aug\u0161upiel\u0101des laik\u0101",labelFileProcessingRevertError:"Notika k\u013C\u016Bda atgrie\u0161anas laik\u0101",labelFileRemoveError:"Notika k\u013C\u016Bda dz\u0113\u0161anas laik\u0101",labelTapToCancel:"pieskarieties, lai atceltu",labelTapToRetry:"pieskarieties, lai m\u0113\u0123in\u0101tu v\u0113lreiz",labelTapToUndo:"pieskarieties, lai atsauktu",labelButtonRemoveItem:"Dz\u0113st",labelButtonAbortItemLoad:"P\u0101rtraukt",labelButtonRetryItemLoad:"M\u0113\u0123in\u0101t v\u0113lreiz",labelButtonAbortItemProcessing:"P\u0101rtraucam",labelButtonUndoItemProcessing:"Atsaucam",labelButtonRetryItemProcessing:"M\u0113\u0123in\u0101m v\u0113lreiz",labelButtonProcessItem:"Aug\u0161upiel\u0101d\u0113t",labelMaxFileSizeExceeded:"Fails ir p\u0101r\u0101k liels",labelMaxFileSize:"Maksim\u0101lais faila izm\u0113rs ir {filesize}",labelMaxTotalFileSizeExceeded:"P\u0101rsniegts maksim\u0101lais kop\u0113jais failu izm\u0113rs",labelMaxTotalFileSize:"Maksim\u0101lais kop\u0113jais failu izm\u0113rs ir {filesize}",labelFileTypeNotAllowed:"Neder\u012Bgs faila tips",fileValidateTypeLabelExpectedTypes:"Sagaid\u0101m {allButLastType} vai {lastType}",imageValidateSizeLabelFormatError:"Neatbilsto\u0161s att\u0113la tips",imageValidateSizeLabelImageSizeTooSmall:"Att\u0113ls ir p\u0101r\u0101k mazs",imageValidateSizeLabelImageSizeTooBig:"Att\u0113ls ir p\u0101r\u0101k liels",imageValidateSizeLabelExpectedMinSize:"Minim\u0101lais izm\u0113rs ir {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksim\u0101lais izm\u0113rs ir {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Iz\u0161\u0137irtsp\u0113ja ir p\u0101r\u0101k zema",imageValidateSizeLabelImageResolutionTooHigh:"Iz\u0161\u0137irtsp\u0113ja ir p\u0101r\u0101k augsta",imageValidateSizeLabelExpectedMinResolution:"Minim\u0101l\u0101 iz\u0161\u0137irtsp\u0113ja ir {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksim\u0101l\u0101 iz\u0161\u0137irtsp\u0113ja ir {maxResolution}"};var Qo={labelIdle:'Dra og slipp filene dine, eller Bla gjennom... ',labelInvalidField:"Feltet inneholder ugyldige filer",labelFileWaitingForSize:"Venter p\xE5 st\xF8rrelse",labelFileSizeNotAvailable:"St\xF8rrelse ikke tilgjengelig",labelFileLoading:"Laster",labelFileLoadError:"Feil under lasting",labelFileProcessing:"Laster opp",labelFileProcessingComplete:"Opplasting ferdig",labelFileProcessingAborted:"Opplasting avbrutt",labelFileProcessingError:"Feil under opplasting",labelFileProcessingRevertError:"Feil under reversering",labelFileRemoveError:"Feil under flytting",labelTapToCancel:"klikk for \xE5 avbryte",labelTapToRetry:"klikk for \xE5 pr\xF8ve p\xE5 nytt",labelTapToUndo:"klikk for \xE5 angre",labelButtonRemoveItem:"Fjern",labelButtonAbortItemLoad:"Avbryt",labelButtonRetryItemLoad:"Pr\xF8v p\xE5 nytt",labelButtonAbortItemProcessing:"Avbryt",labelButtonUndoItemProcessing:"Angre",labelButtonRetryItemProcessing:"Pr\xF8v p\xE5 nytt",labelButtonProcessItem:"Last opp",labelMaxFileSizeExceeded:"Filen er for stor",labelMaxFileSize:"Maksimal filst\xF8rrelse er {filesize}",labelMaxTotalFileSizeExceeded:"Maksimal total st\xF8rrelse oversteget",labelMaxTotalFileSize:"Maksimal total st\xF8rrelse er {filesize}",labelFileTypeNotAllowed:"Ugyldig filtype",fileValidateTypeLabelExpectedTypes:"Forventer {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Bildeformat ikke st\xF8ttet",imageValidateSizeLabelImageSizeTooSmall:"Bildet er for lite",imageValidateSizeLabelImageSizeTooBig:"Bildet er for stort",imageValidateSizeLabelExpectedMinSize:"Minimumsst\xF8rrelse er {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksimumsst\xF8rrelse er {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Oppl\xF8sningen er for lav",imageValidateSizeLabelImageResolutionTooHigh:"Oppl\xF8sningen er for h\xF8y",imageValidateSizeLabelExpectedMinResolution:"Minimum oppl\xF8sning er {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksimal oppl\xF8sning er {maxResolution}"};var Jo={labelIdle:'Drag & Drop je bestanden of Bladeren ',labelInvalidField:"Veld bevat ongeldige bestanden",labelFileWaitingForSize:"Wachten op grootte",labelFileSizeNotAvailable:"Grootte niet beschikbaar",labelFileLoading:"Laden",labelFileLoadError:"Fout tijdens laden",labelFileProcessing:"Uploaden",labelFileProcessingComplete:"Upload afgerond",labelFileProcessingAborted:"Upload geannuleerd",labelFileProcessingError:"Fout tijdens upload",labelFileProcessingRevertError:"Fout bij herstellen",labelFileRemoveError:"Fout bij verwijderen",labelTapToCancel:"tik om te annuleren",labelTapToRetry:"tik om opnieuw te proberen",labelTapToUndo:"tik om ongedaan te maken",labelButtonRemoveItem:"Verwijderen",labelButtonAbortItemLoad:"Afbreken",labelButtonRetryItemLoad:"Opnieuw proberen",labelButtonAbortItemProcessing:"Annuleren",labelButtonUndoItemProcessing:"Ongedaan maken",labelButtonRetryItemProcessing:"Opnieuw proberen",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"Bestand is te groot",labelMaxFileSize:"Maximale bestandsgrootte is {filesize}",labelMaxTotalFileSizeExceeded:"Maximale totale grootte overschreden",labelMaxTotalFileSize:"Maximale totale bestandsgrootte is {filesize}",labelFileTypeNotAllowed:"Ongeldig bestandstype",fileValidateTypeLabelExpectedTypes:"Verwacht {allButLastType} of {lastType}",imageValidateSizeLabelFormatError:"Afbeeldingstype niet ondersteund",imageValidateSizeLabelImageSizeTooSmall:"Afbeelding is te klein",imageValidateSizeLabelImageSizeTooBig:"Afbeelding is te groot",imageValidateSizeLabelExpectedMinSize:"Minimale afmeting is {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximale afmeting is {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolutie is te laag",imageValidateSizeLabelImageResolutionTooHigh:"Resolution is too high",imageValidateSizeLabelExpectedMinResolution:"Minimale resolutie is {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximale resolutie is {maxResolution}"};var er={labelIdle:'Przeci\u0105gnij i upu\u015B\u0107 lub wybierz pliki',labelInvalidField:"Nieprawid\u0142owe pliki",labelFileWaitingForSize:"Pobieranie rozmiaru",labelFileSizeNotAvailable:"Nieznany rozmiar",labelFileLoading:"Wczytywanie",labelFileLoadError:"B\u0142\u0105d wczytywania",labelFileProcessing:"Przesy\u0142anie",labelFileProcessingComplete:"Przes\u0142ano",labelFileProcessingAborted:"Przerwano",labelFileProcessingError:"Przesy\u0142anie nie powiod\u0142o si\u0119",labelFileProcessingRevertError:"Co\u015B posz\u0142o nie tak",labelFileRemoveError:"Nieudane usuni\u0119cie",labelTapToCancel:"Anuluj",labelTapToRetry:"Pon\xF3w",labelTapToUndo:"Cofnij",labelButtonRemoveItem:"Usu\u0144",labelButtonAbortItemLoad:"Przerwij",labelButtonRetryItemLoad:"Pon\xF3w",labelButtonAbortItemProcessing:"Anuluj",labelButtonUndoItemProcessing:"Cofnij",labelButtonRetryItemProcessing:"Pon\xF3w",labelButtonProcessItem:"Prze\u015Blij",labelMaxFileSizeExceeded:"Plik jest zbyt du\u017Cy",labelMaxFileSize:"Dopuszczalna wielko\u015B\u0107 pliku to {filesize}",labelMaxTotalFileSizeExceeded:"Przekroczono \u0142\u0105czny rozmiar plik\xF3w",labelMaxTotalFileSize:"\u0141\u0105czny rozmiar plik\xF3w nie mo\u017Ce przekroczy\u0107 {filesize}",labelFileTypeNotAllowed:"Niedozwolony rodzaj pliku",fileValidateTypeLabelExpectedTypes:"Oczekiwano {allButLastType} lub {lastType}",imageValidateSizeLabelFormatError:"Nieobs\u0142ugiwany format obrazu",imageValidateSizeLabelImageSizeTooSmall:"Obraz jest zbyt ma\u0142y",imageValidateSizeLabelImageSizeTooBig:"Obraz jest zbyt du\u017Cy",imageValidateSizeLabelExpectedMinSize:"Minimalne wymiary obrazu to {minWidth}\xD7{minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maksymalna wymiary obrazu to {maxWidth}\xD7{maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozdzielczo\u015B\u0107 jest zbyt niska",imageValidateSizeLabelImageResolutionTooHigh:"Rozdzielczo\u015B\u0107 jest zbyt wysoka",imageValidateSizeLabelExpectedMinResolution:"Minimalna rozdzielczo\u015B\u0107 to {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maksymalna rozdzielczo\u015B\u0107 to {maxResolution}"};var tr={labelIdle:'Arraste & Largue os ficheiros ou Seleccione ',labelInvalidField:"O campo cont\xE9m ficheiros inv\xE1lidos",labelFileWaitingForSize:"A aguardar tamanho",labelFileSizeNotAvailable:"Tamanho n\xE3o dispon\xEDvel",labelFileLoading:"A carregar",labelFileLoadError:"Erro ao carregar",labelFileProcessing:"A carregar",labelFileProcessingComplete:"Carregamento completo",labelFileProcessingAborted:"Carregamento cancelado",labelFileProcessingError:"Erro ao carregar",labelFileProcessingRevertError:"Erro ao reverter",labelFileRemoveError:"Erro ao remover",labelTapToCancel:"carregue para cancelar",labelTapToRetry:"carregue para tentar novamente",labelTapToUndo:"carregue para desfazer",labelButtonRemoveItem:"Remover",labelButtonAbortItemLoad:"Abortar",labelButtonRetryItemLoad:"Tentar novamente",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Desfazer",labelButtonRetryItemProcessing:"Tentar novamente",labelButtonProcessItem:"Carregar",labelMaxFileSizeExceeded:"Ficheiro demasiado grande",labelMaxFileSize:"O tamanho m\xE1ximo do ficheiro \xE9 de {filesize}",labelMaxTotalFileSizeExceeded:"Tamanho m\xE1ximo total excedido",labelMaxTotalFileSize:"O tamanho m\xE1ximo total do ficheiro \xE9 de {filesize}",labelFileTypeNotAllowed:"Tipo de ficheiro inv\xE1lido",fileValidateTypeLabelExpectedTypes:"\xC9 esperado {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagem n\xE3o suportada",imageValidateSizeLabelImageSizeTooSmall:"A imagem \xE9 demasiado pequena",imageValidateSizeLabelImageSizeTooBig:"A imagem \xE9 demasiado grande",imageValidateSizeLabelExpectedMinSize:"O tamanho m\xEDnimo \xE9 de {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"O tamanho m\xE1ximo \xE9 de {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"A resolu\xE7\xE3o \xE9 demasiado baixa",imageValidateSizeLabelImageResolutionTooHigh:"A resolu\xE7\xE3o \xE9 demasiado grande",imageValidateSizeLabelExpectedMinResolution:"A resolu\xE7\xE3o m\xEDnima \xE9 de {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"A resolu\xE7\xE3o m\xE1xima \xE9 de {maxResolution}"};var ir={labelIdle:'Arraste e solte os arquivos ou Clique aqui ',labelInvalidField:"Arquivos inv\xE1lidos",labelFileWaitingForSize:"Calculando o tamanho do arquivo",labelFileSizeNotAvailable:"Tamanho do arquivo indispon\xEDvel",labelFileLoading:"Carregando",labelFileLoadError:"Erro durante o carregamento",labelFileProcessing:"Enviando",labelFileProcessingComplete:"Envio finalizado",labelFileProcessingAborted:"Envio cancelado",labelFileProcessingError:"Erro durante o envio",labelFileProcessingRevertError:"Erro ao reverter o envio",labelFileRemoveError:"Erro ao remover o arquivo",labelTapToCancel:"clique para cancelar",labelTapToRetry:"clique para reenviar",labelTapToUndo:"clique para desfazer",labelButtonRemoveItem:"Remover",labelButtonAbortItemLoad:"Abortar",labelButtonRetryItemLoad:"Reenviar",labelButtonAbortItemProcessing:"Cancelar",labelButtonUndoItemProcessing:"Desfazer",labelButtonRetryItemProcessing:"Reenviar",labelButtonProcessItem:"Enviar",labelMaxFileSizeExceeded:"Arquivo \xE9 muito grande",labelMaxFileSize:"O tamanho m\xE1ximo permitido: {filesize}",labelMaxTotalFileSizeExceeded:"Tamanho total dos arquivos excedido",labelMaxTotalFileSize:"Tamanho total permitido: {filesize}",labelFileTypeNotAllowed:"Tipo de arquivo inv\xE1lido",fileValidateTypeLabelExpectedTypes:"Tipos de arquivo suportados s\xE3o {allButLastType} ou {lastType}",imageValidateSizeLabelFormatError:"Tipo de imagem inv\xE1lida",imageValidateSizeLabelImageSizeTooSmall:"Imagem muito pequena",imageValidateSizeLabelImageSizeTooBig:"Imagem muito grande",imageValidateSizeLabelExpectedMinSize:"Tamanho m\xEDnimo permitida: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Tamanho m\xE1ximo permitido: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Resolu\xE7\xE3o muito baixa",imageValidateSizeLabelImageResolutionTooHigh:"Resolu\xE7\xE3o muito alta",imageValidateSizeLabelExpectedMinResolution:"Resolu\xE7\xE3o m\xEDnima permitida: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Resolu\xE7\xE3o m\xE1xima permitida: {maxResolution}"};var ar={labelIdle:'Trage \u0219i plaseaz\u0103 fi\u0219iere sau Caut\u0103-le ',labelInvalidField:"C\xE2mpul con\u021Bine fi\u0219iere care nu sunt valide",labelFileWaitingForSize:"\xCEn a\u0219teptarea dimensiunii",labelFileSizeNotAvailable:"Dimensiunea nu este diponibil\u0103",labelFileLoading:"Se \xEEncarc\u0103",labelFileLoadError:"Eroare la \xEEnc\u0103rcare",labelFileProcessing:"Se \xEEncarc\u0103",labelFileProcessingComplete:"\xCEnc\u0103rcare finalizat\u0103",labelFileProcessingAborted:"\xCEnc\u0103rcare anulat\u0103",labelFileProcessingError:"Eroare la \xEEnc\u0103rcare",labelFileProcessingRevertError:"Eroare la anulare",labelFileRemoveError:"Eroare la \u015Ftergere",labelTapToCancel:"apas\u0103 pentru a anula",labelTapToRetry:"apas\u0103 pentru a re\xEEncerca",labelTapToUndo:"apas\u0103 pentru a anula",labelButtonRemoveItem:"\u015Eterge",labelButtonAbortItemLoad:"Anuleaz\u0103",labelButtonRetryItemLoad:"Re\xEEncearc\u0103",labelButtonAbortItemProcessing:"Anuleaz\u0103",labelButtonUndoItemProcessing:"Anuleaz\u0103",labelButtonRetryItemProcessing:"Re\xEEncearc\u0103",labelButtonProcessItem:"\xCEncarc\u0103",labelMaxFileSizeExceeded:"Fi\u0219ierul este prea mare",labelMaxFileSize:"Dimensiunea maxim\u0103 a unui fi\u0219ier este de {filesize}",labelMaxTotalFileSizeExceeded:"Dimensiunea total\u0103 maxim\u0103 a fost dep\u0103\u0219it\u0103",labelMaxTotalFileSize:"Dimensiunea total\u0103 maxim\u0103 a fi\u0219ierelor este de {filesize}",labelFileTypeNotAllowed:"Tipul fi\u0219ierului nu este valid",fileValidateTypeLabelExpectedTypes:"Se a\u0219teapt\u0103 {allButLastType} sau {lastType}",imageValidateSizeLabelFormatError:"Formatul imaginii nu este acceptat",imageValidateSizeLabelImageSizeTooSmall:"Imaginea este prea mic\u0103",imageValidateSizeLabelImageSizeTooBig:"Imaginea este prea mare",imageValidateSizeLabelExpectedMinSize:"M\u0103rimea minim\u0103 este de {maxWidth} x {maxHeight}",imageValidateSizeLabelExpectedMaxSize:"M\u0103rimea maxim\u0103 este de {maxWidth} x {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rezolu\u021Bia este prea mic\u0103",imageValidateSizeLabelImageResolutionTooHigh:"Rezolu\u021Bia este prea mare",imageValidateSizeLabelExpectedMinResolution:"Rezolu\u021Bia minim\u0103 este de {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Rezolu\u021Bia maxim\u0103 este de {maxResolution}"};var nr={labelIdle:'\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B \u0438\u043B\u0438 \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 ',labelInvalidField:"\u041F\u043E\u043B\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0444\u0430\u0439\u043B\u044B",labelFileWaitingForSize:"\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0440\u0430\u0437\u043C\u0435\u0440",labelFileSizeNotAvailable:"\u0420\u0430\u0437\u043C\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",labelFileLoading:"\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435",labelFileLoadError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0438",labelFileProcessing:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",labelFileProcessingComplete:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430",labelFileProcessingAborted:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430",labelFileProcessingError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435",labelFileProcessingRevertError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0442\u0435",labelFileRemoveError:"\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438",labelTapToCancel:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B",labelTapToRetry:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelTapToUndo:"\u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",labelButtonRemoveItem:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",labelButtonAbortItemLoad:"\u041F\u0440\u0435\u043A\u0440\u0430\u0449\u0435\u043D\u043E",labelButtonRetryItemLoad:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelButtonAbortItemProcessing:"\u041E\u0442\u043C\u0435\u043D\u0430",labelButtonUndoItemProcessing:"\u041E\u0442\u043C\u0435\u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",labelButtonRetryItemProcessing:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0443",labelButtonProcessItem:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430",labelMaxFileSizeExceeded:"\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439",labelMaxFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430: {filesize}",labelMaxTotalFileSizeExceeded:"\u041F\u0440\u0435\u0432\u044B\u0448\u0435\u043D \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440",labelMaxTotalFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430: {filesize}",labelFileTypeNotAllowed:"\u0424\u0430\u0439\u043B \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u0442\u0438\u043F\u0430",fileValidateTypeLabelExpectedTypes:"\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F {allButLastType} \u0438\u043B\u0438 {lastType}",imageValidateSizeLabelFormatError:"\u0422\u0438\u043F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F",imageValidateSizeLabelImageSizeTooSmall:"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435",imageValidateSizeLabelImageSizeTooBig:"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435",imageValidateSizeLabelExpectedMinSize:"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043D\u0438\u0437\u043A\u043E\u0435",imageValidateSizeLabelImageResolutionTooHigh:"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0432\u044B\u0441\u043E\u043A\u043E\u0435",imageValidateSizeLabelExpectedMinResolution:"\u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435: {maxResolution}"};var lr={labelIdle:'Natiahn\xFA\u0165 s\xFAbor (drag&drop) alebo Vyh\u013Eada\u0165 ',labelInvalidField:"Pole obsahuje chybn\xE9 s\xFAbory",labelFileWaitingForSize:"Zis\u0165uje sa ve\u013Ekos\u0165",labelFileSizeNotAvailable:"Nezn\xE1ma ve\u013Ekos\u0165",labelFileLoading:"Pren\xE1\u0161a sa",labelFileLoadError:"Chyba pri prenose",labelFileProcessing:"Prebieha upload",labelFileProcessingComplete:"Upload dokon\u010Den\xFD",labelFileProcessingAborted:"Upload stornovan\xFD",labelFileProcessingError:"Chyba pri uploade",labelFileProcessingRevertError:"Chyba pri obnove",labelFileRemoveError:"Chyba pri odstr\xE1nen\xED",labelTapToCancel:"Kliknite pre storno",labelTapToRetry:"Kliknite pre opakovanie",labelTapToUndo:"Kliknite pre vr\xE1tenie",labelButtonRemoveItem:"Odstr\xE1ni\u0165",labelButtonAbortItemLoad:"Storno",labelButtonRetryItemLoad:"Opakova\u0165",labelButtonAbortItemProcessing:"Sp\xE4\u0165",labelButtonUndoItemProcessing:"Vr\xE1ti\u0165",labelButtonRetryItemProcessing:"Opakova\u0165",labelButtonProcessItem:"Upload",labelMaxFileSizeExceeded:"S\xFAbor je pr\xEDli\u0161 ve\u013Ek\xFD",labelMaxFileSize:"Najv\xE4\u010D\u0161ia ve\u013Ekos\u0165 s\xFAboru je {filesize}",labelMaxTotalFileSizeExceeded:"Prekro\u010Den\xE1 maxim\xE1lna celkov\xE1 ve\u013Ekos\u0165 s\xFAboru",labelMaxTotalFileSize:"Maxim\xE1lna celkov\xE1 ve\u013Ekos\u0165 s\xFAboru je {filesize}",labelFileTypeNotAllowed:"S\xFAbor je nespr\xE1vneho typu",fileValidateTypeLabelExpectedTypes:"O\u010Dak\xE1va sa {allButLastType} alebo {lastType}",imageValidateSizeLabelFormatError:"Obr\xE1zok tohto typu nie je podporovan\xFD",imageValidateSizeLabelImageSizeTooSmall:"Obr\xE1zok je pr\xEDli\u0161 mal\xFD",imageValidateSizeLabelImageSizeTooBig:"Obr\xE1zok je pr\xEDli\u0161 ve\u013Ek\xFD",imageValidateSizeLabelExpectedMinSize:"Minim\xE1lny rozmer je {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maxim\xE1lny rozmer je {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Rozl\xED\u0161enie je pr\xEDli\u0161 mal\xE9",imageValidateSizeLabelImageResolutionTooHigh:"Rozli\u0161enie je pr\xEDli\u0161 ve\u013Ek\xE9",imageValidateSizeLabelExpectedMinResolution:"Minim\xE1lne rozl\xED\u0161enie je {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maxim\xE1lne rozl\xED\u0161enie je {maxResolution}"};var or={labelIdle:'Drag och sl\xE4pp dina filer eller Bl\xE4ddra ',labelInvalidField:"F\xE4ltet inneh\xE5ller felaktiga filer",labelFileWaitingForSize:"V\xE4ntar p\xE5 storlek",labelFileSizeNotAvailable:"Storleken finns inte tillg\xE4nglig",labelFileLoading:"Laddar",labelFileLoadError:"Fel under laddning",labelFileProcessing:"Laddar upp",labelFileProcessingComplete:"Uppladdning klar",labelFileProcessingAborted:"Uppladdning avbruten",labelFileProcessingError:"Fel under uppladdning",labelFileProcessingRevertError:"Fel under \xE5terst\xE4llning",labelFileRemoveError:"Fel under borttagning",labelTapToCancel:"tryck f\xF6r att avbryta",labelTapToRetry:"tryck f\xF6r att f\xF6rs\xF6ka igen",labelTapToUndo:"tryck f\xF6r att \xE5ngra",labelButtonRemoveItem:"Tabort",labelButtonAbortItemLoad:"Avbryt",labelButtonRetryItemLoad:"F\xF6rs\xF6k igen",labelButtonAbortItemProcessing:"Avbryt",labelButtonUndoItemProcessing:"\xC5ngra",labelButtonRetryItemProcessing:"F\xF6rs\xF6k igen",labelButtonProcessItem:"Ladda upp",labelMaxFileSizeExceeded:"Filen \xE4r f\xF6r stor",labelMaxFileSize:"St\xF6rsta till\xE5tna filstorlek \xE4r {filesize}",labelMaxTotalFileSizeExceeded:"Maximal uppladdningsstorlek uppn\xE5d",labelMaxTotalFileSize:"Maximal uppladdningsstorlek \xE4r {filesize}",labelFileTypeNotAllowed:"Felaktig filtyp",fileValidateTypeLabelExpectedTypes:"Godk\xE4nda filtyper {allButLastType} eller {lastType}",imageValidateSizeLabelFormatError:"Bildtypen saknar st\xF6d",imageValidateSizeLabelImageSizeTooSmall:"Bilden \xE4r f\xF6r liten",imageValidateSizeLabelImageSizeTooBig:"Bilden \xE4r f\xF6r stor",imageValidateSizeLabelExpectedMinSize:"Minimal storlek \xE4r {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximal storlek \xE4r {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"Uppl\xF6sningen \xE4r f\xF6r l\xE5g",imageValidateSizeLabelImageResolutionTooHigh:"Uppl\xF6sningen \xE4r f\xF6r h\xF6g",imageValidateSizeLabelExpectedMinResolution:"Minsta till\xE5tna uppl\xF6sning \xE4r {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"H\xF6gsta till\xE5tna uppl\xF6sning \xE4r {maxResolution}"};var rr={labelIdle:'Dosyan\u0131z\u0131 S\xFCr\xFCkleyin & B\u0131rak\u0131n ya da Se\xE7in ',labelInvalidField:"Alan ge\xE7ersiz dosyalar i\xE7eriyor",labelFileWaitingForSize:"Boyut hesaplan\u0131yor",labelFileSizeNotAvailable:"Boyut mevcut de\u011Fil",labelFileLoading:"Y\xFCkleniyor",labelFileLoadError:"Y\xFCkleme s\u0131ras\u0131nda hata olu\u015Ftu",labelFileProcessing:"Y\xFCkleniyor",labelFileProcessingComplete:"Y\xFCkleme tamamland\u0131",labelFileProcessingAborted:"Y\xFCkleme iptal edildi",labelFileProcessingError:"Y\xFCklerken hata olu\u015Ftu",labelFileProcessingRevertError:"Geri \xE7ekerken hata olu\u015Ftu",labelFileRemoveError:"Kald\u0131r\u0131rken hata olu\u015Ftu",labelTapToCancel:"\u0130ptal etmek i\xE7in t\u0131klay\u0131n",labelTapToRetry:"Tekrar denemek i\xE7in t\u0131klay\u0131n",labelTapToUndo:"Geri almak i\xE7in t\u0131klay\u0131n",labelButtonRemoveItem:"Kald\u0131r",labelButtonAbortItemLoad:"\u0130ptal Et",labelButtonRetryItemLoad:"Tekrar dene",labelButtonAbortItemProcessing:"\u0130ptal et",labelButtonUndoItemProcessing:"Geri Al",labelButtonRetryItemProcessing:"Tekrar dene",labelButtonProcessItem:"Y\xFCkle",labelMaxFileSizeExceeded:"Dosya \xE7ok b\xFCy\xFCk",labelMaxFileSize:"En fazla dosya boyutu: {filesize}",labelMaxTotalFileSizeExceeded:"Maximum boyut a\u015F\u0131ld\u0131",labelMaxTotalFileSize:"Maximum dosya boyutu :{filesize}",labelFileTypeNotAllowed:"Ge\xE7ersiz dosya tipi",fileValidateTypeLabelExpectedTypes:"\u015Eu {allButLastType} ya da \u015Fu dosya olmas\u0131 gerekir: {lastType}",imageValidateSizeLabelFormatError:"Resim tipi desteklenmiyor",imageValidateSizeLabelImageSizeTooSmall:"Resim \xE7ok k\xFC\xE7\xFCk",imageValidateSizeLabelImageSizeTooBig:"Resim \xE7ok b\xFCy\xFCk",imageValidateSizeLabelExpectedMinSize:"Minimum boyut {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"Maximum boyut {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\xC7\xF6z\xFCn\xFCrl\xFCk \xE7ok d\xFC\u015F\xFCk",imageValidateSizeLabelImageResolutionTooHigh:"\xC7\xF6z\xFCn\xFCrl\xFCk \xE7ok y\xFCksek",imageValidateSizeLabelExpectedMinResolution:"Minimum \xE7\xF6z\xFCn\xFCrl\xFCk {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"Maximum \xE7\xF6z\xFCn\xFCrl\xFCk {maxResolution}"};var sr={labelIdle:'\u041F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0456\u0442\u044C \u0444\u0430\u0439\u043B\u0438 \u0430\u0431\u043E \u0432\u0438\u0431\u0435\u0440\u0456\u0442\u044C ',labelInvalidField:"\u041F\u043E\u043B\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0456 \u0444\u0430\u0439\u043B\u0438",labelFileWaitingForSize:"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0440\u043E\u0437\u043C\u0456\u0440",labelFileSizeNotAvailable:"\u0420\u043E\u0437\u043C\u0456\u0440 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439",labelFileLoading:"\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F",labelFileLoadError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u0456",labelFileProcessing:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",labelFileProcessingComplete:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E",labelFileProcessingAborted:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E",labelFileProcessingError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u0456",labelFileProcessingRevertError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0456",labelFileRemoveError:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u0456",labelTapToCancel:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelTapToRetry:"\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelTapToUndo:"\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0434\u0456\u044E",labelButtonRemoveItem:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438",labelButtonAbortItemLoad:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelButtonRetryItemLoad:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelButtonAbortItemProcessing:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",labelButtonUndoItemProcessing:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0434\u0456\u044E",labelButtonRetryItemProcessing:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0441\u043F\u0440\u043E\u0431\u0443",labelButtonProcessItem:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",labelMaxFileSizeExceeded:"\u0424\u0430\u0439\u043B \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0438\u0439",labelMaxFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440 \u0444\u0430\u0439\u043B\u0443: {filesize}",labelMaxTotalFileSizeExceeded:"\u041F\u0435\u0440\u0435\u0432\u0438\u0449\u0435\u043D\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440",labelMaxTotalFileSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {filesize}",labelFileTypeNotAllowed:"\u0424\u043E\u0440\u043C\u0430\u0442 \u0444\u0430\u0439\u043B\u0443 \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",fileValidateTypeLabelExpectedTypes:"\u041E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F {allButLastType} \u0430\u0431\u043E {lastType}",imageValidateSizeLabelFormatError:"\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u043D\u0435 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F",imageValidateSizeLabelImageSizeTooSmall:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0435",imageValidateSizeLabelImageSizeTooBig:"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435",imageValidateSizeLabelExpectedMinSize:"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456",imageValidateSizeLabelImageResolutionTooHigh:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0456",imageValidateSizeLabelExpectedMinResolution:"\u041C\u0456\u043D\u0456\u043C\u0430\u043B\u044C\u043D\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0438: {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0438: {maxResolution}"};var cr={labelIdle:'K\xE9o th\u1EA3 t\u1EC7p c\u1EE7a b\u1EA1n ho\u1EB7c T\xECm ki\u1EBFm ',labelInvalidField:"Tr\u01B0\u1EDDng ch\u1EE9a c\xE1c t\u1EC7p kh\xF4ng h\u1EE3p l\u1EC7",labelFileWaitingForSize:"\u0110ang ch\u1EDD k\xEDch th\u01B0\u1EDBc",labelFileSizeNotAvailable:"K\xEDch th\u01B0\u1EDBc kh\xF4ng c\xF3 s\u1EB5n",labelFileLoading:"\u0110ang t\u1EA3i",labelFileLoadError:"L\u1ED7i khi t\u1EA3i",labelFileProcessing:"\u0110ang t\u1EA3i l\xEAn",labelFileProcessingComplete:"T\u1EA3i l\xEAn th\xE0nh c\xF4ng",labelFileProcessingAborted:"\u0110\xE3 hu\u1EF7 t\u1EA3i l\xEAn",labelFileProcessingError:"L\u1ED7i khi t\u1EA3i l\xEAn",labelFileProcessingRevertError:"L\u1ED7i khi ho\xE0n nguy\xEAn",labelFileRemoveError:"L\u1ED7i khi x\xF3a",labelTapToCancel:"nh\u1EA5n \u0111\u1EC3 h\u1EE7y",labelTapToRetry:"nh\u1EA5n \u0111\u1EC3 th\u1EED l\u1EA1i",labelTapToUndo:"nh\u1EA5n \u0111\u1EC3 ho\xE0n t\xE1c",labelButtonRemoveItem:"Xo\xE1",labelButtonAbortItemLoad:"Hu\u1EF7 b\u1ECF",labelButtonRetryItemLoad:"Th\u1EED l\u1EA1i",labelButtonAbortItemProcessing:"H\u1EE7y b\u1ECF",labelButtonUndoItemProcessing:"Ho\xE0n t\xE1c",labelButtonRetryItemProcessing:"Th\u1EED l\u1EA1i",labelButtonProcessItem:"T\u1EA3i l\xEAn",labelMaxFileSizeExceeded:"T\u1EADp tin qu\xE1 l\u1EDBn",labelMaxFileSize:"K\xEDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a l\xE0 {filesize}",labelMaxTotalFileSizeExceeded:"\u0110\xE3 v\u01B0\u1EE3t qu\xE1 t\u1ED5ng k\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a",labelMaxTotalFileSize:"T\u1ED5ng k\xEDch th\u01B0\u1EDBc t\u1EC7p t\u1ED1i \u0111a l\xE0 {filesize}",labelFileTypeNotAllowed:"T\u1EC7p thu\u1ED9c lo\u1EA1i kh\xF4ng h\u1EE3p l\u1EC7",fileValidateTypeLabelExpectedTypes:"Ki\u1EC3u t\u1EC7p h\u1EE3p l\u1EC7 l\xE0 {allButLastType} ho\u1EB7c {lastType}",imageValidateSizeLabelFormatError:"Lo\u1EA1i h\xECnh \u1EA3nh kh\xF4ng \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3",imageValidateSizeLabelImageSizeTooSmall:"H\xECnh \u1EA3nh qu\xE1 nh\u1ECF",imageValidateSizeLabelImageSizeTooBig:"H\xECnh \u1EA3nh qu\xE1 l\u1EDBn",imageValidateSizeLabelExpectedMinSize:"K\xEDch th\u01B0\u1EDBc t\u1ED1i thi\u1EC3u l\xE0 {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"K\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a l\xE0 {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u0110\u1ED9 ph\xE2n gi\u1EA3i qu\xE1 th\u1EA5p",imageValidateSizeLabelImageResolutionTooHigh:"\u0110\u1ED9 ph\xE2n gi\u1EA3i qu\xE1 cao",imageValidateSizeLabelExpectedMinResolution:"\u0110\u1ED9 ph\xE2n gi\u1EA3i t\u1ED1i thi\u1EC3u l\xE0 {minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u0110\u1ED9 ph\xE2n gi\u1EA3i t\u1ED1i \u0111a l\xE0 {maxResolution}"};var dr={labelIdle:'\u62D6\u653E\u6587\u4EF6\uFF0C\u6216\u8005 \u6D4F\u89C8 ',labelInvalidField:"\u5B57\u6BB5\u5305\u542B\u65E0\u6548\u6587\u4EF6",labelFileWaitingForSize:"\u8BA1\u7B97\u6587\u4EF6\u5927\u5C0F",labelFileSizeNotAvailable:"\u6587\u4EF6\u5927\u5C0F\u4E0D\u53EF\u7528",labelFileLoading:"\u52A0\u8F7D",labelFileLoadError:"\u52A0\u8F7D\u9519\u8BEF",labelFileProcessing:"\u4E0A\u4F20",labelFileProcessingComplete:"\u5DF2\u4E0A\u4F20",labelFileProcessingAborted:"\u4E0A\u4F20\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u4F20\u51FA\u9519",labelFileProcessingRevertError:"\u8FD8\u539F\u51FA\u9519",labelFileRemoveError:"\u5220\u9664\u51FA\u9519",labelTapToCancel:"\u70B9\u51FB\u53D6\u6D88",labelTapToRetry:"\u70B9\u51FB\u91CD\u8BD5",labelTapToUndo:"\u70B9\u51FB\u64A4\u6D88",labelButtonRemoveItem:"\u5220\u9664",labelButtonAbortItemLoad:"\u4E2D\u6B62",labelButtonRetryItemLoad:"\u91CD\u8BD5",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u64A4\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8BD5",labelButtonProcessItem:"\u4E0A\u4F20",labelMaxFileSizeExceeded:"\u6587\u4EF6\u592A\u5927",labelMaxFileSize:"\u6700\u5927\u503C: {filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u8FC7\u6700\u5927\u6587\u4EF6\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u6587\u4EF6\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u6587\u4EF6\u7C7B\u578B\u65E0\u6548",fileValidateTypeLabelExpectedTypes:"\u5E94\u4E3A {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u56FE\u50CF\u7C7B\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u56FE\u50CF\u592A\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u56FE\u50CF\u592A\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u503C: {minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u503C: {maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u5206\u8FA8\u7387\u592A\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u5206\u8FA8\u7387\u592A\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u5C0F\u5206\u8FA8\u7387\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u5927\u5206\u8FA8\u7387\uFF1A{maxResolution}"};var pr={labelIdle:'\u62D6\u653E\u6A94\u6848\uFF0C\u6216\u8005 \u700F\u89BD ',labelInvalidField:"\u4E0D\u652F\u63F4\u6B64\u6A94\u6848",labelFileWaitingForSize:"\u6B63\u5728\u8A08\u7B97\u6A94\u6848\u5927\u5C0F",labelFileSizeNotAvailable:"\u6A94\u6848\u5927\u5C0F\u4E0D\u7B26",labelFileLoading:"\u8B80\u53D6\u4E2D",labelFileLoadError:"\u8B80\u53D6\u932F\u8AA4",labelFileProcessing:"\u4E0A\u50B3",labelFileProcessingComplete:"\u5DF2\u4E0A\u50B3",labelFileProcessingAborted:"\u4E0A\u50B3\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u50B3\u767C\u751F\u932F\u8AA4",labelFileProcessingRevertError:"\u9084\u539F\u932F\u8AA4",labelFileRemoveError:"\u522A\u9664\u932F\u8AA4",labelTapToCancel:"\u9EDE\u64CA\u53D6\u6D88",labelTapToRetry:"\u9EDE\u64CA\u91CD\u8A66",labelTapToUndo:"\u9EDE\u64CA\u9084\u539F",labelButtonRemoveItem:"\u522A\u9664",labelButtonAbortItemLoad:"\u505C\u6B62",labelButtonRetryItemLoad:"\u91CD\u8A66",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u53D6\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8A66",labelButtonProcessItem:"\u4E0A\u50B3",labelMaxFileSizeExceeded:"\u6A94\u6848\u904E\u5927",labelMaxFileSize:"\u6700\u5927\u503C\uFF1A{filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u904E\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u4E0D\u652F\u63F4\u6B64\u985E\u578B\u6A94\u6848",fileValidateTypeLabelExpectedTypes:"\u61C9\u70BA {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u6B64\u985E\u5716\u7247\u985E\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u5716\u7247\u904E\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u5716\u7247\u904E\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u5C3A\u5BF8\uFF1A{minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u5C3A\u5BF8\uFF1A{maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u89E3\u6790\u5EA6\u904E\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u89E3\u6790\u5EA6\u904E\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u4F4E\u89E3\u6790\u5EA6\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u9AD8\u89E3\u6790\u5EA6\uFF1A{maxResolution}"};var mr={labelIdle:'\u62D6\u653E\u6A94\u6848\uFF0C\u6216\u8005 \u700F\u89BD ',labelInvalidField:"\u4E0D\u652F\u63F4\u6B64\u6A94\u6848",labelFileWaitingForSize:"\u6B63\u5728\u8A08\u7B97\u6A94\u6848\u5927\u5C0F",labelFileSizeNotAvailable:"\u6A94\u6848\u5927\u5C0F\u4E0D\u7B26",labelFileLoading:"\u8B80\u53D6\u4E2D",labelFileLoadError:"\u8B80\u53D6\u932F\u8AA4",labelFileProcessing:"\u4E0A\u50B3",labelFileProcessingComplete:"\u5DF2\u4E0A\u50B3",labelFileProcessingAborted:"\u4E0A\u50B3\u5DF2\u53D6\u6D88",labelFileProcessingError:"\u4E0A\u50B3\u767C\u751F\u932F\u8AA4",labelFileProcessingRevertError:"\u9084\u539F\u932F\u8AA4",labelFileRemoveError:"\u522A\u9664\u932F\u8AA4",labelTapToCancel:"\u9EDE\u64CA\u53D6\u6D88",labelTapToRetry:"\u9EDE\u64CA\u91CD\u8A66",labelTapToUndo:"\u9EDE\u64CA\u9084\u539F",labelButtonRemoveItem:"\u522A\u9664",labelButtonAbortItemLoad:"\u505C\u6B62",labelButtonRetryItemLoad:"\u91CD\u8A66",labelButtonAbortItemProcessing:"\u53D6\u6D88",labelButtonUndoItemProcessing:"\u53D6\u6D88",labelButtonRetryItemProcessing:"\u91CD\u8A66",labelButtonProcessItem:"\u4E0A\u50B3",labelMaxFileSizeExceeded:"\u6A94\u6848\u904E\u5927",labelMaxFileSize:"\u6700\u5927\u503C\uFF1A{filesize}",labelMaxTotalFileSizeExceeded:"\u8D85\u904E\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F",labelMaxTotalFileSize:"\u6700\u5927\u53EF\u4E0A\u50B3\u5927\u5C0F\uFF1A{filesize}",labelFileTypeNotAllowed:"\u4E0D\u652F\u63F4\u6B64\u985E\u578B\u6A94\u6848",fileValidateTypeLabelExpectedTypes:"\u61C9\u70BA {allButLastType} \u6216 {lastType}",imageValidateSizeLabelFormatError:"\u4E0D\u652F\u6301\u6B64\u985E\u5716\u7247\u985E\u578B",imageValidateSizeLabelImageSizeTooSmall:"\u5716\u7247\u904E\u5C0F",imageValidateSizeLabelImageSizeTooBig:"\u5716\u7247\u904E\u5927",imageValidateSizeLabelExpectedMinSize:"\u6700\u5C0F\u5C3A\u5BF8\uFF1A{minWidth} \xD7 {minHeight}",imageValidateSizeLabelExpectedMaxSize:"\u6700\u5927\u5C3A\u5BF8\uFF1A{maxWidth} \xD7 {maxHeight}",imageValidateSizeLabelImageResolutionTooLow:"\u89E3\u6790\u5EA6\u904E\u4F4E",imageValidateSizeLabelImageResolutionTooHigh:"\u89E3\u6790\u5EA6\u904E\u9AD8",imageValidateSizeLabelExpectedMinResolution:"\u6700\u4F4E\u89E3\u6790\u5EA6\uFF1A{minResolution}",imageValidateSizeLabelExpectedMaxResolution:"\u6700\u9AD8\u89E3\u6790\u5EA6\uFF1A{maxResolution}"};ve(Hl);ve(jl);ve($l);ve(Kl);ve(eo);ve(mo);ve(go);ve(_o);ve(Aa);window.FilePond=na;function Og({acceptedFileTypes:e,automaticallyCropImagesAspectRatio:t,automaticallyOpenImageEditorForAspectRatio:i,automaticallyResizeImagesHeight:a,automaticallyResizeImagesMode:n,automaticallyResizeImagesWidth:l,cancelUploadUsing:o,canEditSvgs:r,confirmSvgEditingMessage:s,deleteUploadedFileUsing:p,disabledSvgEditingMessage:c,getUploadedFilesUsing:d,hasCircleCropper:m,hasImageEditor:u,imageEditorEmptyFillColor:g,imageEditorMode:f,imageEditorViewportHeight:h,imageEditorViewportWidth:I,imagePreviewHeight:b,isAvatar:E,isDeletable:v,isDisabled:y,isDownloadable:T,isImageEditorExplicitlyEnabled:_,isMultiple:x,isOpenable:R,isPasteable:P,isPreviewable:z,isReorderable:A,isSvgEditingConfirmed:B,itemPanelAspectRatio:w,loadingIndicatorPosition:F,locale:S,maxFiles:L,maxFilesValidationMessage:D,maxParallelUploads:O,maxSize:U,mimeTypeMap:C,minSize:X,panelAspectRatio:K,panelLayout:Z,placeholder:ce,removeUploadedFileButtonPosition:V,removeUploadedFileUsing:W,reorderUploadedFilesUsing:$,shouldAppendFiles:ie,shouldAutomaticallyUpscaleImagesWhenResizing:ee,shouldOrientImageFromExif:pt,shouldTransformImage:gr,state:fr,uploadButtonPosition:hr,uploadingMessage:br,uploadProgressIndicatorPosition:Er,uploadUsing:Tr}){return{fileKeyIndex:{},pond:null,shouldUpdateState:!0,state:fr,lastState:null,error:null,uploadedFileIndex:{},isEditorOpen:!1,isEditorOpenedForAspectRatio:!1,editingFile:{},currentRatio:"",editor:{},visibilityObserver:null,intersectionObserver:null,isInitializing:!1,async init(){if(this.pond||this.isInitializing)return;if(this.isInitializing=!0,!this.visibilityObserver){let k=()=>{this.$el.offsetParent===null||getComputedStyle(this.$el).visibility==="hidden"||(this.pond?document.dispatchEvent(new Event("visibilitychange")):this.init())};this.visibilityObserver=new ResizeObserver(()=>k()),this.visibilityObserver.observe(this.$el),this.intersectionObserver=new IntersectionObserver(j=>{j[0]?.isIntersecting&&k()},{threshold:0}),this.intersectionObserver.observe(this.$el)}if(this.$el.offsetParent===null||getComputedStyle(this.$el).visibility==="hidden"){this.isInitializing=!1;return}Dt(ur[S]??ur.en),this.pond=ft(this.$refs.input,{acceptedFileTypes:e,allowImageExifOrientation:pt,allowPaste:P,allowRemove:v,allowReorder:A,allowImagePreview:z,allowVideoPreview:z,allowAudioPreview:z,allowImageTransform:gr,credits:!1,files:await this.getFiles(),imageCropAspectRatio:t,imagePreviewHeight:b,imageResizeTargetHeight:a,imageResizeTargetWidth:l,imageResizeMode:n,imageResizeUpscale:ee,imageTransformOutputStripImageHead:!1,itemInsertLocation:ie?"after":"before",...ce&&{labelIdle:ce},maxFiles:L,maxFileSize:U,minFileSize:X,...O&&{maxParallelUploads:O},styleButtonProcessItemPosition:hr,styleButtonRemoveItemPosition:V,styleItemPanelAspectRatio:w,styleLoadIndicatorPosition:F,stylePanelAspectRatio:K,stylePanelLayout:Z,styleProgressIndicatorPosition:Er,server:{load:async(k,j)=>{let Ne=await(await fetch(k,{cache:"no-store"})).blob();j(Ne)},process:(k,j,q,Ne,Me,$e,Ir)=>{this.shouldUpdateState=!1;let za=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,Zt=>(Zt^crypto.getRandomValues(new Uint8Array(1))[0]&15>>Zt/4).toString(16));return Tr(za,j,Zt=>{this.shouldUpdateState=!0,Ne(Zt)},Me,$e),{abort:()=>{o(za),Ir()}}},remove:async(k,j)=>{let q=this.uploadedFileIndex[k]??null;q&&(await p(q),j())},revert:async(k,j)=>{await W(k),j()}},allowImageEdit:_,imageEditEditor:{open:k=>this.loadEditor(k),onconfirm:()=>{},oncancel:()=>this.closeEditor(),onclose:()=>this.closeEditor()},fileValidateTypeDetectType:(k,j)=>new Promise((q,Ne)=>{let Me=k.name.split(".").pop().toLowerCase(),$e=C[Me]||j||Gl.getType(Me);$e?q($e):Ne()})}),this.$watch("state",async()=>{if(this.pond&&this.shouldUpdateState&&this.state!==void 0){if(this.state!==null&&Object.values(this.state).filter(k=>k.startsWith("livewire-file:")).length){this.lastState=null;return}JSON.stringify(this.state)!==this.lastState&&(this.lastState=JSON.stringify(this.state),this.pond.files=await this.getFiles())}}),this.pond.on("reorderfiles",async k=>{let j=k.map(q=>q.source instanceof File?q.serverId:this.uploadedFileIndex[q.source]??null).filter(q=>q);await $(ie?j:j.reverse())}),this.pond.on("initfile",async k=>{T&&(E||this.insertDownloadLink(k))}),this.pond.on("initfile",async k=>{R&&(E||this.insertOpenLink(k))}),this.pond.on("addfilestart",async k=>{this.error=null,k.status===Tt.PROCESSING_QUEUED&&this.dispatchFormEvent("form-processing-started",{message:br})});let N=async()=>{this.pond.getFiles().filter(k=>k.status===Tt.PROCESSING||k.status===Tt.PROCESSING_QUEUED).length||this.dispatchFormEvent("form-processing-finished")};this.pond.on("processfile",N),this.pond.on("processfileabort",N),this.pond.on("processfilerevert",N),this.pond.on("removefile",N),this.pond.on("warning",k=>{k.body==="Max files"&&(this.error=D)}),Z==="compact circle"&&this.pond.on("error",k=>{this.error=`${k.main}: ${k.sub}`.replace("Expects or","Expects")}),this.pond.on("removefile",()=>this.error=null),i&&this.pond.on("addfile",(k,j)=>{k||j.file instanceof File&&j.file.type.startsWith("image/")&&this.checkImageAspectRatio(j.file)}),this.isInitializing=!1},destroy(){this.visibilityObserver?.disconnect(),this.intersectionObserver?.disconnect(),this.destroyEditor(),this.pond&&(ht(this.$refs.input),this.pond=null)},dispatchFormEvent(G,N={}){this.$el.closest("form")?.dispatchEvent(new CustomEvent(G,{composed:!0,cancelable:!0,detail:N}))},async getUploadedFiles(){let G=await d();this.fileKeyIndex=G??{},this.uploadedFileIndex=Object.entries(this.fileKeyIndex).filter(([N,k])=>k?.url).reduce((N,[k,j])=>(N[j.url]=k,N),{})},async getFiles(){await this.getUploadedFiles();let G=[];for(let N of Object.values(this.fileKeyIndex))N&&G.push({source:N.url,options:{type:"local",...!N.type||z&&(/^audio/.test(N.type)||/^image/.test(N.type)||/^video/.test(N.type))?{}:{file:{name:N.name,size:N.size,type:N.type}}}});return ie?G:G.reverse()},insertDownloadLink(G){if(G.origin!==Bt.LOCAL)return;let N=this.getDownloadLink(G);N&&document.getElementById(`filepond--item-${G.id}`).querySelector(".filepond--file-info-main").prepend(N)},insertOpenLink(G){if(G.origin!==Bt.LOCAL)return;let N=this.getOpenLink(G);N&&document.getElementById(`filepond--item-${G.id}`).querySelector(".filepond--file-info-main").prepend(N)},getDownloadLink(G){let N=G.source;if(!N)return;let k=document.createElement("a");return k.className="filepond--download-icon",k.href=N,k.download=G.file.name,k},getOpenLink(G){let N=G.source;if(!N)return;let k=document.createElement("a");return k.className="filepond--open-icon",k.href=N,k.target="_blank",k},initEditor(){if(y||!u)return;let G={aspectRatio:i??I/h,autoCropArea:1,center:!0,cropBoxResizable:!0,guides:!0,highlight:!0,responsive:!0,toggleDragModeOnDblclick:!0,viewMode:f,wheelZoomRatio:.02};_&&(G.crop=N=>{this.$refs.xPositionInput.value=Math.round(N.detail.x),this.$refs.yPositionInput.value=Math.round(N.detail.y),this.$refs.heightInput.value=Math.round(N.detail.height),this.$refs.widthInput.value=Math.round(N.detail.width),this.$refs.rotationInput.value=N.detail.rotate}),this.editor=new xa(this.$refs.editor,G)},closeEditor(){if(this.isEditorOpenedForAspectRatio){let G=this.pond.getFiles().find(N=>N.filename===this.editingFile.name);G&&this.pond.removeFile(G.id,{revert:!0}),this.isEditorOpenedForAspectRatio=!1}this.editingFile={},this.isEditorOpen=!1,this.destroyEditor()},fixImageDimensions(G,N){if(G.type!=="image/svg+xml")return N(G);let k=new FileReader;k.onload=j=>{let q=new DOMParser().parseFromString(j.target.result,"image/svg+xml")?.querySelector("svg");if(!q)return N(G);let Ne=["viewBox","ViewBox","viewbox"].find($e=>q.hasAttribute($e));if(!Ne)return N(G);let Me=q.getAttribute(Ne).split(" ");return!Me||Me.length!==4?N(G):(q.setAttribute("width",parseFloat(Me[2])+"pt"),q.setAttribute("height",parseFloat(Me[3])+"pt"),N(new File([new Blob([new XMLSerializer().serializeToString(q)],{type:"image/svg+xml"})],G.name,{type:"image/svg+xml",_relativePath:""})))},k.readAsText(G)},loadEditor(G){if(y||!u||!G)return;let N=G.type==="image/svg+xml";if(!r&&N){alert(c);return}B&&N&&!confirm(s)||this.fixImageDimensions(G,k=>{this.editingFile=k,this.initEditor();let j=new FileReader;j.onload=q=>{this.isEditorOpen=!0,setTimeout(()=>this.editor.replace(q.target.result),200)},j.readAsDataURL(G)})},getRoundedCanvas(G){let N=G.width,k=G.height,j=document.createElement("canvas");j.width=N,j.height=k;let q=j.getContext("2d");return q.imageSmoothingEnabled=!0,q.drawImage(G,0,0,N,k),q.globalCompositeOperation="destination-in",q.beginPath(),q.ellipse(N/2,k/2,N/2,k/2,0,0,2*Math.PI),q.fill(),j},saveEditor(){if(y||!u)return;this.isEditorOpenedForAspectRatio=!1;let G=this.editor.getCroppedCanvas({fillColor:g??"transparent",height:a,imageSmoothingEnabled:!0,imageSmoothingQuality:"high",width:l});m&&(G=this.getRoundedCanvas(G)),G.toBlob(N=>{this.pond.removeFile(this.pond.getFiles().find(k=>k.filename===this.editingFile.name)?.id,{revert:!0}),this.$nextTick(()=>{this.shouldUpdateState=!1;let k=this.editingFile.name.slice(0,this.editingFile.name.lastIndexOf(".")),j=this.editingFile.name.split(".").pop();j==="svg"&&(j="png");let q=/-v(\d+)/;q.test(k)?k=k.replace(q,(Ne,Me)=>`-v${Number(Me)+1}`):k+="-v1",this.pond.addFile(new File([N],`${k}.${j}`,{type:this.editingFile.type==="image/svg+xml"||m?"image/png":this.editingFile.type,lastModified:new Date().getTime()})).then(()=>{this.closeEditor()}).catch(()=>{this.closeEditor()})})},m?"image/png":this.editingFile.type)},destroyEditor(){this.editor&&typeof this.editor.destroy=="function"&&this.editor.destroy(),this.editor=null},checkImageAspectRatio(G){if(!i)return;let N=new Image,k=URL.createObjectURL(G);N.onload=()=>{URL.revokeObjectURL(k);let j=N.width/N.height;Math.abs(j-i)>.01&&(this.isEditorOpenedForAspectRatio=!0,this.loadEditor(G))},N.onerror=()=>{URL.revokeObjectURL(k)},N.src=k}}}var ur={am:wo,ar:Lo,az:Mo,ca:Ao,ckb:zo,cs:Po,da:Fo,de:Oo,el:Do,en:Co,es:Bo,fa:ko,fi:No,fr:Vo,he:Go,hr:Uo,hu:Ho,id:Wo,it:jo,ja:Yo,km:qo,ko:$o,lt:Xo,lus:Ko,lv:Zo,nb:Qo,nl:Jo,pl:er,pt:tr,pt_BR:ir,ro:ar,ru:nr,sk:lr,sv:or,tr:rr,uk:sr,vi:cr,zh_CN:dr,zh_HK:pr,zh_TW:mr};export{Og as default}; /*! Bundled license information: filepond/dist/filepond.esm.js: (*! * FilePond 4.32.10 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) cropperjs/dist/cropper.esm.js: (*! * Cropper.js v1.6.2 * https://fengyuanchen.github.io/cropperjs * * Copyright 2015-present Chen Fengyuan * Released under the MIT license * * Date: 2024-04-21T07:43:05.335Z *) filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size.esm.js: (*! * FilePondPluginFileValidateSize 2.2.8 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type.esm.js: (*! * FilePondPluginFileValidateType 1.2.9 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-crop/dist/filepond-plugin-image-crop.esm.js: (*! * FilePondPluginImageCrop 2.0.6 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-edit/dist/filepond-plugin-image-edit.esm.js: (*! * FilePondPluginImageEdit 1.6.3 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-exif-orientation/dist/filepond-plugin-image-exif-orientation.esm.js: (*! * FilePondPluginImageExifOrientation 1.0.11 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-preview/dist/filepond-plugin-image-preview.esm.js: (*! * FilePondPluginImagePreview 4.6.12 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-resize/dist/filepond-plugin-image-resize.esm.js: (*! * FilePondPluginImageResize 2.0.10 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-image-transform/dist/filepond-plugin-image-transform.esm.js: (*! * FilePondPluginImageTransform 3.8.7 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://pqina.nl/filepond/ for details. *) filepond-plugin-media-preview/dist/filepond-plugin-media-preview.esm.js: (*! * FilePondPluginMediaPreview 1.0.11 * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit undefined for details. *) */ ================================================ FILE: public/js/filament/forms/components/key-value.js ================================================ function a({state:r}){return{state:r,rows:[],init(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(e,t)=>{if(!Array.isArray(e))return;let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(e)===0&&s(t)===0||this.updateRows()})},addRow(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow(e){this.rows.splice(e,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows(e){let t=Alpine.raw(this.rows);this.rows=[];let s=t.splice(e.oldIndex,1)[0];t.splice(e.newIndex,0,s),this.$nextTick(()=>{this.rows=t,this.updateState()})},updateRows(){let t=Alpine.raw(this.state).map(({key:s,value:i})=>({key:s,value:i}));this.rows.forEach(s=>{(s.key===""||s.key===null)&&t.push({key:"",value:s.value})}),this.rows=t},updateState(){let e=[];this.rows.forEach(t=>{t.key===""||t.key===null||e.push({key:t.key,value:t.value})}),JSON.stringify(this.state)!==JSON.stringify(e)&&(this.state=e)}}}export{a as default}; ================================================ FILE: public/js/filament/forms/components/markdown-editor.js ================================================ var ss=Object.defineProperty;var Sd=Object.getOwnPropertyDescriptor;var Td=Object.getOwnPropertyNames;var Ld=Object.prototype.hasOwnProperty;var Cd=(o,p)=>()=>(o&&(p=o(o=0)),p);var Ke=(o,p)=>()=>(p||o((p={exports:{}}).exports,p),p.exports);var Ed=(o,p,v,C)=>{if(p&&typeof p=="object"||typeof p=="function")for(let b of Td(p))!Ld.call(o,b)&&b!==v&&ss(o,b,{get:()=>p[b],enumerable:!(C=Sd(p,b))||C.enumerable});return o};var zd=o=>Ed(ss({},"__esModule",{value:!0}),o);var We=Ke((Yo,Qo)=>{(function(o,p){typeof Yo=="object"&&typeof Qo<"u"?Qo.exports=p():typeof define=="function"&&define.amd?define(p):(o=o||self,o.CodeMirror=p())})(Yo,(function(){"use strict";var o=navigator.userAgent,p=navigator.platform,v=/gecko\/\d/i.test(o),C=/MSIE \d/.test(o),b=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(o),S=/Edge\/(\d+)/.exec(o),s=C||b||S,h=s&&(C?document.documentMode||6:+(S||b)[1]),g=!S&&/WebKit\//.test(o),T=g&&/Qt\/\d+\.\d+/.test(o),w=!S&&/Chrome\/(\d+)/.exec(o),c=w&&+w[1],d=/Opera\//.test(o),k=/Apple Computer/.test(navigator.vendor),z=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(o),M=/PhantomJS/.test(o),_=k&&(/Mobile\/\w+/.test(o)||navigator.maxTouchPoints>2),W=/Android/.test(o),E=_||W||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(o),O=_||/Mac/.test(p),G=/\bCrOS\b/.test(o),J=/win/i.test(p),re=d&&o.match(/Version\/(\d*\.\d*)/);re&&(re=Number(re[1])),re&&re>=15&&(d=!1,g=!0);var q=O&&(T||d&&(re==null||re<12.11)),I=v||s&&h>=9;function D(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var Q=function(e,t){var n=e.className,r=D(t).exec(n);if(r){var i=n.slice(r.index+r[0].length);e.className=n.slice(0,r.index)+(i?r[1]+i:"")}};function j(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function V(e,t){return j(e).appendChild(t)}function y(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),typeof t=="string")i.appendChild(document.createTextNode(t));else if(t)for(var a=0;a=t)return l+(t-a);l+=u-a,l+=n-l%n,a=u+1}}var qe=function(){this.id=null,this.f=null,this.time=0,this.handler=Ee(this.onTimeout,this)};qe.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-+new Date)},qe.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n=t)return r+Math.min(l,t-i);if(i+=a-r,i+=n-i%n,r=a+1,i>=t)return r}}var U=[""];function Z(e){for(;U.length<=e;)U.push(ce(U)+" ");return U[e]}function ce(e){return e[e.length-1]}function He(e,t){for(var n=[],r=0;r"\x80"&&(e.toUpperCase()!=e.toLowerCase()||Ue.test(e))}function Me(e,t){return t?t.source.indexOf("\\w")>-1&&we(e)?!0:t.test(e):we(e)}function Le(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var $=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function H(e){return e.charCodeAt(0)>=768&&$.test(e)}function se(e,t,n){for(;(n<0?t>0:tn?-1:1;;){if(t==n)return t;var i=(t+n)/2,a=r<0?Math.ceil(i):Math.floor(i);if(a==t)return e(a)?t:n;e(a)?n=a:t=a+r}}function nt(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,a=0;at||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),l.level==1?"rtl":"ltr",a),i=!0)}i||r(t,n,"ltr")}var dt=null;function Pt(e,t,n){var r;dt=null;for(var i=0;it)return i;a.to==t&&(a.from!=a.to&&n=="before"?r=i:dt=i),a.from==t&&(a.from!=a.to&&n!="before"?r=i:dt=i)}return r??dt}var Ft=(function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";function n(m){return m<=247?e.charAt(m):1424<=m&&m<=1524?"R":1536<=m&&m<=1785?t.charAt(m-1536):1774<=m&&m<=2220?"r":8192<=m&&m<=8203?"w":m==8204?"b":"L"}var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,i=/[stwN]/,a=/[LRr]/,l=/[Lb1n]/,u=/[1n]/;function f(m,A,B){this.level=m,this.from=A,this.to=B}return function(m,A){var B=A=="ltr"?"L":"R";if(m.length==0||A=="ltr"&&!r.test(m))return!1;for(var ee=m.length,Y=[],ie=0;ie-1&&(r[t]=i.slice(0,a).concat(i.slice(a+1)))}}}function it(e,t){var n=nr(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i0}function Wt(e){e.prototype.on=function(t,n){Ie(this,t,n)},e.prototype.off=function(t,n){_t(this,t,n)}}function kt(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Rr(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ct(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==!1}function dr(e){kt(e),Rr(e)}function yn(e){return e.target||e.srcElement}function Ut(e){var t=e.which;return t==null&&(e.button&1?t=1:e.button&2?t=3:e.button&4&&(t=2)),O&&e.ctrlKey&&t==1&&(t=3),t}var eo=(function(){if(s&&h<9)return!1;var e=y("div");return"draggable"in e||"dragDrop"in e})(),Hr;function ei(e){if(Hr==null){var t=y("span","\u200B");V(e,y("span",[t,document.createTextNode("x")])),e.firstChild.offsetHeight!=0&&(Hr=t.offsetWidth<=1&&t.offsetHeight>2&&!(s&&h<8))}var n=Hr?y("span","\u200B"):y("span","\xA0",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}var xn;function pr(e){if(xn!=null)return xn;var t=V(e,document.createTextNode("A\u062EA")),n=X(t,0,1).getBoundingClientRect(),r=X(t,1,2).getBoundingClientRect();return j(e),!n||n.left==n.right?!1:xn=r.right-n.right<3}var Ht=` b`.split(/\n/).length!=3?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf(` `,t);i==-1&&(i=e.length);var a=e.slice(t,e.charAt(i-1)=="\r"?i-1:i),l=a.indexOf("\r");l!=-1?(n.push(a.slice(0,l)),t+=l+1):(n.push(a),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},hr=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch{return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch{}return!t||t.parentElement()!=e?!1:t.compareEndPoints("StartToEnd",t)!=0},ti=(function(){var e=y("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),typeof e.oncopy=="function")})(),$t=null;function to(e){if($t!=null)return $t;var t=V(e,y("span","x")),n=t.getBoundingClientRect(),r=X(t,0,1).getBoundingClientRect();return $t=Math.abs(n.left-r.left)>1}var Wr={},Kt={};function Gt(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Wr[e]=t}function Cr(e,t){Kt[e]=t}function Ur(e){if(typeof e=="string"&&Kt.hasOwnProperty(e))e=Kt[e];else if(e&&typeof e.name=="string"&&Kt.hasOwnProperty(e.name)){var t=Kt[e.name];typeof t=="string"&&(t={name:t}),e=oe(t,e),e.name=t.name}else{if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ur("application/xml");if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ur("application/json")}return typeof e=="string"?{name:e}:e||{name:"null"}}function $r(e,t){t=Ur(t);var n=Wr[t.name];if(!n)return $r(e,"text/plain");var r=n(e,t);if(gr.hasOwnProperty(t.name)){var i=gr[t.name];for(var a in i)i.hasOwnProperty(a)&&(r.hasOwnProperty(a)&&(r["_"+a]=r[a]),r[a]=i[a])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var gr={};function Kr(e,t){var n=gr.hasOwnProperty(e)?gr[e]:gr[e]={};ge(t,n)}function Vt(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function _n(e,t){for(var n;e.innerMode&&(n=e.innerMode(t),!(!n||n.mode==e));)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Gr(e,t,n){return e.startState?e.startState(t,n):!0}var at=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};at.prototype.eol=function(){return this.pos>=this.string.length},at.prototype.sol=function(){return this.pos==this.lineStart},at.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},at.prototype.next=function(){if(this.post},at.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},at.prototype.skipToEnd=function(){this.pos=this.string.length},at.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},at.prototype.backUp=function(e){this.pos-=e},at.prototype.column=function(){return this.lastColumnPos0?null:(a&&t!==!1&&(this.pos+=a[0].length),a)}},at.prototype.current=function(){return this.string.slice(this.start,this.pos)},at.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},at.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},at.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};function Ae(e,t){if(t-=e.first,t<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],a=i.chunkSize();if(t=e.first&&tn?ne(n,Ae(e,n).text.length):Sc(t,Ae(e,t.line).text.length)}function Sc(e,t){var n=e.ch;return n==null||n>t?ne(e.line,t):n<0?ne(e.line,0):e}function ca(e,t){for(var n=[],r=0;rthis.maxLookAhead&&(this.maxLookAhead=e),t},Jt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},Jt.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Jt.fromSaved=function(e,t,n){return t instanceof ri?new Jt(e,Vt(e.mode,t.state),n,t.lookAhead):new Jt(e,Vt(e.mode,t),n)},Jt.prototype.save=function(e){var t=e!==!1?Vt(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ri(t,this.maxLookAhead):t};function fa(e,t,n,r){var i=[e.state.modeGen],a={};va(e,t.text,e.doc.mode,n,function(m,A){return i.push(m,A)},a,r);for(var l=n.state,u=function(m){n.baseTokens=i;var A=e.state.overlays[m],B=1,ee=0;n.state=!0,va(e,t.text,A.mode,n,function(Y,ie){for(var ue=B;eeY&&i.splice(B,1,Y,i[B+1],me),B+=2,ee=Math.min(Y,me)}if(ie)if(A.opaque)i.splice(ue,B-ue,Y,"overlay "+ie),B=ue+2;else for(;uee.options.maxHighlightLength&&Vt(e.doc.mode,r.state),a=fa(e,t,r);i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=a.styles,a.classes?t.styleClasses=a.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function wn(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return new Jt(r,!0,t);var a=Tc(e,t,n),l=a>r.first&&Ae(r,a-1).stateAfter,u=l?Jt.fromSaved(r,l,a):new Jt(r,Gr(r.mode),a);return r.iter(a,t,function(f){ro(e,f.text,u);var m=u.line;f.stateAfter=m==t-1||m%5==0||m>=i.viewFrom&&mt.start)return a}throw new Error("Mode "+e.name+" failed to advance stream.")}var ha=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function ga(e,t,n,r){var i=e.doc,a=i.mode,l;t=je(i,t);var u=Ae(i,t.line),f=wn(e,t.line,n),m=new at(u.text,e.options.tabSize,f),A;for(r&&(A=[]);(r||m.pose.options.maxHighlightLength?(u=!1,l&&ro(e,t,r,A.pos),A.pos=t.length,B=null):B=ma(no(n,A,r.state,ee),a),ee){var Y=ee[0].name;Y&&(B="m-"+(B?Y+" "+B:Y))}if(!u||m!=B){for(;fl;--u){if(u<=a.first)return a.first;var f=Ae(a,u-1),m=f.stateAfter;if(m&&(!n||u+(m instanceof ri?m.lookAhead:0)<=a.modeFrontier))return u;var A=Oe(f.text,null,e.options.tabSize);(i==null||r>A)&&(i=u-1,r=A)}return i}function Lc(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontiern;r--){var i=Ae(e,r).stateAfter;if(i&&(!(i instanceof ri)||r+i.lookAhead=t:a.to>t);(r||(r=[])).push(new ni(l,a.from,f?null:a.to))}}return r}function Dc(e,t,n){var r;if(e)for(var i=0;i=t:a.to>t);if(u||a.from==t&&l.type=="bookmark"&&(!n||a.marker.insertLeft)){var f=a.from==null||(l.inclusiveLeft?a.from<=t:a.from0&&u)for(var Ce=0;Ce0)){var A=[f,1],B=ye(m.from,u.from),ee=ye(m.to,u.to);(B<0||!l.inclusiveLeft&&!B)&&A.push({from:m.from,to:u.from}),(ee>0||!l.inclusiveRight&&!ee)&&A.push({from:u.to,to:m.to}),i.splice.apply(i,A),f+=A.length-3}}return i}function xa(e){var t=e.markedSpans;if(t){for(var n=0;nt)&&(!r||oo(r,a.marker)<0)&&(r=a.marker)}return r}function Sa(e,t,n,r,i){var a=Ae(e,t),l=or&&a.markedSpans;if(l)for(var u=0;u=0&&B<=0||A<=0&&B>=0)&&(A<=0&&(f.marker.inclusiveRight&&i.inclusiveLeft?ye(m.to,n)>=0:ye(m.to,n)>0)||A>=0&&(f.marker.inclusiveRight&&i.inclusiveLeft?ye(m.from,r)<=0:ye(m.from,r)<0)))return!0}}}function Zt(e){for(var t;t=wa(e);)e=t.find(-1,!0).line;return e}function Ic(e){for(var t;t=ai(e);)e=t.find(1,!0).line;return e}function Nc(e){for(var t,n;t=ai(e);)e=t.find(1,!0).line,(n||(n=[])).push(e);return n}function ao(e,t){var n=Ae(e,t),r=Zt(n);return n==r?t:x(r)}function Ta(e,t){if(t>e.lastLine())return t;var n=Ae(e,t),r;if(!mr(e,n))return t;for(;r=ai(n);)n=r.find(1,!0).line;return x(n)+1}function mr(e,t){var n=or&&t.markedSpans;if(n){for(var r=void 0,i=0;it.maxLineLength&&(t.maxLineLength=i,t.maxLine=r)})}var Xr=function(e,t,n){this.text=e,_a(this,t),this.height=n?n(this):1};Xr.prototype.lineNo=function(){return x(this)},Wt(Xr);function Oc(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),e.order!=null&&(e.order=null),xa(e),_a(e,n);var i=r?r(e):1;i!=e.height&&Bt(e,i)}function Pc(e){e.parent=null,xa(e)}var Bc={},jc={};function La(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?jc:Bc;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Ca(e,t){var n=K("span",null,null,g?"padding-right: .1px":null),r={pre:K("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var a=i?t.rest[i-1]:t.line,l=void 0;r.pos=0,r.addToken=Hc,pr(e.display.measure)&&(l=Pe(a,e.doc.direction))&&(r.addToken=Uc(r.addToken,l)),r.map=[];var u=t!=e.display.externalMeasured&&x(a);$c(a,r,da(e,a,u)),a.styleClasses&&(a.styleClasses.bgClass&&(r.bgClass=xe(a.styleClasses.bgClass,r.bgClass||"")),a.styleClasses.textClass&&(r.textClass=xe(a.styleClasses.textClass,r.textClass||""))),r.map.length==0&&r.map.push(0,0,r.content.appendChild(ei(e.display.measure))),i==0?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(g){var f=r.content.lastChild;(/\bcm-tab\b/.test(f.className)||f.querySelector&&f.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")}return it(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=xe(r.pre.className,r.textClass||"")),r}function Rc(e){var t=y("span","\u2022","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Hc(e,t,n,r,i,a,l){if(t){var u=e.splitSpaces?Wc(t,e.trailingSpace):t,f=e.cm.state.specialChars,m=!1,A;if(!f.test(t))e.col+=t.length,A=document.createTextNode(u),e.map.push(e.pos,e.pos+t.length,A),s&&h<9&&(m=!0),e.pos+=t.length;else{A=document.createDocumentFragment();for(var B=0;;){f.lastIndex=B;var ee=f.exec(t),Y=ee?ee.index-B:t.length-B;if(Y){var ie=document.createTextNode(u.slice(B,B+Y));s&&h<9?A.appendChild(y("span",[ie])):A.appendChild(ie),e.map.push(e.pos,e.pos+Y,ie),e.col+=Y,e.pos+=Y}if(!ee)break;B+=Y+1;var ue=void 0;if(ee[0]==" "){var me=e.cm.options.tabSize,ve=me-e.col%me;ue=A.appendChild(y("span",Z(ve),"cm-tab")),ue.setAttribute("role","presentation"),ue.setAttribute("cm-text"," "),e.col+=ve}else ee[0]=="\r"||ee[0]==` `?(ue=A.appendChild(y("span",ee[0]=="\r"?"\u240D":"\u2424","cm-invalidchar")),ue.setAttribute("cm-text",ee[0]),e.col+=1):(ue=e.cm.options.specialCharPlaceholder(ee[0]),ue.setAttribute("cm-text",ee[0]),s&&h<9?A.appendChild(y("span",[ue])):A.appendChild(ue),e.col+=1);e.map.push(e.pos,e.pos+1,ue),e.pos++}}if(e.trailingSpace=u.charCodeAt(t.length-1)==32,n||r||i||m||a||l){var _e=n||"";r&&(_e+=r),i&&(_e+=i);var be=y("span",[A],_e,a);if(l)for(var Ce in l)l.hasOwnProperty(Ce)&&Ce!="style"&&Ce!="class"&&be.setAttribute(Ce,l[Ce]);return e.content.appendChild(be)}e.content.appendChild(A)}}function Wc(e,t){if(e.length>1&&!/ /.test(e))return e;for(var n=t,r="",i=0;im&&B.from<=m));ee++);if(B.to>=A)return e(n,r,i,a,l,u,f);e(n,r.slice(0,B.to-m),i,a,null,u,f),a=null,r=r.slice(B.to-m),m=B.to}}}function Ea(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function $c(e,t,n){var r=e.markedSpans,i=e.text,a=0;if(!r){for(var l=1;lf||$e.collapsed&&Fe.to==f&&Fe.from==f)){if(Fe.to!=null&&Fe.to!=f&&Y>Fe.to&&(Y=Fe.to,ue=""),$e.className&&(ie+=" "+$e.className),$e.css&&(ee=(ee?ee+";":"")+$e.css),$e.startStyle&&Fe.from==f&&(me+=" "+$e.startStyle),$e.endStyle&&Fe.to==Y&&(Ce||(Ce=[])).push($e.endStyle,Fe.to),$e.title&&((_e||(_e={})).title=$e.title),$e.attributes)for(var Ve in $e.attributes)(_e||(_e={}))[Ve]=$e.attributes[Ve];$e.collapsed&&(!ve||oo(ve.marker,$e)<0)&&(ve=Fe)}else Fe.from>f&&Y>Fe.from&&(Y=Fe.from)}if(Ce)for(var vt=0;vt=u)break;for(var Ot=Math.min(u,Y);;){if(A){var At=f+A.length;if(!ve){var ut=At>Ot?A.slice(0,Ot-f):A;t.addToken(t,ut,B?B+ie:ie,me,f+ut.length==Y?ue:"",ee,_e)}if(At>=Ot){A=A.slice(Ot-f),f=Ot;break}f=At,me=""}A=i.slice(a,a=n[m++]),B=La(n[m++],t.cm.options)}}}function za(e,t,n){this.line=t,this.rest=Nc(t),this.size=this.rest?x(ce(this.rest))-n+1:1,this.node=this.text=null,this.hidden=mr(e,t)}function si(e,t,n){for(var r=[],i,a=t;a2&&a.push((f.bottom+m.top)/2-n.top)}}a.push(n.bottom-n.top)}}function Na(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};if(e.rest){for(var r=0;rn)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}}function rf(e,t){t=Zt(t);var n=x(t),r=e.display.externalMeasured=new za(e.doc,t,n);r.lineN=n;var i=r.built=Ca(e,r);return r.text=i.pre,V(e.display.lineMeasure,i.pre),r}function Oa(e,t,n,r){return tr(e,Qr(e,t),n,r)}function po(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&tt)&&(a=f-u,i=a-1,t>=f&&(l="right")),i!=null){if(r=e[m+2],u==f&&n==(r.insertLeft?"left":"right")&&(l=n),n=="left"&&i==0)for(;m&&e[m-2]==e[m-3]&&e[m-1].insertLeft;)r=e[(m-=3)+2],l="left";if(n=="right"&&i==f-u)for(;m=0&&(n=e[i]).left==n.right;i--);return n}function of(e,t,n,r){var i=Ba(t.map,n,r),a=i.node,l=i.start,u=i.end,f=i.collapse,m;if(a.nodeType==3){for(var A=0;A<4;A++){for(;l&&H(t.line.text.charAt(i.coverStart+l));)--l;for(;i.coverStart+u0&&(f=r="right");var B;e.options.lineWrapping&&(B=a.getClientRects()).length>1?m=B[r=="right"?B.length-1:0]:m=a.getBoundingClientRect()}if(s&&h<9&&!l&&(!m||!m.left&&!m.right)){var ee=a.parentNode.getClientRects()[0];ee?m={left:ee.left,right:ee.left+Jr(e.display),top:ee.top,bottom:ee.bottom}:m=Pa}for(var Y=m.top-t.rect.top,ie=m.bottom-t.rect.top,ue=(Y+ie)/2,me=t.view.measure.heights,ve=0;ve=r.text.length?(f=r.text.length,m="before"):f<=0&&(f=0,m="after"),!u)return l(m=="before"?f-1:f,m=="before");function A(ie,ue,me){var ve=u[ue],_e=ve.level==1;return l(me?ie-1:ie,_e!=me)}var B=Pt(u,f,m),ee=dt,Y=A(f,B,m=="before");return ee!=null&&(Y.other=A(f,ee,m!="before")),Y}function $a(e,t){var n=0;t=je(e.doc,t),e.options.lineWrapping||(n=Jr(e.display)*t.ch);var r=Ae(e.doc,t.line),i=ar(r)+ui(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function go(e,t,n,r,i){var a=ne(e,t,n);return a.xRel=i,r&&(a.outside=r),a}function mo(e,t,n){var r=e.doc;if(n+=e.display.viewOffset,n<0)return go(r.first,0,null,-1,-1);var i=P(r,n),a=r.first+r.size-1;if(i>a)return go(r.first+r.size-1,Ae(r,a).text.length,null,1,1);t<0&&(t=0);for(var l=Ae(r,i);;){var u=lf(e,l,i,t,n),f=Fc(l,u.ch+(u.xRel>0||u.outside>0?1:0));if(!f)return u;var m=f.find(1);if(m.line==i)return m;l=Ae(r,i=m.line)}}function Ka(e,t,n,r){r-=ho(t);var i=t.text.length,a=De(function(l){return tr(e,n,l-1).bottom<=r},i,0);return i=De(function(l){return tr(e,n,l).top>r},a,i),{begin:a,end:i}}function Ga(e,t,n,r){n||(n=Qr(e,t));var i=ci(e,t,tr(e,n,r),"line").top;return Ka(e,t,n,i)}function vo(e,t,n,r){return e.bottom<=n?!1:e.top>n?!0:(r?e.left:e.right)>t}function lf(e,t,n,r,i){i-=ar(t);var a=Qr(e,t),l=ho(t),u=0,f=t.text.length,m=!0,A=Pe(t,e.doc.direction);if(A){var B=(e.options.lineWrapping?uf:sf)(e,t,n,a,A,r,i);m=B.level!=1,u=m?B.from:B.to-1,f=m?B.to:B.from-1}var ee=null,Y=null,ie=De(function(Ne){var Fe=tr(e,a,Ne);return Fe.top+=l,Fe.bottom+=l,vo(Fe,r,i,!1)?(Fe.top<=i&&Fe.left<=r&&(ee=Ne,Y=Fe),!0):!1},u,f),ue,me,ve=!1;if(Y){var _e=r-Y.left=Ce.bottom?1:0}return ie=se(t.text,ie,1),go(n,ie,me,ve,r-ue)}function sf(e,t,n,r,i,a,l){var u=De(function(B){var ee=i[B],Y=ee.level!=1;return vo(Xt(e,ne(n,Y?ee.to:ee.from,Y?"before":"after"),"line",t,r),a,l,!0)},0,i.length-1),f=i[u];if(u>0){var m=f.level!=1,A=Xt(e,ne(n,m?f.from:f.to,m?"after":"before"),"line",t,r);vo(A,a,l,!0)&&A.top>l&&(f=i[u-1])}return f}function uf(e,t,n,r,i,a,l){var u=Ka(e,t,r,l),f=u.begin,m=u.end;/\s/.test(t.text.charAt(m-1))&&m--;for(var A=null,B=null,ee=0;ee=m||Y.to<=f)){var ie=Y.level!=1,ue=tr(e,r,ie?Math.min(m,Y.to)-1:Math.max(f,Y.from)).right,me=ueme)&&(A=Y,B=me)}}return A||(A=i[i.length-1]),A.fromm&&(A={from:A.from,to:m,level:A.level}),A}var zr;function Vr(e){if(e.cachedTextHeight!=null)return e.cachedTextHeight;if(zr==null){zr=y("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)zr.appendChild(document.createTextNode("x")),zr.appendChild(y("br"));zr.appendChild(document.createTextNode("x"))}V(e.measure,zr);var n=zr.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),j(e.measure),n||1}function Jr(e){if(e.cachedCharWidth!=null)return e.cachedCharWidth;var t=y("span","xxxxxxxxxx"),n=y("pre",[t],"CodeMirror-line-like");V(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function bo(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,a=t.gutters.firstChild,l=0;a;a=a.nextSibling,++l){var u=e.display.gutterSpecs[l].className;n[u]=a.offsetLeft+a.clientLeft+i,r[u]=a.clientWidth}return{fixedPos:yo(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function yo(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function Za(e){var t=Vr(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/Jr(e.display)-3);return function(i){if(mr(e.doc,i))return 0;var a=0;if(i.widgets)for(var l=0;l0&&(m=Ae(e.doc,f.line).text).length==f.ch){var A=Oe(m,m.length,e.options.tabSize)-m.length;f=ne(f.line,Math.max(0,Math.round((a-Ia(e.display).left)/Jr(e.display))-A))}return f}function Ar(e,t){if(t>=e.display.viewTo||(t-=e.display.viewFrom,t<0))return null;for(var n=e.display.view,r=0;rt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)or&&ao(e.doc,t)i.viewFrom?br(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)br(e);else if(t<=i.viewFrom){var a=di(e,n,n+r,1);a?(i.view=i.view.slice(a.index),i.viewFrom=a.lineN,i.viewTo+=r):br(e)}else if(n>=i.viewTo){var l=di(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):br(e)}else{var u=di(e,t,t,-1),f=di(e,n,n+r,1);u&&f?(i.view=i.view.slice(0,u.index).concat(si(e,u.lineN,f.lineN)).concat(i.view.slice(f.index)),i.viewTo+=r):br(e)}var m=i.externalMeasured;m&&(n=i.lineN&&t=r.viewTo)){var a=r.view[Ar(e,t)];if(a.node!=null){var l=a.changes||(a.changes=[]);Se(l,n)==-1&&l.push(n)}}}function br(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function di(e,t,n,r){var i=Ar(e,t),a,l=e.display.view;if(!or||n==e.doc.first+e.doc.size)return{index:i,lineN:n};for(var u=e.display.viewFrom,f=0;f0){if(i==l.length-1)return null;a=u+l[i].size-t,i++}else a=u-t;t+=a,n+=a}for(;ao(e.doc,n)!=n;){if(i==(r<0?0:l.length-1))return null;n+=r*l[i-(r<0?1:0)].size,i+=r}return{index:i,lineN:n}}function cf(e,t,n){var r=e.display,i=r.view;i.length==0||t>=r.viewTo||n<=r.viewFrom?(r.view=si(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=si(e,t,r.viewFrom).concat(r.view):r.viewFromn&&(r.view=r.view.slice(0,Ar(e,n)))),r.viewTo=n}function Xa(e){for(var t=e.display.view,n=0,r=0;r=e.display.viewTo||f.to().line0?l:e.defaultCharWidth())+"px"}if(r.other){var u=n.appendChild(y("div","\xA0","CodeMirror-cursor CodeMirror-secondarycursor"));u.style.display="",u.style.left=r.other.left+"px",u.style.top=r.other.top+"px",u.style.height=(r.other.bottom-r.other.top)*.85+"px"}}function pi(e,t){return e.top-t.top||e.left-t.left}function ff(e,t,n){var r=e.display,i=e.doc,a=document.createDocumentFragment(),l=Ia(e.display),u=l.left,f=Math.max(r.sizerWidth,Er(e)-r.sizer.offsetLeft)-l.right,m=i.direction=="ltr";function A(be,Ce,Ne,Fe){Ce<0&&(Ce=0),Ce=Math.round(Ce),Fe=Math.round(Fe),a.appendChild(y("div",null,"CodeMirror-selected","position: absolute; left: "+be+`px; top: `+Ce+"px; width: "+(Ne??f-be)+`px; height: `+(Fe-Ce)+"px"))}function B(be,Ce,Ne){var Fe=Ae(i,be),$e=Fe.text.length,Ve,vt;function rt(ut,Dt){return fi(e,ne(be,ut),"div",Fe,Dt)}function Ot(ut,Dt,yt){var ft=Ga(e,Fe,null,ut),ct=Dt=="ltr"==(yt=="after")?"left":"right",lt=yt=="after"?ft.begin:ft.end-(/\s/.test(Fe.text.charAt(ft.end-1))?2:1);return rt(lt,ct)[ct]}var At=Pe(Fe,i.direction);return nt(At,Ce||0,Ne??$e,function(ut,Dt,yt,ft){var ct=yt=="ltr",lt=rt(ut,ct?"left":"right"),qt=rt(Dt-1,ct?"right":"left"),pn=Ce==null&&ut==0,Sr=Ne==null&&Dt==$e,St=ft==0,rr=!At||ft==At.length-1;if(qt.top-lt.top<=3){var bt=(m?pn:Sr)&&St,Zo=(m?Sr:pn)&&rr,cr=bt?u:(ct?lt:qt).left,Nr=Zo?f:(ct?qt:lt).right;A(cr,lt.top,Nr-cr,lt.bottom)}else{var Or,Lt,hn,Xo;ct?(Or=m&&pn&&St?u:lt.left,Lt=m?f:Ot(ut,yt,"before"),hn=m?u:Ot(Dt,yt,"after"),Xo=m&&Sr&&rr?f:qt.right):(Or=m?Ot(ut,yt,"before"):u,Lt=!m&&pn&&St?f:lt.right,hn=!m&&Sr&&rr?u:qt.left,Xo=m?Ot(Dt,yt,"after"):f),A(Or,lt.top,Lt-Or,lt.bottom),lt.bottom0?t.blinker=setInterval(function(){e.hasFocus()||en(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Qa(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||So(e))}function wo(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&en(e))},100)}function So(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),e.options.readOnly!="nocursor"&&(e.state.focused||(it(e,"focus",e,t),e.state.focused=!0,le(e.display.wrapper,"CodeMirror-focused"),!e.curOp&&e.display.selForContextMenu!=e.doc.sel&&(e.display.input.reset(),g&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),ko(e))}function en(e,t){e.state.delayingBlurEvent||(e.state.focused&&(it(e,"blur",e,t),e.state.focused=!1,Q(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function hi(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=Math.max(0,t.scroller.getBoundingClientRect().top),i=t.lineDiv.getBoundingClientRect().top,a=0,l=0;l.005||Y<-.005)&&(ie.display.sizerWidth){var ue=Math.ceil(A/Jr(e.display));ue>e.display.maxLineLength&&(e.display.maxLineLength=ue,e.display.maxLine=u.line,e.display.maxLineChanged=!0)}}}Math.abs(a)>2&&(t.scroller.scrollTop+=a)}function Va(e){if(e.widgets)for(var t=0;t=l&&(a=P(t,ar(Ae(t,f))-e.wrapper.clientHeight),l=f)}return{from:a,to:Math.max(l,a+1)}}function df(e,t){if(!ot(e,"scrollCursorIntoView")){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null,a=n.wrapper.ownerDocument;if(t.top+r.top<0?i=!0:t.bottom+r.top>(a.defaultView.innerHeight||a.documentElement.clientHeight)&&(i=!1),i!=null&&!M){var l=y("div","\u200B",null,`position: absolute; top: `+(t.top-n.viewOffset-ui(e.display))+`px; height: `+(t.bottom-t.top+er(e)+n.barHeight)+`px; left: `+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(l),l.scrollIntoView(i),e.display.lineSpace.removeChild(l)}}}function pf(e,t,n,r){r==null&&(r=0);var i;!e.options.lineWrapping&&t==n&&(n=t.sticky=="before"?ne(t.line,t.ch+1,"before"):t,t=t.ch?ne(t.line,t.sticky=="before"?t.ch-1:t.ch,"after"):t);for(var a=0;a<5;a++){var l=!1,u=Xt(e,t),f=!n||n==t?u:Xt(e,n);i={left:Math.min(u.left,f.left),top:Math.min(u.top,f.top)-r,right:Math.max(u.left,f.left),bottom:Math.max(u.bottom,f.bottom)+r};var m=To(e,i),A=e.doc.scrollTop,B=e.doc.scrollLeft;if(m.scrollTop!=null&&(An(e,m.scrollTop),Math.abs(e.doc.scrollTop-A)>1&&(l=!0)),m.scrollLeft!=null&&(Dr(e,m.scrollLeft),Math.abs(e.doc.scrollLeft-B)>1&&(l=!0)),!l)break}return i}function hf(e,t){var n=To(e,t);n.scrollTop!=null&&An(e,n.scrollTop),n.scrollLeft!=null&&Dr(e,n.scrollLeft)}function To(e,t){var n=e.display,r=Vr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&e.curOp.scrollTop!=null?e.curOp.scrollTop:n.scroller.scrollTop,a=fo(e),l={};t.bottom-t.top>a&&(t.bottom=t.top+a);var u=e.doc.height+co(n),f=t.topu-r;if(t.topi+a){var A=Math.min(t.top,(m?u:t.bottom)-a);A!=i&&(l.scrollTop=A)}var B=e.options.fixedGutter?0:n.gutters.offsetWidth,ee=e.curOp&&e.curOp.scrollLeft!=null?e.curOp.scrollLeft:n.scroller.scrollLeft-B,Y=Er(e)-n.gutters.offsetWidth,ie=t.right-t.left>Y;return ie&&(t.right=t.left+Y),t.left<10?l.scrollLeft=0:t.leftY+ee-3&&(l.scrollLeft=t.right+(ie?0:10)-Y),l}function Lo(e,t){t!=null&&(mi(e),e.curOp.scrollTop=(e.curOp.scrollTop==null?e.doc.scrollTop:e.curOp.scrollTop)+t)}function tn(e){mi(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Mn(e,t,n){(t!=null||n!=null)&&mi(e),t!=null&&(e.curOp.scrollLeft=t),n!=null&&(e.curOp.scrollTop=n)}function gf(e,t){mi(e),e.curOp.scrollToPos=t}function mi(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=$a(e,t.from),r=$a(e,t.to);Ja(e,n,r,t.margin)}}function Ja(e,t,n,r){var i=To(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Mn(e,i.scrollLeft,i.scrollTop)}function An(e,t){Math.abs(e.doc.scrollTop-t)<2||(v||Eo(e,{top:t}),el(e,t,!0),v&&Eo(e),Fn(e,100))}function el(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),!(e.display.scroller.scrollTop==t&&!n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Dr(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),!((n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r)&&(e.doc.scrollLeft=t,ol(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Dn(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+co(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+er(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}var qr=function(e,t,n){this.cm=n;var r=this.vert=y("div",[y("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=y("div",[y("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),Ie(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),Ie(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,s&&h<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};qr.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.scrollTop=0,this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var a=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+a)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(r==0&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},qr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},qr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},qr.prototype.zeroWidthHack=function(){var e=O&&!z?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.visibility=this.vert.style.visibility="hidden",this.disableHoriz=new qe,this.disableVert=new qe},qr.prototype.enableZeroWidthBar=function(e,t,n){e.style.visibility="";function r(){var i=e.getBoundingClientRect(),a=n=="vert"?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1);a!=e?e.style.visibility="hidden":t.set(1e3,r)}t.set(1e3,r)},qr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var qn=function(){};qn.prototype.update=function(){return{bottom:0,right:0}},qn.prototype.setScrollLeft=function(){},qn.prototype.setScrollTop=function(){},qn.prototype.clear=function(){};function rn(e,t){t||(t=Dn(e));var n=e.display.barWidth,r=e.display.barHeight;tl(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&hi(e),tl(e,Dn(e)),n=e.display.barWidth,r=e.display.barHeight}function tl(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}var rl={native:qr,null:qn};function nl(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&Q(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new rl[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Ie(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,n){n=="horizontal"?Dr(e,t):An(e,t)},e),e.display.scrollbars.addClass&&le(e.display.wrapper,e.display.scrollbars.addClass)}var mf=0;function Fr(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++mf,markArrays:null},Kc(e.curOp)}function Ir(e){var t=e.curOp;t&&Zc(t,function(n){for(var r=0;r=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new vi(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function yf(e){e.updatedDisplay=e.mustUpdate&&Co(e.cm,e.update)}function xf(e){var t=e.cm,n=t.display;e.updatedDisplay&&hi(t),e.barMeasure=Dn(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Oa(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+er(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Er(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function _f(e){var t=e.cm;e.adjustWidthTo!=null&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft=e.display.viewTo)){var n=+new Date+e.options.workTime,r=wn(e,t.highlightFrontier),i=[];t.iter(r.line,Math.min(t.first+t.size,e.display.viewTo+500),function(a){if(r.line>=e.display.viewFrom){var l=a.styles,u=a.text.length>e.options.maxHighlightLength?Vt(t.mode,r.state):null,f=fa(e,a,r,!0);u&&(r.state=u),a.styles=f.styles;var m=a.styleClasses,A=f.classes;A?a.styleClasses=A:m&&(a.styleClasses=null);for(var B=!l||l.length!=a.styles.length||m!=A&&(!m||!A||m.bgClass!=A.bgClass||m.textClass!=A.textClass),ee=0;!B&&een)return Fn(e,e.options.workDelay),!0}),t.highlightFrontier=r.line,t.modeFrontier=Math.max(t.modeFrontier,r.line),i.length&&Nt(e,function(){for(var a=0;a=n.viewFrom&&t.visible.to<=n.viewTo&&(n.updateLineNumbers==null||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&Xa(e)==0)return!1;al(e)&&(br(e),t.dims=bo(e));var i=r.first+r.size,a=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFroml&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),or&&(a=ao(e.doc,a),l=Ta(e.doc,l));var u=a!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;cf(e,a,l),n.viewOffset=ar(Ae(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var f=Xa(e);if(!u&&f==0&&!t.force&&n.renderedView==n.view&&(n.updateLineNumbers==null||n.updateLineNumbers>=n.viewTo))return!1;var m=Tf(e);return f>4&&(n.lineDiv.style.display="none"),Cf(e,n.updateLineNumbers,t.dims),f>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,Lf(m),j(n.cursorDiv),j(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,u&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Fn(e,400)),n.updateLineNumbers=null,!0}function il(e,t){for(var n=t.viewport,r=!0;;r=!1){if(!r||!e.options.lineWrapping||t.oldDisplayWidth==Er(e)){if(n&&n.top!=null&&(n={top:Math.min(e.doc.height+co(e.display)-fo(e),n.top)}),t.visible=gi(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break}else r&&(t.visible=gi(e.display,e.doc,n));if(!Co(e,t))break;hi(e);var i=Dn(e);zn(e),rn(e,i),Mo(e,i),t.force=!1}t.signal(e,"update",e),(e.display.viewFrom!=e.display.reportedViewFrom||e.display.viewTo!=e.display.reportedViewTo)&&(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function Eo(e,t){var n=new vi(e,t);if(Co(e,n)){hi(e),il(e,n);var r=Dn(e);zn(e),rn(e,r),Mo(e,r),n.finish()}}function Cf(e,t,n){var r=e.display,i=e.options.lineNumbers,a=r.lineDiv,l=a.firstChild;function u(ie){var ue=ie.nextSibling;return g&&O&&e.display.currentWheelTarget==ie?ie.style.display="none":ie.parentNode.removeChild(ie),ue}for(var f=r.view,m=r.viewFrom,A=0;A-1&&(Y=!1),Ma(e,B,m,n)),Y&&(j(B.lineNumber),B.lineNumber.appendChild(document.createTextNode(he(e.options,m)))),l=B.node.nextSibling}m+=B.size}for(;l;)l=u(l)}function zo(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px",ht(e,"gutterChanged",e)}function Mo(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+er(e)+"px"}function ol(e){var t=e.display,n=t.view;if(!(!t.alignWidgets&&(!t.gutters.firstChild||!e.options.fixedGutter))){for(var r=yo(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,a=r+"px",l=0;lu.clientWidth,m=u.scrollHeight>u.clientHeight;if(r&&f||i&&m){if(i&&O&&g){e:for(var A=t.target,B=l.view;A!=u;A=A.parentNode)for(var ee=0;ee=0&&ye(e,r.to())<=0)return n}return-1};var Ye=function(e,t){this.anchor=e,this.head=t};Ye.prototype.from=function(){return Zr(this.anchor,this.head)},Ye.prototype.to=function(){return Et(this.anchor,this.head)},Ye.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch};function Yt(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(ee,Y){return ye(ee.from(),Y.from())}),n=Se(t,i);for(var a=1;a0:f>=0){var m=Zr(u.from(),l.from()),A=Et(u.to(),l.to()),B=u.empty()?l.from()==l.head:u.from()==u.head;a<=n&&--n,t.splice(--a,2,new Ye(B?A:m,B?m:A))}}return new jt(t,n)}function yr(e,t){return new jt([new Ye(e,t||e)],0)}function xr(e){return e.text?ne(e.from.line+e.text.length-1,ce(e.text).length+(e.text.length==1?e.from.ch:0)):e.to}function cl(e,t){if(ye(e,t.from)<0)return e;if(ye(e,t.to)<=0)return xr(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=xr(t).ch-t.to.ch),ne(n,r)}function Do(e,t){for(var n=[],r=0;r1&&e.remove(u.line+1,ie-1),e.insert(u.line+1,ve)}ht(e,"change",e,t)}function _r(e,t,n){function r(i,a,l){if(i.linked)for(var u=0;u1&&!e.done[e.done.length-2].ranges)return e.done.pop(),ce(e.done)}function ml(e,t,n,r){var i=e.history;i.undone.length=0;var a=+new Date,l,u;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&(t.origin.charAt(0)=="+"&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||t.origin.charAt(0)=="*"))&&(l=Df(i,i.lastOp==r)))u=ce(l.changes),ye(t.from,t.to)==0&&ye(t.from,u.to)==0?u.to=xr(t):l.changes.push(Io(e,t));else{var f=ce(i.done);for((!f||!f.ranges)&&xi(e.sel,i.done),l={changes:[Io(e,t)],generation:i.generation},i.done.push(l);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,u||it(e,"historyAdded")}function qf(e,t,n,r){var i=t.charAt(0);return i=="*"||i=="+"&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function Ff(e,t,n,r){var i=e.history,a=r&&r.origin;n==i.lastSelOp||a&&i.lastSelOrigin==a&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==a||qf(e,a,ce(i.done),t))?i.done[i.done.length-1]=t:xi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=a,i.lastSelOp=n,r&&r.clearRedo!==!1&&gl(i.undone)}function xi(e,t){var n=ce(t);n&&n.ranges&&n.equals(e)||t.push(e)}function vl(e,t,n,r){var i=t["spans_"+e.id],a=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(l){l.markedSpans&&((i||(i=t["spans_"+e.id]={}))[a]=l.markedSpans),++a})}function If(e){if(!e)return null;for(var t,n=0;n-1&&(ce(u)[B]=m[B],delete m[B])}}return r}function No(e,t,n,r){if(r){var i=e.anchor;if(n){var a=ye(t,i)<0;a!=ye(n,i)<0?(i=t,t=n):a!=ye(t,n)<0&&(t=n)}return new Ye(i,t)}else return new Ye(n||t,t)}function _i(e,t,n,r,i){i==null&&(i=e.cm&&(e.cm.display.shift||e.extend)),wt(e,new jt([No(e.sel.primary(),t,n,i)],0),r)}function yl(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),a=0;a=t.ch:u.to>t.ch))){if(i&&(it(f,"beforeCursorEnter"),f.explicitlyCleared))if(a.markedSpans){--l;continue}else break;if(!f.atomic)continue;if(n){var B=f.find(r<0?1:-1),ee=void 0;if((r<0?A:m)&&(B=Tl(e,B,-r,B&&B.line==t.line?a:null)),B&&B.line==t.line&&(ee=ye(B,n))&&(r<0?ee<0:ee>0))return on(e,B,t,r,i)}var Y=f.find(r<0?-1:1);return(r<0?m:A)&&(Y=Tl(e,Y,r,Y.line==t.line?a:null)),Y?on(e,Y,t,r,i):null}}return t}function wi(e,t,n,r,i){var a=r||1,l=on(e,t,n,a,i)||!i&&on(e,t,n,a,!0)||on(e,t,n,-a,i)||!i&&on(e,t,n,-a,!0);return l||(e.cantEdit=!0,ne(e.first,0))}function Tl(e,t,n,r){return n<0&&t.ch==0?t.line>e.first?je(e,ne(t.line-1)):null:n>0&&t.ch==(r||Ae(e,t.line)).text.length?t.line=0;--i)El(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else El(e,t)}}function El(e,t){if(!(t.text.length==1&&t.text[0]==""&&ye(t.from,t.to)==0)){var n=Do(e,t);ml(e,t,n,e.cm?e.cm.curOp.id:NaN),On(e,t,n,io(e,t));var r=[];_r(e,function(i,a){!a&&Se(r,i.history)==-1&&(Dl(i.history,t),r.push(i.history)),On(i,t,null,io(i,t))})}}function Si(e,t,n){var r=e.cm&&e.cm.state.suppressEdits;if(!(r&&!n)){for(var i=e.history,a,l=e.sel,u=t=="undo"?i.done:i.undone,f=t=="undo"?i.undone:i.done,m=0;m=0;--Y){var ie=ee(Y);if(ie)return ie.v}}}}function zl(e,t){if(t!=0&&(e.first+=t,e.sel=new jt(He(e.sel.ranges,function(i){return new Ye(ne(i.anchor.line+t,i.anchor.ch),ne(i.head.line+t,i.head.ch))}),e.sel.primIndex),e.cm)){zt(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;re.lastLine())){if(t.from.linea&&(t={from:t.from,to:ne(a,Ae(e,a).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ir(e,t.from,t.to),n||(n=Do(e,t)),e.cm?Pf(e.cm,t,r):Fo(e,t,r),ki(e,n,ke),e.cantEdit&&wi(e,ne(e.firstLine(),0))&&(e.cantEdit=!1)}}function Pf(e,t,n){var r=e.doc,i=e.display,a=t.from,l=t.to,u=!1,f=a.line;e.options.lineWrapping||(f=x(Zt(Ae(r,a.line))),r.iter(f,l.line+1,function(Y){if(Y==i.maxLine)return u=!0,!0})),r.sel.contains(t.from,t.to)>-1&&Rt(e),Fo(r,t,n,Za(e)),e.options.lineWrapping||(r.iter(f,a.line+t.text.length,function(Y){var ie=li(Y);ie>i.maxLineLength&&(i.maxLine=Y,i.maxLineLength=ie,i.maxLineChanged=!0,u=!1)}),u&&(e.curOp.updateMaxLine=!0)),Lc(r,a.line),Fn(e,400);var m=t.text.length-(l.line-a.line)-1;t.full?zt(e):a.line==l.line&&t.text.length==1&&!dl(e.doc,t)?vr(e,a.line,"text"):zt(e,a.line,l.line+1,m);var A=It(e,"changes"),B=It(e,"change");if(B||A){var ee={from:a,to:l,text:t.text,removed:t.removed,origin:t.origin};B&&ht(e,"change",e,ee),A&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(ee)}e.display.selForContextMenu=null}function ln(e,t,n,r,i){var a;r||(r=n),ye(r,n)<0&&(a=[r,n],n=a[0],r=a[1]),typeof t=="string"&&(t=e.splitLines(t)),an(e,{from:n,to:r,text:t,origin:i})}function Ml(e,t,n,r){n1||!(this.children[0]instanceof Bn))){var u=[];this.collapse(u),this.children=[new Bn(u)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var l=i.lines.length%25+25,u=l;u10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;re.display.maxLineLength&&(e.display.maxLine=m,e.display.maxLineLength=A,e.display.maxLineChanged=!0)}r!=null&&e&&this.collapsed&&zt(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&wl(e.doc)),e&&ht(e,"markerCleared",e,this,r,i),t&&Ir(e),this.parent&&this.parent.clear()}},kr.prototype.find=function(e,t){e==null&&this.type=="bookmark"&&(e=1);for(var n,r,i=0;i0||l==0&&a.clearWhenEmpty!==!1)return a;if(a.replacedWith&&(a.collapsed=!0,a.widgetNode=K("span",[a.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||a.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(a.widgetNode.insertLeft=!0)),a.collapsed){if(Sa(e,t.line,t,n,a)||t.line!=n.line&&Sa(e,n.line,t,n,a))throw new Error("Inserting collapsed marker partially overlapping an existing one");Ec()}a.addToHistory&&ml(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var u=t.line,f=e.cm,m;if(e.iter(u,n.line+1,function(B){f&&a.collapsed&&!f.options.lineWrapping&&Zt(B)==f.display.maxLine&&(m=!0),a.collapsed&&u!=t.line&&Bt(B,0),Mc(B,new ni(a,u==t.line?t.ch:null,u==n.line?n.ch:null),e.cm&&e.cm.curOp),++u}),a.collapsed&&e.iter(t.line,n.line+1,function(B){mr(e,B)&&Bt(B,0)}),a.clearOnEnter&&Ie(a,"beforeCursorEnter",function(){return a.clear()}),a.readOnly&&(Cc(),(e.history.done.length||e.history.undone.length)&&e.clearHistory()),a.collapsed&&(a.id=++Fl,a.atomic=!0),f){if(m&&(f.curOp.updateMaxLine=!0),a.collapsed)zt(f,t.line,n.line+1);else if(a.className||a.startStyle||a.endStyle||a.css||a.attributes||a.title)for(var A=t.line;A<=n.line;A++)vr(f,A,"text");a.atomic&&wl(f.doc),ht(f,"markerAdded",f,a)}return a}var Hn=function(e,t){this.markers=e,this.primary=t;for(var n=0;n=0;f--)an(this,r[f]);u?_l(this,u):this.cm&&tn(this.cm)}),undo:mt(function(){Si(this,"undo")}),redo:mt(function(){Si(this,"redo")}),undoSelection:mt(function(){Si(this,"undo",!0)}),redoSelection:mt(function(){Si(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=je(this,e),t=je(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,function(a){var l=a.markedSpans;if(l)for(var u=0;u=f.to||f.from==null&&i!=e.line||f.from!=null&&i==t.line&&f.from>=t.ch)&&(!n||n(f.marker))&&r.push(f.marker.parent||f.marker)}++i}),r},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;re)return t=e,!0;e-=a,++n}),je(this,ne(n,t))},indexFromPos:function(e){e=je(this,e);var t=e.ch;if(e.linet&&(t=e.from),e.to!=null&&e.to-1){t.state.draggingText(e),setTimeout(function(){return t.display.input.focus()},20);return}try{var A=e.dataTransfer.getData("Text");if(A){var B;if(t.state.draggingText&&!t.state.draggingText.copy&&(B=t.listSelections()),ki(t.doc,yr(n,n)),B)for(var ee=0;ee=0;u--)ln(e.doc,"",r[u].from,r[u].to,"+delete");tn(e)})}function Po(e,t,n){var r=se(e.text,t+n,n);return r<0||r>e.text.length?null:r}function Bo(e,t,n){var r=Po(e,t.ch,n);return r==null?null:new ne(t.line,r,n<0?"after":"before")}function jo(e,t,n,r,i){if(e){t.doc.direction=="rtl"&&(i=-i);var a=Pe(n,t.doc.direction);if(a){var l=i<0?ce(a):a[0],u=i<0==(l.level==1),f=u?"after":"before",m;if(l.level>0||t.doc.direction=="rtl"){var A=Qr(t,n);m=i<0?n.text.length-1:0;var B=tr(t,A,m).top;m=De(function(ee){return tr(t,A,ee).top==B},i<0==(l.level==1)?l.from:l.to-1,m),f=="before"&&(m=Po(n,m,1))}else m=i<0?l.to:l.from;return new ne(r,m,f)}}return new ne(r,i<0?n.text.length:0,i<0?"before":"after")}function Vf(e,t,n,r){var i=Pe(t,e.doc.direction);if(!i)return Bo(t,n,r);n.ch>=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var a=Pt(i,n.ch,n.sticky),l=i[a];if(e.doc.direction=="ltr"&&l.level%2==0&&(r>0?l.to>n.ch:l.from=l.from&&ee>=A.begin)){var Y=B?"before":"after";return new ne(n.line,ee,Y)}}var ie=function(ve,_e,be){for(var Ce=function(Ve,vt){return vt?new ne(n.line,u(Ve,1),"before"):new ne(n.line,Ve,"after")};ve>=0&&ve0==(Ne.level!=1),$e=Fe?be.begin:u(be.end,-1);if(Ne.from<=$e&&$e0?A.end:u(A.begin,-1);return me!=null&&!(r>0&&me==t.text.length)&&(ue=ie(r>0?0:i.length-1,r,m(me)),ue)?ue:null}var $n={selectAll:Ll,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),ke)},killLine:function(e){return cn(e,function(t){if(t.empty()){var n=Ae(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)i=new ne(i.line,i.ch+1),e.replaceRange(a.charAt(i.ch-1)+a.charAt(i.ch-2),ne(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Ae(e.doc,i.line-1).text;l&&(i=new ne(i.line,1),e.replaceRange(a.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ne(i.line-1,l.length-1),i,"+transpose"))}}n.push(new Ye(i,i))}e.setSelections(n)})},newlineAndIndent:function(e){return Nt(e,function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var r=0;re&&ye(t,this.pos)==0&&n==this.button};var Gn,Zn;function od(e,t){var n=+new Date;return Zn&&Zn.compare(n,e,t)?(Gn=Zn=null,"triple"):Gn&&Gn.compare(n,e,t)?(Zn=new Ho(n,e,t),Gn=null,"double"):(Gn=new Ho(n,e,t),Zn=null,"single")}function Yl(e){var t=this,n=t.display;if(!(ot(t,e)||n.activeTouch&&n.input.supportsTouch())){if(n.input.ensurePolled(),n.shift=e.shiftKey,lr(n,e)){g||(n.scroller.draggable=!1,setTimeout(function(){return n.scroller.draggable=!0},100));return}if(!Wo(t,e)){var r=Mr(t,e),i=Ut(e),a=r?od(r,i):"single";pe(t).focus(),i==1&&t.state.selectingText&&t.state.selectingText(e),!(r&&ad(t,i,r,a,e))&&(i==1?r?sd(t,r,a,e):yn(e)==n.scroller&&kt(e):i==2?(r&&_i(t.doc,r),setTimeout(function(){return n.input.focus()},20)):i==3&&(I?t.display.input.onContextMenu(e):wo(t)))}}}function ad(e,t,n,r,i){var a="Click";return r=="double"?a="Double"+a:r=="triple"&&(a="Triple"+a),a=(t==1?"Left":t==2?"Middle":"Right")+a,Kn(e,Rl(a,i),i,function(l){if(typeof l=="string"&&(l=$n[l]),!l)return!1;var u=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),u=l(e,n)!=Ze}finally{e.state.suppressEdits=!1}return u})}function ld(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};if(i.unit==null){var a=G?n.shiftKey&&n.metaKey:n.altKey;i.unit=a?"rectangle":t=="single"?"char":t=="double"?"word":"line"}return(i.extend==null||e.doc.extend)&&(i.extend=e.doc.extend||n.shiftKey),i.addNew==null&&(i.addNew=O?n.metaKey:n.ctrlKey),i.moveOnDrag==null&&(i.moveOnDrag=!(O?n.altKey:n.ctrlKey)),i}function sd(e,t,n,r){s?setTimeout(Ee(Qa,e),0):e.curOp.focus=R(de(e));var i=ld(e,n,r),a=e.doc.sel,l;e.options.dragDrop&&eo&&!e.isReadOnly()&&n=="single"&&(l=a.contains(t))>-1&&(ye((l=a.ranges[l]).from(),t)<0||t.xRel>0)&&(ye(l.to(),t)>0||t.xRel<0)?ud(e,r,t,i):cd(e,r,t,i)}function ud(e,t,n,r){var i=e.display,a=!1,l=gt(e,function(m){g&&(i.scroller.draggable=!1),e.state.draggingText=!1,e.state.delayingBlurEvent&&(e.hasFocus()?e.state.delayingBlurEvent=!1:wo(e)),_t(i.wrapper.ownerDocument,"mouseup",l),_t(i.wrapper.ownerDocument,"mousemove",u),_t(i.scroller,"dragstart",f),_t(i.scroller,"drop",l),a||(kt(m),r.addNew||_i(e.doc,n,null,null,r.extend),g&&!k||s&&h==9?setTimeout(function(){i.wrapper.ownerDocument.body.focus({preventScroll:!0}),i.input.focus()},20):i.input.focus())}),u=function(m){a=a||Math.abs(t.clientX-m.clientX)+Math.abs(t.clientY-m.clientY)>=10},f=function(){return a=!0};g&&(i.scroller.draggable=!0),e.state.draggingText=l,l.copy=!r.moveOnDrag,Ie(i.wrapper.ownerDocument,"mouseup",l),Ie(i.wrapper.ownerDocument,"mousemove",u),Ie(i.scroller,"dragstart",f),Ie(i.scroller,"drop",l),e.state.delayingBlurEvent=!0,setTimeout(function(){return i.input.focus()},20),i.scroller.dragDrop&&i.scroller.dragDrop()}function Ql(e,t,n){if(n=="char")return new Ye(t,t);if(n=="word")return e.findWordAt(t);if(n=="line")return new Ye(ne(t.line,0),je(e.doc,ne(t.line+1,0)));var r=n(e,t);return new Ye(r.from,r.to)}function cd(e,t,n,r){s&&wo(e);var i=e.display,a=e.doc;kt(t);var l,u,f=a.sel,m=f.ranges;if(r.addNew&&!r.extend?(u=a.sel.contains(n),u>-1?l=m[u]:l=new Ye(n,n)):(l=a.sel.primary(),u=a.sel.primIndex),r.unit=="rectangle")r.addNew||(l=new Ye(n,n)),n=Mr(e,t,!0,!0),u=-1;else{var A=Ql(e,n,r.unit);r.extend?l=No(l,A.anchor,A.head,r.extend):l=A}r.addNew?u==-1?(u=m.length,wt(a,Yt(e,m.concat([l]),u),{scroll:!1,origin:"*mouse"})):m.length>1&&m[u].empty()&&r.unit=="char"&&!r.extend?(wt(a,Yt(e,m.slice(0,u).concat(m.slice(u+1)),0),{scroll:!1,origin:"*mouse"}),f=a.sel):Oo(a,u,l,Je):(u=0,wt(a,new jt([l],0),Je),f=a.sel);var B=n;function ee(be){if(ye(B,be)!=0)if(B=be,r.unit=="rectangle"){for(var Ce=[],Ne=e.options.tabSize,Fe=Oe(Ae(a,n.line).text,n.ch,Ne),$e=Oe(Ae(a,be.line).text,be.ch,Ne),Ve=Math.min(Fe,$e),vt=Math.max(Fe,$e),rt=Math.min(n.line,be.line),Ot=Math.min(e.lastLine(),Math.max(n.line,be.line));rt<=Ot;rt++){var At=Ae(a,rt).text,ut=Ge(At,Ve,Ne);Ve==vt?Ce.push(new Ye(ne(rt,ut),ne(rt,ut))):At.length>ut&&Ce.push(new Ye(ne(rt,ut),ne(rt,Ge(At,vt,Ne))))}Ce.length||Ce.push(new Ye(n,n)),wt(a,Yt(e,f.ranges.slice(0,u).concat(Ce),u),{origin:"*mouse",scroll:!1}),e.scrollIntoView(be)}else{var Dt=l,yt=Ql(e,be,r.unit),ft=Dt.anchor,ct;ye(yt.anchor,ft)>0?(ct=yt.head,ft=Zr(Dt.from(),yt.anchor)):(ct=yt.anchor,ft=Et(Dt.to(),yt.head));var lt=f.ranges.slice(0);lt[u]=fd(e,new Ye(je(a,ft),ct)),wt(a,Yt(e,lt,u),Je)}}var Y=i.wrapper.getBoundingClientRect(),ie=0;function ue(be){var Ce=++ie,Ne=Mr(e,be,!0,r.unit=="rectangle");if(Ne)if(ye(Ne,B)!=0){e.curOp.focus=R(de(e)),ee(Ne);var Fe=gi(i,a);(Ne.line>=Fe.to||Ne.lineY.bottom?20:0;$e&&setTimeout(gt(e,function(){ie==Ce&&(i.scroller.scrollTop+=$e,ue(be))}),50)}}function me(be){e.state.selectingText=!1,ie=1/0,be&&(kt(be),i.input.focus()),_t(i.wrapper.ownerDocument,"mousemove",ve),_t(i.wrapper.ownerDocument,"mouseup",_e),a.history.lastSelOrigin=null}var ve=gt(e,function(be){be.buttons===0||!Ut(be)?me(be):ue(be)}),_e=gt(e,me);e.state.selectingText=_e,Ie(i.wrapper.ownerDocument,"mousemove",ve),Ie(i.wrapper.ownerDocument,"mouseup",_e)}function fd(e,t){var n=t.anchor,r=t.head,i=Ae(e.doc,n.line);if(ye(n,r)==0&&n.sticky==r.sticky)return t;var a=Pe(i);if(!a)return t;var l=Pt(a,n.ch,n.sticky),u=a[l];if(u.from!=n.ch&&u.to!=n.ch)return t;var f=l+(u.from==n.ch==(u.level!=1)?0:1);if(f==0||f==a.length)return t;var m;if(r.line!=n.line)m=(r.line-n.line)*(e.doc.direction=="ltr"?1:-1)>0;else{var A=Pt(a,r.ch,r.sticky),B=A-l||(r.ch-n.ch)*(u.level==1?-1:1);A==f-1||A==f?m=B<0:m=B>0}var ee=a[f+(m?-1:0)],Y=m==(ee.level==1),ie=Y?ee.from:ee.to,ue=Y?"after":"before";return n.ch==ie&&n.sticky==ue?t:new Ye(new ne(n.line,ie,ue),r)}function Vl(e,t,n,r){var i,a;if(t.touches)i=t.touches[0].clientX,a=t.touches[0].clientY;else try{i=t.clientX,a=t.clientY}catch{return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&kt(t);var l=e.display,u=l.lineDiv.getBoundingClientRect();if(a>u.bottom||!It(e,n))return Ct(t);a-=u.top-l.viewOffset;for(var f=0;f=i){var A=P(e.doc,a),B=e.display.gutterSpecs[f];return it(e,n,e,A,B.className,t),Ct(t)}}}function Wo(e,t){return Vl(e,t,"gutterClick",!0)}function Jl(e,t){lr(e.display,t)||dd(e,t)||ot(e,t,"contextmenu")||I||e.display.input.onContextMenu(t)}function dd(e,t){return It(e,"gutterContextMenu")?Vl(e,t,"gutterContextMenu",!1):!1}function es(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),En(e)}var fn={toString:function(){return"CodeMirror.Init"}},ts={},Ei={};function pd(e){var t=e.optionHandlers;function n(r,i,a,l){e.defaults[r]=i,a&&(t[r]=l?function(u,f,m){m!=fn&&a(u,f,m)}:a)}e.defineOption=n,e.Init=fn,n("value","",function(r,i){return r.setValue(i)},!0),n("mode",null,function(r,i){r.doc.modeOption=i,qo(r)},!0),n("indentUnit",2,qo,!0),n("indentWithTabs",!1),n("smartIndent",!0),n("tabSize",4,function(r){Nn(r),En(r),zt(r)},!0),n("lineSeparator",null,function(r,i){if(r.doc.lineSep=i,!!i){var a=[],l=r.doc.first;r.doc.iter(function(f){for(var m=0;;){var A=f.text.indexOf(i,m);if(A==-1)break;m=A+i.length,a.push(ne(l,A))}l++});for(var u=a.length-1;u>=0;u--)ln(r.doc,i,a[u],ne(a[u].line,a[u].ch+i.length))}}),n("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g,function(r,i,a){r.state.specialChars=new RegExp(i.source+(i.test(" ")?"":"| "),"g"),a!=fn&&r.refresh()}),n("specialCharPlaceholder",Rc,function(r){return r.refresh()},!0),n("electricChars",!0),n("inputStyle",E?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),n("spellcheck",!1,function(r,i){return r.getInputField().spellcheck=i},!0),n("autocorrect",!1,function(r,i){return r.getInputField().autocorrect=i},!0),n("autocapitalize",!1,function(r,i){return r.getInputField().autocapitalize=i},!0),n("rtlMoveVisually",!J),n("wholeLineUpdateBefore",!0),n("theme","default",function(r){es(r),In(r)},!0),n("keyMap","default",function(r,i,a){var l=Li(i),u=a!=fn&&Li(a);u&&u.detach&&u.detach(r,l),l.attach&&l.attach(r,u||null)}),n("extraKeys",null),n("configureMouse",null),n("lineWrapping",!1,gd,!0),n("gutters",[],function(r,i){r.display.gutterSpecs=Ao(i,r.options.lineNumbers),In(r)},!0),n("fixedGutter",!0,function(r,i){r.display.gutters.style.left=i?yo(r.display)+"px":"0",r.refresh()},!0),n("coverGutterNextToScrollbar",!1,function(r){return rn(r)},!0),n("scrollbarStyle","native",function(r){nl(r),rn(r),r.display.scrollbars.setScrollTop(r.doc.scrollTop),r.display.scrollbars.setScrollLeft(r.doc.scrollLeft)},!0),n("lineNumbers",!1,function(r,i){r.display.gutterSpecs=Ao(r.options.gutters,i),In(r)},!0),n("firstLineNumber",1,In,!0),n("lineNumberFormatter",function(r){return r},In,!0),n("showCursorWhenSelecting",!1,zn,!0),n("resetSelectionOnContextMenu",!0),n("lineWiseCopyCut",!0),n("pasteLinesPerSelection",!0),n("selectionsMayTouch",!1),n("readOnly",!1,function(r,i){i=="nocursor"&&(en(r),r.display.input.blur()),r.display.input.readOnlyChanged(i)}),n("screenReaderLabel",null,function(r,i){i=i===""?null:i,r.display.input.screenReaderLabelChanged(i)}),n("disableInput",!1,function(r,i){i||r.display.input.reset()},!0),n("dragDrop",!0,hd),n("allowDropFileTypes",null),n("cursorBlinkRate",530),n("cursorScrollMargin",0),n("cursorHeight",1,zn,!0),n("singleCursorHeightPerLine",!0,zn,!0),n("workTime",100),n("workDelay",100),n("flattenSpans",!0,Nn,!0),n("addModeClass",!1,Nn,!0),n("pollInterval",100),n("undoDepth",200,function(r,i){return r.doc.history.undoDepth=i}),n("historyEventDelay",1250),n("viewportMargin",10,function(r){return r.refresh()},!0),n("maxHighlightLength",1e4,Nn,!0),n("moveInputWithCursor",!0,function(r,i){i||r.display.input.resetPosition()}),n("tabindex",null,function(r,i){return r.display.input.getField().tabIndex=i||""}),n("autofocus",null),n("direction","ltr",function(r,i){return r.doc.setDirection(i)},!0),n("phrases",null)}function hd(e,t,n){var r=n&&n!=fn;if(!t!=!r){var i=e.display.dragFunctions,a=t?Ie:_t;a(e.display.scroller,"dragstart",i.start),a(e.display.scroller,"dragenter",i.enter),a(e.display.scroller,"dragover",i.over),a(e.display.scroller,"dragleave",i.leave),a(e.display.scroller,"drop",i.drop)}}function gd(e){e.options.lineWrapping?(le(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(Q(e.display.wrapper,"CodeMirror-wrap"),so(e)),xo(e),zt(e),En(e),setTimeout(function(){return rn(e)},100)}function tt(e,t){var n=this;if(!(this instanceof tt))return new tt(e,t);this.options=t=t?ge(t):{},ge(ts,t,!1);var r=t.value;typeof r=="string"?r=new Mt(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new tt.inputStyles[t.inputStyle](this),a=this.display=new Ef(e,r,i,t);a.wrapper.CodeMirror=this,es(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),nl(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new qe,keySeq:null,specialChars:null},t.autofocus&&!E&&a.input.focus(),s&&h<11&&setTimeout(function(){return n.display.input.reset(!0)},20),md(this),Gf(),Fr(this),this.curOp.forceUpdate=!0,pl(this,r),t.autofocus&&!E||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&So(n)},20):en(this);for(var l in Ei)Ei.hasOwnProperty(l)&&Ei[l](this,t[l],fn);al(this),t.finishInit&&t.finishInit(this);for(var u=0;u400}Ie(t.scroller,"touchstart",function(f){if(!ot(e,f)&&!a(f)&&!Wo(e,f)){t.input.ensurePolled(),clearTimeout(n);var m=+new Date;t.activeTouch={start:m,moved:!1,prev:m-r.end<=300?r:null},f.touches.length==1&&(t.activeTouch.left=f.touches[0].pageX,t.activeTouch.top=f.touches[0].pageY)}}),Ie(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Ie(t.scroller,"touchend",function(f){var m=t.activeTouch;if(m&&!lr(t,f)&&m.left!=null&&!m.moved&&new Date-m.start<300){var A=e.coordsChar(t.activeTouch,"page"),B;!m.prev||l(m,m.prev)?B=new Ye(A,A):!m.prev.prev||l(m,m.prev.prev)?B=e.findWordAt(A):B=new Ye(ne(A.line,0),je(e.doc,ne(A.line+1,0))),e.setSelection(B.anchor,B.head),e.focus(),kt(f)}i()}),Ie(t.scroller,"touchcancel",i),Ie(t.scroller,"scroll",function(){t.scroller.clientHeight&&(An(e,t.scroller.scrollTop),Dr(e,t.scroller.scrollLeft,!0),it(e,"scroll",e))}),Ie(t.scroller,"mousewheel",function(f){return ul(e,f)}),Ie(t.scroller,"DOMMouseScroll",function(f){return ul(e,f)}),Ie(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(f){ot(e,f)||dr(f)},over:function(f){ot(e,f)||(Kf(e,f),dr(f))},start:function(f){return $f(e,f)},drop:gt(e,Uf),leave:function(f){ot(e,f)||Ol(e)}};var u=t.input.getField();Ie(u,"keyup",function(f){return Zl.call(e,f)}),Ie(u,"keydown",gt(e,Gl)),Ie(u,"keypress",gt(e,Xl)),Ie(u,"focus",function(f){return So(e,f)}),Ie(u,"blur",function(f){return en(e,f)})}var Uo=[];tt.defineInitHook=function(e){return Uo.push(e)};function Xn(e,t,n,r){var i=e.doc,a;n==null&&(n="add"),n=="smart"&&(i.mode.indent?a=wn(e,t).state:n="prev");var l=e.options.tabSize,u=Ae(i,t),f=Oe(u.text,null,l);u.stateAfter&&(u.stateAfter=null);var m=u.text.match(/^\s*/)[0],A;if(!r&&!/\S/.test(u.text))A=0,n="not";else if(n=="smart"&&(A=i.mode.indent(a,u.text.slice(m.length),u.text),A==Ze||A>150)){if(!r)return;n="prev"}n=="prev"?t>i.first?A=Oe(Ae(i,t-1).text,null,l):A=0:n=="add"?A=f+e.options.indentUnit:n=="subtract"?A=f-e.options.indentUnit:typeof n=="number"&&(A=f+n),A=Math.max(0,A);var B="",ee=0;if(e.options.indentWithTabs)for(var Y=Math.floor(A/l);Y;--Y)ee+=l,B+=" ";if(eel,f=Ht(t),m=null;if(u&&r.ranges.length>1)if(Qt&&Qt.text.join(` `)==t){if(r.ranges.length%Qt.text.length==0){m=[];for(var A=0;A=0;ee--){var Y=r.ranges[ee],ie=Y.from(),ue=Y.to();Y.empty()&&(n&&n>0?ie=ne(ie.line,ie.ch-n):e.state.overwrite&&!u?ue=ne(ue.line,Math.min(Ae(a,ue.line).text.length,ue.ch+ce(f).length)):u&&Qt&&Qt.lineWise&&Qt.text.join(` `)==f.join(` `)&&(ie=ue=ne(ie.line,0)));var me={from:ie,to:ue,text:m?m[ee%m.length]:f,origin:i||(u?"paste":e.state.cutIncoming>l?"cut":"+input")};an(e.doc,me),ht(e,"inputRead",e,me)}t&&!u&&ns(e,t),tn(e),e.curOp.updateInput<2&&(e.curOp.updateInput=B),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function rs(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),!t.isReadOnly()&&!t.options.disableInput&&t.hasFocus()&&Nt(t,function(){return $o(t,n,0,null,"paste")}),!0}function ns(e,t){if(!(!e.options.electricChars||!e.options.smartIndent))for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var a=e.getModeAt(i.head),l=!1;if(a.electricChars){for(var u=0;u-1){l=Xn(e,i.head.line,"smart");break}}else a.electricInput&&a.electricInput.test(Ae(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Xn(e,i.head.line,"smart"));l&&ht(e,"electricInput",e,i.head.line)}}}function is(e){for(var t=[],n=[],r=0;ra&&(Xn(this,u.head.line,r,!0),a=u.head.line,l==this.doc.sel.primIndex&&tn(this));else{var f=u.from(),m=u.to(),A=Math.max(a,f.line);a=Math.min(this.lastLine(),m.line-(m.ch?0:1))+1;for(var B=A;B0&&Oo(this.doc,l,new Ye(f,ee[l].to()),ke)}}}),getTokenAt:function(r,i){return ga(this,r,i)},getLineTokens:function(r,i){return ga(this,ne(r),i,!0)},getTokenTypeAt:function(r){r=je(this.doc,r);var i=da(this,Ae(this.doc,r.line)),a=0,l=(i.length-1)/2,u=r.ch,f;if(u==0)f=i[2];else for(;;){var m=a+l>>1;if((m?i[m*2-1]:0)>=u)l=m;else if(i[m*2+1]f&&(r=f,l=!0),u=Ae(this.doc,r)}else u=r;return ci(this,u,{top:0,left:0},i||"page",a||l).top+(l?this.doc.height-ar(u):0)},defaultTextHeight:function(){return Vr(this.display)},defaultCharWidth:function(){return Jr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(r,i,a,l,u){var f=this.display;r=Xt(this,je(this.doc,r));var m=r.bottom,A=r.left;if(i.style.position="absolute",i.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(i),f.sizer.appendChild(i),l=="over")m=r.top;else if(l=="above"||l=="near"){var B=Math.max(f.wrapper.clientHeight,this.doc.height),ee=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);(l=="above"||r.bottom+i.offsetHeight>B)&&r.top>i.offsetHeight?m=r.top-i.offsetHeight:r.bottom+i.offsetHeight<=B&&(m=r.bottom),A+i.offsetWidth>ee&&(A=ee-i.offsetWidth)}i.style.top=m+"px",i.style.left=i.style.right="",u=="right"?(A=f.sizer.clientWidth-i.offsetWidth,i.style.right="0px"):(u=="left"?A=0:u=="middle"&&(A=(f.sizer.clientWidth-i.offsetWidth)/2),i.style.left=A+"px"),a&&hf(this,{left:A,top:m,right:A+i.offsetWidth,bottom:m+i.offsetHeight})},triggerOnKeyDown:Tt(Gl),triggerOnKeyPress:Tt(Xl),triggerOnKeyUp:Zl,triggerOnMouseDown:Tt(Yl),execCommand:function(r){if($n.hasOwnProperty(r))return $n[r].call(null,this)},triggerElectric:Tt(function(r){ns(this,r)}),findPosH:function(r,i,a,l){var u=1;i<0&&(u=-1,i=-i);for(var f=je(this.doc,r),m=0;m0&&A(a.charAt(l-1));)--l;for(;u.5||this.options.lineWrapping)&&xo(this),it(this,"refresh",this)}),swapDoc:Tt(function(r){var i=this.doc;return i.cm=null,this.state.selectingText&&this.state.selectingText(),pl(this,r),En(this),this.display.input.reset(),Mn(this,r.scrollLeft,r.scrollTop),this.curOp.forceScroll=!0,ht(this,"swapDoc",this,i),i}),phrase:function(r){var i=this.options.phrases;return i&&Object.prototype.hasOwnProperty.call(i,r)?i[r]:r},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Wt(e),e.registerHelper=function(r,i,a){n.hasOwnProperty(r)||(n[r]=e[r]={_global:[]}),n[r][i]=a},e.registerGlobalHelper=function(r,i,a,l){e.registerHelper(r,i,l),n[r]._global.push({pred:a,val:l})}}function Go(e,t,n,r,i){var a=t,l=n,u=Ae(e,t.line),f=i&&e.direction=="rtl"?-n:n;function m(){var _e=t.line+f;return _e=e.first+e.size?!1:(t=new ne(_e,t.ch,t.sticky),u=Ae(e,_e))}function A(_e){var be;if(r=="codepoint"){var Ce=u.text.charCodeAt(t.ch+(n>0?0:-1));if(isNaN(Ce))be=null;else{var Ne=n>0?Ce>=55296&&Ce<56320:Ce>=56320&&Ce<57343;be=new ne(t.line,Math.max(0,Math.min(u.text.length,t.ch+n*(Ne?2:1))),-n)}}else i?be=Vf(e.cm,u,t,n):be=Bo(u,t,n);if(be==null)if(!_e&&m())t=jo(i,e.cm,u,t.line,f);else return!1;else t=be;return!0}if(r=="char"||r=="codepoint")A();else if(r=="column")A(!0);else if(r=="word"||r=="group")for(var B=null,ee=r=="group",Y=e.cm&&e.cm.getHelper(t,"wordChars"),ie=!0;!(n<0&&!A(!ie));ie=!1){var ue=u.text.charAt(t.ch)||` `,me=Me(ue,Y)?"w":ee&&ue==` `?"n":!ee||/\s/.test(ue)?null:"p";if(ee&&!ie&&!me&&(me="s"),B&&B!=me){n<0&&(n=1,A(),t.sticky="after");break}if(me&&(B=me),n>0&&!A(!ie))break}var ve=wi(e,t,a,l,!0);return Xe(a,ve)&&(ve.hitSide=!0),ve}function as(e,t,n,r){var i=e.doc,a=t.left,l;if(r=="page"){var u=Math.min(e.display.wrapper.clientHeight,pe(e).innerHeight||i(e).documentElement.clientHeight),f=Math.max(u-.5*Vr(e.display),3);l=(n>0?t.bottom:t.top)+n*f}else r=="line"&&(l=n>0?t.bottom+3:t.top-3);for(var m;m=mo(e,a,l),!!m.outside;){if(n<0?l<=0:l>=i.height){m.hitSide=!0;break}l+=n*5}return m}var Qe=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new qe,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};Qe.prototype.init=function(e){var t=this,n=this,r=n.cm,i=n.div=e.lineDiv;i.contentEditable=!0,Ko(i,r.options.spellcheck,r.options.autocorrect,r.options.autocapitalize);function a(u){for(var f=u.target;f;f=f.parentNode){if(f==i)return!0;if(/\bCodeMirror-(?:line)?widget\b/.test(f.className))break}return!1}Ie(i,"paste",function(u){!a(u)||ot(r,u)||rs(u,r)||h<=11&&setTimeout(gt(r,function(){return t.updateFromDOM()}),20)}),Ie(i,"compositionstart",function(u){t.composing={data:u.data,done:!1}}),Ie(i,"compositionupdate",function(u){t.composing||(t.composing={data:u.data,done:!1})}),Ie(i,"compositionend",function(u){t.composing&&(u.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Ie(i,"touchstart",function(){return n.forceCompositionEnd()}),Ie(i,"input",function(){t.composing||t.readFromDOMSoon()});function l(u){if(!(!a(u)||ot(r,u))){if(r.somethingSelected())zi({lineWise:!1,text:r.getSelections()}),u.type=="cut"&&r.replaceSelection("",null,"cut");else if(r.options.lineWiseCopyCut){var f=is(r);zi({lineWise:!0,text:f.text}),u.type=="cut"&&r.operation(function(){r.setSelections(f.ranges,0,ke),r.replaceSelection("",null,"cut")})}else return;if(u.clipboardData){u.clipboardData.clearData();var m=Qt.text.join(` `);if(u.clipboardData.setData("Text",m),u.clipboardData.getData("Text")==m){u.preventDefault();return}}var A=os(),B=A.firstChild;Ko(B),r.display.lineSpace.insertBefore(A,r.display.lineSpace.firstChild),B.value=Qt.text.join(` `);var ee=R(ze(i));F(B),setTimeout(function(){r.display.lineSpace.removeChild(A),ee.focus(),ee==i&&n.showPrimarySelection()},50)}}Ie(i,"copy",l),Ie(i,"cut",l)},Qe.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Qe.prototype.prepareSelection=function(){var e=Ya(this.cm,!1);return e.focus=R(ze(this.div))==this.div,e},Qe.prototype.showSelection=function(e,t){!e||!this.cm.display.view.length||((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Qe.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Qe.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line=t.display.viewFrom&&ls(t,r)||{node:u[0].measure.map[2],offset:0},m=i.linee.firstLine()&&(r=ne(r.line-1,Ae(e.doc,r.line-1).length)),i.ch==Ae(e.doc,i.line).text.length&&i.linet.viewTo-1)return!1;var a,l,u;r.line==t.viewFrom||(a=Ar(e,r.line))==0?(l=x(t.view[0].line),u=t.view[0].node):(l=x(t.view[a].line),u=t.view[a-1].node.nextSibling);var f=Ar(e,i.line),m,A;if(f==t.view.length-1?(m=t.viewTo-1,A=t.lineDiv.lastChild):(m=x(t.view[f+1].line)-1,A=t.view[f+1].node.previousSibling),!u)return!1;for(var B=e.doc.splitLines(yd(e,u,A,l,m)),ee=ir(e.doc,ne(l,0),ne(m,Ae(e.doc,m).text.length));B.length>1&&ee.length>1;)if(ce(B)==ce(ee))B.pop(),ee.pop(),m--;else if(B[0]==ee[0])B.shift(),ee.shift(),l++;else break;for(var Y=0,ie=0,ue=B[0],me=ee[0],ve=Math.min(ue.length,me.length);Yr.ch&&_e.charCodeAt(_e.length-ie-1)==be.charCodeAt(be.length-ie-1);)Y--,ie++;B[B.length-1]=_e.slice(0,_e.length-ie).replace(/^\u200b+/,""),B[0]=B[0].slice(Y).replace(/\u200b+$/,"");var Ne=ne(l,Y),Fe=ne(m,ee.length?ce(ee).length-ie:0);if(B.length>1||B[0]||ye(Ne,Fe))return ln(e.doc,B,Ne,Fe,"+input"),!0},Qe.prototype.ensurePolled=function(){this.forceCompositionEnd()},Qe.prototype.reset=function(){this.forceCompositionEnd()},Qe.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Qe.prototype.readFromDOMSoon=function(){var e=this;this.readDOMTimeout==null&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing)if(e.composing.done)e.composing=null;else return;e.updateFromDOM()},80))},Qe.prototype.updateFromDOM=function(){var e=this;(this.cm.isReadOnly()||!this.pollContent())&&Nt(this.cm,function(){return zt(e.cm)})},Qe.prototype.setUneditable=function(e){e.contentEditable="false"},Qe.prototype.onKeyPress=function(e){e.charCode==0||this.composing||(e.preventDefault(),this.cm.isReadOnly()||gt(this.cm,$o)(this.cm,String.fromCharCode(e.charCode==null?e.keyCode:e.charCode),0))},Qe.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(e!="nocursor")},Qe.prototype.onContextMenu=function(){},Qe.prototype.resetPosition=function(){},Qe.prototype.needsContentAttribute=!0;function ls(e,t){var n=po(e,t.line);if(!n||n.hidden)return null;var r=Ae(e.doc,t.line),i=Na(n,r,t.line),a=Pe(r,e.doc.direction),l="left";if(a){var u=Pt(a,t.ch);l=u%2?"right":"left"}var f=Ba(i.map,t.ch,l);return f.offset=f.collapse=="right"?f.end:f.start,f}function bd(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}function dn(e,t){return t&&(e.bad=!0),e}function yd(e,t,n,r,i){var a="",l=!1,u=e.doc.lineSeparator(),f=!1;function m(Y){return function(ie){return ie.id==Y}}function A(){l&&(a+=u,f&&(a+=u),l=f=!1)}function B(Y){Y&&(A(),a+=Y)}function ee(Y){if(Y.nodeType==1){var ie=Y.getAttribute("cm-text");if(ie){B(ie);return}var ue=Y.getAttribute("cm-marker"),me;if(ue){var ve=e.findMarks(ne(r,0),ne(i+1,0),m(+ue));ve.length&&(me=ve[0].find(0))&&B(ir(e.doc,me.from,me.to).join(u));return}if(Y.getAttribute("contenteditable")=="false")return;var _e=/^(pre|div|p|li|table|br)$/i.test(Y.nodeName);if(!/^br$/i.test(Y.nodeName)&&Y.textContent.length==0)return;_e&&A();for(var be=0;be=9&&t.hasSelection&&(t.hasSelection=null),n.poll()}),Ie(i,"paste",function(l){ot(r,l)||rs(l,r)||(r.state.pasteIncoming=+new Date,n.fastPoll())});function a(l){if(!ot(r,l)){if(r.somethingSelected())zi({lineWise:!1,text:r.getSelections()});else if(r.options.lineWiseCopyCut){var u=is(r);zi({lineWise:!0,text:u.text}),l.type=="cut"?r.setSelections(u.ranges,null,ke):(n.prevInput="",i.value=u.text.join(` `),F(i))}else return;l.type=="cut"&&(r.state.cutIncoming=+new Date)}}Ie(i,"cut",a),Ie(i,"copy",a),Ie(e.scroller,"paste",function(l){if(!(lr(e,l)||ot(r,l))){if(!i.dispatchEvent){r.state.pasteIncoming=+new Date,n.focus();return}var u=new Event("paste");u.clipboardData=l.clipboardData,i.dispatchEvent(u)}}),Ie(e.lineSpace,"selectstart",function(l){lr(e,l)||kt(l)}),Ie(i,"compositionstart",function(){var l=r.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:l,range:r.markText(l,r.getCursor("to"),{className:"CodeMirror-composing"})}}),Ie(i,"compositionend",function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)})},st.prototype.createField=function(e){this.wrapper=os(),this.textarea=this.wrapper.firstChild;var t=this.cm.options;Ko(this.textarea,t.spellcheck,t.autocorrect,t.autocapitalize)},st.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},st.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,r=Ya(e);if(e.options.moveInputWithCursor){var i=Xt(e,n.sel.primary().head,"div"),a=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-a.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-a.left))}return r},st.prototype.showSelection=function(e){var t=this.cm,n=t.display;V(n.cursorDiv,e.cursors),V(n.selectionDiv,e.selection),e.teTop!=null&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},st.prototype.reset=function(e){if(!(this.contextMenuPending||this.composing&&e)){var t=this.cm;if(this.resetting=!0,t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&F(this.textarea),s&&h>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",s&&h>=9&&(this.hasSelection=null));this.resetting=!1}},st.prototype.getField=function(){return this.textarea},st.prototype.supportsTouch=function(){return!1},st.prototype.focus=function(){if(this.cm.options.readOnly!="nocursor"&&(!E||R(ze(this.textarea))!=this.textarea))try{this.textarea.focus()}catch{}},st.prototype.blur=function(){this.textarea.blur()},st.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},st.prototype.receivedFocus=function(){this.slowPoll()},st.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},st.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0;function n(){var r=t.poll();!r&&!e?(e=!0,t.polling.set(60,n)):(t.pollingFast=!1,t.slowPoll())}t.polling.set(20,n)},st.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||this.resetting||!t.state.focused||hr(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(s&&h>=9&&this.hasSelection===i||O&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var a=i.charCodeAt(0);if(a==8203&&!r&&(r="\u200B"),a==8666)return this.reset(),this.cm.execCommand("undo")}for(var l=0,u=Math.min(r.length,i.length);l1e3||i.indexOf(` `)>-1?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},st.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},st.prototype.onKeyPress=function(){s&&h>=9&&(this.hasSelection=null),this.fastPoll()},st.prototype.onContextMenu=function(e){var t=this,n=t.cm,r=n.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var a=Mr(n,e),l=r.scroller.scrollTop;if(!a||d)return;var u=n.options.resetSelectionOnContextMenu;u&&n.doc.sel.contains(a)==-1&>(n,wt)(n.doc,yr(a),ke);var f=i.style.cssText,m=t.wrapper.style.cssText,A=t.wrapper.offsetParent.getBoundingClientRect();t.wrapper.style.cssText="position: static",i.style.cssText=`position: absolute; width: 30px; height: 30px; top: `+(e.clientY-A.top-5)+"px; left: "+(e.clientX-A.left-5)+`px; z-index: 1000; background: `+(s?"rgba(255, 255, 255, .05)":"transparent")+`; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`;var B;g&&(B=i.ownerDocument.defaultView.scrollY),r.input.focus(),g&&i.ownerDocument.defaultView.scrollTo(null,B),r.input.reset(),n.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=Y,r.selForContextMenu=n.doc.sel,clearTimeout(r.detectingSelectAll);function ee(){if(i.selectionStart!=null){var ue=n.somethingSelected(),me="\u200B"+(ue?i.value:"");i.value="\u21DA",i.value=me,t.prevInput=ue?"":"\u200B",i.selectionStart=1,i.selectionEnd=me.length,r.selForContextMenu=n.doc.sel}}function Y(){if(t.contextMenuPending==Y&&(t.contextMenuPending=!1,t.wrapper.style.cssText=m,i.style.cssText=f,s&&h<9&&r.scrollbars.setScrollTop(r.scroller.scrollTop=l),i.selectionStart!=null)){(!s||s&&h<9)&&ee();var ue=0,me=function(){r.selForContextMenu==n.doc.sel&&i.selectionStart==0&&i.selectionEnd>0&&t.prevInput=="\u200B"?gt(n,Ll)(n):ue++<10?r.detectingSelectAll=setTimeout(me,500):(r.selForContextMenu=null,r.input.reset())};r.detectingSelectAll=setTimeout(me,200)}}if(s&&h>=9&&ee(),I){dr(e);var ie=function(){_t(window,"mouseup",ie),setTimeout(Y,20)};Ie(window,"mouseup",ie)}else setTimeout(Y,50)},st.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=e=="nocursor",this.textarea.readOnly=!!e},st.prototype.setUneditable=function(){},st.prototype.needsContentAttribute=!1;function _d(e,t){if(t=t?ge(t):{},t.value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),t.autofocus==null){var n=R(ze(e));t.autofocus=n==e||e.getAttribute("autofocus")!=null&&n==document.body}function r(){e.value=u.getValue()}var i;if(e.form&&(Ie(e.form,"submit",r),!t.leaveSubmitMethodAlone)){var a=e.form;i=a.submit;try{var l=a.submit=function(){r(),a.submit=i,a.submit(),a.submit=l}}catch{}}t.finishInit=function(f){f.save=r,f.getTextArea=function(){return e},f.toTextArea=function(){f.toTextArea=isNaN,r(),e.parentNode.removeChild(f.getWrapperElement()),e.style.display="",e.form&&(_t(e.form,"submit",r),!t.leaveSubmitMethodAlone&&typeof e.form.submit=="function"&&(e.form.submit=i))}},e.style.display="none";var u=tt(function(f){return e.parentNode.insertBefore(f,e.nextSibling)},t);return u}function kd(e){e.off=_t,e.on=Ie,e.wheelEventPixels=zf,e.Doc=Mt,e.splitLines=Ht,e.countColumn=Oe,e.findColumn=Ge,e.isWordChar=we,e.Pass=Ze,e.signal=it,e.Line=Xr,e.changeEnd=xr,e.scrollbarModel=rl,e.Pos=ne,e.cmpPos=ye,e.modes=Wr,e.mimeModes=Kt,e.resolveMode=Ur,e.getMode=$r,e.modeExtensions=gr,e.extendMode=Kr,e.copyState=Vt,e.startState=Gr,e.innerMode=_n,e.commands=$n,e.keyMap=ur,e.keyName=Hl,e.isModifierKey=jl,e.lookupKey=un,e.normalizeKeyMap=Qf,e.StringStream=at,e.SharedTextMarker=Hn,e.TextMarker=kr,e.LineWidget=Rn,e.e_preventDefault=kt,e.e_stopPropagation=Rr,e.e_stop=dr,e.addClass=le,e.contains=N,e.rmClass=Q,e.keyNames=wr}pd(tt),vd(tt);var wd="iter insert remove copy getEditor constructor".split(" ");for(var Ai in Mt.prototype)Mt.prototype.hasOwnProperty(Ai)&&Se(wd,Ai)<0&&(tt.prototype[Ai]=(function(e){return function(){return e.apply(this.doc,arguments)}})(Mt.prototype[Ai]));return Wt(Mt),tt.inputStyles={textarea:st,contenteditable:Qe},tt.defineMode=function(e){!tt.defaults.mode&&e!="null"&&(tt.defaults.mode=e),Gt.apply(this,arguments)},tt.defineMIME=Cr,tt.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),tt.defineMIME("text/plain","null"),tt.defineExtension=function(e,t){tt.prototype[e]=t},tt.defineDocExtension=function(e,t){Mt.prototype[e]=t},tt.fromTextArea=_d,kd(tt),tt.version="5.65.20",tt}))});var Yn=Ke((us,cs)=>{(function(o){typeof us=="object"&&typeof cs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.overlayMode=function(p,v,C){return{startState:function(){return{base:o.startState(p),overlay:o.startState(v),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(b){return{base:o.copyState(p,b.base),overlay:o.copyState(v,b.overlay),basePos:b.basePos,baseCur:null,overlayPos:b.overlayPos,overlayCur:null}},token:function(b,S){return(b!=S.streamSeen||Math.min(S.basePos,S.overlayPos){(function(o){typeof fs=="object"&&typeof ds=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p=/^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,v=/^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,C=/[*+-]\s/;o.commands.newlineAndIndentContinueMarkdownList=function(S){if(S.getOption("disableInput"))return o.Pass;for(var s=S.listSelections(),h=[],g=0;g\s*$/.test(z),E=!/>\s*$/.test(z);(W||E)&&S.replaceRange("",{line:T.line,ch:0},{line:T.line,ch:T.ch+1}),h[g]=` `}else{var O=M[1],G=M[5],J=!(C.test(M[2])||M[2].indexOf(">")>=0),re=J?parseInt(M[3],10)+1+M[4]:M[2].replace("x"," ");h[g]=` `+O+re+G,J&&b(S,T)}}S.replaceSelections(h)};function b(S,s){var h=s.line,g=0,T=0,w=p.exec(S.getLine(h)),c=w[1];do{g+=1;var d=h+g,k=S.getLine(d),z=p.exec(k);if(z){var M=z[1],_=parseInt(w[3],10)+g-T,W=parseInt(z[3],10),E=W;if(c===M&&!isNaN(W))_===W&&(E=W+1),_>W&&(E=_+1),S.replaceRange(k.replace(p,M+E+z[4]+z[5]),{line:d,ch:0},{line:d,ch:k.length});else{if(c.length>M.length||c.length{(function(o){typeof hs=="object"&&typeof gs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){o.defineOption("placeholder","",function(h,g,T){var w=T&&T!=o.Init;if(g&&!w)h.on("blur",b),h.on("change",S),h.on("swapDoc",S),o.on(h.getInputField(),"compositionupdate",h.state.placeholderCompose=function(){C(h)}),S(h);else if(!g&&w){h.off("blur",b),h.off("change",S),h.off("swapDoc",S),o.off(h.getInputField(),"compositionupdate",h.state.placeholderCompose),p(h);var c=h.getWrapperElement();c.className=c.className.replace(" CodeMirror-empty","")}g&&!h.hasFocus()&&b(h)});function p(h){h.state.placeholder&&(h.state.placeholder.parentNode.removeChild(h.state.placeholder),h.state.placeholder=null)}function v(h){p(h);var g=h.state.placeholder=document.createElement("pre");g.style.cssText="height: 0; overflow: visible",g.style.direction=h.getOption("direction"),g.className="CodeMirror-placeholder CodeMirror-line-like";var T=h.getOption("placeholder");typeof T=="string"&&(T=document.createTextNode(T)),g.appendChild(T),h.display.lineSpace.insertBefore(g,h.display.lineSpace.firstChild)}function C(h){setTimeout(function(){var g=!1;if(h.lineCount()==1){var T=h.getInputField();g=T.nodeName=="TEXTAREA"?!h.getLine(0).length:!/[^\u200b]/.test(T.querySelector(".CodeMirror-line").textContent)}g?v(h):p(h)},20)}function b(h){s(h)&&v(h)}function S(h){var g=h.getWrapperElement(),T=s(h);g.className=g.className.replace(" CodeMirror-empty","")+(T?" CodeMirror-empty":""),T?v(h):p(h)}function s(h){return h.lineCount()===1&&h.getLine(0)===""}})});var ys=Ke((vs,bs)=>{(function(o){typeof vs=="object"&&typeof bs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineOption("styleSelectedText",!1,function(w,c,d){var k=d&&d!=o.Init;c&&!k?(w.state.markedSelection=[],w.state.markedSelectionStyle=typeof c=="string"?c:"CodeMirror-selectedtext",g(w),w.on("cursorActivity",p),w.on("change",v)):!c&&k&&(w.off("cursorActivity",p),w.off("change",v),h(w),w.state.markedSelection=w.state.markedSelectionStyle=null)});function p(w){w.state.markedSelection&&w.operation(function(){T(w)})}function v(w){w.state.markedSelection&&w.state.markedSelection.length&&w.operation(function(){h(w)})}var C=8,b=o.Pos,S=o.cmpPos;function s(w,c,d,k){if(S(c,d)!=0)for(var z=w.state.markedSelection,M=w.state.markedSelectionStyle,_=c.line;;){var W=_==c.line?c:b(_,0),E=_+C,O=E>=d.line,G=O?d:b(E,0),J=w.markText(W,G,{className:M});if(k==null?z.push(J):z.splice(k++,0,J),O)break;_=E}}function h(w){for(var c=w.state.markedSelection,d=0;d1)return g(w);var c=w.getCursor("start"),d=w.getCursor("end"),k=w.state.markedSelection;if(!k.length)return s(w,c,d);var z=k[0].find(),M=k[k.length-1].find();if(!z||!M||d.line-c.line<=C||S(c,M.to)>=0||S(d,z.from)<=0)return g(w);for(;S(c,z.from)>0;)k.shift().clear(),z=k[0].find();for(S(c,z.from)<0&&(z.to.line-c.line0&&(d.line-M.from.line{(function(o){typeof xs=="object"&&typeof _s=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p=o.Pos;function v(_){var W=_.flags;return W??(_.ignoreCase?"i":"")+(_.global?"g":"")+(_.multiline?"m":"")}function C(_,W){for(var E=v(_),O=E,G=0;Gre);q++){var I=_.getLine(J++);O=O==null?I:O+` `+I}G=G*2,W.lastIndex=E.ch;var D=W.exec(O);if(D){var Q=O.slice(0,D.index).split(` `),j=D[0].split(` `),V=E.line+Q.length-1,y=Q[Q.length-1].length;return{from:p(V,y),to:p(V+j.length-1,j.length==1?y+j[0].length:j[j.length-1].length),match:D}}}}function h(_,W,E){for(var O,G=0;G<=_.length;){W.lastIndex=G;var J=W.exec(_);if(!J)break;var re=J.index+J[0].length;if(re>_.length-E)break;(!O||re>O.index+O[0].length)&&(O=J),G=J.index+1}return O}function g(_,W,E){W=C(W,"g");for(var O=E.line,G=E.ch,J=_.firstLine();O>=J;O--,G=-1){var re=_.getLine(O),q=h(re,W,G<0?0:re.length-G);if(q)return{from:p(O,q.index),to:p(O,q.index+q[0].length),match:q}}}function T(_,W,E){if(!b(W))return g(_,W,E);W=C(W,"gm");for(var O,G=1,J=_.getLine(E.line).length-E.ch,re=E.line,q=_.firstLine();re>=q;){for(var I=0;I=q;I++){var D=_.getLine(re--);O=O==null?D:D+` `+O}G*=2;var Q=h(O,W,J);if(Q){var j=O.slice(0,Q.index).split(` `),V=Q[0].split(` `),y=re+j.length,K=j[j.length-1].length;return{from:p(y,K),to:p(y+V.length-1,V.length==1?K+V[0].length:V[V.length-1].length),match:Q}}}}var w,c;String.prototype.normalize?(w=function(_){return _.normalize("NFD").toLowerCase()},c=function(_){return _.normalize("NFD")}):(w=function(_){return _.toLowerCase()},c=function(_){return _});function d(_,W,E,O){if(_.length==W.length)return E;for(var G=0,J=E+Math.max(0,_.length-W.length);;){if(G==J)return G;var re=G+J>>1,q=O(_.slice(0,re)).length;if(q==E)return re;q>E?J=re:G=re+1}}function k(_,W,E,O){if(!W.length)return null;var G=O?w:c,J=G(W).split(/\r|\n\r?/);e:for(var re=E.line,q=E.ch,I=_.lastLine()+1-J.length;re<=I;re++,q=0){var D=_.getLine(re).slice(q),Q=G(D);if(J.length==1){var j=Q.indexOf(J[0]);if(j==-1)continue e;var E=d(D,Q,j,G)+q;return{from:p(re,d(D,Q,j,G)+q),to:p(re,d(D,Q,j+J[0].length,G)+q)}}else{var V=Q.length-J[0].length;if(Q.slice(V)!=J[0])continue e;for(var y=1;y=I;re--,q=-1){var D=_.getLine(re);q>-1&&(D=D.slice(0,q));var Q=G(D);if(J.length==1){var j=Q.lastIndexOf(J[0]);if(j==-1)continue e;return{from:p(re,d(D,Q,j,G)),to:p(re,d(D,Q,j+J[0].length,G))}}else{var V=J[J.length-1];if(Q.slice(0,V.length)!=V)continue e;for(var y=1,E=re-J.length+1;y(this.doc.getLine(W.line)||"").length&&(W.ch=0,W.line++)),o.cmpPos(W,this.doc.clipPos(W))!=0))return this.atOccurrence=!1;var E=this.matches(_,W);if(this.afterEmptyMatch=E&&o.cmpPos(E.from,E.to)==0,E)return this.pos=E,this.atOccurrence=!0,this.pos.match||!0;var O=p(_?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:O,to:O},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(_,W){if(this.atOccurrence){var E=o.splitLines(_);this.doc.replaceRange(E,this.pos.from,this.pos.to,W),this.pos.to=p(this.pos.from.line+E.length-1,E[E.length-1].length+(E.length==1?this.pos.from.ch:0))}}},o.defineExtension("getSearchCursor",function(_,W,E){return new M(this.doc,_,W,E)}),o.defineDocExtension("getSearchCursor",function(_,W,E){return new M(this,_,W,E)}),o.defineExtension("selectMatches",function(_,W){for(var E=[],O=this.getSearchCursor(_,this.getCursor("from"),W);O.findNext()&&!(o.cmpPos(O.to(),this.getCursor("to"))>0);)E.push({anchor:O.from(),head:O.to()});E.length&&this.setSelections(E,0)})})});var Vo=Ke((ws,Ss)=>{(function(o){typeof ws=="object"&&typeof Ss=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(N,R,le,xe,F,L){this.indented=N,this.column=R,this.type=le,this.info=xe,this.align=F,this.prev=L}function v(N,R,le,xe){var F=N.indented;return N.context&&N.context.type=="statement"&&le!="statement"&&(F=N.context.indented),N.context=new p(F,R,le,xe,null,N.context)}function C(N){var R=N.context.type;return(R==")"||R=="]"||R=="}")&&(N.indented=N.context.indented),N.context=N.context.prev}function b(N,R,le){if(R.prevToken=="variable"||R.prevToken=="type"||/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(N.string.slice(0,le))||R.typeAtEndOfLine&&N.column()==N.indentation())return!0}function S(N){for(;;){if(!N||N.type=="top")return!0;if(N.type=="}"&&N.prev.info!="namespace")return!1;N=N.prev}}o.defineMode("clike",function(N,R){var le=N.indentUnit,xe=R.statementIndentUnit||le,F=R.dontAlignCalls,L=R.keywords||{},de=R.types||{},ze=R.builtin||{},pe=R.blockKeywords||{},Ee=R.defKeywords||{},ge=R.atoms||{},Oe=R.hooks||{},qe=R.multiLineStrings,Se=R.indentStatements!==!1,Be=R.indentSwitch!==!1,Ze=R.namespaceSeparator,ke=R.isPunctuationChar||/[\[\]{}\(\),;\:\.]/,Je=R.numberStart||/[\d\.]/,Re=R.number||/^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i,Ge=R.isOperatorChar||/[+\-*&%=<>!?|\/]/,U=R.isIdentifierChar||/[\w\$_\xa1-\uffff]/,Z=R.isReservedIdentifier||!1,ce,He;function te(we,Me){var Le=we.next();if(Oe[Le]){var $=Oe[Le](we,Me);if($!==!1)return $}if(Le=='"'||Le=="'")return Me.tokenize=fe(Le),Me.tokenize(we,Me);if(Je.test(Le)){if(we.backUp(1),we.match(Re))return"number";we.next()}if(ke.test(Le))return ce=Le,null;if(Le=="/"){if(we.eat("*"))return Me.tokenize=oe,oe(we,Me);if(we.eat("/"))return we.skipToEnd(),"comment"}if(Ge.test(Le)){for(;!we.match(/^\/[\/*]/,!1)&&we.eat(Ge););return"operator"}if(we.eatWhile(U),Ze)for(;we.match(Ze);)we.eatWhile(U);var H=we.current();return h(L,H)?(h(pe,H)&&(ce="newstatement"),h(Ee,H)&&(He=!0),"keyword"):h(de,H)?"type":h(ze,H)||Z&&Z(H)?(h(pe,H)&&(ce="newstatement"),"builtin"):h(ge,H)?"atom":"variable"}function fe(we){return function(Me,Le){for(var $=!1,H,se=!1;(H=Me.next())!=null;){if(H==we&&!$){se=!0;break}$=!$&&H=="\\"}return(se||!($||qe))&&(Le.tokenize=null),"string"}}function oe(we,Me){for(var Le=!1,$;$=we.next();){if($=="/"&&Le){Me.tokenize=null;break}Le=$=="*"}return"comment"}function Ue(we,Me){R.typeFirstDefinitions&&we.eol()&&S(Me.context)&&(Me.typeAtEndOfLine=b(we,Me,we.pos))}return{startState:function(we){return{tokenize:null,context:new p((we||0)-le,0,"top",null,!1),indented:0,startOfLine:!0,prevToken:null}},token:function(we,Me){var Le=Me.context;if(we.sol()&&(Le.align==null&&(Le.align=!1),Me.indented=we.indentation(),Me.startOfLine=!0),we.eatSpace())return Ue(we,Me),null;ce=He=null;var $=(Me.tokenize||te)(we,Me);if($=="comment"||$=="meta")return $;if(Le.align==null&&(Le.align=!0),ce==";"||ce==":"||ce==","&&we.match(/^\s*(?:\/\/.*)?$/,!1))for(;Me.context.type=="statement";)C(Me);else if(ce=="{")v(Me,we.column(),"}");else if(ce=="[")v(Me,we.column(),"]");else if(ce=="(")v(Me,we.column(),")");else if(ce=="}"){for(;Le.type=="statement";)Le=C(Me);for(Le.type=="}"&&(Le=C(Me));Le.type=="statement";)Le=C(Me)}else ce==Le.type?C(Me):Se&&((Le.type=="}"||Le.type=="top")&&ce!=";"||Le.type=="statement"&&ce=="newstatement")&&v(Me,we.column(),"statement",we.current());if($=="variable"&&(Me.prevToken=="def"||R.typeFirstDefinitions&&b(we,Me,we.start)&&S(Me.context)&&we.match(/^\s*\(/,!1))&&($="def"),Oe.token){var H=Oe.token(we,Me,$);H!==void 0&&($=H)}return $=="def"&&R.styleDefs===!1&&($="variable"),Me.startOfLine=!1,Me.prevToken=He?"def":$||ce,Ue(we,Me),$},indent:function(we,Me){if(we.tokenize!=te&&we.tokenize!=null||we.typeAtEndOfLine&&S(we.context))return o.Pass;var Le=we.context,$=Me&&Me.charAt(0),H=$==Le.type;if(Le.type=="statement"&&$=="}"&&(Le=Le.prev),R.dontIndentStatements)for(;Le.type=="statement"&&R.dontIndentStatements.test(Le.info);)Le=Le.prev;if(Oe.indent){var se=Oe.indent(we,Le,Me,le);if(typeof se=="number")return se}var De=Le.prev&&Le.prev.info=="switch";if(R.allmanIndentation&&/[{(]/.test($)){for(;Le.type!="top"&&Le.type!="}";)Le=Le.prev;return Le.indented}return Le.type=="statement"?Le.indented+($=="{"?0:xe):Le.align&&(!F||Le.type!=")")?Le.column+(H?0:1):Le.type==")"&&!H?Le.indented+xe:Le.indented+(H?0:le)+(!H&&De&&!/^(?:case|default)\b/.test(Me)?le:0)},electricInput:Be?/^\s*(?:case .*?:|default:|\{\}?|\})$/:/^\s*[{}]$/,blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:"//",fold:"brace"}});function s(N){for(var R={},le=N.split(" "),xe=0;xe!?|\/#:@]/,hooks:{"@":function(N){return N.eatWhile(/[\w\$_]/),"meta"},'"':function(N,R){return N.match('""')?(R.tokenize=j,R.tokenize(N,R)):!1},"'":function(N){return N.match(/^(\\[^'\s]+|[^\\'])'/)?"string-2":(N.eatWhile(/[\w\$_\xa1-\uffff]/),"atom")},"=":function(N,R){var le=R.context;return le.type=="}"&&le.align&&N.eat(">")?(R.context=new p(le.indented,le.column,le.type,le.info,null,le.prev),"operator"):!1},"/":function(N,R){return N.eat("*")?(R.tokenize=V(1),R.tokenize(N,R)):!1}},modeProps:{closeBrackets:{pairs:'()[]{}""',triples:'"'}}});function y(N){return function(R,le){for(var xe=!1,F,L=!1;!R.eol();){if(!N&&!xe&&R.match('"')){L=!0;break}if(N&&R.match('"""')){L=!0;break}F=R.next(),!xe&&F=="$"&&R.match("{")&&R.skipTo("}"),xe=!xe&&F=="\\"&&!N}return(L||!N)&&(le.tokenize=null),"string"}}Q("text/x-kotlin",{name:"clike",keywords:s("package as typealias class interface this super val operator var fun for is in This throw return annotation break continue object if else while do try when !in !is as? file import where by get set abstract enum open inner override private public internal protected catch finally out final vararg reified dynamic companion constructor init sealed field property receiver param sparam lateinit data inline noinline tailrec external annotation crossinline const operator infix suspend actual expect setparam value"),types:s("Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy LazyThreadSafetyMode LongArray Nothing ShortArray Unit"),intendSwitch:!1,indentStatements:!1,multiLineStrings:!0,number:/^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i,blockKeywords:s("catch class do else finally for if where try while enum"),defKeywords:s("class val var object interface fun"),atoms:s("true false null this"),hooks:{"@":function(N){return N.eatWhile(/[\w\$_]/),"meta"},"*":function(N,R){return R.prevToken=="."?"variable":"operator"},'"':function(N,R){return R.tokenize=y(N.match('""')),R.tokenize(N,R)},"/":function(N,R){return N.eat("*")?(R.tokenize=V(1),R.tokenize(N,R)):!1},indent:function(N,R,le,xe){var F=le&&le.charAt(0);if((N.prevToken=="}"||N.prevToken==")")&&le=="")return N.indented;if(N.prevToken=="operator"&&le!="}"&&N.context.type!="}"||N.prevToken=="variable"&&F=="."||(N.prevToken=="}"||N.prevToken==")")&&F==".")return xe*2+R.indented;if(R.align&&R.type=="}")return R.indented+(N.context.type==(le||"").charAt(0)?0:xe)}},modeProps:{closeBrackets:{triples:'"'}}}),Q(["x-shader/x-vertex","x-shader/x-fragment"],{name:"clike",keywords:s("sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout"),types:s("float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4"),blockKeywords:s("for while do if else struct"),builtin:s("radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4"),atoms:s("true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers"),indentSwitch:!1,hooks:{"#":E},modeProps:{fold:["brace","include"]}}),Q("text/x-nesc",{name:"clike",keywords:s(g+" as atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends"),types:z,blockKeywords:s(_),atoms:s("null true false"),hooks:{"#":E},modeProps:{fold:["brace","include"]}}),Q("text/x-objectivec",{name:"clike",keywords:s(g+" "+w),types:M,builtin:s(c),blockKeywords:s(_+" @synthesize @try @catch @finally @autoreleasepool @synchronized"),defKeywords:s(W+" @interface @implementation @protocol @class"),dontIndentStatements:/^@.*$/,typeFirstDefinitions:!0,atoms:s("YES NO NULL Nil nil true false nullptr"),isReservedIdentifier:G,hooks:{"#":E,"*":O},modeProps:{fold:["brace","include"]}}),Q("text/x-objectivec++",{name:"clike",keywords:s(g+" "+w+" "+T),types:M,builtin:s(c),blockKeywords:s(_+" @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"),defKeywords:s(W+" @interface @implementation @protocol @class class namespace"),dontIndentStatements:/^@.*$|^template$/,typeFirstDefinitions:!0,atoms:s("YES NO NULL Nil nil true false nullptr"),isReservedIdentifier:G,hooks:{"#":E,"*":O,u:re,U:re,L:re,R:re,0:J,1:J,2:J,3:J,4:J,5:J,6:J,7:J,8:J,9:J,token:function(N,R,le){if(le=="variable"&&N.peek()=="("&&(R.prevToken==";"||R.prevToken==null||R.prevToken=="}")&&q(N.current()))return"def"}},namespaceSeparator:"::",modeProps:{fold:["brace","include"]}}),Q("text/x-squirrel",{name:"clike",keywords:s("base break clone continue const default delete enum extends function in class foreach local resume return this throw typeof yield constructor instanceof static"),types:z,blockKeywords:s("case catch class else for foreach if switch try while"),defKeywords:s("function local class"),typeFirstDefinitions:!0,atoms:s("true false null"),hooks:{"#":E},modeProps:{fold:["brace","include"]}});var K=null;function X(N){return function(R,le){for(var xe=!1,F,L=!1;!R.eol();){if(!xe&&R.match('"')&&(N=="single"||R.match('""'))){L=!0;break}if(!xe&&R.match("``")){K=X(N),L=!0;break}F=R.next(),xe=N=="single"&&!xe&&F=="\\"}return L&&(le.tokenize=null),"string"}}Q("text/x-ceylon",{name:"clike",keywords:s("abstracts alias assembly assert assign break case catch class continue dynamic else exists extends finally for function given if import in interface is let module new nonempty object of out outer package return satisfies super switch then this throw try value void while"),types:function(N){var R=N.charAt(0);return R===R.toUpperCase()&&R!==R.toLowerCase()},blockKeywords:s("case catch class dynamic else finally for function if interface module new object switch try while"),defKeywords:s("class dynamic function interface module object package value"),builtin:s("abstract actual aliased annotation by default deprecated doc final formal late license native optional sealed see serializable shared suppressWarnings tagged throws variable"),isPunctuationChar:/[\[\]{}\(\),;\:\.`]/,isOperatorChar:/[+\-*&%=<>!?|^~:\/]/,numberStart:/[\d#$]/,number:/^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i,multiLineStrings:!0,typeFirstDefinitions:!0,atoms:s("true false null larger smaller equal empty finished"),indentSwitch:!1,styleDefs:!1,hooks:{"@":function(N){return N.eatWhile(/[\w\$_]/),"meta"},'"':function(N,R){return R.tokenize=X(N.match('""')?"triple":"single"),R.tokenize(N,R)},"`":function(N,R){return!K||!N.match("`")?!1:(R.tokenize=K,K=null,R.tokenize(N,R))},"'":function(N){return N.eatWhile(/[\w\$_\xa1-\uffff]/),"atom"},token:function(N,R,le){if((le=="variable"||le=="type")&&R.prevToken==".")return"variable-2"}},modeProps:{fold:["brace","import"],closeBrackets:{triples:'"'}}})})});var Cs=Ke((Ts,Ls)=>{(function(o){typeof Ts=="object"&&typeof Ls=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("cmake",function(){var p=/({)?[a-zA-Z0-9_]+(})?/;function v(b,S){for(var s,h,g=!1;!b.eol()&&(s=b.next())!=S.pending;){if(s==="$"&&h!="\\"&&S.pending=='"'){g=!0;break}h=s}return g&&b.backUp(1),s==S.pending?S.continueString=!1:S.continueString=!0,"string"}function C(b,S){var s=b.next();return s==="$"?b.match(p)?"variable-2":"variable":S.continueString?(b.backUp(1),v(b,S)):b.match(/(\s+)?\w+\(/)||b.match(/(\s+)?\w+\ \(/)?(b.backUp(1),"def"):s=="#"?(b.skipToEnd(),"comment"):s=="'"||s=='"'?(S.pending=s,v(b,S)):s=="("||s==")"?"bracket":s.match(/[0-9]/)?"number":(b.eatWhile(/[\w-]/),null)}return{startState:function(){var b={};return b.inDefinition=!1,b.inInclude=!1,b.continueString=!1,b.pending=!1,b},token:function(b,S){return b.eatSpace()?null:C(b,S)}}}),o.defineMIME("text/x-cmake","cmake")})});var gn=Ke((Es,zs)=>{(function(o){typeof Es=="object"&&typeof zs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("css",function(I,D){var Q=D.inline;D.propertyKeywords||(D=o.resolveMode("text/css"));var j=I.indentUnit,V=D.tokenHooks,y=D.documentTypes||{},K=D.mediaTypes||{},X=D.mediaFeatures||{},N=D.mediaValueKeywords||{},R=D.propertyKeywords||{},le=D.nonStandardPropertyKeywords||{},xe=D.fontProperties||{},F=D.counterDescriptors||{},L=D.colorKeywords||{},de=D.valueKeywords||{},ze=D.allowNested,pe=D.lineComment,Ee=D.supportsAtComponent===!0,ge=I.highlightNonStandardPropertyKeywords!==!1,Oe,qe;function Se(te,fe){return Oe=fe,te}function Be(te,fe){var oe=te.next();if(V[oe]){var Ue=V[oe](te,fe);if(Ue!==!1)return Ue}if(oe=="@")return te.eatWhile(/[\w\\\-]/),Se("def",te.current());if(oe=="="||(oe=="~"||oe=="|")&&te.eat("="))return Se(null,"compare");if(oe=='"'||oe=="'")return fe.tokenize=Ze(oe),fe.tokenize(te,fe);if(oe=="#")return te.eatWhile(/[\w\\\-]/),Se("atom","hash");if(oe=="!")return te.match(/^\s*\w*/),Se("keyword","important");if(/\d/.test(oe)||oe=="."&&te.eat(/\d/))return te.eatWhile(/[\w.%]/),Se("number","unit");if(oe==="-"){if(/[\d.]/.test(te.peek()))return te.eatWhile(/[\w.%]/),Se("number","unit");if(te.match(/^-[\w\\\-]*/))return te.eatWhile(/[\w\\\-]/),te.match(/^\s*:/,!1)?Se("variable-2","variable-definition"):Se("variable-2","variable");if(te.match(/^\w+-/))return Se("meta","meta")}else return/[,+>*\/]/.test(oe)?Se(null,"select-op"):oe=="."&&te.match(/^-?[_a-z][_a-z0-9-]*/i)?Se("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(oe)?Se(null,oe):te.match(/^[\w-.]+(?=\()/)?(/^(url(-prefix)?|domain|regexp)$/i.test(te.current())&&(fe.tokenize=ke),Se("variable callee","variable")):/[\w\\\-]/.test(oe)?(te.eatWhile(/[\w\\\-]/),Se("property","word")):Se(null,null)}function Ze(te){return function(fe,oe){for(var Ue=!1,we;(we=fe.next())!=null;){if(we==te&&!Ue){te==")"&&fe.backUp(1);break}Ue=!Ue&&we=="\\"}return(we==te||!Ue&&te!=")")&&(oe.tokenize=null),Se("string","string")}}function ke(te,fe){return te.next(),te.match(/^\s*[\"\')]/,!1)?fe.tokenize=null:fe.tokenize=Ze(")"),Se(null,"(")}function Je(te,fe,oe){this.type=te,this.indent=fe,this.prev=oe}function Re(te,fe,oe,Ue){return te.context=new Je(oe,fe.indentation()+(Ue===!1?0:j),te.context),oe}function Ge(te){return te.context.prev&&(te.context=te.context.prev),te.context.type}function U(te,fe,oe){return He[oe.context.type](te,fe,oe)}function Z(te,fe,oe,Ue){for(var we=Ue||1;we>0;we--)oe.context=oe.context.prev;return U(te,fe,oe)}function ce(te){var fe=te.current().toLowerCase();de.hasOwnProperty(fe)?qe="atom":L.hasOwnProperty(fe)?qe="keyword":qe="variable"}var He={};return He.top=function(te,fe,oe){if(te=="{")return Re(oe,fe,"block");if(te=="}"&&oe.context.prev)return Ge(oe);if(Ee&&/@component/i.test(te))return Re(oe,fe,"atComponentBlock");if(/^@(-moz-)?document$/i.test(te))return Re(oe,fe,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/i.test(te))return Re(oe,fe,"atBlock");if(/^@(font-face|counter-style)/i.test(te))return oe.stateArg=te,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(te))return"keyframes";if(te&&te.charAt(0)=="@")return Re(oe,fe,"at");if(te=="hash")qe="builtin";else if(te=="word")qe="tag";else{if(te=="variable-definition")return"maybeprop";if(te=="interpolation")return Re(oe,fe,"interpolation");if(te==":")return"pseudo";if(ze&&te=="(")return Re(oe,fe,"parens")}return oe.context.type},He.block=function(te,fe,oe){if(te=="word"){var Ue=fe.current().toLowerCase();return R.hasOwnProperty(Ue)?(qe="property","maybeprop"):le.hasOwnProperty(Ue)?(qe=ge?"string-2":"property","maybeprop"):ze?(qe=fe.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(qe+=" error","maybeprop")}else return te=="meta"?"block":!ze&&(te=="hash"||te=="qualifier")?(qe="error","block"):He.top(te,fe,oe)},He.maybeprop=function(te,fe,oe){return te==":"?Re(oe,fe,"prop"):U(te,fe,oe)},He.prop=function(te,fe,oe){if(te==";")return Ge(oe);if(te=="{"&&ze)return Re(oe,fe,"propBlock");if(te=="}"||te=="{")return Z(te,fe,oe);if(te=="(")return Re(oe,fe,"parens");if(te=="hash"&&!/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(fe.current()))qe+=" error";else if(te=="word")ce(fe);else if(te=="interpolation")return Re(oe,fe,"interpolation");return"prop"},He.propBlock=function(te,fe,oe){return te=="}"?Ge(oe):te=="word"?(qe="property","maybeprop"):oe.context.type},He.parens=function(te,fe,oe){return te=="{"||te=="}"?Z(te,fe,oe):te==")"?Ge(oe):te=="("?Re(oe,fe,"parens"):te=="interpolation"?Re(oe,fe,"interpolation"):(te=="word"&&ce(fe),"parens")},He.pseudo=function(te,fe,oe){return te=="meta"?"pseudo":te=="word"?(qe="variable-3",oe.context.type):U(te,fe,oe)},He.documentTypes=function(te,fe,oe){return te=="word"&&y.hasOwnProperty(fe.current())?(qe="tag",oe.context.type):He.atBlock(te,fe,oe)},He.atBlock=function(te,fe,oe){if(te=="(")return Re(oe,fe,"atBlock_parens");if(te=="}"||te==";")return Z(te,fe,oe);if(te=="{")return Ge(oe)&&Re(oe,fe,ze?"block":"top");if(te=="interpolation")return Re(oe,fe,"interpolation");if(te=="word"){var Ue=fe.current().toLowerCase();Ue=="only"||Ue=="not"||Ue=="and"||Ue=="or"?qe="keyword":K.hasOwnProperty(Ue)?qe="attribute":X.hasOwnProperty(Ue)?qe="property":N.hasOwnProperty(Ue)?qe="keyword":R.hasOwnProperty(Ue)?qe="property":le.hasOwnProperty(Ue)?qe=ge?"string-2":"property":de.hasOwnProperty(Ue)?qe="atom":L.hasOwnProperty(Ue)?qe="keyword":qe="error"}return oe.context.type},He.atComponentBlock=function(te,fe,oe){return te=="}"?Z(te,fe,oe):te=="{"?Ge(oe)&&Re(oe,fe,ze?"block":"top",!1):(te=="word"&&(qe="error"),oe.context.type)},He.atBlock_parens=function(te,fe,oe){return te==")"?Ge(oe):te=="{"||te=="}"?Z(te,fe,oe,2):He.atBlock(te,fe,oe)},He.restricted_atBlock_before=function(te,fe,oe){return te=="{"?Re(oe,fe,"restricted_atBlock"):te=="word"&&oe.stateArg=="@counter-style"?(qe="variable","restricted_atBlock_before"):U(te,fe,oe)},He.restricted_atBlock=function(te,fe,oe){return te=="}"?(oe.stateArg=null,Ge(oe)):te=="word"?(oe.stateArg=="@font-face"&&!xe.hasOwnProperty(fe.current().toLowerCase())||oe.stateArg=="@counter-style"&&!F.hasOwnProperty(fe.current().toLowerCase())?qe="error":qe="property","maybeprop"):"restricted_atBlock"},He.keyframes=function(te,fe,oe){return te=="word"?(qe="variable","keyframes"):te=="{"?Re(oe,fe,"top"):U(te,fe,oe)},He.at=function(te,fe,oe){return te==";"?Ge(oe):te=="{"||te=="}"?Z(te,fe,oe):(te=="word"?qe="tag":te=="hash"&&(qe="builtin"),"at")},He.interpolation=function(te,fe,oe){return te=="}"?Ge(oe):te=="{"||te==";"?Z(te,fe,oe):(te=="word"?qe="variable":te!="variable"&&te!="("&&te!=")"&&(qe="error"),"interpolation")},{startState:function(te){return{tokenize:null,state:Q?"block":"top",stateArg:null,context:new Je(Q?"block":"top",te||0,null)}},token:function(te,fe){if(!fe.tokenize&&te.eatSpace())return null;var oe=(fe.tokenize||Be)(te,fe);return oe&&typeof oe=="object"&&(Oe=oe[1],oe=oe[0]),qe=oe,Oe!="comment"&&(fe.state=He[fe.state](Oe,te,fe)),qe},indent:function(te,fe){var oe=te.context,Ue=fe&&fe.charAt(0),we=oe.indent;return oe.type=="prop"&&(Ue=="}"||Ue==")")&&(oe=oe.prev),oe.prev&&(Ue=="}"&&(oe.type=="block"||oe.type=="top"||oe.type=="interpolation"||oe.type=="restricted_atBlock")?(oe=oe.prev,we=oe.indent):(Ue==")"&&(oe.type=="parens"||oe.type=="atBlock_parens")||Ue=="{"&&(oe.type=="at"||oe.type=="atBlock"))&&(we=Math.max(0,oe.indent-j))),we},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:pe,fold:"brace"}});function p(I){for(var D={},Q=0;Q{(function(o){typeof Ms=="object"&&typeof As=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("diff",function(){var p={"+":"positive","-":"negative","@":"meta"};return{token:function(v){var C=v.string.search(/[\t ]+?$/);if(!v.sol()||C===0)return v.skipToEnd(),("error "+(p[v.string.charAt(0)]||"")).replace(/ $/,"");var b=p[v.peek()]||v.skipToEnd();return C===-1?v.skipToEnd():v.pos=C,b}}}),o.defineMIME("text/x-diff","diff")})});var mn=Ke((qs,Fs)=>{(function(o){typeof qs=="object"&&typeof Fs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";var p={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},v={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};o.defineMode("xml",function(C,b){var S=C.indentUnit,s={},h=b.htmlMode?p:v;for(var g in h)s[g]=h[g];for(var g in b)s[g]=b[g];var T,w;function c(y,K){function X(le){return K.tokenize=le,le(y,K)}var N=y.next();if(N=="<")return y.eat("!")?y.eat("[")?y.match("CDATA[")?X(z("atom","]]>")):null:y.match("--")?X(z("comment","-->")):y.match("DOCTYPE",!0,!0)?(y.eatWhile(/[\w\._\-]/),X(M(1))):null:y.eat("?")?(y.eatWhile(/[\w\._\-]/),K.tokenize=z("meta","?>"),"meta"):(T=y.eat("/")?"closeTag":"openTag",K.tokenize=d,"tag bracket");if(N=="&"){var R;return y.eat("#")?y.eat("x")?R=y.eatWhile(/[a-fA-F\d]/)&&y.eat(";"):R=y.eatWhile(/[\d]/)&&y.eat(";"):R=y.eatWhile(/[\w\.\-:]/)&&y.eat(";"),R?"atom":"error"}else return y.eatWhile(/[^&<]/),null}c.isInText=!0;function d(y,K){var X=y.next();if(X==">"||X=="/"&&y.eat(">"))return K.tokenize=c,T=X==">"?"endTag":"selfcloseTag","tag bracket";if(X=="=")return T="equals",null;if(X=="<"){K.tokenize=c,K.state=G,K.tagName=K.tagStart=null;var N=K.tokenize(y,K);return N?N+" tag error":"tag error"}else return/[\'\"]/.test(X)?(K.tokenize=k(X),K.stringStartCol=y.column(),K.tokenize(y,K)):(y.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function k(y){var K=function(X,N){for(;!X.eol();)if(X.next()==y){N.tokenize=d;break}return"string"};return K.isInAttribute=!0,K}function z(y,K){return function(X,N){for(;!X.eol();){if(X.match(K)){N.tokenize=c;break}X.next()}return y}}function M(y){return function(K,X){for(var N;(N=K.next())!=null;){if(N=="<")return X.tokenize=M(y+1),X.tokenize(K,X);if(N==">")if(y==1){X.tokenize=c;break}else return X.tokenize=M(y-1),X.tokenize(K,X)}return"meta"}}function _(y){return y&&y.toLowerCase()}function W(y,K,X){this.prev=y.context,this.tagName=K||"",this.indent=y.indented,this.startOfLine=X,(s.doNotIndent.hasOwnProperty(K)||y.context&&y.context.noIndent)&&(this.noIndent=!0)}function E(y){y.context&&(y.context=y.context.prev)}function O(y,K){for(var X;;){if(!y.context||(X=y.context.tagName,!s.contextGrabbers.hasOwnProperty(_(X))||!s.contextGrabbers[_(X)].hasOwnProperty(_(K))))return;E(y)}}function G(y,K,X){return y=="openTag"?(X.tagStart=K.column(),J):y=="closeTag"?re:G}function J(y,K,X){return y=="word"?(X.tagName=K.current(),w="tag",D):s.allowMissingTagName&&y=="endTag"?(w="tag bracket",D(y,K,X)):(w="error",J)}function re(y,K,X){if(y=="word"){var N=K.current();return X.context&&X.context.tagName!=N&&s.implicitlyClosed.hasOwnProperty(_(X.context.tagName))&&E(X),X.context&&X.context.tagName==N||s.matchClosing===!1?(w="tag",q):(w="tag error",I)}else return s.allowMissingTagName&&y=="endTag"?(w="tag bracket",q(y,K,X)):(w="error",I)}function q(y,K,X){return y!="endTag"?(w="error",q):(E(X),G)}function I(y,K,X){return w="error",q(y,K,X)}function D(y,K,X){if(y=="word")return w="attribute",Q;if(y=="endTag"||y=="selfcloseTag"){var N=X.tagName,R=X.tagStart;return X.tagName=X.tagStart=null,y=="selfcloseTag"||s.autoSelfClosers.hasOwnProperty(_(N))?O(X,N):(O(X,N),X.context=new W(X,N,R==X.indented)),G}return w="error",D}function Q(y,K,X){return y=="equals"?j:(s.allowMissing||(w="error"),D(y,K,X))}function j(y,K,X){return y=="string"?V:y=="word"&&s.allowUnquoted?(w="string",D):(w="error",D(y,K,X))}function V(y,K,X){return y=="string"?V:D(y,K,X)}return{startState:function(y){var K={tokenize:c,state:G,indented:y||0,tagName:null,tagStart:null,context:null};return y!=null&&(K.baseIndent=y),K},token:function(y,K){if(!K.tagName&&y.sol()&&(K.indented=y.indentation()),y.eatSpace())return null;T=null;var X=K.tokenize(y,K);return(X||T)&&X!="comment"&&(w=null,K.state=K.state(T||X,y,K),w&&(X=w=="error"?X+" error":w)),X},indent:function(y,K,X){var N=y.context;if(y.tokenize.isInAttribute)return y.tagStart==y.indented?y.stringStartCol+1:y.indented+S;if(N&&N.noIndent)return o.Pass;if(y.tokenize!=d&&y.tokenize!=c)return X?X.match(/^(\s*)/)[0].length:0;if(y.tagName)return s.multilineTagIndentPastTag!==!1?y.tagStart+y.tagName.length+2:y.tagStart+S*(s.multilineTagIndentFactor||1);if(s.alignCDATA&&/$/,blockCommentStart:"",configuration:s.htmlMode?"html":"xml",helperType:s.htmlMode?"html":"xml",skipAttribute:function(y){y.state==j&&(y.state=D)},xmlCurrentTag:function(y){return y.tagName?{name:y.tagName,close:y.type=="closeTag"}:null},xmlCurrentContext:function(y){for(var K=[],X=y.context;X;X=X.prev)K.push(X.tagName);return K.reverse()}}}),o.defineMIME("text/xml","xml"),o.defineMIME("application/xml","xml"),o.mimeModes.hasOwnProperty("text/html")||o.defineMIME("text/html",{name:"xml",htmlMode:!0})})});var vn=Ke((Is,Ns)=>{(function(o){typeof Is=="object"&&typeof Ns=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("javascript",function(p,v){var C=p.indentUnit,b=v.statementIndent,S=v.jsonld,s=v.json||S,h=v.trackScope!==!1,g=v.typescript,T=v.wordCharacters||/[\w$\xa1-\uffff]/,w=(function(){function x(pt){return{type:pt,style:"keyword"}}var P=x("keyword a"),ae=x("keyword b"),he=x("keyword c"),ne=x("keyword d"),ye=x("operator"),Xe={type:"atom",style:"atom"};return{if:x("if"),while:P,with:P,else:ae,do:ae,try:ae,finally:ae,return:ne,break:ne,continue:ne,new:x("new"),delete:he,void:he,throw:he,debugger:x("debugger"),var:x("var"),const:x("var"),let:x("var"),function:x("function"),catch:x("catch"),for:x("for"),switch:x("switch"),case:x("case"),default:x("default"),in:ye,typeof:ye,instanceof:ye,true:Xe,false:Xe,null:Xe,undefined:Xe,NaN:Xe,Infinity:Xe,this:x("this"),class:x("class"),super:x("atom"),yield:he,export:x("export"),import:x("import"),extends:he,await:he}})(),c=/[+\-*&%=<>!?|~^@]/,d=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function k(x){for(var P=!1,ae,he=!1;(ae=x.next())!=null;){if(!P){if(ae=="/"&&!he)return;ae=="["?he=!0:he&&ae=="]"&&(he=!1)}P=!P&&ae=="\\"}}var z,M;function _(x,P,ae){return z=x,M=ae,P}function W(x,P){var ae=x.next();if(ae=='"'||ae=="'")return P.tokenize=E(ae),P.tokenize(x,P);if(ae=="."&&x.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/))return _("number","number");if(ae=="."&&x.match(".."))return _("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(ae))return _(ae);if(ae=="="&&x.eat(">"))return _("=>","operator");if(ae=="0"&&x.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/))return _("number","number");if(/\d/.test(ae))return x.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/),_("number","number");if(ae=="/")return x.eat("*")?(P.tokenize=O,O(x,P)):x.eat("/")?(x.skipToEnd(),_("comment","comment")):Bt(x,P,1)?(k(x),x.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),_("regexp","string-2")):(x.eat("="),_("operator","operator",x.current()));if(ae=="`")return P.tokenize=G,G(x,P);if(ae=="#"&&x.peek()=="!")return x.skipToEnd(),_("meta","meta");if(ae=="#"&&x.eatWhile(T))return _("variable","property");if(ae=="<"&&x.match("!--")||ae=="-"&&x.match("->")&&!/\S/.test(x.string.slice(0,x.start)))return x.skipToEnd(),_("comment","comment");if(c.test(ae))return(ae!=">"||!P.lexical||P.lexical.type!=">")&&(x.eat("=")?(ae=="!"||ae=="=")&&x.eat("="):/[<>*+\-|&?]/.test(ae)&&(x.eat(ae),ae==">"&&x.eat(ae))),ae=="?"&&x.eat(".")?_("."):_("operator","operator",x.current());if(T.test(ae)){x.eatWhile(T);var he=x.current();if(P.lastType!="."){if(w.propertyIsEnumerable(he)){var ne=w[he];return _(ne.type,ne.style,he)}if(he=="async"&&x.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/,!1))return _("async","keyword",he)}return _("variable","variable",he)}}function E(x){return function(P,ae){var he=!1,ne;if(S&&P.peek()=="@"&&P.match(d))return ae.tokenize=W,_("jsonld-keyword","meta");for(;(ne=P.next())!=null&&!(ne==x&&!he);)he=!he&&ne=="\\";return he||(ae.tokenize=W),_("string","string")}}function O(x,P){for(var ae=!1,he;he=x.next();){if(he=="/"&&ae){P.tokenize=W;break}ae=he=="*"}return _("comment","comment")}function G(x,P){for(var ae=!1,he;(he=x.next())!=null;){if(!ae&&(he=="`"||he=="$"&&x.eat("{"))){P.tokenize=W;break}ae=!ae&&he=="\\"}return _("quasi","string-2",x.current())}var J="([{}])";function re(x,P){P.fatArrowAt&&(P.fatArrowAt=null);var ae=x.string.indexOf("=>",x.start);if(!(ae<0)){if(g){var he=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(x.string.slice(x.start,ae));he&&(ae=he.index)}for(var ne=0,ye=!1,Xe=ae-1;Xe>=0;--Xe){var pt=x.string.charAt(Xe),Et=J.indexOf(pt);if(Et>=0&&Et<3){if(!ne){++Xe;break}if(--ne==0){pt=="("&&(ye=!0);break}}else if(Et>=3&&Et<6)++ne;else if(T.test(pt))ye=!0;else if(/["'\/`]/.test(pt))for(;;--Xe){if(Xe==0)return;var Zr=x.string.charAt(Xe-1);if(Zr==pt&&x.string.charAt(Xe-2)!="\\"){Xe--;break}}else if(ye&&!ne){++Xe;break}}ye&&!ne&&(P.fatArrowAt=Xe)}}var q={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,import:!0,"jsonld-keyword":!0};function I(x,P,ae,he,ne,ye){this.indented=x,this.column=P,this.type=ae,this.prev=ne,this.info=ye,he!=null&&(this.align=he)}function D(x,P){if(!h)return!1;for(var ae=x.localVars;ae;ae=ae.next)if(ae.name==P)return!0;for(var he=x.context;he;he=he.prev)for(var ae=he.vars;ae;ae=ae.next)if(ae.name==P)return!0}function Q(x,P,ae,he,ne){var ye=x.cc;for(j.state=x,j.stream=ne,j.marked=null,j.cc=ye,j.style=P,x.lexical.hasOwnProperty("align")||(x.lexical.align=!0);;){var Xe=ye.length?ye.pop():s?Se:Oe;if(Xe(ae,he)){for(;ye.length&&ye[ye.length-1].lex;)ye.pop()();return j.marked?j.marked:ae=="variable"&&D(x,he)?"variable-2":P}}}var j={state:null,column:null,marked:null,cc:null};function V(){for(var x=arguments.length-1;x>=0;x--)j.cc.push(arguments[x])}function y(){return V.apply(null,arguments),!0}function K(x,P){for(var ae=P;ae;ae=ae.next)if(ae.name==x)return!0;return!1}function X(x){var P=j.state;if(j.marked="def",!!h){if(P.context){if(P.lexical.info=="var"&&P.context&&P.context.block){var ae=N(x,P.context);if(ae!=null){P.context=ae;return}}else if(!K(x,P.localVars)){P.localVars=new xe(x,P.localVars);return}}v.globalVars&&!K(x,P.globalVars)&&(P.globalVars=new xe(x,P.globalVars))}}function N(x,P){if(P)if(P.block){var ae=N(x,P.prev);return ae?ae==P.prev?P:new le(ae,P.vars,!0):null}else return K(x,P.vars)?P:new le(P.prev,new xe(x,P.vars),!1);else return null}function R(x){return x=="public"||x=="private"||x=="protected"||x=="abstract"||x=="readonly"}function le(x,P,ae){this.prev=x,this.vars=P,this.block=ae}function xe(x,P){this.name=x,this.next=P}var F=new xe("this",new xe("arguments",null));function L(){j.state.context=new le(j.state.context,j.state.localVars,!1),j.state.localVars=F}function de(){j.state.context=new le(j.state.context,j.state.localVars,!0),j.state.localVars=null}L.lex=de.lex=!0;function ze(){j.state.localVars=j.state.context.vars,j.state.context=j.state.context.prev}ze.lex=!0;function pe(x,P){var ae=function(){var he=j.state,ne=he.indented;if(he.lexical.type=="stat")ne=he.lexical.indented;else for(var ye=he.lexical;ye&&ye.type==")"&&ye.align;ye=ye.prev)ne=ye.indented;he.lexical=new I(ne,j.stream.column(),x,null,he.lexical,P)};return ae.lex=!0,ae}function Ee(){var x=j.state;x.lexical.prev&&(x.lexical.type==")"&&(x.indented=x.lexical.indented),x.lexical=x.lexical.prev)}Ee.lex=!0;function ge(x){function P(ae){return ae==x?y():x==";"||ae=="}"||ae==")"||ae=="]"?V():y(P)}return P}function Oe(x,P){return x=="var"?y(pe("vardef",P),Rr,ge(";"),Ee):x=="keyword a"?y(pe("form"),Ze,Oe,Ee):x=="keyword b"?y(pe("form"),Oe,Ee):x=="keyword d"?j.stream.match(/^\s*$/,!1)?y():y(pe("stat"),Je,ge(";"),Ee):x=="debugger"?y(ge(";")):x=="{"?y(pe("}"),de,De,Ee,ze):x==";"?y():x=="if"?(j.state.lexical.info=="else"&&j.state.cc[j.state.cc.length-1]==Ee&&j.state.cc.pop()(),y(pe("form"),Ze,Oe,Ee,Hr)):x=="function"?y(Ht):x=="for"?y(pe("form"),de,ei,Oe,ze,Ee):x=="class"||g&&P=="interface"?(j.marked="keyword",y(pe("form",x=="class"?x:P),Wr,Ee)):x=="variable"?g&&P=="declare"?(j.marked="keyword",y(Oe)):g&&(P=="module"||P=="enum"||P=="type")&&j.stream.match(/^\s*\w/,!1)?(j.marked="keyword",P=="enum"?y(Ae):P=="type"?y(ti,ge("operator"),Pe,ge(";")):y(pe("form"),Ct,ge("{"),pe("}"),De,Ee,Ee)):g&&P=="namespace"?(j.marked="keyword",y(pe("form"),Se,Oe,Ee)):g&&P=="abstract"?(j.marked="keyword",y(Oe)):y(pe("stat"),Ue):x=="switch"?y(pe("form"),Ze,ge("{"),pe("}","switch"),de,De,Ee,Ee,ze):x=="case"?y(Se,ge(":")):x=="default"?y(ge(":")):x=="catch"?y(pe("form"),L,qe,Oe,Ee,ze):x=="export"?y(pe("stat"),Ur,Ee):x=="import"?y(pe("stat"),gr,Ee):x=="async"?y(Oe):P=="@"?y(Se,Oe):V(pe("stat"),Se,ge(";"),Ee)}function qe(x){if(x=="(")return y($t,ge(")"))}function Se(x,P){return ke(x,P,!1)}function Be(x,P){return ke(x,P,!0)}function Ze(x){return x!="("?V():y(pe(")"),Je,ge(")"),Ee)}function ke(x,P,ae){if(j.state.fatArrowAt==j.stream.start){var he=ae?He:ce;if(x=="(")return y(L,pe(")"),H($t,")"),Ee,ge("=>"),he,ze);if(x=="variable")return V(L,Ct,ge("=>"),he,ze)}var ne=ae?Ge:Re;return q.hasOwnProperty(x)?y(ne):x=="function"?y(Ht,ne):x=="class"||g&&P=="interface"?(j.marked="keyword",y(pe("form"),to,Ee)):x=="keyword c"||x=="async"?y(ae?Be:Se):x=="("?y(pe(")"),Je,ge(")"),Ee,ne):x=="operator"||x=="spread"?y(ae?Be:Se):x=="["?y(pe("]"),at,Ee,ne):x=="{"?se(Me,"}",null,ne):x=="quasi"?V(U,ne):x=="new"?y(te(ae)):y()}function Je(x){return x.match(/[;\}\)\],]/)?V():V(Se)}function Re(x,P){return x==","?y(Je):Ge(x,P,!1)}function Ge(x,P,ae){var he=ae==!1?Re:Ge,ne=ae==!1?Se:Be;if(x=="=>")return y(L,ae?He:ce,ze);if(x=="operator")return/\+\+|--/.test(P)||g&&P=="!"?y(he):g&&P=="<"&&j.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/,!1)?y(pe(">"),H(Pe,">"),Ee,he):P=="?"?y(Se,ge(":"),ne):y(ne);if(x=="quasi")return V(U,he);if(x!=";"){if(x=="(")return se(Be,")","call",he);if(x==".")return y(we,he);if(x=="[")return y(pe("]"),Je,ge("]"),Ee,he);if(g&&P=="as")return j.marked="keyword",y(Pe,he);if(x=="regexp")return j.state.lastType=j.marked="operator",j.stream.backUp(j.stream.pos-j.stream.start-1),y(ne)}}function U(x,P){return x!="quasi"?V():P.slice(P.length-2)!="${"?y(U):y(Je,Z)}function Z(x){if(x=="}")return j.marked="string-2",j.state.tokenize=G,y(U)}function ce(x){return re(j.stream,j.state),V(x=="{"?Oe:Se)}function He(x){return re(j.stream,j.state),V(x=="{"?Oe:Be)}function te(x){return function(P){return P=="."?y(x?oe:fe):P=="variable"&&g?y(It,x?Ge:Re):V(x?Be:Se)}}function fe(x,P){if(P=="target")return j.marked="keyword",y(Re)}function oe(x,P){if(P=="target")return j.marked="keyword",y(Ge)}function Ue(x){return x==":"?y(Ee,Oe):V(Re,ge(";"),Ee)}function we(x){if(x=="variable")return j.marked="property",y()}function Me(x,P){if(x=="async")return j.marked="property",y(Me);if(x=="variable"||j.style=="keyword"){if(j.marked="property",P=="get"||P=="set")return y(Le);var ae;return g&&j.state.fatArrowAt==j.stream.start&&(ae=j.stream.match(/^\s*:\s*/,!1))&&(j.state.fatArrowAt=j.stream.pos+ae[0].length),y($)}else{if(x=="number"||x=="string")return j.marked=S?"property":j.style+" property",y($);if(x=="jsonld-keyword")return y($);if(g&&R(P))return j.marked="keyword",y(Me);if(x=="[")return y(Se,nt,ge("]"),$);if(x=="spread")return y(Be,$);if(P=="*")return j.marked="keyword",y(Me);if(x==":")return V($)}}function Le(x){return x!="variable"?V($):(j.marked="property",y(Ht))}function $(x){if(x==":")return y(Be);if(x=="(")return V(Ht)}function H(x,P,ae){function he(ne,ye){if(ae?ae.indexOf(ne)>-1:ne==","){var Xe=j.state.lexical;return Xe.info=="call"&&(Xe.pos=(Xe.pos||0)+1),y(function(pt,Et){return pt==P||Et==P?V():V(x)},he)}return ne==P||ye==P?y():ae&&ae.indexOf(";")>-1?V(x):y(ge(P))}return function(ne,ye){return ne==P||ye==P?y():V(x,he)}}function se(x,P,ae){for(var he=3;he"),Pe);if(x=="quasi")return V(_t,Rt)}function xt(x){if(x=="=>")return y(Pe)}function Ie(x){return x.match(/[\}\)\]]/)?y():x==","||x==";"?y(Ie):V(nr,Ie)}function nr(x,P){if(x=="variable"||j.style=="keyword")return j.marked="property",y(nr);if(P=="?"||x=="number"||x=="string")return y(nr);if(x==":")return y(Pe);if(x=="[")return y(ge("variable"),dt,ge("]"),nr);if(x=="(")return V(hr,nr);if(!x.match(/[;\}\)\],]/))return y()}function _t(x,P){return x!="quasi"?V():P.slice(P.length-2)!="${"?y(_t):y(Pe,it)}function it(x){if(x=="}")return j.marked="string-2",j.state.tokenize=G,y(_t)}function ot(x,P){return x=="variable"&&j.stream.match(/^\s*[?:]/,!1)||P=="?"?y(ot):x==":"?y(Pe):x=="spread"?y(ot):V(Pe)}function Rt(x,P){if(P=="<")return y(pe(">"),H(Pe,">"),Ee,Rt);if(P=="|"||x=="."||P=="&")return y(Pe);if(x=="[")return y(Pe,ge("]"),Rt);if(P=="extends"||P=="implements")return j.marked="keyword",y(Pe);if(P=="?")return y(Pe,ge(":"),Pe)}function It(x,P){if(P=="<")return y(pe(">"),H(Pe,">"),Ee,Rt)}function Wt(){return V(Pe,kt)}function kt(x,P){if(P=="=")return y(Pe)}function Rr(x,P){return P=="enum"?(j.marked="keyword",y(Ae)):V(Ct,nt,Ut,eo)}function Ct(x,P){if(g&&R(P))return j.marked="keyword",y(Ct);if(x=="variable")return X(P),y();if(x=="spread")return y(Ct);if(x=="[")return se(yn,"]");if(x=="{")return se(dr,"}")}function dr(x,P){return x=="variable"&&!j.stream.match(/^\s*:/,!1)?(X(P),y(Ut)):(x=="variable"&&(j.marked="property"),x=="spread"?y(Ct):x=="}"?V():x=="["?y(Se,ge("]"),ge(":"),dr):y(ge(":"),Ct,Ut))}function yn(){return V(Ct,Ut)}function Ut(x,P){if(P=="=")return y(Be)}function eo(x){if(x==",")return y(Rr)}function Hr(x,P){if(x=="keyword b"&&P=="else")return y(pe("form","else"),Oe,Ee)}function ei(x,P){if(P=="await")return y(ei);if(x=="(")return y(pe(")"),xn,Ee)}function xn(x){return x=="var"?y(Rr,pr):x=="variable"?y(pr):V(pr)}function pr(x,P){return x==")"?y():x==";"?y(pr):P=="in"||P=="of"?(j.marked="keyword",y(Se,pr)):V(Se,pr)}function Ht(x,P){if(P=="*")return j.marked="keyword",y(Ht);if(x=="variable")return X(P),y(Ht);if(x=="(")return y(L,pe(")"),H($t,")"),Ee,Pt,Oe,ze);if(g&&P=="<")return y(pe(">"),H(Wt,">"),Ee,Ht)}function hr(x,P){if(P=="*")return j.marked="keyword",y(hr);if(x=="variable")return X(P),y(hr);if(x=="(")return y(L,pe(")"),H($t,")"),Ee,Pt,ze);if(g&&P=="<")return y(pe(">"),H(Wt,">"),Ee,hr)}function ti(x,P){if(x=="keyword"||x=="variable")return j.marked="type",y(ti);if(P=="<")return y(pe(">"),H(Wt,">"),Ee)}function $t(x,P){return P=="@"&&y(Se,$t),x=="spread"?y($t):g&&R(P)?(j.marked="keyword",y($t)):g&&x=="this"?y(nt,Ut):V(Ct,nt,Ut)}function to(x,P){return x=="variable"?Wr(x,P):Kt(x,P)}function Wr(x,P){if(x=="variable")return X(P),y(Kt)}function Kt(x,P){if(P=="<")return y(pe(">"),H(Wt,">"),Ee,Kt);if(P=="extends"||P=="implements"||g&&x==",")return P=="implements"&&(j.marked="keyword"),y(g?Pe:Se,Kt);if(x=="{")return y(pe("}"),Gt,Ee)}function Gt(x,P){if(x=="async"||x=="variable"&&(P=="static"||P=="get"||P=="set"||g&&R(P))&&j.stream.match(/^\s+#?[\w$\xa1-\uffff]/,!1))return j.marked="keyword",y(Gt);if(x=="variable"||j.style=="keyword")return j.marked="property",y(Cr,Gt);if(x=="number"||x=="string")return y(Cr,Gt);if(x=="[")return y(Se,nt,ge("]"),Cr,Gt);if(P=="*")return j.marked="keyword",y(Gt);if(g&&x=="(")return V(hr,Gt);if(x==";"||x==",")return y(Gt);if(x=="}")return y();if(P=="@")return y(Se,Gt)}function Cr(x,P){if(P=="!"||P=="?")return y(Cr);if(x==":")return y(Pe,Ut);if(P=="=")return y(Be);var ae=j.state.lexical.prev,he=ae&&ae.info=="interface";return V(he?hr:Ht)}function Ur(x,P){return P=="*"?(j.marked="keyword",y(Gr,ge(";"))):P=="default"?(j.marked="keyword",y(Se,ge(";"))):x=="{"?y(H($r,"}"),Gr,ge(";")):V(Oe)}function $r(x,P){if(P=="as")return j.marked="keyword",y(ge("variable"));if(x=="variable")return V(Be,$r)}function gr(x){return x=="string"?y():x=="("?V(Se):x=="."?V(Re):V(Kr,Vt,Gr)}function Kr(x,P){return x=="{"?se(Kr,"}"):(x=="variable"&&X(P),P=="*"&&(j.marked="keyword"),y(_n))}function Vt(x){if(x==",")return y(Kr,Vt)}function _n(x,P){if(P=="as")return j.marked="keyword",y(Kr)}function Gr(x,P){if(P=="from")return j.marked="keyword",y(Se)}function at(x){return x=="]"?y():V(H(Be,"]"))}function Ae(){return V(pe("form"),Ct,ge("{"),pe("}"),H(ir,"}"),Ee,Ee)}function ir(){return V(Ct,Ut)}function kn(x,P){return x.lastType=="operator"||x.lastType==","||c.test(P.charAt(0))||/[,.]/.test(P.charAt(0))}function Bt(x,P,ae){return P.tokenize==W&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(P.lastType)||P.lastType=="quasi"&&/\{\s*$/.test(x.string.slice(0,x.pos-(ae||0)))}return{startState:function(x){var P={tokenize:W,lastType:"sof",cc:[],lexical:new I((x||0)-C,0,"block",!1),localVars:v.localVars,context:v.localVars&&new le(null,null,!1),indented:x||0};return v.globalVars&&typeof v.globalVars=="object"&&(P.globalVars=v.globalVars),P},token:function(x,P){if(x.sol()&&(P.lexical.hasOwnProperty("align")||(P.lexical.align=!1),P.indented=x.indentation(),re(x,P)),P.tokenize!=O&&x.eatSpace())return null;var ae=P.tokenize(x,P);return z=="comment"?ae:(P.lastType=z=="operator"&&(M=="++"||M=="--")?"incdec":z,Q(P,ae,z,M,x))},indent:function(x,P){if(x.tokenize==O||x.tokenize==G)return o.Pass;if(x.tokenize!=W)return 0;var ae=P&&P.charAt(0),he=x.lexical,ne;if(!/^\s*else\b/.test(P))for(var ye=x.cc.length-1;ye>=0;--ye){var Xe=x.cc[ye];if(Xe==Ee)he=he.prev;else if(Xe!=Hr&&Xe!=ze)break}for(;(he.type=="stat"||he.type=="form")&&(ae=="}"||(ne=x.cc[x.cc.length-1])&&(ne==Re||ne==Ge)&&!/^[,\.=+\-*:?[\(]/.test(P));)he=he.prev;b&&he.type==")"&&he.prev.type=="stat"&&(he=he.prev);var pt=he.type,Et=ae==pt;return pt=="vardef"?he.indented+(x.lastType=="operator"||x.lastType==","?he.info.length+1:0):pt=="form"&&ae=="{"?he.indented:pt=="form"?he.indented+C:pt=="stat"?he.indented+(kn(x,P)?b||C:0):he.info=="switch"&&!Et&&v.doubleIndentSwitch!=!1?he.indented+(/^(?:case|default)\b/.test(P)?C:2*C):he.align?he.column+(Et?0:1):he.indented+(Et?0:C)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:s?null:"/*",blockCommentEnd:s?null:"*/",blockCommentContinue:s?null:" * ",lineComment:s?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:s?"json":"javascript",jsonldMode:S,jsonMode:s,expressionAllowed:Bt,skipExpression:function(x){Q(x,"atom","atom","true",new o.StringStream("",2,null))}}}),o.registerHelper("wordChars","javascript",/[\w$]/),o.defineMIME("text/javascript","javascript"),o.defineMIME("text/ecmascript","javascript"),o.defineMIME("application/javascript","javascript"),o.defineMIME("application/x-javascript","javascript"),o.defineMIME("application/ecmascript","javascript"),o.defineMIME("application/json",{name:"javascript",json:!0}),o.defineMIME("application/x-json",{name:"javascript",json:!0}),o.defineMIME("application/manifest+json",{name:"javascript",json:!0}),o.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),o.defineMIME("text/typescript",{name:"javascript",typescript:!0}),o.defineMIME("application/typescript",{name:"javascript",typescript:!0})})});var Qn=Ke((Os,Ps)=>{(function(o){typeof Os=="object"&&typeof Ps=="object"?o(We(),mn(),vn(),gn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],o):o(CodeMirror)})(function(o){"use strict";var p={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};function v(T,w,c){var d=T.current(),k=d.search(w);return k>-1?T.backUp(d.length-k):d.match(/<\/?$/)&&(T.backUp(d.length),T.match(w,!1)||T.match(d)),c}var C={};function b(T){var w=C[T];return w||(C[T]=new RegExp("\\s+"+T+`\\s*=\\s*('|")?([^'"]+)('|")?\\s*`))}function S(T,w){var c=T.match(b(w));return c?/^\s*(.*?)\s*$/.exec(c[2])[1]:""}function s(T,w){return new RegExp((w?"^":"")+"","i")}function h(T,w){for(var c in T)for(var d=w[c]||(w[c]=[]),k=T[c],z=k.length-1;z>=0;z--)d.unshift(k[z])}function g(T,w){for(var c=0;c=0;M--)d.script.unshift(["type",z[M].matches,z[M].mode]);function _(W,E){var O=c.token(W,E.htmlState),G=/\btag\b/.test(O),J;if(G&&!/[<>\s\/]/.test(W.current())&&(J=E.htmlState.tagName&&E.htmlState.tagName.toLowerCase())&&d.hasOwnProperty(J))E.inTag=J+" ";else if(E.inTag&&G&&/>$/.test(W.current())){var re=/^([\S]+) (.*)/.exec(E.inTag);E.inTag=null;var q=W.current()==">"&&g(d[re[1]],re[2]),I=o.getMode(T,q),D=s(re[1],!0),Q=s(re[1],!1);E.token=function(j,V){return j.match(D,!1)?(V.token=_,V.localState=V.localMode=null,null):v(j,Q,V.localMode.token(j,V.localState))},E.localMode=I,E.localState=o.startState(I,c.indent(E.htmlState,"",""))}else E.inTag&&(E.inTag+=W.current(),W.eol()&&(E.inTag+=" "));return O}return{startState:function(){var W=o.startState(c);return{token:_,inTag:null,localMode:null,localState:null,htmlState:W}},copyState:function(W){var E;return W.localState&&(E=o.copyState(W.localMode,W.localState)),{token:W.token,inTag:W.inTag,localMode:W.localMode,localState:E,htmlState:o.copyState(c,W.htmlState)}},token:function(W,E){return E.token(W,E)},indent:function(W,E,O){return!W.localMode||/^\s*<\//.test(E)?c.indent(W.htmlState,E,O):W.localMode.indent?W.localMode.indent(W.localState,E,O):o.Pass},innerMode:function(W){return{state:W.localState||W.htmlState,mode:W.localMode||c}}}},"xml","javascript","css"),o.defineMIME("text/html","htmlmixed")})});var Rs=Ke((Bs,js)=>{(function(o){typeof Bs=="object"&&typeof js=="object"?o(We(),Qn(),Yn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../../addon/mode/overlay"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("django:inner",function(){var p=["block","endblock","for","endfor","true","false","filter","endfilter","loop","none","self","super","if","elif","endif","as","else","import","with","endwith","without","context","ifequal","endifequal","ifnotequal","endifnotequal","extends","include","load","comment","endcomment","empty","url","static","trans","blocktrans","endblocktrans","now","regroup","lorem","ifchanged","endifchanged","firstof","debug","cycle","csrf_token","autoescape","endautoescape","spaceless","endspaceless","ssi","templatetag","verbatim","endverbatim","widthratio"],v=["add","addslashes","capfirst","center","cut","date","default","default_if_none","dictsort","dictsortreversed","divisibleby","escape","escapejs","filesizeformat","first","floatformat","force_escape","get_digit","iriencode","join","last","length","length_is","linebreaks","linebreaksbr","linenumbers","ljust","lower","make_list","phone2numeric","pluralize","pprint","random","removetags","rjust","safe","safeseq","slice","slugify","stringformat","striptags","time","timesince","timeuntil","title","truncatechars","truncatechars_html","truncatewords","truncatewords_html","unordered_list","upper","urlencode","urlize","urlizetrunc","wordcount","wordwrap","yesno"],C=["==","!=","<",">","<=",">="],b=["in","not","or","and"];p=new RegExp("^\\b("+p.join("|")+")\\b"),v=new RegExp("^\\b("+v.join("|")+")\\b"),C=new RegExp("^\\b("+C.join("|")+")\\b"),b=new RegExp("^\\b("+b.join("|")+")\\b");function S(c,d){if(c.match("{{"))return d.tokenize=h,"tag";if(c.match("{%"))return d.tokenize=g,"tag";if(c.match("{#"))return d.tokenize=T,"comment";for(;c.next()!=null&&!c.match(/\{[{%#]/,!1););return null}function s(c,d){return function(k,z){if(!z.escapeNext&&k.eat(c))z.tokenize=d;else{z.escapeNext&&(z.escapeNext=!1);var M=k.next();M=="\\"&&(z.escapeNext=!0)}return"string"}}function h(c,d){if(d.waitDot){if(d.waitDot=!1,c.peek()!=".")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("."))return d.waitProperty=!0,"null";throw Error("Unexpected error while waiting for property.")}if(d.waitPipe){if(d.waitPipe=!1,c.peek()!="|")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("|"))return d.waitFilter=!0,"null";throw Error("Unexpected error while waiting for filter.")}return d.waitProperty&&(d.waitProperty=!1,c.match(/\b(\w+)\b/))?(d.waitDot=!0,d.waitPipe=!0,"property"):d.waitFilter&&(d.waitFilter=!1,c.match(v))?"variable-2":c.eatSpace()?(d.waitProperty=!1,"null"):c.match(/\b\d+(\.\d+)?\b/)?"number":c.match("'")?(d.tokenize=s("'",d.tokenize),"string"):c.match('"')?(d.tokenize=s('"',d.tokenize),"string"):c.match(/\b(\w+)\b/)&&!d.foundVariable?(d.waitDot=!0,d.waitPipe=!0,"variable"):c.match("}}")?(d.waitProperty=null,d.waitFilter=null,d.waitDot=null,d.waitPipe=null,d.tokenize=S,"tag"):(c.next(),"null")}function g(c,d){if(d.waitDot){if(d.waitDot=!1,c.peek()!=".")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("."))return d.waitProperty=!0,"null";throw Error("Unexpected error while waiting for property.")}if(d.waitPipe){if(d.waitPipe=!1,c.peek()!="|")return"null";if(c.match(/\.\W+/))return"error";if(c.eat("|"))return d.waitFilter=!0,"null";throw Error("Unexpected error while waiting for filter.")}if(d.waitProperty&&(d.waitProperty=!1,c.match(/\b(\w+)\b/)))return d.waitDot=!0,d.waitPipe=!0,"property";if(d.waitFilter&&(d.waitFilter=!1,c.match(v)))return"variable-2";if(c.eatSpace())return d.waitProperty=!1,"null";if(c.match(/\b\d+(\.\d+)?\b/))return"number";if(c.match("'"))return d.tokenize=s("'",d.tokenize),"string";if(c.match('"'))return d.tokenize=s('"',d.tokenize),"string";if(c.match(C))return"operator";if(c.match(b))return"keyword";var k=c.match(p);return k?(k[0]=="comment"&&(d.blockCommentTag=!0),"keyword"):c.match(/\b(\w+)\b/)?(d.waitDot=!0,d.waitPipe=!0,"variable"):c.match("%}")?(d.waitProperty=null,d.waitFilter=null,d.waitDot=null,d.waitPipe=null,d.blockCommentTag?(d.blockCommentTag=!1,d.tokenize=w):d.tokenize=S,"tag"):(c.next(),"null")}function T(c,d){return c.match(/^.*?#\}/)?d.tokenize=S:c.skipToEnd(),"comment"}function w(c,d){return c.match(/\{%\s*endcomment\s*%\}/,!1)?(d.tokenize=g,c.match("{%"),"tag"):(c.next(),"comment")}return{startState:function(){return{tokenize:S}},token:function(c,d){return d.tokenize(c,d)},blockCommentStart:"{% comment %}",blockCommentEnd:"{% endcomment %}"}}),o.defineMode("django",function(p){var v=o.getMode(p,"text/html"),C=o.getMode(p,"django:inner");return o.overlayMode(v,C)}),o.defineMIME("text/x-django","django")})});var Di=Ke((Hs,Ws)=>{(function(o){typeof Hs=="object"&&typeof Ws=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode=function(w,c){o.defineMode(w,function(d){return o.simpleMode(d,c)})},o.simpleMode=function(w,c){p(c,"start");var d={},k=c.meta||{},z=!1;for(var M in c)if(M!=k&&c.hasOwnProperty(M))for(var _=d[M]=[],W=c[M],E=0;E2&&O.token&&typeof O.token!="string"){for(var re=2;re-1)return o.Pass;var M=d.indent.length-1,_=w[d.state];e:for(;;){for(var W=0;W<_.length;W++){var E=_[W];if(E.data.dedent&&E.data.dedentIfLineStart!==!1){var O=E.regex.exec(k);if(O&&O[0]){M--,(E.next||E.push)&&(_=w[E.next||E.push]),k=k.slice(O[0].length);continue e}}}break}return M<0?0:d.indent[M]}}})});var Ks=Ke((Us,$s)=>{(function(o){typeof Us=="object"&&typeof $s=="object"?o(We(),Di()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple"],o):o(CodeMirror)})(function(o){"use strict";var p="from",v=new RegExp("^(\\s*)\\b("+p+")\\b","i"),C=["run","cmd","entrypoint","shell"],b=new RegExp("^(\\s*)("+C.join("|")+")(\\s+\\[)","i"),S="expose",s=new RegExp("^(\\s*)("+S+")(\\s+)","i"),h=["arg","from","maintainer","label","env","add","copy","volume","user","workdir","onbuild","stopsignal","healthcheck","shell"],g=[p,S].concat(C).concat(h),T="("+g.join("|")+")",w=new RegExp("^(\\s*)"+T+"(\\s*)(#.*)?$","i"),c=new RegExp("^(\\s*)"+T+"(\\s+)","i");o.defineSimpleMode("dockerfile",{start:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:v,token:[null,"keyword"],sol:!0,next:"from"},{regex:w,token:[null,"keyword",null,"error"],sol:!0},{regex:b,token:[null,"keyword",null],sol:!0,next:"array"},{regex:s,token:[null,"keyword",null],sol:!0,next:"expose"},{regex:c,token:[null,"keyword",null],sol:!0,next:"arguments"},{regex:/./,token:null}],from:[{regex:/\s*$/,token:null,next:"start"},{regex:/(\s*)(#.*)$/,token:[null,"error"],next:"start"},{regex:/(\s*\S+\s+)(as)/i,token:[null,"keyword"],next:"start"},{token:null,next:"start"}],single:[{regex:/(?:[^\\']|\\.)/,token:"string"},{regex:/'/,token:"string",pop:!0}],double:[{regex:/(?:[^\\"]|\\.)/,token:"string"},{regex:/"/,token:"string",pop:!0}],array:[{regex:/\]/,token:null,next:"start"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"}],expose:[{regex:/\d+$/,token:"number",next:"start"},{regex:/[^\d]+$/,token:null,next:"start"},{regex:/\d+/,token:"number"},{regex:/[^\d]+/,token:null},{token:null,next:"start"}],arguments:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:/"(?:[^\\"]|\\.)*"?$/,token:"string",next:"start"},{regex:/"/,token:"string",push:"double"},{regex:/'(?:[^\\']|\\.)*'?$/,token:"string",next:"start"},{regex:/'/,token:"string",push:"single"},{regex:/[^#"']+[\\`]$/,token:null},{regex:/[^#"']+$/,token:null,next:"start"},{regex:/[^#"']+/,token:null},{token:null,next:"start"}],meta:{lineComment:"#"}}),o.defineMIME("text/x-dockerfile","dockerfile")})});var Xs=Ke((Gs,Zs)=>{(function(o){typeof Gs=="object"&&typeof Zs=="object"?o(We()):typeof define=="function"&&define.amd?define(["../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-encrypted","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["asc","pgp","sig"]},{name:"ASN.1",mime:"text/x-ttcn-asn",mode:"asn.1",ext:["asn","asn1"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"Brainfuck",mime:"text/x-brainfuck",mode:"brainfuck",ext:["b","bf"]},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h","ino"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy","cbl"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp","cs"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj","cljc","cljx"]},{name:"ClojureScript",mime:"text/x-clojurescript",mode:"clojure",ext:["cljs"]},{name:"Closure Stylesheets (GSS)",mime:"text/x-gss",mode:"css",ext:["gss"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists\.txt$/},{name:"CoffeeScript",mimes:["application/vnd.coffeescript","text/coffeescript","text/x-coffeescript"],mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"Crystal",mime:"text/x-crystal",mode:"crystal",ext:["cr"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"edn",mime:"application/edn",mode:"clojure",ext:["edn"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Elm",mime:"text/x-elm",mode:"elm",ext:["elm"]},{name:"Embedded JavaScript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Esper",mime:"text/x-esper",mode:"sql"},{name:"Factor",mime:"text/x-factor",mode:"factor",ext:["factor"]},{name:"FCL",mime:"text/x-fcl",mode:"fcl"},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90","f95"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history)\.md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy","gradle"],file:/^Jenkinsfile$/},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haskell (Literate)",mime:"text/x-literate-haskell",mode:"haskell-literate",ext:["lhs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm","handlebars","hbs"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Pug",mime:"text/x-pug",mode:"pug",ext:["jade","pug"],alias:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"JSX",mime:"text/jsx",mode:"jsx",ext:["jsx"]},{name:"Jinja2",mime:"text/jinja2",mode:"jinja2",ext:["j2","jinja","jinja2"]},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"],alias:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"clike",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb","wl","wls"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps",ext:["mps"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"mbox",mime:"application/mbox",mode:"mbox",ext:["mbox"]},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NSIS",mime:"text/x-nsis",mode:"nsis",ext:["nsh","nsi"]},{name:"NTriples",mimes:["application/n-triples","application/n-quads","text/n-triples"],mode:"ntriples",ext:["nt","nq"]},{name:"Objective-C",mime:"text/x-objectivec",mode:"clike",ext:["m"],alias:["objective-c","objc"]},{name:"Objective-C++",mime:"text/x-objectivec++",mode:"clike",ext:["mm"],alias:["objective-c++","objc++"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Oz",mime:"text/x-oz",mode:"oz",ext:["oz"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mimes:["text/x-php","application/x-httpd-php","application/x-httpd-php-open"],mode:"php",ext:["php","php3","php4","php5","php7","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"PostgreSQL",mime:"text/x-pgsql",mode:"sql"},{name:"PowerShell",mime:"application/x-powershell",mode:"powershell",ext:["ps1","psd1","psm1"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"ProtoBuf",mime:"text/x-protobuf",mode:"protobuf",ext:["proto"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["BUILD","bzl","py","pyw"],file:/^(BUCK|BUILD)$/},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r","R"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"SAS",mime:"text/x-sas",mode:"sas",ext:["sas"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mimes:["text/x-sh","application/x-sh"],mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"],file:/^PKGBUILD$/},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"SML",mime:"text/x-sml",mode:"mllike",ext:["sml","sig","fun","smackspec"]},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"SQLite",mime:"text/x-sqlite",mode:"sql"},{name:"Squirrel",mime:"text/x-squirrel",mode:"clike",ext:["nut"]},{name:"Stylus",mime:"text/x-styl",mode:"stylus",ext:["styl"]},{name:"Swift",mime:"text/x-swift",mode:"swift",ext:["swift"]},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx","tex"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v","sv","svh"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"text/troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"TTCN",mime:"text/x-ttcn",mode:"ttcn",ext:["ttcn","ttcn3","ttcnpp"]},{name:"TTCN_CFG",mime:"text/x-ttcn-cfg",mode:"ttcn-cfg",ext:["cfg"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"TypeScript-JSX",mime:"text/typescript-jsx",mode:"jsx",ext:["tsx"],alias:["tsx"]},{name:"Twig",mime:"text/x-twig",mode:"twig"},{name:"Web IDL",mime:"text/x-webidl",mode:"webidl",ext:["webidl"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"VHDL",mime:"text/x-vhdl",mode:"vhdl",ext:["vhd","vhdl"]},{name:"Vue.js Component",mimes:["script/x-vue","text/x-vue"],mode:"vue",ext:["vue"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd","svg"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"Yacas",mime:"text/x-yacas",mode:"yacas",ext:["ys"]},{name:"YAML",mimes:["text/x-yaml","text/yaml"],mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]},{name:"mscgen",mime:"text/x-mscgen",mode:"mscgen",ext:["mscgen","mscin","msc"]},{name:"xu",mime:"text/x-xu",mode:"mscgen",ext:["xu"]},{name:"msgenny",mime:"text/x-msgenny",mode:"mscgen",ext:["msgenny"]},{name:"WebAssembly",mime:"text/webassembly",mode:"wast",ext:["wat","wast"]}];for(var p=0;p-1&&C.substring(s+1,C.length);if(h)return o.findModeByExtension(h)},o.findModeByName=function(C){C=C.toLowerCase();for(var b=0;b{(function(o){typeof Ys=="object"&&typeof Qs=="object"?o(We(),mn(),Xs()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../meta"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("markdown",function(p,v){var C=o.getMode(p,"text/html"),b=C.name=="null";function S(F){if(o.findModeByName){var L=o.findModeByName(F);L&&(F=L.mime||L.mimes[0])}var de=o.getMode(p,F);return de.name=="null"?null:de}v.highlightFormatting===void 0&&(v.highlightFormatting=!1),v.maxBlockquoteDepth===void 0&&(v.maxBlockquoteDepth=0),v.taskLists===void 0&&(v.taskLists=!1),v.strikethrough===void 0&&(v.strikethrough=!1),v.emoji===void 0&&(v.emoji=!1),v.fencedCodeBlockHighlighting===void 0&&(v.fencedCodeBlockHighlighting=!0),v.fencedCodeBlockDefaultMode===void 0&&(v.fencedCodeBlockDefaultMode="text/plain"),v.xml===void 0&&(v.xml=!0),v.tokenTypeOverrides===void 0&&(v.tokenTypeOverrides={});var s={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"image",imageAltText:"image-alt-text",imageMarker:"image-marker",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough",emoji:"builtin"};for(var h in s)s.hasOwnProperty(h)&&v.tokenTypeOverrides[h]&&(s[h]=v.tokenTypeOverrides[h]);var g=/^([*\-_])(?:\s*\1){2,}\s*$/,T=/^(?:[*\-+]|^[0-9]+([.)]))\s+/,w=/^\[(x| )\](?=\s)/i,c=v.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,d=/^ {0,3}(?:\={1,}|-{2,})\s*$/,k=/^[^#!\[\]*_\\<>` "'(~:]+/,z=/^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/,M=/^\s*\[[^\]]+?\]:.*$/,_=/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/,W=" ";function E(F,L,de){return L.f=L.inline=de,de(F,L)}function O(F,L,de){return L.f=L.block=de,de(F,L)}function G(F){return!F||!/\S/.test(F.string)}function J(F){if(F.linkTitle=!1,F.linkHref=!1,F.linkText=!1,F.em=!1,F.strong=!1,F.strikethrough=!1,F.quote=0,F.indentedCode=!1,F.f==q){var L=b;if(!L){var de=o.innerMode(C,F.htmlState);L=de.mode.name=="xml"&&de.state.tagStart===null&&!de.state.context&&de.state.tokenize.isInText}L&&(F.f=j,F.block=re,F.htmlState=null)}return F.trailingSpace=0,F.trailingSpaceNewLine=!1,F.prevLine=F.thisLine,F.thisLine={stream:null},null}function re(F,L){var de=F.column()===L.indentation,ze=G(L.prevLine.stream),pe=L.indentedCode,Ee=L.prevLine.hr,ge=L.list!==!1,Oe=(L.listStack[L.listStack.length-1]||0)+3;L.indentedCode=!1;var qe=L.indentation;if(L.indentationDiff===null&&(L.indentationDiff=L.indentation,ge)){for(L.list=null;qe=4&&(pe||L.prevLine.fencedCodeEnd||L.prevLine.header||ze))return F.skipToEnd(),L.indentedCode=!0,s.code;if(F.eatSpace())return null;if(de&&L.indentation<=Oe&&(Ze=F.match(c))&&Ze[1].length<=6)return L.quote=0,L.header=Ze[1].length,L.thisLine.header=!0,v.highlightFormatting&&(L.formatting="header"),L.f=L.inline,D(L);if(L.indentation<=Oe&&F.eat(">"))return L.quote=de?1:L.quote+1,v.highlightFormatting&&(L.formatting="quote"),F.eatSpace(),D(L);if(!Be&&!L.setext&&de&&L.indentation<=Oe&&(Ze=F.match(T))){var ke=Ze[1]?"ol":"ul";return L.indentation=qe+F.current().length,L.list=!0,L.quote=0,L.listStack.push(L.indentation),L.em=!1,L.strong=!1,L.code=!1,L.strikethrough=!1,v.taskLists&&F.match(w,!1)&&(L.taskList=!0),L.f=L.inline,v.highlightFormatting&&(L.formatting=["list","list-"+ke]),D(L)}else{if(de&&L.indentation<=Oe&&(Ze=F.match(z,!0)))return L.quote=0,L.fencedEndRE=new RegExp(Ze[1]+"+ *$"),L.localMode=v.fencedCodeBlockHighlighting&&S(Ze[2]||v.fencedCodeBlockDefaultMode),L.localMode&&(L.localState=o.startState(L.localMode)),L.f=L.block=I,v.highlightFormatting&&(L.formatting="code-block"),L.code=-1,D(L);if(L.setext||(!Se||!ge)&&!L.quote&&L.list===!1&&!L.code&&!Be&&!M.test(F.string)&&(Ze=F.lookAhead(1))&&(Ze=Ze.match(d)))return L.setext?(L.header=L.setext,L.setext=0,F.skipToEnd(),v.highlightFormatting&&(L.formatting="header")):(L.header=Ze[0].charAt(0)=="="?1:2,L.setext=L.header),L.thisLine.header=!0,L.f=L.inline,D(L);if(Be)return F.skipToEnd(),L.hr=!0,L.thisLine.hr=!0,s.hr;if(F.peek()==="[")return E(F,L,N)}return E(F,L,L.inline)}function q(F,L){var de=C.token(F,L.htmlState);if(!b){var ze=o.innerMode(C,L.htmlState);(ze.mode.name=="xml"&&ze.state.tagStart===null&&!ze.state.context&&ze.state.tokenize.isInText||L.md_inside&&F.current().indexOf(">")>-1)&&(L.f=j,L.block=re,L.htmlState=null)}return de}function I(F,L){var de=L.listStack[L.listStack.length-1]||0,ze=L.indentation=F.quote?L.push(s.formatting+"-"+F.formatting[de]+"-"+F.quote):L.push("error"))}if(F.taskOpen)return L.push("meta"),L.length?L.join(" "):null;if(F.taskClosed)return L.push("property"),L.length?L.join(" "):null;if(F.linkHref?L.push(s.linkHref,"url"):(F.strong&&L.push(s.strong),F.em&&L.push(s.em),F.strikethrough&&L.push(s.strikethrough),F.emoji&&L.push(s.emoji),F.linkText&&L.push(s.linkText),F.code&&L.push(s.code),F.image&&L.push(s.image),F.imageAltText&&L.push(s.imageAltText,"link"),F.imageMarker&&L.push(s.imageMarker)),F.header&&L.push(s.header,s.header+"-"+F.header),F.quote&&(L.push(s.quote),!v.maxBlockquoteDepth||v.maxBlockquoteDepth>=F.quote?L.push(s.quote+"-"+F.quote):L.push(s.quote+"-"+v.maxBlockquoteDepth)),F.list!==!1){var ze=(F.listStack.length-1)%3;ze?ze===1?L.push(s.list2):L.push(s.list3):L.push(s.list1)}return F.trailingSpaceNewLine?L.push("trailing-space-new-line"):F.trailingSpace&&L.push("trailing-space-"+(F.trailingSpace%2?"a":"b")),L.length?L.join(" "):null}function Q(F,L){if(F.match(k,!0))return D(L)}function j(F,L){var de=L.text(F,L);if(typeof de<"u")return de;if(L.list)return L.list=null,D(L);if(L.taskList){var ze=F.match(w,!0)[1]===" ";return ze?L.taskOpen=!0:L.taskClosed=!0,v.highlightFormatting&&(L.formatting="task"),L.taskList=!1,D(L)}if(L.taskOpen=!1,L.taskClosed=!1,L.header&&F.match(/^#+$/,!0))return v.highlightFormatting&&(L.formatting="header"),D(L);var pe=F.next();if(L.linkTitle){L.linkTitle=!1;var Ee=pe;pe==="("&&(Ee=")"),Ee=(Ee+"").replace(/([.?*+^\[\]\\(){}|-])/g,"\\$1");var ge="^\\s*(?:[^"+Ee+"\\\\]+|\\\\\\\\|\\\\.)"+Ee;if(F.match(new RegExp(ge),!0))return s.linkHref}if(pe==="`"){var Oe=L.formatting;v.highlightFormatting&&(L.formatting="code"),F.eatWhile("`");var qe=F.current().length;if(L.code==0&&(!L.quote||qe==1))return L.code=qe,D(L);if(qe==L.code){var Se=D(L);return L.code=0,Se}else return L.formatting=Oe,D(L)}else if(L.code)return D(L);if(pe==="\\"&&(F.next(),v.highlightFormatting)){var Be=D(L),Ze=s.formatting+"-escape";return Be?Be+" "+Ze:Ze}if(pe==="!"&&F.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return L.imageMarker=!0,L.image=!0,v.highlightFormatting&&(L.formatting="image"),D(L);if(pe==="["&&L.imageMarker&&F.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/,!1))return L.imageMarker=!1,L.imageAltText=!0,v.highlightFormatting&&(L.formatting="image"),D(L);if(pe==="]"&&L.imageAltText){v.highlightFormatting&&(L.formatting="image");var Be=D(L);return L.imageAltText=!1,L.image=!1,L.inline=L.f=y,Be}if(pe==="["&&!L.image)return L.linkText&&F.match(/^.*?\]/)||(L.linkText=!0,v.highlightFormatting&&(L.formatting="link")),D(L);if(pe==="]"&&L.linkText){v.highlightFormatting&&(L.formatting="link");var Be=D(L);return L.linkText=!1,L.inline=L.f=F.match(/\(.*?\)| ?\[.*?\]/,!1)?y:j,Be}if(pe==="<"&&F.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1)){L.f=L.inline=V,v.highlightFormatting&&(L.formatting="link");var Be=D(L);return Be?Be+=" ":Be="",Be+s.linkInline}if(pe==="<"&&F.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1)){L.f=L.inline=V,v.highlightFormatting&&(L.formatting="link");var Be=D(L);return Be?Be+=" ":Be="",Be+s.linkEmail}if(v.xml&&pe==="<"&&F.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i,!1)){var ke=F.string.indexOf(">",F.pos);if(ke!=-1){var Je=F.string.substring(F.start,ke);/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(Je)&&(L.md_inside=!0)}return F.backUp(1),L.htmlState=o.startState(C),O(F,L,q)}if(v.xml&&pe==="<"&&F.match(/^\/\w*?>/))return L.md_inside=!1,"tag";if(pe==="*"||pe==="_"){for(var Re=1,Ge=F.pos==1?" ":F.string.charAt(F.pos-2);Re<3&&F.eat(pe);)Re++;var U=F.peek()||" ",Z=!/\s/.test(U)&&(!_.test(U)||/\s/.test(Ge)||_.test(Ge)),ce=!/\s/.test(Ge)&&(!_.test(Ge)||/\s/.test(U)||_.test(U)),He=null,te=null;if(Re%2&&(!L.em&&Z&&(pe==="*"||!ce||_.test(Ge))?He=!0:L.em==pe&&ce&&(pe==="*"||!Z||_.test(U))&&(He=!1)),Re>1&&(!L.strong&&Z&&(pe==="*"||!ce||_.test(Ge))?te=!0:L.strong==pe&&ce&&(pe==="*"||!Z||_.test(U))&&(te=!1)),te!=null||He!=null){v.highlightFormatting&&(L.formatting=He==null?"strong":te==null?"em":"strong em"),He===!0&&(L.em=pe),te===!0&&(L.strong=pe);var Se=D(L);return He===!1&&(L.em=!1),te===!1&&(L.strong=!1),Se}}else if(pe===" "&&(F.eat("*")||F.eat("_"))){if(F.peek()===" ")return D(L);F.backUp(1)}if(v.strikethrough){if(pe==="~"&&F.eatWhile(pe)){if(L.strikethrough){v.highlightFormatting&&(L.formatting="strikethrough");var Se=D(L);return L.strikethrough=!1,Se}else if(F.match(/^[^\s]/,!1))return L.strikethrough=!0,v.highlightFormatting&&(L.formatting="strikethrough"),D(L)}else if(pe===" "&&F.match("~~",!0)){if(F.peek()===" ")return D(L);F.backUp(2)}}if(v.emoji&&pe===":"&&F.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)){L.emoji=!0,v.highlightFormatting&&(L.formatting="emoji");var fe=D(L);return L.emoji=!1,fe}return pe===" "&&(F.match(/^ +$/,!1)?L.trailingSpace++:L.trailingSpace&&(L.trailingSpaceNewLine=!0)),D(L)}function V(F,L){var de=F.next();if(de===">"){L.f=L.inline=j,v.highlightFormatting&&(L.formatting="link");var ze=D(L);return ze?ze+=" ":ze="",ze+s.linkInline}return F.match(/^[^>]+/,!0),s.linkInline}function y(F,L){if(F.eatSpace())return null;var de=F.next();return de==="("||de==="["?(L.f=L.inline=X(de==="("?")":"]"),v.highlightFormatting&&(L.formatting="link-string"),L.linkHref=!0,D(L)):"error"}var K={")":/^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,"]":/^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/};function X(F){return function(L,de){var ze=L.next();if(ze===F){de.f=de.inline=j,v.highlightFormatting&&(de.formatting="link-string");var pe=D(de);return de.linkHref=!1,pe}return L.match(K[F]),de.linkHref=!0,D(de)}}function N(F,L){return F.match(/^([^\]\\]|\\.)*\]:/,!1)?(L.f=R,F.next(),v.highlightFormatting&&(L.formatting="link"),L.linkText=!0,D(L)):E(F,L,j)}function R(F,L){if(F.match("]:",!0)){L.f=L.inline=le,v.highlightFormatting&&(L.formatting="link");var de=D(L);return L.linkText=!1,de}return F.match(/^([^\]\\]|\\.)+/,!0),s.linkText}function le(F,L){return F.eatSpace()?null:(F.match(/^[^\s]+/,!0),F.peek()===void 0?L.linkTitle=!0:F.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/,!0),L.f=L.inline=j,s.linkHref+" url")}var xe={startState:function(){return{f:re,prevLine:{stream:null},thisLine:{stream:null},block:re,htmlState:null,indentation:0,inline:j,text:Q,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,setext:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,emoji:!1,fencedEndRE:null}},copyState:function(F){return{f:F.f,prevLine:F.prevLine,thisLine:F.thisLine,block:F.block,htmlState:F.htmlState&&o.copyState(C,F.htmlState),indentation:F.indentation,localMode:F.localMode,localState:F.localMode?o.copyState(F.localMode,F.localState):null,inline:F.inline,text:F.text,formatting:!1,linkText:F.linkText,linkTitle:F.linkTitle,linkHref:F.linkHref,code:F.code,em:F.em,strong:F.strong,strikethrough:F.strikethrough,emoji:F.emoji,header:F.header,setext:F.setext,hr:F.hr,taskList:F.taskList,list:F.list,listStack:F.listStack.slice(0),quote:F.quote,indentedCode:F.indentedCode,trailingSpace:F.trailingSpace,trailingSpaceNewLine:F.trailingSpaceNewLine,md_inside:F.md_inside,fencedEndRE:F.fencedEndRE}},token:function(F,L){if(L.formatting=!1,F!=L.thisLine.stream){if(L.header=0,L.hr=!1,F.match(/^\s*$/,!0))return J(L),null;if(L.prevLine=L.thisLine,L.thisLine={stream:F},L.taskList=!1,L.trailingSpace=0,L.trailingSpaceNewLine=!1,!L.localState&&(L.f=L.block,L.f!=q)){var de=F.match(/^\s*/,!0)[0].replace(/\t/g,W).length;if(L.indentation=de,L.indentationDiff=null,de>0)return null}}return L.f(F,L)},innerMode:function(F){return F.block==q?{state:F.htmlState,mode:C}:F.localState?{state:F.localState,mode:F.localMode}:{state:F,mode:xe}},indent:function(F,L,de){return F.block==q&&C.indent?C.indent(F.htmlState,L,de):F.localState&&F.localMode.indent?F.localMode.indent(F.localState,L,de):o.Pass},blankLine:J,getType:D,blockCommentStart:"",closeBrackets:"()[]{}''\"\"``",fold:"markdown"};return xe},"xml"),o.defineMIME("text/markdown","markdown"),o.defineMIME("text/x-markdown","markdown")})});var eu=Ke((Vs,Js)=>{(function(o){typeof Vs=="object"&&typeof Js=="object"?o(We(),Jo(),Yn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../markdown/markdown","../../addon/mode/overlay"],o):o(CodeMirror)})(function(o){"use strict";var p=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i;o.defineMode("gfm",function(v,C){var b=0;function S(T){return T.code=!1,null}var s={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(T){return{code:T.code,codeBlock:T.codeBlock,ateSpace:T.ateSpace}},token:function(T,w){if(w.combineTokens=null,w.codeBlock)return T.match(/^```+/)?(w.codeBlock=!1,null):(T.skipToEnd(),null);if(T.sol()&&(w.code=!1),T.sol()&&T.match(/^```+/))return T.skipToEnd(),w.codeBlock=!0,null;if(T.peek()==="`"){T.next();var c=T.pos;T.eatWhile("`");var d=1+T.pos-c;return w.code?d===b&&(w.code=!1):(b=d,w.code=!0),null}else if(w.code)return T.next(),null;if(T.eatSpace())return w.ateSpace=!0,null;if((T.sol()||w.ateSpace)&&(w.ateSpace=!1,C.gitHubSpice!==!1)){if(T.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/))return w.combineTokens=!0,"link";if(T.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return w.combineTokens=!0,"link"}return T.match(p)&&T.string.slice(T.start-2,T.start)!="]("&&(T.start==0||/\W/.test(T.string.charAt(T.start-1)))?(w.combineTokens=!0,"link"):(T.next(),null)},blankLine:S},h={taskLists:!0,strikethrough:!0,emoji:!0};for(var g in C)h[g]=C[g];return h.name="markdown",o.overlayMode(o.getMode(v,h),s)},"markdown"),o.defineMIME("text/x-gfm","gfm")})});var nu=Ke((tu,ru)=>{(function(o){typeof tu=="object"&&typeof ru=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("go",function(p){var v=p.indentUnit,C={break:!0,case:!0,chan:!0,const:!0,continue:!0,default:!0,defer:!0,else:!0,fallthrough:!0,for:!0,func:!0,go:!0,goto:!0,if:!0,import:!0,interface:!0,map:!0,package:!0,range:!0,return:!0,select:!0,struct:!0,switch:!0,type:!0,var:!0,bool:!0,byte:!0,complex64:!0,complex128:!0,float32:!0,float64:!0,int8:!0,int16:!0,int32:!0,int64:!0,string:!0,uint8:!0,uint16:!0,uint32:!0,uint64:!0,int:!0,uint:!0,uintptr:!0,error:!0,rune:!0,any:!0,comparable:!0},b={true:!0,false:!0,iota:!0,nil:!0,append:!0,cap:!0,close:!0,complex:!0,copy:!0,delete:!0,imag:!0,len:!0,make:!0,new:!0,panic:!0,print:!0,println:!0,real:!0,recover:!0},S=/[+\-*&^%:=<>!|\/]/,s;function h(k,z){var M=k.next();if(M=='"'||M=="'"||M=="`")return z.tokenize=g(M),z.tokenize(k,z);if(/[\d\.]/.test(M))return M=="."?k.match(/^[0-9_]+([eE][\-+]?[0-9_]+)?/):M=="0"?k.match(/^[xX][0-9a-fA-F_]+/)||k.match(/^[0-7_]+/):k.match(/^[0-9_]*\.?[0-9_]*([eE][\-+]?[0-9_]+)?/),"number";if(/[\[\]{}\(\),;\:\.]/.test(M))return s=M,null;if(M=="/"){if(k.eat("*"))return z.tokenize=T,T(k,z);if(k.eat("/"))return k.skipToEnd(),"comment"}if(S.test(M))return k.eatWhile(S),"operator";k.eatWhile(/[\w\$_\xa1-\uffff]/);var _=k.current();return C.propertyIsEnumerable(_)?((_=="case"||_=="default")&&(s="case"),"keyword"):b.propertyIsEnumerable(_)?"atom":"variable"}function g(k){return function(z,M){for(var _=!1,W,E=!1;(W=z.next())!=null;){if(W==k&&!_){E=!0;break}_=!_&&k!="`"&&W=="\\"}return(E||!(_||k=="`"))&&(M.tokenize=h),"string"}}function T(k,z){for(var M=!1,_;_=k.next();){if(_=="/"&&M){z.tokenize=h;break}M=_=="*"}return"comment"}function w(k,z,M,_,W){this.indented=k,this.column=z,this.type=M,this.align=_,this.prev=W}function c(k,z,M){return k.context=new w(k.indented,z,M,null,k.context)}function d(k){if(k.context.prev){var z=k.context.type;return(z==")"||z=="]"||z=="}")&&(k.indented=k.context.indented),k.context=k.context.prev}}return{startState:function(k){return{tokenize:null,context:new w((k||0)-v,0,"top",!1),indented:0,startOfLine:!0}},token:function(k,z){var M=z.context;if(k.sol()&&(M.align==null&&(M.align=!1),z.indented=k.indentation(),z.startOfLine=!0,M.type=="case"&&(M.type="}")),k.eatSpace())return null;s=null;var _=(z.tokenize||h)(k,z);return _=="comment"||(M.align==null&&(M.align=!0),s=="{"?c(z,k.column(),"}"):s=="["?c(z,k.column(),"]"):s=="("?c(z,k.column(),")"):s=="case"?M.type="case":(s=="}"&&M.type=="}"||s==M.type)&&d(z),z.startOfLine=!1),_},indent:function(k,z){if(k.tokenize!=h&&k.tokenize!=null)return o.Pass;var M=k.context,_=z&&z.charAt(0);if(M.type=="case"&&/^(?:case|default)\b/.test(z))return k.context.type="}",M.indented;var W=_==M.type;return M.align?M.column+(W?0:1):M.indented+(W?0:v)},electricChars:"{}):",closeBrackets:"()[]{}''\"\"``",fold:"brace",blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//"}}),o.defineMIME("text/x-go","go")})});var au=Ke((iu,ou)=>{(function(o){typeof iu=="object"&&typeof ou=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("http",function(){function p(T,w){return T.skipToEnd(),w.cur=h,"error"}function v(T,w){return T.match(/^HTTP\/\d\.\d/)?(w.cur=C,"keyword"):T.match(/^[A-Z]+/)&&/[ \t]/.test(T.peek())?(w.cur=S,"keyword"):p(T,w)}function C(T,w){var c=T.match(/^\d+/);if(!c)return p(T,w);w.cur=b;var d=Number(c[0]);return d>=100&&d<200?"positive informational":d>=200&&d<300?"positive success":d>=300&&d<400?"positive redirect":d>=400&&d<500?"negative client-error":d>=500&&d<600?"negative server-error":"error"}function b(T,w){return T.skipToEnd(),w.cur=h,null}function S(T,w){return T.eatWhile(/\S/),w.cur=s,"string-2"}function s(T,w){return T.match(/^HTTP\/\d\.\d$/)?(w.cur=h,"keyword"):p(T,w)}function h(T){return T.sol()&&!T.eat(/[ \t]/)?T.match(/^.*?:/)?"atom":(T.skipToEnd(),"error"):(T.skipToEnd(),"string")}function g(T){return T.skipToEnd(),null}return{token:function(T,w){var c=w.cur;return c!=h&&c!=g&&T.eatSpace()?null:c(T,w)},blankLine:function(T){T.cur=g},startState:function(){return{cur:v}}}}),o.defineMIME("message/http","http")})});var uu=Ke((lu,su)=>{(function(o){typeof lu=="object"&&typeof su=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("jinja2",function(){var p=["and","as","block","endblock","by","cycle","debug","else","elif","extends","filter","endfilter","firstof","do","for","endfor","if","endif","ifchanged","endifchanged","ifequal","endifequal","ifnotequal","set","raw","endraw","endifnotequal","in","include","load","not","now","or","parsed","regroup","reversed","spaceless","call","endcall","macro","endmacro","endspaceless","ssi","templatetag","openblock","closeblock","openvariable","closevariable","without","context","openbrace","closebrace","opencomment","closecomment","widthratio","url","with","endwith","get_current_language","trans","endtrans","noop","blocktrans","endblocktrans","get_available_languages","get_current_language_bidi","pluralize","autoescape","endautoescape"],v=/^[+\-*&%=<>!?|~^]/,C=/^[:\[\(\{]/,b=["true","false"],S=/^(\d[+\-\*\/])?\d+(\.\d+)?/;p=new RegExp("(("+p.join(")|(")+"))\\b"),b=new RegExp("(("+b.join(")|(")+"))\\b");function s(h,g){var T=h.peek();if(g.incomment)return h.skipTo("#}")?(h.eatWhile(/\#|}/),g.incomment=!1):h.skipToEnd(),"comment";if(g.intag){if(g.operator){if(g.operator=!1,h.match(b))return"atom";if(h.match(S))return"number"}if(g.sign){if(g.sign=!1,h.match(b))return"atom";if(h.match(S))return"number"}if(g.instring)return T==g.instring&&(g.instring=!1),h.next(),"string";if(T=="'"||T=='"')return g.instring=T,h.next(),"string";if(g.inbraces>0&&T==")")h.next(),g.inbraces--;else if(T=="(")h.next(),g.inbraces++;else if(g.inbrackets>0&&T=="]")h.next(),g.inbrackets--;else if(T=="[")h.next(),g.inbrackets++;else{if(!g.lineTag&&(h.match(g.intag+"}")||h.eat("-")&&h.match(g.intag+"}")))return g.intag=!1,"tag";if(h.match(v))return g.operator=!0,"operator";if(h.match(C))g.sign=!0;else{if(h.column()==1&&g.lineTag&&h.match(p))return"keyword";if(h.eat(" ")||h.sol()){if(h.match(p))return"keyword";if(h.match(b))return"atom";if(h.match(S))return"number";h.sol()&&h.next()}else h.next()}}return"variable"}else if(h.eat("{")){if(h.eat("#"))return g.incomment=!0,h.skipTo("#}")?(h.eatWhile(/\#|}/),g.incomment=!1):h.skipToEnd(),"comment";if(T=h.eat(/\{|%/))return g.intag=T,g.inbraces=0,g.inbrackets=0,T=="{"&&(g.intag="}"),h.eat("-"),"tag"}else if(h.eat("#")){if(h.peek()=="#")return h.skipToEnd(),"comment";if(!h.eol())return g.intag=!0,g.lineTag=!0,g.inbraces=0,g.inbrackets=0,"tag"}h.next()}return{startState:function(){return{tokenize:s,inbrackets:0,inbraces:0}},token:function(h,g){var T=g.tokenize(h,g);return h.eol()&&g.lineTag&&!g.instring&&g.inbraces==0&&g.inbrackets==0&&(g.intag=!1,g.lineTag=!1),T},blockCommentStart:"{#",blockCommentEnd:"#}",lineComment:"##"}}),o.defineMIME("text/jinja2","jinja2")})});var du=Ke((cu,fu)=>{(function(o){typeof cu=="object"&&typeof fu=="object"?o(We(),mn(),vn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript"],o):o(CodeMirror)})(function(o){"use strict";function p(C,b,S,s){this.state=C,this.mode=b,this.depth=S,this.prev=s}function v(C){return new p(o.copyState(C.mode,C.state),C.mode,C.depth,C.prev&&v(C.prev))}o.defineMode("jsx",function(C,b){var S=o.getMode(C,{name:"xml",allowMissing:!0,multilineTagIndentPastTag:!1,allowMissingTagName:!0}),s=o.getMode(C,b&&b.base||"javascript");function h(c){var d=c.tagName;c.tagName=null;var k=S.indent(c,"","");return c.tagName=d,k}function g(c,d){return d.context.mode==S?T(c,d,d.context):w(c,d,d.context)}function T(c,d,k){if(k.depth==2)return c.match(/^.*?\*\//)?k.depth=1:c.skipToEnd(),"comment";if(c.peek()=="{"){S.skipAttribute(k.state);var z=h(k.state),M=k.state.context;if(M&&c.match(/^[^>]*>\s*$/,!1)){for(;M.prev&&!M.startOfLine;)M=M.prev;M.startOfLine?z-=C.indentUnit:k.prev.state.lexical&&(z=k.prev.state.lexical.indented)}else k.depth==1&&(z+=C.indentUnit);return d.context=new p(o.startState(s,z),s,0,d.context),null}if(k.depth==1){if(c.peek()=="<")return S.skipAttribute(k.state),d.context=new p(o.startState(S,h(k.state)),S,0,d.context),null;if(c.match("//"))return c.skipToEnd(),"comment";if(c.match("/*"))return k.depth=2,g(c,d)}var _=S.token(c,k.state),W=c.current(),E;return/\btag\b/.test(_)?/>$/.test(W)?k.state.context?k.depth=0:d.context=d.context.prev:/^-1&&c.backUp(W.length-E),_}function w(c,d,k){if(c.peek()=="<"&&!c.match(/^<([^<>]|<[^>]*>)+,\s*>/,!1)&&s.expressionAllowed(c,k.state))return d.context=new p(o.startState(S,s.indent(k.state,"","")),S,0,d.context),s.skipExpression(k.state),null;var z=s.token(c,k.state);if(!z&&k.depth!=null){var M=c.current();M=="{"?k.depth++:M=="}"&&--k.depth==0&&(d.context=d.context.prev)}return z}return{startState:function(){return{context:new p(o.startState(s),s)}},copyState:function(c){return{context:v(c.context)}},token:g,indent:function(c,d,k){return c.context.mode.indent(c.context.state,d,k)},innerMode:function(c){return c.context}}},"xml","javascript"),o.defineMIME("text/jsx","jsx"),o.defineMIME("text/typescript-jsx",{name:"jsx",base:{name:"javascript",typescript:!0}})})});var gu=Ke((pu,hu)=>{(function(o){typeof pu=="object"&&typeof hu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("nginx",function(p){function v(k){for(var z={},M=k.split(" "),_=0;_*\/]/.test(_)?g(null,"select-op"):/[;{}:\[\]]/.test(_)?g(null,_):(k.eatWhile(/[\w\\\-]/),g("variable","variable"))}function w(k,z){for(var M=!1,_;(_=k.next())!=null;){if(M&&_=="/"){z.tokenize=T;break}M=_=="*"}return g("comment","comment")}function c(k,z){for(var M=0,_;(_=k.next())!=null;){if(M>=2&&_==">"){z.tokenize=T;break}M=_=="-"?M+1:0}return g("comment","comment")}function d(k){return function(z,M){for(var _=!1,W;(W=z.next())!=null&&!(W==k&&!_);)_=!_&&W=="\\";return _||(M.tokenize=T),g("string","string")}}return{startState:function(k){return{tokenize:T,baseIndent:k||0,stack:[]}},token:function(k,z){if(k.eatSpace())return null;h=null;var M=z.tokenize(k,z),_=z.stack[z.stack.length-1];return h=="hash"&&_=="rule"?M="atom":M=="variable"&&(_=="rule"?M="number":(!_||_=="@media{")&&(M="tag")),_=="rule"&&/^[\{\};]$/.test(h)&&z.stack.pop(),h=="{"?_=="@media"?z.stack[z.stack.length-1]="@media{":z.stack.push("{"):h=="}"?z.stack.pop():h=="@media"?z.stack.push("@media"):_=="{"&&h!="comment"&&z.stack.push("rule"),M},indent:function(k,z){var M=k.stack.length;return/^\}/.test(z)&&(M-=k.stack[k.stack.length-1]=="rule"?2:1),k.baseIndent+M*s},electricChars:"}"}}),o.defineMIME("text/x-nginx-conf","nginx")})});var bu=Ke((mu,vu)=>{(function(o){typeof mu=="object"&&typeof vu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("pascal",function(){function p(T){for(var w={},c=T.split(" "),d=0;d!?|\/]/;function S(T,w){var c=T.next();if(c=="#"&&w.startOfLine)return T.skipToEnd(),"meta";if(c=='"'||c=="'")return w.tokenize=s(c),w.tokenize(T,w);if(c=="("&&T.eat("*"))return w.tokenize=h,h(T,w);if(c=="{")return w.tokenize=g,g(T,w);if(/[\[\]\(\),;\:\.]/.test(c))return null;if(/\d/.test(c))return T.eatWhile(/[\w\.]/),"number";if(c=="/"&&T.eat("/"))return T.skipToEnd(),"comment";if(b.test(c))return T.eatWhile(b),"operator";T.eatWhile(/[\w\$_]/);var d=T.current().toLowerCase();return v.propertyIsEnumerable(d)?"keyword":C.propertyIsEnumerable(d)?"atom":"variable"}function s(T){return function(w,c){for(var d=!1,k,z=!1;(k=w.next())!=null;){if(k==T&&!d){z=!0;break}d=!d&&k=="\\"}return(z||!d)&&(c.tokenize=null),"string"}}function h(T,w){for(var c=!1,d;d=T.next();){if(d==")"&&c){w.tokenize=null;break}c=d=="*"}return"comment"}function g(T,w){for(var c;c=T.next();)if(c=="}"){w.tokenize=null;break}return"comment"}return{startState:function(){return{tokenize:null}},token:function(T,w){if(T.eatSpace())return null;var c=(w.tokenize||S)(T,w);return c=="comment"||c=="meta",c},electricChars:"{}"}}),o.defineMIME("text/x-pascal","pascal")})});var _u=Ke((yu,xu)=>{(function(o){typeof yu=="object"&&typeof xu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("perl",function(){var S={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,if:[1,1],elsif:[1,1],else:[1,1],while:[1,1],unless:[1,1],for:[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,break:1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,continue:[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,default:1,defined:1,delete:1,die:1,do:1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,goto:1,grep:1,hex:1,import:1,index:1,int:1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,new:1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,package:1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,return:1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,y:null},s="string-2",h=/[goseximacplud]/;function g(c,d,k,z,M){return d.chain=null,d.style=null,d.tail=null,d.tokenize=function(_,W){for(var E=!1,O,G=0;O=_.next();){if(O===k[G]&&!E)return k[++G]!==void 0?(W.chain=k[G],W.style=z,W.tail=M):M&&_.eatWhile(M),W.tokenize=w,z;E=!E&&O=="\\"}return z},d.tokenize(c,d)}function T(c,d,k){return d.tokenize=function(z,M){return z.string==k&&(M.tokenize=w),z.skipToEnd(),"string"},d.tokenize(c,d)}function w(c,d){if(c.eatSpace())return null;if(d.chain)return g(c,d,d.chain,d.style,d.tail);if(c.match(/^(\-?((\d[\d_]*)?\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F_]+|0b[01_]+|\d[\d_]*(e[+-]?\d+)?)/))return"number";if(c.match(/^<<(?=[_a-zA-Z])/))return c.eatWhile(/\w/),T(c,d,c.current().substr(2));if(c.sol()&&c.match(/^\=item(?!\w)/))return T(c,d,"=cut");var k=c.next();if(k=='"'||k=="'"){if(v(c,3)=="<<"+k){var z=c.pos;c.eatWhile(/\w/);var M=c.current().substr(1);if(M&&c.eat(k))return T(c,d,M);c.pos=z}return g(c,d,[k],"string")}if(k=="q"){var _=p(c,-2);if(!(_&&/\w/.test(_))){if(_=p(c,0),_=="x"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],s,h);if(_=="[")return b(c,2),g(c,d,["]"],s,h);if(_=="{")return b(c,2),g(c,d,["}"],s,h);if(_=="<")return b(c,2),g(c,d,[">"],s,h);if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],s,h)}else if(_=="q"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],"string");if(_=="[")return b(c,2),g(c,d,["]"],"string");if(_=="{")return b(c,2),g(c,d,["}"],"string");if(_=="<")return b(c,2),g(c,d,[">"],"string");if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],"string")}else if(_=="w"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],"bracket");if(_=="[")return b(c,2),g(c,d,["]"],"bracket");if(_=="{")return b(c,2),g(c,d,["}"],"bracket");if(_=="<")return b(c,2),g(c,d,[">"],"bracket");if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],"bracket")}else if(_=="r"){if(_=p(c,1),_=="(")return b(c,2),g(c,d,[")"],s,h);if(_=="[")return b(c,2),g(c,d,["]"],s,h);if(_=="{")return b(c,2),g(c,d,["}"],s,h);if(_=="<")return b(c,2),g(c,d,[">"],s,h);if(/[\^'"!~\/]/.test(_))return b(c,1),g(c,d,[c.eat(_)],s,h)}else if(/[\^'"!~\/(\[{<]/.test(_)){if(_=="(")return b(c,1),g(c,d,[")"],"string");if(_=="[")return b(c,1),g(c,d,["]"],"string");if(_=="{")return b(c,1),g(c,d,["}"],"string");if(_=="<")return b(c,1),g(c,d,[">"],"string");if(/[\^'"!~\/]/.test(_))return g(c,d,[c.eat(_)],"string")}}}if(k=="m"){var _=p(c,-2);if(!(_&&/\w/.test(_))&&(_=c.eat(/[(\[{<\^'"!~\/]/),_)){if(/[\^'"!~\/]/.test(_))return g(c,d,[_],s,h);if(_=="(")return g(c,d,[")"],s,h);if(_=="[")return g(c,d,["]"],s,h);if(_=="{")return g(c,d,["}"],s,h);if(_=="<")return g(c,d,[">"],s,h)}}if(k=="s"){var _=/[\/>\]})\w]/.test(p(c,-2));if(!_&&(_=c.eat(/[(\[{<\^'"!~\/]/),_))return _=="["?g(c,d,["]","]"],s,h):_=="{"?g(c,d,["}","}"],s,h):_=="<"?g(c,d,[">",">"],s,h):_=="("?g(c,d,[")",")"],s,h):g(c,d,[_,_],s,h)}if(k=="y"){var _=/[\/>\]})\w]/.test(p(c,-2));if(!_&&(_=c.eat(/[(\[{<\^'"!~\/]/),_))return _=="["?g(c,d,["]","]"],s,h):_=="{"?g(c,d,["}","}"],s,h):_=="<"?g(c,d,[">",">"],s,h):_=="("?g(c,d,[")",")"],s,h):g(c,d,[_,_],s,h)}if(k=="t"){var _=/[\/>\]})\w]/.test(p(c,-2));if(!_&&(_=c.eat("r"),_&&(_=c.eat(/[(\[{<\^'"!~\/]/),_)))return _=="["?g(c,d,["]","]"],s,h):_=="{"?g(c,d,["}","}"],s,h):_=="<"?g(c,d,[">",">"],s,h):_=="("?g(c,d,[")",")"],s,h):g(c,d,[_,_],s,h)}if(k=="`")return g(c,d,[k],"variable-2");if(k=="/")return/~\s*$/.test(v(c))?g(c,d,[k],s,h):"operator";if(k=="$"){var z=c.pos;if(c.eatWhile(/\d/)||c.eat("{")&&c.eatWhile(/\d/)&&c.eat("}"))return"variable-2";c.pos=z}if(/[$@%]/.test(k)){var z=c.pos;if(c.eat("^")&&c.eat(/[A-Z]/)||!/[@$%&]/.test(p(c,-2))&&c.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var _=c.current();if(S[_])return"variable-2"}c.pos=z}if(/[$@%&]/.test(k)&&(c.eatWhile(/[\w$]/)||c.eat("{")&&c.eatWhile(/[\w$]/)&&c.eat("}"))){var _=c.current();return S[_]?"variable-2":"variable"}if(k=="#"&&p(c,-2)!="$")return c.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(k)){var z=c.pos;if(c.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),S[c.current()])return"operator";c.pos=z}if(k=="_"&&c.pos==1){if(C(c,6)=="_END__")return g(c,d,["\0"],"comment");if(C(c,7)=="_DATA__")return g(c,d,["\0"],"variable-2");if(C(c,7)=="_C__")return g(c,d,["\0"],"string")}if(/\w/.test(k)){var z=c.pos;if(p(c,-2)=="{"&&(p(c,0)=="}"||c.eatWhile(/\w/)&&p(c,0)=="}"))return"string";c.pos=z}if(/[A-Z]/.test(k)){var W=p(c,-2),z=c.pos;if(c.eatWhile(/[A-Z_]/),/[\da-z]/.test(p(c,0)))c.pos=z;else{var _=S[c.current()];return _?(_[1]&&(_=_[0]),W!=":"?_==1?"keyword":_==2?"def":_==3?"atom":_==4?"operator":_==5?"variable-2":"meta":"meta"):"meta"}}if(/[a-zA-Z_]/.test(k)){var W=p(c,-2);c.eatWhile(/\w/);var _=S[c.current()];return _?(_[1]&&(_=_[0]),W!=":"?_==1?"keyword":_==2?"def":_==3?"atom":_==4?"operator":_==5?"variable-2":"meta":"meta"):"meta"}return null}return{startState:function(){return{tokenize:w,chain:null,style:null,tail:null}},token:function(c,d){return(d.tokenize||w)(c,d)},lineComment:"#"}}),o.registerHelper("wordChars","perl",/[\w$]/),o.defineMIME("text/x-perl","perl");function p(S,s){return S.string.charAt(S.pos+(s||0))}function v(S,s){if(s){var h=S.pos-s;return S.string.substr(h>=0?h:0,s)}else return S.string.substr(0,S.pos-1)}function C(S,s){var h=S.string.length,g=h-S.pos+1;return S.string.substr(S.pos,s&&s=(g=S.string.length-1)?S.pos=g:S.pos=h}})});var Su=Ke((ku,wu)=>{(function(o){typeof ku=="object"&&typeof wu=="object"?o(We(),Qn(),Vo()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../clike/clike"],o):o(CodeMirror)})(function(o){"use strict";function p(T){for(var w={},c=T.split(" "),d=0;d\w/,!1)&&(w.tokenize=v([[["->",null]],[[/[\w]+/,"variable"]]],c,d)),"variable-2";for(var k=!1;!T.eol()&&(k||d===!1||!T.match("{$",!1)&&!T.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/,!1));){if(!k&&T.match(c)){w.tokenize=null,w.tokStack.pop(),w.tokStack.pop();break}k=T.next()=="\\"&&!k}return"string"}var S="abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally readonly match",s="true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__",h="func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";o.registerHelper("hintWords","php",[S,s,h].join(" ").split(" ")),o.registerHelper("wordChars","php",/[\w$]/);var g={name:"clike",helperType:"php",keywords:p(S),blockKeywords:p("catch do else elseif for foreach if switch try while finally"),defKeywords:p("class enum function interface namespace trait"),atoms:p(s),builtin:p(h),multiLineStrings:!0,hooks:{$:function(T){return T.eatWhile(/[\w\$_]/),"variable-2"},"<":function(T,w){var c;if(c=T.match(/^<<\s*/)){var d=T.eat(/['"]/);T.eatWhile(/[\w\.]/);var k=T.current().slice(c[0].length+(d?2:1));if(d&&T.eat(d),k)return(w.tokStack||(w.tokStack=[])).push(k,0),w.tokenize=C(k,d!="'"),"string"}return!1},"#":function(T){for(;!T.eol()&&!T.match("?>",!1);)T.next();return"comment"},"/":function(T){if(T.eat("/")){for(;!T.eol()&&!T.match("?>",!1);)T.next();return"comment"}return!1},'"':function(T,w){return(w.tokStack||(w.tokStack=[])).push('"',0),w.tokenize=C('"'),"string"},"{":function(T,w){return w.tokStack&&w.tokStack.length&&w.tokStack[w.tokStack.length-1]++,!1},"}":function(T,w){return w.tokStack&&w.tokStack.length>0&&!--w.tokStack[w.tokStack.length-1]&&(w.tokenize=C(w.tokStack[w.tokStack.length-2])),!1}}};o.defineMode("php",function(T,w){var c=o.getMode(T,w&&w.htmlMode||"text/html"),d=o.getMode(T,g);function k(z,M){var _=M.curMode==d;if(z.sol()&&M.pending&&M.pending!='"'&&M.pending!="'"&&(M.pending=null),_)return _&&M.php.tokenize==null&&z.match("?>")?(M.curMode=c,M.curState=M.html,M.php.context.prev||(M.php=null),"meta"):d.token(z,M.curState);if(z.match(/^<\?\w*/))return M.curMode=d,M.php||(M.php=o.startState(d,c.indent(M.html,"",""))),M.curState=M.php,"meta";if(M.pending=='"'||M.pending=="'"){for(;!z.eol()&&z.next()!=M.pending;);var W="string"}else if(M.pending&&z.pos/.test(E)?M.pending=G[0]:M.pending={end:z.pos,style:W},z.backUp(E.length-O)),W}return{startState:function(){var z=o.startState(c),M=w.startOpen?o.startState(d):null;return{html:z,php:M,curMode:w.startOpen?d:c,curState:w.startOpen?M:z,pending:null}},copyState:function(z){var M=z.html,_=o.copyState(c,M),W=z.php,E=W&&o.copyState(d,W),O;return z.curMode==c?O=_:O=E,{html:_,php:E,curMode:z.curMode,curState:O,pending:z.pending}},token:k,indent:function(z,M,_){return z.curMode!=d&&/^\s*<\//.test(M)||z.curMode==d&&/^\?>/.test(M)?c.indent(z.html,M,_):z.curMode.indent(z.curState,M,_)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(z){return{state:z.curState,mode:z.curMode}}}},"htmlmixed","clike"),o.defineMIME("application/x-httpd-php","php"),o.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:!0}),o.defineMIME("text/x-php",g)})});var Cu=Ke((Tu,Lu)=>{(function(o){typeof Tu=="object"&&typeof Lu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(s){return new RegExp("^(("+s.join(")|(")+"))\\b","i")}var v=["package","message","import","syntax","required","optional","repeated","reserved","default","extensions","packed","bool","bytes","double","enum","float","string","int32","int64","uint32","uint64","sint32","sint64","fixed32","fixed64","sfixed32","sfixed64","option","service","rpc","returns"],C=p(v);o.registerHelper("hintWords","protobuf",v);var b=new RegExp("^[_A-Za-z\xA1-\uFFFF][_A-Za-z0-9\xA1-\uFFFF]*");function S(s){return s.eatSpace()?null:s.match("//")?(s.skipToEnd(),"comment"):s.match(/^[0-9\.+-]/,!1)&&(s.match(/^[+-]?0x[0-9a-fA-F]+/)||s.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)||s.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))?"number":s.match(/^"([^"]|(""))*"/)||s.match(/^'([^']|(''))*'/)?"string":s.match(C)?"keyword":s.match(b)?"variable":(s.next(),null)}o.defineMode("protobuf",function(){return{token:S,fold:"brace"}}),o.defineMIME("text/x-protobuf","protobuf")})});var Mu=Ke((Eu,zu)=>{(function(o){typeof Eu=="object"&&typeof zu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(h){return new RegExp("^(("+h.join(")|(")+"))\\b")}var v=p(["and","or","not","is"]),C=["as","assert","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","lambda","pass","raise","return","try","while","with","yield","in","False","True"],b=["abs","all","any","bin","bool","bytearray","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip","__import__","NotImplemented","Ellipsis","__debug__"];o.registerHelper("hintWords","python",C.concat(b).concat(["exec","print"]));function S(h){return h.scopes[h.scopes.length-1]}o.defineMode("python",function(h,g){for(var T="error",w=g.delimiters||g.singleDelimiters||/^[\(\)\[\]\{\}@,:`=;\.\\]/,c=[g.singleOperators,g.doubleOperators,g.doubleDelimiters,g.tripleDelimiters,g.operators||/^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/],d=0;dR?D(X):le0&&j(K,X)&&(xe+=" "+T),xe}}return re(K,X)}function re(K,X,N){if(K.eatSpace())return null;if(!N&&K.match(/^#.*/))return"comment";if(K.match(/^[0-9\.]/,!1)){var R=!1;if(K.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i)&&(R=!0),K.match(/^[\d_]+\.\d*/)&&(R=!0),K.match(/^\.\d+/)&&(R=!0),R)return K.eat(/J/i),"number";var le=!1;if(K.match(/^0x[0-9a-f_]+/i)&&(le=!0),K.match(/^0b[01_]+/i)&&(le=!0),K.match(/^0o[0-7_]+/i)&&(le=!0),K.match(/^[1-9][\d_]*(e[\+\-]?[\d_]+)?/)&&(K.eat(/J/i),le=!0),K.match(/^0(?![\dx])/i)&&(le=!0),le)return K.eat(/L/i),"number"}if(K.match(E)){var xe=K.current().toLowerCase().indexOf("f")!==-1;return xe?(X.tokenize=q(K.current(),X.tokenize),X.tokenize(K,X)):(X.tokenize=I(K.current(),X.tokenize),X.tokenize(K,X))}for(var F=0;F=0;)K=K.substr(1);var N=K.length==1,R="string";function le(F){return function(L,de){var ze=re(L,de,!0);return ze=="punctuation"&&(L.current()=="{"?de.tokenize=le(F+1):L.current()=="}"&&(F>1?de.tokenize=le(F-1):de.tokenize=xe)),ze}}function xe(F,L){for(;!F.eol();)if(F.eatWhile(/[^'"\{\}\\]/),F.eat("\\")){if(F.next(),N&&F.eol())return R}else{if(F.match(K))return L.tokenize=X,R;if(F.match("{{"))return R;if(F.match("{",!1))return L.tokenize=le(0),F.current()?R:L.tokenize(F,L);if(F.match("}}"))return R;if(F.match("}"))return T;F.eat(/['"]/)}if(N){if(g.singleLineStringErrors)return T;L.tokenize=X}return R}return xe.isString=!0,xe}function I(K,X){for(;"rubf".indexOf(K.charAt(0).toLowerCase())>=0;)K=K.substr(1);var N=K.length==1,R="string";function le(xe,F){for(;!xe.eol();)if(xe.eatWhile(/[^'"\\]/),xe.eat("\\")){if(xe.next(),N&&xe.eol())return R}else{if(xe.match(K))return F.tokenize=X,R;xe.eat(/['"]/)}if(N){if(g.singleLineStringErrors)return T;F.tokenize=X}return R}return le.isString=!0,le}function D(K){for(;S(K).type!="py";)K.scopes.pop();K.scopes.push({offset:S(K).offset+h.indentUnit,type:"py",align:null})}function Q(K,X,N){var R=K.match(/^[\s\[\{\(]*(?:#|$)/,!1)?null:K.column()+1;X.scopes.push({offset:X.indent+k,type:N,align:R})}function j(K,X){for(var N=K.indentation();X.scopes.length>1&&S(X).offset>N;){if(S(X).type!="py")return!0;X.scopes.pop()}return S(X).offset!=N}function V(K,X){K.sol()&&(X.beginningOfLine=!0,X.dedent=!1);var N=X.tokenize(K,X),R=K.current();if(X.beginningOfLine&&R=="@")return K.match(W,!1)?"meta":_?"operator":T;if(/\S/.test(R)&&(X.beginningOfLine=!1),(N=="variable"||N=="builtin")&&X.lastToken=="meta"&&(N="meta"),(R=="pass"||R=="return")&&(X.dedent=!0),R=="lambda"&&(X.lambda=!0),R==":"&&!X.lambda&&S(X).type=="py"&&K.match(/^\s*(?:#|$)/,!1)&&D(X),R.length==1&&!/string|comment/.test(N)){var le="[({".indexOf(R);if(le!=-1&&Q(K,X,"])}".slice(le,le+1)),le="])}".indexOf(R),le!=-1)if(S(X).type==R)X.indent=X.scopes.pop().offset-k;else return T}return X.dedent&&K.eol()&&S(X).type=="py"&&X.scopes.length>1&&X.scopes.pop(),N}var y={startState:function(K){return{tokenize:J,scopes:[{offset:K||0,type:"py",align:null}],indent:K||0,lastToken:null,lambda:!1,dedent:0}},token:function(K,X){var N=X.errorToken;N&&(X.errorToken=!1);var R=V(K,X);return R&&R!="comment"&&(X.lastToken=R=="keyword"||R=="punctuation"?K.current():R),R=="punctuation"&&(R=null),K.eol()&&X.lambda&&(X.lambda=!1),N?R+" "+T:R},indent:function(K,X){if(K.tokenize!=J)return K.tokenize.isString?o.Pass:0;var N=S(K),R=N.type==X.charAt(0)||N.type=="py"&&!K.dedent&&/^(else:|elif |except |finally:)/.test(X);return N.align!=null?N.align-(R?1:0):N.offset-(R?k:0)},electricInput:/^\s*([\}\]\)]|else:|elif |except |finally:)$/,closeBrackets:{triples:`'"`},lineComment:"#",fold:"indent"};return y}),o.defineMIME("text/x-python","python");var s=function(h){return h.split(" ")};o.defineMIME("text/x-cython",{name:"python",extra_keywords:s("by cdef cimport cpdef ctypedef enum except extern gil include nogil property public readonly struct union DEF IF ELIF ELSE")})})});var qu=Ke((Au,Du)=>{(function(o){typeof Au=="object"&&typeof Du=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(g){for(var T={},w=0,c=g.length;w]/)?(E.eat(/[\<\>]/),"atom"):E.eat(/[\+\-\*\/\&\|\:\!]/)?"atom":E.eat(/[a-zA-Z$@_\xa1-\uffff]/)?(E.eatWhile(/[\w$\xa1-\uffff]/),E.eat(/[\?\!\=]/),"atom"):"operator";if(G=="@"&&E.match(/^@?[a-zA-Z_\xa1-\uffff]/))return E.eat("@"),E.eatWhile(/[\w\xa1-\uffff]/),"variable-2";if(G=="$")return E.eat(/[a-zA-Z_]/)?E.eatWhile(/[\w]/):E.eat(/\d/)?E.eat(/\d/):E.next(),"variable-3";if(/[a-zA-Z_\xa1-\uffff]/.test(G))return E.eatWhile(/[\w\xa1-\uffff]/),E.eat(/[\?\!]/),E.eat(":")?"atom":"ident";if(G=="|"&&(O.varList||O.lastTok=="{"||O.lastTok=="do"))return T="|",null;if(/[\(\)\[\]{}\\;]/.test(G))return T=G,null;if(G=="-"&&E.eat(">"))return"arrow";if(/[=+\-\/*:\.^%<>~|]/.test(G)){var D=E.eatWhile(/[=+\-\/*:\.^%<>~|]/);return G=="."&&!D&&(T="."),"operator"}else return null}}}function d(E){for(var O=E.pos,G=0,J,re=!1,q=!1;(J=E.next())!=null;)if(q)q=!1;else{if("[{(".indexOf(J)>-1)G++;else if("]})".indexOf(J)>-1){if(G--,G<0)break}else if(J=="/"&&G==0){re=!0;break}q=J=="\\"}return E.backUp(E.pos-O),re}function k(E){return E||(E=1),function(O,G){if(O.peek()=="}"){if(E==1)return G.tokenize.pop(),G.tokenize[G.tokenize.length-1](O,G);G.tokenize[G.tokenize.length-1]=k(E-1)}else O.peek()=="{"&&(G.tokenize[G.tokenize.length-1]=k(E+1));return c(O,G)}}function z(){var E=!1;return function(O,G){return E?(G.tokenize.pop(),G.tokenize[G.tokenize.length-1](O,G)):(E=!0,c(O,G))}}function M(E,O,G,J){return function(re,q){var I=!1,D;for(q.context.type==="read-quoted-paused"&&(q.context=q.context.prev,re.eat("}"));(D=re.next())!=null;){if(D==E&&(J||!I)){q.tokenize.pop();break}if(G&&D=="#"&&!I){if(re.eat("{")){E=="}"&&(q.context={prev:q.context,type:"read-quoted-paused"}),q.tokenize.push(k());break}else if(/[@\$]/.test(re.peek())){q.tokenize.push(z());break}}I=!I&&D=="\\"}return O}}function _(E,O){return function(G,J){return O&&G.eatSpace(),G.match(E)?J.tokenize.pop():G.skipToEnd(),"string"}}function W(E,O){return E.sol()&&E.match("=end")&&E.eol()&&O.tokenize.pop(),E.skipToEnd(),"comment"}return{startState:function(){return{tokenize:[c],indented:0,context:{type:"top",indented:-g.indentUnit},continuedLine:!1,lastTok:null,varList:!1}},token:function(E,O){T=null,E.sol()&&(O.indented=E.indentation());var G=O.tokenize[O.tokenize.length-1](E,O),J,re=T;if(G=="ident"){var q=E.current();G=O.lastTok=="."?"property":C.propertyIsEnumerable(E.current())?"keyword":/^[A-Z]/.test(q)?"tag":O.lastTok=="def"||O.lastTok=="class"||O.varList?"def":"variable",G=="keyword"&&(re=q,b.propertyIsEnumerable(q)?J="indent":S.propertyIsEnumerable(q)?J="dedent":((q=="if"||q=="unless")&&E.column()==E.indentation()||q=="do"&&O.context.indented{(function(o){typeof Fu=="object"&&typeof Iu=="object"?o(We(),Di()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode("rust",{start:[{regex:/b?"/,token:"string",next:"string"},{regex:/b?r"/,token:"string",next:"string_raw"},{regex:/b?r#+"/,token:"string",next:"string_raw_hash"},{regex:/'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/,token:"string-2"},{regex:/b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/,token:"string-2"},{regex:/(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,token:"number"},{regex:/(let(?:\s+mut)?|fn|enum|mod|struct|type|union)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:["keyword",null,"def"]},{regex:/(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,token:"keyword"},{regex:/\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/,token:"atom"},{regex:/\b(?:true|false|Some|None|Ok|Err)\b/,token:"builtin"},{regex:/\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:["keyword",null,"def"]},{regex:/#!?\[.*\]/,token:"meta"},{regex:/\/\/.*/,token:"comment"},{regex:/\/\*/,token:"comment",next:"comment"},{regex:/[-+\/*=<>!]+/,token:"operator"},{regex:/[a-zA-Z_]\w*!/,token:"variable-3"},{regex:/[a-zA-Z_]\w*/,token:"variable"},{regex:/[\{\[\(]/,indent:!0},{regex:/[\}\]\)]/,dedent:!0}],string:[{regex:/"/,token:"string",next:"start"},{regex:/(?:[^\\"]|\\(?:.|$))*/,token:"string"}],string_raw:[{regex:/"/,token:"string",next:"start"},{regex:/[^"]*/,token:"string"}],string_raw_hash:[{regex:/"#+/,token:"string",next:"start"},{regex:/(?:[^"]|"(?!#))*/,token:"string"}],comment:[{regex:/.*?\*\//,token:"comment",next:"start"},{regex:/.*/,token:"comment"}],meta:{dontIndentStates:["comment"],electricInput:/^\s*\}$/,blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",fold:"brace"}}),o.defineMIME("text/x-rustsrc","rust"),o.defineMIME("text/rust","rust")})});var ea=Ke((Ou,Pu)=>{(function(o){typeof Ou=="object"&&typeof Pu=="object"?o(We(),gn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../css/css"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("sass",function(p){var v=o.mimeModes["text/css"],C=v.propertyKeywords||{},b=v.colorKeywords||{},S=v.valueKeywords||{},s=v.fontProperties||{};function h(q){return new RegExp("^"+q.join("|"))}var g=["true","false","null","auto"],T=new RegExp("^"+g.join("|")),w=["\\(","\\)","=",">","<","==",">=","<=","\\+","-","\\!=","/","\\*","%","and","or","not",";","\\{","\\}",":"],c=h(w),d=/^::?[a-zA-Z_][\w\-]*/,k;function z(q){return!q.peek()||q.match(/\s+$/,!1)}function M(q,I){var D=q.peek();return D===")"?(q.next(),I.tokenizer=J,"operator"):D==="("?(q.next(),q.eatSpace(),"operator"):D==="'"||D==='"'?(I.tokenizer=W(q.next()),"string"):(I.tokenizer=W(")",!1),"string")}function _(q,I){return function(D,Q){return D.sol()&&D.indentation()<=q?(Q.tokenizer=J,J(D,Q)):(I&&D.skipTo("*/")?(D.next(),D.next(),Q.tokenizer=J):D.skipToEnd(),"comment")}}function W(q,I){I==null&&(I=!0);function D(Q,j){var V=Q.next(),y=Q.peek(),K=Q.string.charAt(Q.pos-2),X=V!=="\\"&&y===q||V===q&&K!=="\\";return X?(V!==q&&I&&Q.next(),z(Q)&&(j.cursorHalf=0),j.tokenizer=J,"string"):V==="#"&&y==="{"?(j.tokenizer=E(D),Q.next(),"operator"):"string"}return D}function E(q){return function(I,D){return I.peek()==="}"?(I.next(),D.tokenizer=q,"operator"):J(I,D)}}function O(q){if(q.indentCount==0){q.indentCount++;var I=q.scopes[0].offset,D=I+p.indentUnit;q.scopes.unshift({offset:D})}}function G(q){q.scopes.length!=1&&q.scopes.shift()}function J(q,I){var D=q.peek();if(q.match("/*"))return I.tokenizer=_(q.indentation(),!0),I.tokenizer(q,I);if(q.match("//"))return I.tokenizer=_(q.indentation(),!1),I.tokenizer(q,I);if(q.match("#{"))return I.tokenizer=E(J),"operator";if(D==='"'||D==="'")return q.next(),I.tokenizer=W(D),"string";if(I.cursorHalf){if(D==="#"&&(q.next(),q.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/))||q.match(/^-?[0-9\.]+/))return z(q)&&(I.cursorHalf=0),"number";if(q.match(/^(px|em|in)\b/))return z(q)&&(I.cursorHalf=0),"unit";if(q.match(T))return z(q)&&(I.cursorHalf=0),"keyword";if(q.match(/^url/)&&q.peek()==="(")return I.tokenizer=M,z(q)&&(I.cursorHalf=0),"atom";if(D==="$")return q.next(),q.eatWhile(/[\w-]/),z(q)&&(I.cursorHalf=0),"variable-2";if(D==="!")return q.next(),I.cursorHalf=0,q.match(/^[\w]+/)?"keyword":"operator";if(q.match(c))return z(q)&&(I.cursorHalf=0),"operator";if(q.eatWhile(/[\w-]/))return z(q)&&(I.cursorHalf=0),k=q.current().toLowerCase(),S.hasOwnProperty(k)?"atom":b.hasOwnProperty(k)?"keyword":C.hasOwnProperty(k)?(I.prevProp=q.current().toLowerCase(),"property"):"tag";if(z(q))return I.cursorHalf=0,null}else{if(D==="-"&&q.match(/^-\w+-/))return"meta";if(D==="."){if(q.next(),q.match(/^[\w-]+/))return O(I),"qualifier";if(q.peek()==="#")return O(I),"tag"}if(D==="#"){if(q.next(),q.match(/^[\w-]+/))return O(I),"builtin";if(q.peek()==="#")return O(I),"tag"}if(D==="$")return q.next(),q.eatWhile(/[\w-]/),"variable-2";if(q.match(/^-?[0-9\.]+/))return"number";if(q.match(/^(px|em|in)\b/))return"unit";if(q.match(T))return"keyword";if(q.match(/^url/)&&q.peek()==="(")return I.tokenizer=M,"atom";if(D==="="&&q.match(/^=[\w-]+/))return O(I),"meta";if(D==="+"&&q.match(/^\+[\w-]+/))return"variable-3";if(D==="@"&&q.match("@extend")&&(q.match(/\s*[\w]/)||G(I)),q.match(/^@(else if|if|media|else|for|each|while|mixin|function)/))return O(I),"def";if(D==="@")return q.next(),q.eatWhile(/[\w-]/),"def";if(q.eatWhile(/[\w-]/))if(q.match(/ *: *[\w-\+\$#!\("']/,!1)){k=q.current().toLowerCase();var Q=I.prevProp+"-"+k;return C.hasOwnProperty(Q)?"property":C.hasOwnProperty(k)?(I.prevProp=k,"property"):s.hasOwnProperty(k)?"property":"tag"}else return q.match(/ *:/,!1)?(O(I),I.cursorHalf=1,I.prevProp=q.current().toLowerCase(),"property"):(q.match(/ *,/,!1)||O(I),"tag");if(D===":")return q.match(d)?"variable-3":(q.next(),I.cursorHalf=1,"operator")}return q.match(c)?"operator":(q.next(),null)}function re(q,I){q.sol()&&(I.indentCount=0);var D=I.tokenizer(q,I),Q=q.current();if((Q==="@return"||Q==="}")&&G(I),D!==null){for(var j=q.pos-Q.length,V=j+p.indentUnit*I.indentCount,y=[],K=0;K{(function(o){typeof Bu=="object"&&typeof ju=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("shell",function(){var p={};function v(d,k){for(var z=0;z1&&d.eat("$");var z=d.next();return/['"({]/.test(z)?(k.tokens[0]=h(z,z=="("?"quote":z=="{"?"def":"string"),c(d,k)):(/\d/.test(z)||d.eatWhile(/\w/),k.tokens.shift(),"def")};function w(d){return function(k,z){return k.sol()&&k.string==d&&z.tokens.shift(),k.skipToEnd(),"string-2"}}function c(d,k){return(k.tokens[0]||s)(d,k)}return{startState:function(){return{tokens:[]}},token:function(d,k){return c(d,k)},closeBrackets:"()[]{}''\"\"``",lineComment:"#",fold:"brace"}}),o.defineMIME("text/x-sh","shell"),o.defineMIME("application/x-sh","shell")})});var Uu=Ke((Hu,Wu)=>{(function(o){typeof Hu=="object"&&typeof Wu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("sql",function(g,T){var w=T.client||{},c=T.atoms||{false:!0,true:!0,null:!0},d=T.builtin||s(h),k=T.keywords||s(S),z=T.operatorChars||/^[*+\-%<>!=&|~^\/]/,M=T.support||{},_=T.hooks||{},W=T.dateSQL||{date:!0,time:!0,timestamp:!0},E=T.backslashStringEscapes!==!1,O=T.brackets||/^[\{}\(\)\[\]]/,G=T.punctuation||/^[;.,:]/;function J(Q,j){var V=Q.next();if(_[V]){var y=_[V](Q,j);if(y!==!1)return y}if(M.hexNumber&&(V=="0"&&Q.match(/^[xX][0-9a-fA-F]+/)||(V=="x"||V=="X")&&Q.match(/^'[0-9a-fA-F]*'/)))return"number";if(M.binaryNumber&&((V=="b"||V=="B")&&Q.match(/^'[01]*'/)||V=="0"&&Q.match(/^b[01]+/)))return"number";if(V.charCodeAt(0)>47&&V.charCodeAt(0)<58)return Q.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/),M.decimallessFloat&&Q.match(/^\.(?!\.)/),"number";if(V=="?"&&(Q.eatSpace()||Q.eol()||Q.eat(";")))return"variable-3";if(V=="'"||V=='"'&&M.doubleQuote)return j.tokenize=re(V),j.tokenize(Q,j);if((M.nCharCast&&(V=="n"||V=="N")||M.charsetCast&&V=="_"&&Q.match(/[a-z][a-z0-9]*/i))&&(Q.peek()=="'"||Q.peek()=='"'))return"keyword";if(M.escapeConstant&&(V=="e"||V=="E")&&(Q.peek()=="'"||Q.peek()=='"'&&M.doubleQuote))return j.tokenize=function(X,N){return(N.tokenize=re(X.next(),!0))(X,N)},"keyword";if(M.commentSlashSlash&&V=="/"&&Q.eat("/"))return Q.skipToEnd(),"comment";if(M.commentHash&&V=="#"||V=="-"&&Q.eat("-")&&(!M.commentSpaceRequired||Q.eat(" ")))return Q.skipToEnd(),"comment";if(V=="/"&&Q.eat("*"))return j.tokenize=q(1),j.tokenize(Q,j);if(V=="."){if(M.zerolessFloat&&Q.match(/^(?:\d+(?:e[+-]?\d+)?)/i))return"number";if(Q.match(/^\.+/))return null;if(Q.match(/^[\w\d_$#]+/))return"variable-2"}else{if(z.test(V))return Q.eatWhile(z),"operator";if(O.test(V))return"bracket";if(G.test(V))return Q.eatWhile(G),"punctuation";if(V=="{"&&(Q.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/)||Q.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/)))return"number";Q.eatWhile(/^[_\w\d]/);var K=Q.current().toLowerCase();return W.hasOwnProperty(K)&&(Q.match(/^( )+'[^']*'/)||Q.match(/^( )+"[^"]*"/))?"number":c.hasOwnProperty(K)?"atom":d.hasOwnProperty(K)?"type":k.hasOwnProperty(K)?"keyword":w.hasOwnProperty(K)?"builtin":null}}function re(Q,j){return function(V,y){for(var K=!1,X;(X=V.next())!=null;){if(X==Q&&!K){y.tokenize=J;break}K=(E||j)&&!K&&X=="\\"}return"string"}}function q(Q){return function(j,V){var y=j.match(/^.*?(\/\*|\*\/)/);return y?y[1]=="/*"?V.tokenize=q(Q+1):Q>1?V.tokenize=q(Q-1):V.tokenize=J:j.skipToEnd(),"comment"}}function I(Q,j,V){j.context={prev:j.context,indent:Q.indentation(),col:Q.column(),type:V}}function D(Q){Q.indent=Q.context.indent,Q.context=Q.context.prev}return{startState:function(){return{tokenize:J,context:null}},token:function(Q,j){if(Q.sol()&&j.context&&j.context.align==null&&(j.context.align=!1),j.tokenize==J&&Q.eatSpace())return null;var V=j.tokenize(Q,j);if(V=="comment")return V;j.context&&j.context.align==null&&(j.context.align=!0);var y=Q.current();return y=="("?I(Q,j,")"):y=="["?I(Q,j,"]"):j.context&&j.context.type==y&&D(j),V},indent:function(Q,j){var V=Q.context;if(!V)return o.Pass;var y=j.charAt(0)==V.type;return V.align?V.col+(y?0:1):V.indent+(y?0:g.indentUnit)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:M.commentSlashSlash?"//":M.commentHash?"#":"--",closeBrackets:"()[]{}''\"\"``",config:T}});function p(g){for(var T;(T=g.next())!=null;)if(T=="`"&&!g.eat("`"))return"variable-2";return g.backUp(g.current().length-1),g.eatWhile(/\w/)?"variable-2":null}function v(g){for(var T;(T=g.next())!=null;)if(T=='"'&&!g.eat('"'))return"variable-2";return g.backUp(g.current().length-1),g.eatWhile(/\w/)?"variable-2":null}function C(g){return g.eat("@")&&(g.match("session."),g.match("local."),g.match("global.")),g.eat("'")?(g.match(/^.*'/),"variable-2"):g.eat('"')?(g.match(/^.*"/),"variable-2"):g.eat("`")?(g.match(/^.*`/),"variable-2"):g.match(/^[0-9a-zA-Z$\.\_]+/)?"variable-2":null}function b(g){return g.eat("N")?"atom":g.match(/^[a-zA-Z.#!?]/)?"variable-2":null}var S="alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit ";function s(g){for(var T={},w=g.split(" "),c=0;c!=^\&|\/]/,brackets:/^[\{}\(\)]/,punctuation:/^[;.,:/]/,backslashStringEscapes:!1,dateSQL:s("date datetimeoffset datetime2 smalldatetime datetime time"),hooks:{"@":C}}),o.defineMIME("text/x-mysql",{name:"sql",client:s("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:s(S+"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":C,"`":p,"\\":b}}),o.defineMIME("text/x-mariadb",{name:"sql",client:s("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:s(S+"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":C,"`":p,"\\":b}}),o.defineMIME("text/x-sqlite",{name:"sql",client:s("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"),keywords:s(S+"abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"),builtin:s("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"),atoms:s("null current_date current_time current_timestamp"),operatorChars:/^[*+\-%<>!=&|/~]/,dateSQL:s("date time timestamp datetime"),support:s("decimallessFloat zerolessFloat"),identifierQuote:'"',hooks:{"@":C,":":C,"?":C,$:C,'"':v,"`":p}}),o.defineMIME("text/x-cassandra",{name:"sql",client:{},keywords:s("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"),builtin:s("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"),atoms:s("false true infinity NaN"),operatorChars:/^[<>=]/,dateSQL:{},support:s("commentSlashSlash decimallessFloat"),hooks:{}}),o.defineMIME("text/x-plsql",{name:"sql",client:s("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),keywords:s("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),builtin:s("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),operatorChars:/^[*\/+\-%<>!=~]/,dateSQL:s("date time timestamp"),support:s("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")}),o.defineMIME("text/x-hive",{name:"sql",keywords:s("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"),builtin:s("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:s("date timestamp"),support:s("doubleQuote binaryNumber hexNumber")}),o.defineMIME("text/x-pgsql",{name:"sql",client:s("source"),keywords:s(S+"a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"),builtin:s("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time zone timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),atoms:s("false true null unknown"),operatorChars:/^[*\/+\-%<>!=&|^\/#@?~]/,backslashStringEscapes:!1,identifierQuote:'"',hooks:{'"':v},dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant")}),o.defineMIME("text/x-gql",{name:"sql",keywords:s("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"),atoms:s("false true"),builtin:s("blob datetime first key __key__ string integer double boolean null"),operatorChars:/^[*+\-%<>!=]/}),o.defineMIME("text/x-gpsql",{name:"sql",client:s("source"),keywords:s("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"),builtin:s("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"),atoms:s("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^\/#@?~]/,dateSQL:s("date time timestamp"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast")}),o.defineMIME("text/x-sparksql",{name:"sql",keywords:s("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"),builtin:s("abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with"),atoms:s("false true null"),operatorChars:/^[*\/+\-%<>!=~&|^]/,dateSQL:s("date time timestamp"),support:s("doubleQuote zerolessFloat")}),o.defineMIME("text/x-esper",{name:"sql",client:s("source"),keywords:s("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"),builtin:{},atoms:s("false true null"),operatorChars:/^[*+\-%<>!=&|^\/#@?~]/,dateSQL:s("time"),support:s("decimallessFloat zerolessFloat binaryNumber hexNumber")}),o.defineMIME("text/x-trino",{name:"sql",keywords:s("abs absent acos add admin after all all_match alter analyze and any any_match approx_distinct approx_most_frequent approx_percentile approx_set arbitrary array_agg array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_sort array_union arrays_overlap as asc asin at at_timezone atan atan2 authorization avg bar bernoulli beta_cdf between bing_tile bing_tile_at bing_tile_coordinates bing_tile_polygon bing_tile_quadkey bing_tile_zoom_level bing_tiles_around bit_count bitwise_and bitwise_and_agg bitwise_left_shift bitwise_not bitwise_or bitwise_or_agg bitwise_right_shift bitwise_right_shift_arithmetic bitwise_xor bool_and bool_or both by call cardinality cascade case cast catalogs cbrt ceil ceiling char2hexint checksum chr classify coalesce codepoint column columns combinations comment commit committed concat concat_ws conditional constraint contains contains_sequence convex_hull_agg copartition corr cos cosh cosine_similarity count count_if covar_pop covar_samp crc32 create cross cube cume_dist current current_catalog current_date current_groups current_path current_role current_schema current_time current_timestamp current_timezone current_user data date_add date_diff date_format date_parse date_trunc day day_of_month day_of_week day_of_year deallocate default define definer degrees delete dense_rank deny desc describe descriptor distinct distributed dow doy drop e element_at else empty empty_approx_set encoding end error escape evaluate_classifier_predictions every except excluding execute exists exp explain extract false features fetch filter final first first_value flatten floor following for format format_datetime format_number from from_base from_base32 from_base64 from_base64url from_big_endian_32 from_big_endian_64 from_encoded_polyline from_geojson_geometry from_hex from_ieee754_32 from_ieee754_64 from_iso8601_date from_iso8601_timestamp from_iso8601_timestamp_nanos from_unixtime from_unixtime_nanos from_utf8 full functions geometric_mean geometry_from_hadoop_shape geometry_invalid_reason geometry_nearest_points geometry_to_bing_tiles geometry_union geometry_union_agg grant granted grants graphviz great_circle_distance greatest group grouping groups hamming_distance hash_counts having histogram hmac_md5 hmac_sha1 hmac_sha256 hmac_sha512 hour human_readable_seconds if ignore in including index infinity initial inner input insert intersect intersection_cardinality into inverse_beta_cdf inverse_normal_cdf invoker io is is_finite is_infinite is_json_scalar is_nan isolation jaccard_index join json_array json_array_contains json_array_get json_array_length json_exists json_extract json_extract_scalar json_format json_object json_parse json_query json_size json_value keep key keys kurtosis lag last last_day_of_month last_value lateral lead leading learn_classifier learn_libsvm_classifier learn_libsvm_regressor learn_regressor least left length level levenshtein_distance like limit line_interpolate_point line_interpolate_points line_locate_point listagg ln local localtime localtimestamp log log10 log2 logical lower lpad ltrim luhn_check make_set_digest map_agg map_concat map_entries map_filter map_from_entries map_keys map_union map_values map_zip_with match match_recognize matched matches materialized max max_by md5 measures merge merge_set_digest millisecond min min_by minute mod month multimap_agg multimap_from_entries murmur3 nan natural next nfc nfd nfkc nfkd ngrams no none none_match normal_cdf normalize not now nth_value ntile null nullif nulls numeric_histogram object objectid_timestamp of offset omit on one only option or order ordinality outer output over overflow parse_data_size parse_datetime parse_duration partition partitions passing past path pattern per percent_rank permute pi position pow power preceding prepare privileges properties prune qdigest_agg quarter quotes radians rand random range rank read recursive reduce reduce_agg refresh regexp_count regexp_extract regexp_extract_all regexp_like regexp_position regexp_replace regexp_split regr_intercept regr_slope regress rename render repeat repeatable replace reset respect restrict returning reverse revoke rgb right role roles rollback rollup round row_number rows rpad rtrim running scalar schema schemas second security seek select sequence serializable session set sets sha1 sha256 sha512 show shuffle sign simplify_geometry sin skewness skip slice some soundex spatial_partitioning spatial_partitions split split_part split_to_map split_to_multimap spooky_hash_v2_32 spooky_hash_v2_64 sqrt st_area st_asbinary st_astext st_boundary st_buffer st_centroid st_contains st_convexhull st_coorddim st_crosses st_difference st_dimension st_disjoint st_distance st_endpoint st_envelope st_envelopeaspts st_equals st_exteriorring st_geometries st_geometryfromtext st_geometryn st_geometrytype st_geomfrombinary st_interiorringn st_interiorrings st_intersection st_intersects st_isclosed st_isempty st_isring st_issimple st_isvalid st_length st_linefromtext st_linestring st_multipoint st_numgeometries st_numinteriorring st_numpoints st_overlaps st_point st_pointn st_points st_polygon st_relate st_startpoint st_symdifference st_touches st_union st_within st_x st_xmax st_xmin st_y st_ymax st_ymin start starts_with stats stddev stddev_pop stddev_samp string strpos subset substr substring sum system table tables tablesample tan tanh tdigest_agg text then ties timestamp_objectid timezone_hour timezone_minute to to_base to_base32 to_base64 to_base64url to_big_endian_32 to_big_endian_64 to_char to_date to_encoded_polyline to_geojson_geometry to_geometry to_hex to_ieee754_32 to_ieee754_64 to_iso8601 to_milliseconds to_spherical_geography to_timestamp to_unixtime to_utf8 trailing transaction transform transform_keys transform_values translate trim trim_array true truncate try try_cast type typeof uescape unbounded uncommitted unconditional union unique unknown unmatched unnest update upper url_decode url_encode url_extract_fragment url_extract_host url_extract_parameter url_extract_path url_extract_port url_extract_protocol url_extract_query use user using utf16 utf32 utf8 validate value value_at_quantile values values_at_quantiles var_pop var_samp variance verbose version view week week_of_year when where width_bucket wilson_interval_lower wilson_interval_upper window with with_timezone within without word_stem work wrapper write xxhash64 year year_of_week yow zip zip_with"),builtin:s("array bigint bingtile boolean char codepoints color date decimal double function geometry hyperloglog int integer interval ipaddress joniregexp json json2016 jsonpath kdbtree likepattern map model objectid p4hyperloglog precision qdigest re2jregexp real regressor row setdigest smallint sphericalgeography tdigest time timestamp tinyint uuid varbinary varchar zone"),atoms:s("false true null unknown"),operatorChars:/^[[\]|<>=!\-+*/%]/,dateSQL:s("date time timestamp zone"),support:s("decimallessFloat zerolessFloat hexNumber")})})});var ta=Ke(($u,Ku)=>{(function(o){typeof $u=="object"&&typeof Ku=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("stylus",function(E){for(var O=E.indentUnit,G="",J=_(p),re=/^(a|b|i|s|col|em)$/i,q=_(S),I=_(s),D=_(T),Q=_(g),j=_(v),V=M(v),y=_(b),K=_(C),X=_(h),N=/^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/,R=M(w),le=_(c),xe=new RegExp(/^\-(moz|ms|o|webkit)-/i),F=_(d),L="",de={},ze,pe,Ee,ge;G.length|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/),H.context.line.firstWord=L?L[0].replace(/^\s*/,""):"",H.context.line.indent=$.indentation(),ze=$.peek(),$.match("//"))return $.skipToEnd(),["comment","comment"];if($.match("/*"))return H.tokenize=qe,qe($,H);if(ze=='"'||ze=="'")return $.next(),H.tokenize=Se(ze),H.tokenize($,H);if(ze=="@")return $.next(),$.eatWhile(/[\w\\-]/),["def",$.current()];if(ze=="#"){if($.next(),$.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\b(?!-)/i))return["atom","atom"];if($.match(/^[a-z][\w-]*/i))return["builtin","hash"]}return $.match(xe)?["meta","vendor-prefixes"]:$.match(/^-?[0-9]?\.?[0-9]/)?($.eatWhile(/[a-z%]/i),["number","unit"]):ze=="!"?($.next(),[$.match(/^(important|optional)/i)?"keyword":"operator","important"]):ze=="."&&$.match(/^\.[a-z][\w-]*/i)?["qualifier","qualifier"]:$.match(V)?($.peek()=="("&&(H.tokenize=Be),["property","word"]):$.match(/^[a-z][\w-]*\(/i)?($.backUp(1),["keyword","mixin"]):$.match(/^(\+|-)[a-z][\w-]*\(/i)?($.backUp(1),["keyword","block-mixin"]):$.string.match(/^\s*&/)&&$.match(/^[-_]+[a-z][\w-]*/)?["qualifier","qualifier"]:$.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)?($.backUp(1),["variable-3","reference"]):$.match(/^&{1}\s*$/)?["variable-3","reference"]:$.match(R)?["operator","operator"]:$.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)?$.match(/^(\.|\[)[\w-\'\"\]]+/i,!1)&&!U($.current())?($.match("."),["variable-2","variable-name"]):["variable-2","word"]:$.match(N)?["operator",$.current()]:/[:;,{}\[\]\(\)]/.test(ze)?($.next(),[null,ze]):($.next(),[null,null])}function qe($,H){for(var se=!1,De;(De=$.next())!=null;){if(se&&De=="/"){H.tokenize=null;break}se=De=="*"}return["comment","comment"]}function Se($){return function(H,se){for(var De=!1,nt;(nt=H.next())!=null;){if(nt==$&&!De){$==")"&&H.backUp(1);break}De=!De&&nt=="\\"}return(nt==$||!De&&$!=")")&&(se.tokenize=null),["string","string"]}}function Be($,H){return $.next(),$.match(/\s*[\"\')]/,!1)?H.tokenize=null:H.tokenize=Se(")"),[null,"("]}function Ze($,H,se,De){this.type=$,this.indent=H,this.prev=se,this.line=De||{firstWord:"",indent:0}}function ke($,H,se,De){return De=De>=0?De:O,$.context=new Ze(se,H.indentation()+De,$.context),se}function Je($,H){var se=$.context.indent-O;return H=H||!1,$.context=$.context.prev,H&&($.context.indent=se),$.context.type}function Re($,H,se){return de[se.context.type]($,H,se)}function Ge($,H,se,De){for(var nt=De||1;nt>0;nt--)se.context=se.context.prev;return Re($,H,se)}function U($){return $.toLowerCase()in J}function Z($){return $=$.toLowerCase(),$ in q||$ in X}function ce($){return $.toLowerCase()in le}function He($){return $.toLowerCase().match(xe)}function te($){var H=$.toLowerCase(),se="variable-2";return U($)?se="tag":ce($)?se="block-keyword":Z($)?se="property":H in D||H in F?se="atom":H=="return"||H in Q?se="keyword":$.match(/^[A-Z]/)&&(se="string"),se}function fe($,H){return Me(H)&&($=="{"||$=="]"||$=="hash"||$=="qualifier")||$=="block-mixin"}function oe($,H){return $=="{"&&H.match(/^\s*\$?[\w-]+/i,!1)}function Ue($,H){return $==":"&&H.match(/^[a-z-]+/,!1)}function we($){return $.sol()||$.string.match(new RegExp("^\\s*"+W($.current())))}function Me($){return $.eol()||$.match(/^\s*$/,!1)}function Le($){var H=/^\s*[-_]*[a-z0-9]+[\w-]*/i,se=typeof $=="string"?$.match(H):$.string.match(H);return se?se[0].replace(/^\s*/,""):""}return de.block=function($,H,se){if($=="comment"&&we(H)||$==","&&Me(H)||$=="mixin")return ke(se,H,"block",0);if(oe($,H))return ke(se,H,"interpolation");if(Me(H)&&$=="]"&&!/^\s*(\.|#|:|\[|\*|&)/.test(H.string)&&!U(Le(H)))return ke(se,H,"block",0);if(fe($,H))return ke(se,H,"block");if($=="}"&&Me(H))return ke(se,H,"block",0);if($=="variable-name")return H.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)||ce(Le(H))?ke(se,H,"variableName"):ke(se,H,"variableName",0);if($=="=")return!Me(H)&&!ce(Le(H))?ke(se,H,"block",0):ke(se,H,"block");if($=="*"&&(Me(H)||H.match(/\s*(,|\.|#|\[|:|{)/,!1)))return ge="tag",ke(se,H,"block");if(Ue($,H))return ke(se,H,"pseudo");if(/@(font-face|media|supports|(-moz-)?document)/.test($))return ke(se,H,Me(H)?"block":"atBlock");if(/@(-(moz|ms|o|webkit)-)?keyframes$/.test($))return ke(se,H,"keyframes");if(/@extends?/.test($))return ke(se,H,"extend",0);if($&&$.charAt(0)=="@")return H.indentation()>0&&Z(H.current().slice(1))?(ge="variable-2","block"):/(@import|@require|@charset)/.test($)?ke(se,H,"block",0):ke(se,H,"block");if($=="reference"&&Me(H))return ke(se,H,"block");if($=="(")return ke(se,H,"parens");if($=="vendor-prefixes")return ke(se,H,"vendorPrefixes");if($=="word"){var De=H.current();if(ge=te(De),ge=="property")return we(H)?ke(se,H,"block",0):(ge="atom","block");if(ge=="tag"){if(/embed|menu|pre|progress|sub|table/.test(De)&&Z(Le(H))||H.string.match(new RegExp("\\[\\s*"+De+"|"+De+"\\s*\\]")))return ge="atom","block";if(re.test(De)&&(we(H)&&H.string.match(/=/)||!we(H)&&!H.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/)&&!U(Le(H))))return ge="variable-2",ce(Le(H))?"block":ke(se,H,"block",0);if(Me(H))return ke(se,H,"block")}if(ge=="block-keyword")return ge="keyword",H.current(/(if|unless)/)&&!we(H)?"block":ke(se,H,"block");if(De=="return")return ke(se,H,"block",0);if(ge=="variable-2"&&H.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/))return ke(se,H,"block")}return se.context.type},de.parens=function($,H,se){if($=="(")return ke(se,H,"parens");if($==")")return se.context.prev.type=="parens"?Je(se):H.string.match(/^[a-z][\w-]*\(/i)&&Me(H)||ce(Le(H))||/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(Le(H))||!H.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/)&&U(Le(H))?ke(se,H,"block"):H.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/)||H.string.match(/^\s*(\(|\)|[0-9])/)||H.string.match(/^\s+[a-z][\w-]*\(/i)||H.string.match(/^\s+[\$-]?[a-z]/i)?ke(se,H,"block",0):Me(H)?ke(se,H,"block"):ke(se,H,"block",0);if($&&$.charAt(0)=="@"&&Z(H.current().slice(1))&&(ge="variable-2"),$=="word"){var De=H.current();ge=te(De),ge=="tag"&&re.test(De)&&(ge="variable-2"),(ge=="property"||De=="to")&&(ge="atom")}return $=="variable-name"?ke(se,H,"variableName"):Ue($,H)?ke(se,H,"pseudo"):se.context.type},de.vendorPrefixes=function($,H,se){return $=="word"?(ge="property",ke(se,H,"block",0)):Je(se)},de.pseudo=function($,H,se){return Z(Le(H.string))?Ge($,H,se):(H.match(/^[a-z-]+/),ge="variable-3",Me(H)?ke(se,H,"block"):Je(se))},de.atBlock=function($,H,se){if($=="(")return ke(se,H,"atBlock_parens");if(fe($,H))return ke(se,H,"block");if(oe($,H))return ke(se,H,"interpolation");if($=="word"){var De=H.current().toLowerCase();if(/^(only|not|and|or)$/.test(De)?ge="keyword":j.hasOwnProperty(De)?ge="tag":K.hasOwnProperty(De)?ge="attribute":y.hasOwnProperty(De)?ge="property":I.hasOwnProperty(De)?ge="string-2":ge=te(H.current()),ge=="tag"&&Me(H))return ke(se,H,"block")}return $=="operator"&&/^(not|and|or)$/.test(H.current())&&(ge="keyword"),se.context.type},de.atBlock_parens=function($,H,se){if($=="{"||$=="}")return se.context.type;if($==")")return Me(H)?ke(se,H,"block"):ke(se,H,"atBlock");if($=="word"){var De=H.current().toLowerCase();return ge=te(De),/^(max|min)/.test(De)&&(ge="property"),ge=="tag"&&(re.test(De)?ge="variable-2":ge="atom"),se.context.type}return de.atBlock($,H,se)},de.keyframes=function($,H,se){return H.indentation()=="0"&&($=="}"&&we(H)||$=="]"||$=="hash"||$=="qualifier"||U(H.current()))?Ge($,H,se):$=="{"?ke(se,H,"keyframes"):$=="}"?we(H)?Je(se,!0):ke(se,H,"keyframes"):$=="unit"&&/^[0-9]+\%$/.test(H.current())?ke(se,H,"keyframes"):$=="word"&&(ge=te(H.current()),ge=="block-keyword")?(ge="keyword",ke(se,H,"keyframes")):/@(font-face|media|supports|(-moz-)?document)/.test($)?ke(se,H,Me(H)?"block":"atBlock"):$=="mixin"?ke(se,H,"block",0):se.context.type},de.interpolation=function($,H,se){return $=="{"&&Je(se)&&ke(se,H,"block"),$=="}"?H.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i)||H.string.match(/^\s*[a-z]/i)&&U(Le(H))?ke(se,H,"block"):!H.string.match(/^(\{|\s*\&)/)||H.match(/\s*[\w-]/,!1)?ke(se,H,"block",0):ke(se,H,"block"):$=="variable-name"?ke(se,H,"variableName",0):($=="word"&&(ge=te(H.current()),ge=="tag"&&(ge="atom")),se.context.type)},de.extend=function($,H,se){return $=="["||$=="="?"extend":$=="]"?Je(se):$=="word"?(ge=te(H.current()),"extend"):Je(se)},de.variableName=function($,H,se){return $=="string"||$=="["||$=="]"||H.current().match(/^(\.|\$)/)?(H.current().match(/^\.[\w-]+/i)&&(ge="variable-2"),"variableName"):Ge($,H,se)},{startState:function($){return{tokenize:null,state:"block",context:new Ze("block",$||0,null)}},token:function($,H){return!H.tokenize&&$.eatSpace()?null:(pe=(H.tokenize||Oe)($,H),pe&&typeof pe=="object"&&(Ee=pe[1],pe=pe[0]),ge=pe,H.state=de[H.state](Ee,$,H),ge)},indent:function($,H,se){var De=$.context,nt=H&&H.charAt(0),dt=De.indent,Pt=Le(H),Ft=se.match(/^\s*/)[0].replace(/\t/g,G).length,Pe=$.context.prev?$.context.prev.line.firstWord:"",xt=$.context.prev?$.context.prev.line.indent:Ft;return De.prev&&(nt=="}"&&(De.type=="block"||De.type=="atBlock"||De.type=="keyframes")||nt==")"&&(De.type=="parens"||De.type=="atBlock_parens")||nt=="{"&&De.type=="at")?dt=De.indent-O:/(\})/.test(nt)||(/@|\$|\d/.test(nt)||/^\{/.test(H)||/^\s*\/(\/|\*)/.test(H)||/^\s*\/\*/.test(Pe)||/^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(H)||/^(\+|-)?[a-z][\w-]*\(/i.test(H)||/^return/.test(H)||ce(Pt)?dt=Ft:/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(nt)||U(Pt)?/\,\s*$/.test(Pe)?dt=xt:/^\s+/.test(se)&&(/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(Pe)||U(Pe))?dt=Ft<=xt?xt:xt+O:dt=Ft:!/,\s*$/.test(se)&&(He(Pt)||Z(Pt))&&(ce(Pe)?dt=Ft<=xt?xt:xt+O:/^\{/.test(Pe)?dt=Ft<=xt?Ft:xt+O:He(Pe)||Z(Pe)?dt=Ft>=xt?xt:Ft:/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(Pe)||/=\s*$/.test(Pe)||U(Pe)||/^\$[\w-\.\[\]\'\"]/.test(Pe)?dt=xt+O:dt=Ft)),dt},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:"//",fold:"indent"}});var p=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","bgsound","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","var","video"],v=["domain","regexp","url-prefix","url"],C=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],b=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","dynamic-range","video-dynamic-range"],S=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"],s=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],h=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],g=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],T=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","conic-gradient","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","high","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-play-button","media-slider","media-sliderthumb","media-volume-slider","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","standard","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around","unset"],w=["in","and","or","not","is not","is a","is","isnt","defined","if unless"],c=["for","if","else","unless","from","to"],d=["null","true","false","href","title","type","not-allowed","readonly","disabled"],k=["@font-face","@keyframes","@media","@viewport","@page","@host","@supports","@block","@css"],z=p.concat(v,C,b,S,s,g,T,h,w,c,d,k);function M(E){return E=E.sort(function(O,G){return G>O}),new RegExp("^(("+E.join(")|(")+"))\\b")}function _(E){for(var O={},G=0;G{(function(o){typeof Gu=="object"&&typeof Zu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";function p(q){for(var I={},D=0;D~^?!",h=":;,.(){}[]",g=/^\-?0b[01][01_]*/,T=/^\-?0o[0-7][0-7_]*/,w=/^\-?0x[\dA-Fa-f][\dA-Fa-f_]*(?:(?:\.[\dA-Fa-f][\dA-Fa-f_]*)?[Pp]\-?\d[\d_]*)?/,c=/^\-?\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee]\-?\d[\d_]*)?/,d=/^\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1/,k=/^\.(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/,z=/^\#[A-Za-z]+/,M=/^@(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/;function _(q,I,D){if(q.sol()&&(I.indented=q.indentation()),q.eatSpace())return null;var Q=q.peek();if(Q=="/"){if(q.match("//"))return q.skipToEnd(),"comment";if(q.match("/*"))return I.tokenize.push(O),O(q,I)}if(q.match(z))return"builtin";if(q.match(M))return"attribute";if(q.match(g)||q.match(T)||q.match(w)||q.match(c))return"number";if(q.match(k))return"property";if(s.indexOf(Q)>-1)return q.next(),"operator";if(h.indexOf(Q)>-1)return q.next(),q.match(".."),"punctuation";var j;if(j=q.match(/("""|"|')/)){var V=E.bind(null,j[0]);return I.tokenize.push(V),V(q,I)}if(q.match(d)){var y=q.current();return S.hasOwnProperty(y)?"variable-2":b.hasOwnProperty(y)?"atom":v.hasOwnProperty(y)?(C.hasOwnProperty(y)&&(I.prev="define"),"keyword"):D=="define"?"def":"variable"}return q.next(),null}function W(){var q=0;return function(I,D,Q){var j=_(I,D,Q);if(j=="punctuation"){if(I.current()=="(")++q;else if(I.current()==")"){if(q==0)return I.backUp(1),D.tokenize.pop(),D.tokenize[D.tokenize.length-1](I,D);--q}}return j}}function E(q,I,D){for(var Q=q.length==1,j,V=!1;j=I.peek();)if(V){if(I.next(),j=="(")return D.tokenize.push(W()),"string";V=!1}else{if(I.match(q))return D.tokenize.pop(),"string";I.next(),V=j=="\\"}return Q&&D.tokenize.pop(),"string"}function O(q,I){for(var D;D=q.next();)if(D==="/"&&q.eat("*"))I.tokenize.push(O);else if(D==="*"&&q.eat("/")){I.tokenize.pop();break}return"comment"}function G(q,I,D){this.prev=q,this.align=I,this.indented=D}function J(q,I){var D=I.match(/^\s*($|\/[\/\*])/,!1)?null:I.column()+1;q.context=new G(q.context,D,q.indented)}function re(q){q.context&&(q.indented=q.context.indented,q.context=q.context.prev)}o.defineMode("swift",function(q){return{startState:function(){return{prev:null,context:null,indented:0,tokenize:[]}},token:function(I,D){var Q=D.prev;D.prev=null;var j=D.tokenize[D.tokenize.length-1]||_,V=j(I,D,Q);if(!V||V=="comment"?D.prev=Q:D.prev||(D.prev=V),V=="punctuation"){var y=/[\(\[\{]|([\]\)\}])/.exec(I.current());y&&(y[1]?re:J)(D,I)}return V},indent:function(I,D){var Q=I.context;if(!Q)return 0;var j=/^[\]\}\)]/.test(D);return Q.align!=null?Q.align-(j?1:0):Q.indented+(j?0:q.indentUnit)},electricInput:/^\s*[\)\}\]]$/,lineComment:"//",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace",closeBrackets:"()[]{}''\"\"``"}}),o.defineMIME("text/x-swift","swift")})});var Vu=Ke((Yu,Qu)=>{(function(o){typeof Yu=="object"&&typeof Qu=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("coffeescript",function(p,v){var C="error";function b(I){return new RegExp("^(("+I.join(")|(")+"))\\b")}var S=/^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/,s=/^(?:[()\[\]{},:`=;]|\.\.?\.?)/,h=/^[_A-Za-z$][_A-Za-z$0-9]*/,g=/^@[_A-Za-z$][_A-Za-z$0-9]*/,T=b(["and","or","not","is","isnt","in","instanceof","typeof"]),w=["for","while","loop","if","unless","else","switch","try","catch","finally","class"],c=["break","by","continue","debugger","delete","do","in","of","new","return","then","this","@","throw","when","until","extends"],d=b(w.concat(c));w=b(w);var k=/^('{3}|\"{3}|['\"])/,z=/^(\/{3}|\/)/,M=["Infinity","NaN","undefined","null","true","false","on","off","yes","no"],_=b(M);function W(I,D){if(I.sol()){D.scope.align===null&&(D.scope.align=!1);var Q=D.scope.offset;if(I.eatSpace()){var j=I.indentation();return j>Q&&D.scope.type=="coffee"?"indent":j0&&J(I,D)}if(I.eatSpace())return null;var V=I.peek();if(I.match("####"))return I.skipToEnd(),"comment";if(I.match("###"))return D.tokenize=O,D.tokenize(I,D);if(V==="#")return I.skipToEnd(),"comment";if(I.match(/^-?[0-9\.]/,!1)){var y=!1;if(I.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)&&(y=!0),I.match(/^-?\d+\.\d*/)&&(y=!0),I.match(/^-?\.\d+/)&&(y=!0),y)return I.peek()=="."&&I.backUp(1),"number";var K=!1;if(I.match(/^-?0x[0-9a-f]+/i)&&(K=!0),I.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)&&(K=!0),I.match(/^-?0(?![\dx])/i)&&(K=!0),K)return"number"}if(I.match(k))return D.tokenize=E(I.current(),!1,"string"),D.tokenize(I,D);if(I.match(z)){if(I.current()!="/"||I.match(/^.*\//,!1))return D.tokenize=E(I.current(),!0,"string-2"),D.tokenize(I,D);I.backUp(1)}return I.match(S)||I.match(T)?"operator":I.match(s)?"punctuation":I.match(_)?"atom":I.match(g)||D.prop&&I.match(h)?"property":I.match(d)?"keyword":I.match(h)?"variable":(I.next(),C)}function E(I,D,Q){return function(j,V){for(;!j.eol();)if(j.eatWhile(/[^'"\/\\]/),j.eat("\\")){if(j.next(),D&&j.eol())return Q}else{if(j.match(I))return V.tokenize=W,Q;j.eat(/['"\/]/)}return D&&(v.singleLineStringErrors?Q=C:V.tokenize=W),Q}}function O(I,D){for(;!I.eol();){if(I.eatWhile(/[^#]/),I.match("###")){D.tokenize=W;break}I.eatWhile("#")}return"comment"}function G(I,D,Q){Q=Q||"coffee";for(var j=0,V=!1,y=null,K=D.scope;K;K=K.prev)if(K.type==="coffee"||K.type=="}"){j=K.offset+p.indentUnit;break}Q!=="coffee"?(V=null,y=I.column()+I.current().length):D.scope.align&&(D.scope.align=!1),D.scope={offset:j,type:Q,prev:D.scope,align:V,alignOffset:y}}function J(I,D){if(D.scope.prev)if(D.scope.type==="coffee"){for(var Q=I.indentation(),j=!1,V=D.scope;V;V=V.prev)if(Q===V.offset){j=!0;break}if(!j)return!0;for(;D.scope.prev&&D.scope.offset!==Q;)D.scope=D.scope.prev;return!1}else return D.scope=D.scope.prev,!1}function re(I,D){var Q=D.tokenize(I,D),j=I.current();j==="return"&&(D.dedent=!0),((j==="->"||j==="=>")&&I.eol()||Q==="indent")&&G(I,D);var V="[({".indexOf(j);if(V!==-1&&G(I,D,"])}".slice(V,V+1)),w.exec(j)&&G(I,D),j=="then"&&J(I,D),Q==="dedent"&&J(I,D))return C;if(V="])}".indexOf(j),V!==-1){for(;D.scope.type=="coffee"&&D.scope.prev;)D.scope=D.scope.prev;D.scope.type==j&&(D.scope=D.scope.prev)}return D.dedent&&I.eol()&&(D.scope.type=="coffee"&&D.scope.prev&&(D.scope=D.scope.prev),D.dedent=!1),Q}var q={startState:function(I){return{tokenize:W,scope:{offset:I||0,type:"coffee",prev:null,align:!1},prop:!1,dedent:0}},token:function(I,D){var Q=D.scope.align===null&&D.scope;Q&&I.sol()&&(Q.align=!1);var j=re(I,D);return j&&j!="comment"&&(Q&&(Q.align=!0),D.prop=j=="punctuation"&&I.current()=="."),j},indent:function(I,D){if(I.tokenize!=W)return 0;var Q=I.scope,j=D&&"])}".indexOf(D.charAt(0))>-1;if(j)for(;Q.type=="coffee"&&Q.prev;)Q=Q.prev;var V=j&&Q.type===D.charAt(0);return Q.align?Q.alignOffset-(V?1:0):(V?Q.prev:Q).offset},lineComment:"#",fold:"indent"};return q}),o.defineMIME("application/vnd.coffeescript","coffeescript"),o.defineMIME("text/x-coffeescript","coffeescript"),o.defineMIME("text/coffeescript","coffeescript")})});var tc=Ke((Ju,ec)=>{(function(o){typeof Ju=="object"&&typeof ec=="object"?o(We(),vn(),gn(),Qn()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../javascript/javascript","../css/css","../htmlmixed/htmlmixed"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("pug",function(p){var v="keyword",C="meta",b="builtin",S="qualifier",s={"{":"}","(":")","[":"]"},h=o.getMode(p,"javascript");function g(){this.javaScriptLine=!1,this.javaScriptLineExcludesColon=!1,this.javaScriptArguments=!1,this.javaScriptArgumentsDepth=0,this.isInterpolating=!1,this.interpolationNesting=0,this.jsState=o.startState(h),this.restOfLine="",this.isIncludeFiltered=!1,this.isEach=!1,this.lastTag="",this.scriptType="",this.isAttrs=!1,this.attrsNest=[],this.inAttributeName=!0,this.attributeIsType=!1,this.attrValue="",this.indentOf=1/0,this.indentToken="",this.innerMode=null,this.innerState=null,this.innerModeForLine=!1}g.prototype.copy=function(){var U=new g;return U.javaScriptLine=this.javaScriptLine,U.javaScriptLineExcludesColon=this.javaScriptLineExcludesColon,U.javaScriptArguments=this.javaScriptArguments,U.javaScriptArgumentsDepth=this.javaScriptArgumentsDepth,U.isInterpolating=this.isInterpolating,U.interpolationNesting=this.interpolationNesting,U.jsState=o.copyState(h,this.jsState),U.innerMode=this.innerMode,this.innerMode&&this.innerState&&(U.innerState=o.copyState(this.innerMode,this.innerState)),U.restOfLine=this.restOfLine,U.isIncludeFiltered=this.isIncludeFiltered,U.isEach=this.isEach,U.lastTag=this.lastTag,U.scriptType=this.scriptType,U.isAttrs=this.isAttrs,U.attrsNest=this.attrsNest.slice(),U.inAttributeName=this.inAttributeName,U.attributeIsType=this.attributeIsType,U.attrValue=this.attrValue,U.indentOf=this.indentOf,U.indentToken=this.indentToken,U.innerModeForLine=this.innerModeForLine,U};function T(U,Z){if(U.sol()&&(Z.javaScriptLine=!1,Z.javaScriptLineExcludesColon=!1),Z.javaScriptLine){if(Z.javaScriptLineExcludesColon&&U.peek()===":"){Z.javaScriptLine=!1,Z.javaScriptLineExcludesColon=!1;return}var ce=h.token(U,Z.jsState);return U.eol()&&(Z.javaScriptLine=!1),ce||!0}}function w(U,Z){if(Z.javaScriptArguments){if(Z.javaScriptArgumentsDepth===0&&U.peek()!=="("){Z.javaScriptArguments=!1;return}if(U.peek()==="("?Z.javaScriptArgumentsDepth++:U.peek()===")"&&Z.javaScriptArgumentsDepth--,Z.javaScriptArgumentsDepth===0){Z.javaScriptArguments=!1;return}var ce=h.token(U,Z.jsState);return ce||!0}}function c(U){if(U.match(/^yield\b/))return"keyword"}function d(U){if(U.match(/^(?:doctype) *([^\n]+)?/))return C}function k(U,Z){if(U.match("#{"))return Z.isInterpolating=!0,Z.interpolationNesting=0,"punctuation"}function z(U,Z){if(Z.isInterpolating){if(U.peek()==="}"){if(Z.interpolationNesting--,Z.interpolationNesting<0)return U.next(),Z.isInterpolating=!1,"punctuation"}else U.peek()==="{"&&Z.interpolationNesting++;return h.token(U,Z.jsState)||!0}}function M(U,Z){if(U.match(/^case\b/))return Z.javaScriptLine=!0,v}function _(U,Z){if(U.match(/^when\b/))return Z.javaScriptLine=!0,Z.javaScriptLineExcludesColon=!0,v}function W(U){if(U.match(/^default\b/))return v}function E(U,Z){if(U.match(/^extends?\b/))return Z.restOfLine="string",v}function O(U,Z){if(U.match(/^append\b/))return Z.restOfLine="variable",v}function G(U,Z){if(U.match(/^prepend\b/))return Z.restOfLine="variable",v}function J(U,Z){if(U.match(/^block\b *(?:(prepend|append)\b)?/))return Z.restOfLine="variable",v}function re(U,Z){if(U.match(/^include\b/))return Z.restOfLine="string",v}function q(U,Z){if(U.match(/^include:([a-zA-Z0-9\-]+)/,!1)&&U.match("include"))return Z.isIncludeFiltered=!0,v}function I(U,Z){if(Z.isIncludeFiltered){var ce=R(U,Z);return Z.isIncludeFiltered=!1,Z.restOfLine="string",ce}}function D(U,Z){if(U.match(/^mixin\b/))return Z.javaScriptLine=!0,v}function Q(U,Z){if(U.match(/^\+([-\w]+)/))return U.match(/^\( *[-\w]+ *=/,!1)||(Z.javaScriptArguments=!0,Z.javaScriptArgumentsDepth=0),"variable";if(U.match("+#{",!1))return U.next(),Z.mixinCallAfter=!0,k(U,Z)}function j(U,Z){if(Z.mixinCallAfter)return Z.mixinCallAfter=!1,U.match(/^\( *[-\w]+ *=/,!1)||(Z.javaScriptArguments=!0,Z.javaScriptArgumentsDepth=0),!0}function V(U,Z){if(U.match(/^(if|unless|else if|else)\b/))return Z.javaScriptLine=!0,v}function y(U,Z){if(U.match(/^(- *)?(each|for)\b/))return Z.isEach=!0,v}function K(U,Z){if(Z.isEach){if(U.match(/^ in\b/))return Z.javaScriptLine=!0,Z.isEach=!1,v;if(U.sol()||U.eol())Z.isEach=!1;else if(U.next()){for(;!U.match(/^ in\b/,!1)&&U.next(););return"variable"}}}function X(U,Z){if(U.match(/^while\b/))return Z.javaScriptLine=!0,v}function N(U,Z){var ce;if(ce=U.match(/^(\w(?:[-:\w]*\w)?)\/?/))return Z.lastTag=ce[1].toLowerCase(),Z.lastTag==="script"&&(Z.scriptType="application/javascript"),"tag"}function R(U,Z){if(U.match(/^:([\w\-]+)/)){var ce;return p&&p.innerModes&&(ce=p.innerModes(U.current().substring(1))),ce||(ce=U.current().substring(1)),typeof ce=="string"&&(ce=o.getMode(p,ce)),Be(U,Z,ce),"atom"}}function le(U,Z){if(U.match(/^(!?=|-)/))return Z.javaScriptLine=!0,"punctuation"}function xe(U){if(U.match(/^#([\w-]+)/))return b}function F(U){if(U.match(/^\.([\w-]+)/))return S}function L(U,Z){if(U.peek()=="(")return U.next(),Z.isAttrs=!0,Z.attrsNest=[],Z.inAttributeName=!0,Z.attrValue="",Z.attributeIsType=!1,"punctuation"}function de(U,Z){if(Z.isAttrs){if(s[U.peek()]&&Z.attrsNest.push(s[U.peek()]),Z.attrsNest[Z.attrsNest.length-1]===U.peek())Z.attrsNest.pop();else if(U.eat(")"))return Z.isAttrs=!1,"punctuation";if(Z.inAttributeName&&U.match(/^[^=,\)!]+/))return(U.peek()==="="||U.peek()==="!")&&(Z.inAttributeName=!1,Z.jsState=o.startState(h),Z.lastTag==="script"&&U.current().trim().toLowerCase()==="type"?Z.attributeIsType=!0:Z.attributeIsType=!1),"attribute";var ce=h.token(U,Z.jsState);if(Z.attributeIsType&&ce==="string"&&(Z.scriptType=U.current().toString()),Z.attrsNest.length===0&&(ce==="string"||ce==="variable"||ce==="keyword"))try{return Function("","var x "+Z.attrValue.replace(/,\s*$/,"").replace(/^!/,"")),Z.inAttributeName=!0,Z.attrValue="",U.backUp(U.current().length),de(U,Z)}catch{}return Z.attrValue+=U.current(),ce||!0}}function ze(U,Z){if(U.match(/^&attributes\b/))return Z.javaScriptArguments=!0,Z.javaScriptArgumentsDepth=0,"keyword"}function pe(U){if(U.sol()&&U.eatSpace())return"indent"}function Ee(U,Z){if(U.match(/^ *\/\/(-)?([^\n]*)/))return Z.indentOf=U.indentation(),Z.indentToken="comment","comment"}function ge(U){if(U.match(/^: */))return"colon"}function Oe(U,Z){if(U.match(/^(?:\| ?| )([^\n]+)/))return"string";if(U.match(/^(<[^\n]*)/,!1))return Be(U,Z,"htmlmixed"),Z.innerModeForLine=!0,Ze(U,Z,!0)}function qe(U,Z){if(U.eat(".")){var ce=null;return Z.lastTag==="script"&&Z.scriptType.toLowerCase().indexOf("javascript")!=-1?ce=Z.scriptType.toLowerCase().replace(/"|'/g,""):Z.lastTag==="style"&&(ce="css"),Be(U,Z,ce),"dot"}}function Se(U){return U.next(),null}function Be(U,Z,ce){ce=o.mimeModes[ce]||ce,ce=p.innerModes&&p.innerModes(ce)||ce,ce=o.mimeModes[ce]||ce,ce=o.getMode(p,ce),Z.indentOf=U.indentation(),ce&&ce.name!=="null"?Z.innerMode=ce:Z.indentToken="string"}function Ze(U,Z,ce){if(U.indentation()>Z.indentOf||Z.innerModeForLine&&!U.sol()||ce)return Z.innerMode?(Z.innerState||(Z.innerState=Z.innerMode.startState?o.startState(Z.innerMode,U.indentation()):{}),U.hideFirstChars(Z.indentOf+2,function(){return Z.innerMode.token(U,Z.innerState)||!0})):(U.skipToEnd(),Z.indentToken);U.sol()&&(Z.indentOf=1/0,Z.indentToken=null,Z.innerMode=null,Z.innerState=null)}function ke(U,Z){if(U.sol()&&(Z.restOfLine=""),Z.restOfLine){U.skipToEnd();var ce=Z.restOfLine;return Z.restOfLine="",ce}}function Je(){return new g}function Re(U){return U.copy()}function Ge(U,Z){var ce=Ze(U,Z)||ke(U,Z)||z(U,Z)||I(U,Z)||K(U,Z)||de(U,Z)||T(U,Z)||w(U,Z)||j(U,Z)||c(U)||d(U)||k(U,Z)||M(U,Z)||_(U,Z)||W(U)||E(U,Z)||O(U,Z)||G(U,Z)||J(U,Z)||re(U,Z)||q(U,Z)||D(U,Z)||Q(U,Z)||V(U,Z)||y(U,Z)||X(U,Z)||N(U,Z)||R(U,Z)||le(U,Z)||xe(U)||F(U)||L(U,Z)||ze(U,Z)||pe(U)||Oe(U,Z)||Ee(U,Z)||ge(U)||qe(U,Z)||Se(U);return ce===!0?null:ce}return{startState:Je,copyState:Re,token:Ge}},"javascript","css","htmlmixed"),o.defineMIME("text/x-pug","pug"),o.defineMIME("text/x-jade","pug")})});var ic=Ke((rc,nc)=>{(function(o){typeof rc=="object"&&typeof nc=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.multiplexingMode=function(p){var v=Array.prototype.slice.call(arguments,1);function C(b,S,s,h){if(typeof S=="string"){var g=b.indexOf(S,s);return h&&g>-1?g+S.length:g}var T=S.exec(s?b.slice(s):b);return T?T.index+s+(h?T[0].length:0):-1}return{startState:function(){return{outer:o.startState(p),innerActive:null,inner:null,startingInner:!1}},copyState:function(b){return{outer:o.copyState(p,b.outer),innerActive:b.innerActive,inner:b.innerActive&&o.copyState(b.innerActive.mode,b.inner),startingInner:b.startingInner}},token:function(b,S){if(S.innerActive){var z=S.innerActive,h=b.string;if(!z.close&&b.sol())return S.innerActive=S.inner=null,this.token(b,S);var w=z.close&&!S.startingInner?C(h,z.close,b.pos,z.parseDelimiters):-1;if(w==b.pos&&!z.parseDelimiters)return b.match(z.close),S.innerActive=S.inner=null,z.delimStyle&&z.delimStyle+" "+z.delimStyle+"-close";w>-1&&(b.string=h.slice(0,w));var M=z.mode.token(b,S.inner);return w>-1?b.string=h:b.pos>b.start&&(S.startingInner=!1),w==b.pos&&z.parseDelimiters&&(S.innerActive=S.inner=null),z.innerStyle&&(M?M=M+" "+z.innerStyle:M=z.innerStyle),M}else{for(var s=1/0,h=b.string,g=0;g{(function(o){typeof oc=="object"&&typeof ac=="object"?o(We(),Di(),ic()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/simple","../../addon/mode/multiplex"],o):o(CodeMirror)})(function(o){"use strict";o.defineSimpleMode("handlebars-tags",{start:[{regex:/\{\{\{/,push:"handlebars_raw",token:"tag"},{regex:/\{\{!--/,push:"dash_comment",token:"comment"},{regex:/\{\{!/,push:"comment",token:"comment"},{regex:/\{\{/,push:"handlebars",token:"tag"}],handlebars_raw:[{regex:/\}\}\}/,pop:!0,token:"tag"}],handlebars:[{regex:/\}\}/,pop:!0,token:"tag"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"},{regex:/'(?:[^\\']|\\.)*'?/,token:"string"},{regex:/>|[#\/]([A-Za-z_]\w*)/,token:"keyword"},{regex:/(?:else|this)\b/,token:"keyword"},{regex:/\d+/i,token:"number"},{regex:/=|~|@|true|false/,token:"atom"},{regex:/(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/,token:"variable-2"}],dash_comment:[{regex:/--\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],comment:[{regex:/\}\}/,pop:!0,token:"comment"},{regex:/./,token:"comment"}],meta:{blockCommentStart:"{{--",blockCommentEnd:"--}}"}}),o.defineMode("handlebars",function(p,v){var C=o.getMode(p,"handlebars-tags");return!v||!v.base?C:o.multiplexingMode(o.getMode(p,v.base),{open:"{{",close:/\}\}\}?/,mode:C,parseDelimiters:!0})}),o.defineMIME("text/x-handlebars-template","handlebars")})});var cc=Ke((sc,uc)=>{(function(o){"use strict";typeof sc=="object"&&typeof uc=="object"?o(We(),Yn(),mn(),vn(),Vu(),gn(),ea(),ta(),tc(),lc()):typeof define=="function"&&define.amd?define(["../../lib/codemirror","../../addon/mode/overlay","../xml/xml","../javascript/javascript","../coffeescript/coffeescript","../css/css","../sass/sass","../stylus/stylus","../pug/pug","../handlebars/handlebars"],o):o(CodeMirror)})(function(o){var p={script:[["lang",/coffee(script)?/,"coffeescript"],["type",/^(?:text|application)\/(?:x-)?coffee(?:script)?$/,"coffeescript"],["lang",/^babel$/,"javascript"],["type",/^text\/babel$/,"javascript"],["type",/^text\/ecmascript-\d+$/,"javascript"]],style:[["lang",/^stylus$/i,"stylus"],["lang",/^sass$/i,"sass"],["lang",/^less$/i,"text/x-less"],["lang",/^scss$/i,"text/x-scss"],["type",/^(text\/)?(x-)?styl(us)?$/i,"stylus"],["type",/^text\/sass/i,"sass"],["type",/^(text\/)?(x-)?scss$/i,"text/x-scss"],["type",/^(text\/)?(x-)?less$/i,"text/x-less"]],template:[["lang",/^vue-template$/i,"vue"],["lang",/^pug$/i,"pug"],["lang",/^handlebars$/i,"handlebars"],["type",/^(text\/)?(x-)?pug$/i,"pug"],["type",/^text\/x-handlebars-template$/i,"handlebars"],[null,null,"vue-template"]]};o.defineMode("vue-template",function(v,C){var b={token:function(S){if(S.match(/^\{\{.*?\}\}/))return"meta mustache";for(;S.next()&&!S.match("{{",!1););return null}};return o.overlayMode(o.getMode(v,C.backdrop||"text/html"),b)}),o.defineMode("vue",function(v){return o.getMode(v,{name:"htmlmixed",tags:p})},"htmlmixed","xml","javascript","coffeescript","css","sass","stylus","pug","handlebars"),o.defineMIME("script/x-vue","vue"),o.defineMIME("text/x-vue","vue")})});var pc=Ke((fc,dc)=>{(function(o){typeof fc=="object"&&typeof dc=="object"?o(We()):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],o):o(CodeMirror)})(function(o){"use strict";o.defineMode("yaml",function(){var p=["true","false","on","off","yes","no"],v=new RegExp("\\b(("+p.join(")|(")+"))$","i");return{token:function(C,b){var S=C.peek(),s=b.escaped;if(b.escaped=!1,S=="#"&&(C.pos==0||/\s/.test(C.string.charAt(C.pos-1))))return C.skipToEnd(),"comment";if(C.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(b.literal&&C.indentation()>b.keyCol)return C.skipToEnd(),"string";if(b.literal&&(b.literal=!1),C.sol()){if(b.keyCol=0,b.pair=!1,b.pairStart=!1,C.match("---")||C.match("..."))return"def";if(C.match(/\s*-\s+/))return"meta"}if(C.match(/^(\{|\}|\[|\])/))return S=="{"?b.inlinePairs++:S=="}"?b.inlinePairs--:S=="["?b.inlineList++:b.inlineList--,"meta";if(b.inlineList>0&&!s&&S==",")return C.next(),"meta";if(b.inlinePairs>0&&!s&&S==",")return b.keyCol=0,b.pair=!1,b.pairStart=!1,C.next(),"meta";if(b.pairStart){if(C.match(/^\s*(\||\>)\s*/))return b.literal=!0,"meta";if(C.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(b.inlinePairs==0&&C.match(/^\s*-?[0-9\.\,]+\s?$/)||b.inlinePairs>0&&C.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(C.match(v))return"keyword"}return!b.pair&&C.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^\s,\[\]{}#&*!|>'"%@`])[^#:]*(?=:($|\s))/)?(b.pair=!0,b.keyCol=C.indentation(),"atom"):b.pair&&C.match(/^:\s*/)?(b.pairStart=!0,"meta"):(b.pairStart=!1,b.escaped=S=="\\",C.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),o.defineMIME("text/x-yaml","yaml"),o.defineMIME("text/yaml","yaml")})});var $d={};function qd(o){for(var p;(p=Md.exec(o))!==null;){var v=p[0];if(v.indexOf("target=")===-1){var C=v.replace(/>$/,' target="_blank">');o=o.replace(v,C)}}return o}function Fd(o){for(var p=new DOMParser,v=p.parseFromString(o,"text/html"),C=v.getElementsByTagName("li"),b=0;b0){for(var d=document.createElement("i"),k=0;k=0&&(w=s.getLineHandle(d),!v(w));d--);var W=s.getTokenAt({line:d,ch:1}),E=C(W).fencedChars,O,G,J,re;v(s.getLineHandle(h.line))?(O="",G=h.line):v(s.getLineHandle(h.line-1))?(O="",G=h.line-1):(O=E+` `,G=h.line),v(s.getLineHandle(g.line))?(J="",re=g.line,g.ch===0&&(re+=1)):g.ch!==0&&v(s.getLineHandle(g.line+1))?(J="",re=g.line+1):(J=E+` `,re=g.line+1),g.ch===0&&(re-=1),s.operation(function(){s.replaceRange(J,{line:re,ch:0},{line:re+(J?0:1),ch:0}),s.replaceRange(O,{line:G,ch:0},{line:G+(O?0:1),ch:0})}),s.setSelection({line:G+(O?1:0),ch:0},{line:re+(O?1:-1),ch:0}),s.focus()}else{var q=h.line;if(v(s.getLineHandle(h.line))&&(b(s,h.line+1)==="fenced"?(d=h.line,q=h.line+1):(k=h.line,q=h.line-1)),d===void 0)for(d=q;d>=0&&(w=s.getLineHandle(d),!v(w));d--);if(k===void 0)for(z=s.lineCount(),k=q;k=0;d--)if(w=s.getLineHandle(d),!w.text.match(/^\s*$/)&&b(s,d,w)!=="indented"){d+=1;break}for(z=s.lineCount(),k=h.line;k\s+/,"unordered-list":C,"ordered-list":C},T=function(z,M){var _={quote:">","unordered-list":v,"ordered-list":"%%i."};return _[z].replace("%%i",M)},w=function(z,M){var _={quote:">","unordered-list":"\\"+v,"ordered-list":"\\d+."},W=new RegExp(_[z]);return M&&W.test(M)},c=function(z,M,_){var W=C.exec(M),E=T(z,d);return W!==null?(w(z,W[2])&&(E=""),M=W[1]+E+W[3]+M.replace(b,"").replace(g[z],"$1")):_==!1&&(M=E+" "+M),M},d=1,k=s.line;k<=h.line;k++)(function(z){var M=o.getLine(z);S[p]?M=M.replace(g[p],"$1"):(p=="unordered-list"&&(M=c("ordered-list",M,!0)),M=c(p,M,!1),d+=1),o.replaceRange(M,{line:z,ch:0},{line:z,ch:99999999999999})})(k);o.focus()}}function xc(o,p,v,C){if(!(!o.codemirror||o.isPreviewActive())){var b=o.codemirror,S=Tr(b),s=S[p];if(!s){jr(b,s,v,C);return}var h=b.getCursor("start"),g=b.getCursor("end"),T=b.getLine(h.line),w=T.slice(0,h.ch),c=T.slice(h.ch);p=="link"?w=w.replace(/(.*)[^!]\[/,"$1"):p=="image"&&(w=w.replace(/(.*)!\[$/,"$1")),c=c.replace(/]\(.*?\)/,""),b.replaceRange(w+c,{line:h.line,ch:0},{line:h.line,ch:99999999999999}),h.ch-=v[0].length,h!==g&&(g.ch-=v[0].length),b.setSelection(h,g),b.focus()}}function sa(o,p,v,C){if(!(!o.codemirror||o.isPreviewActive())){C=typeof C>"u"?v:C;var b=o.codemirror,S=Tr(b),s,h=v,g=C,T=b.getCursor("start"),w=b.getCursor("end");S[p]?(s=b.getLine(T.line),h=s.slice(0,T.ch),g=s.slice(T.ch),p=="bold"?(h=h.replace(/(\*\*|__)(?![\s\S]*(\*\*|__))/,""),g=g.replace(/(\*\*|__)/,"")):p=="italic"?(h=h.replace(/(\*|_)(?![\s\S]*(\*|_))/,""),g=g.replace(/(\*|_)/,"")):p=="strikethrough"&&(h=h.replace(/(\*\*|~~)(?![\s\S]*(\*\*|~~))/,""),g=g.replace(/(\*\*|~~)/,"")),b.replaceRange(h+g,{line:T.line,ch:0},{line:T.line,ch:99999999999999}),p=="bold"||p=="strikethrough"?(T.ch-=2,T!==w&&(w.ch-=2)):p=="italic"&&(T.ch-=1,T!==w&&(w.ch-=1))):(s=b.getSelection(),p=="bold"?(s=s.split("**").join(""),s=s.split("__").join("")):p=="italic"?(s=s.split("*").join(""),s=s.split("_").join("")):p=="strikethrough"&&(s=s.split("~~").join("")),b.replaceSelection(h+s+g),T.ch+=v.length,w.ch=T.ch+s.length),b.setSelection(T,w),b.focus()}}function Pd(o){if(!o.getWrapperElement().lastChild.classList.contains("editor-preview-active"))for(var p=o.getCursor("start"),v=o.getCursor("end"),C,b=p.line;b<=v.line;b++)C=o.getLine(b),C=C.replace(/^[ ]*([# ]+|\*|-|[> ]+|[0-9]+(.|\)))[ ]*/,""),o.replaceRange(C,{line:b,ch:0},{line:b,ch:99999999999999})}function Fi(o,p){if(Math.abs(o)<1024)return""+o+p[0];var v=0;do o/=1024,++v;while(Math.abs(o)>=1024&&v=19968?C+=v[b].length:C+=1;return C}function Te(o){o=o||{},o.parent=this;var p=!0;if(o.autoDownloadFontAwesome===!1&&(p=!1),o.autoDownloadFontAwesome!==!0)for(var v=document.styleSheets,C=0;C-1&&(p=!1);if(p){var b=document.createElement("link");b.rel="stylesheet",b.href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css",document.getElementsByTagName("head")[0].appendChild(b)}if(o.element)this.element=o.element;else if(o.element===null){console.log("EasyMDE: Error. No element was found.");return}if(o.toolbar===void 0){o.toolbar=[];for(var S in Pr)Object.prototype.hasOwnProperty.call(Pr,S)&&(S.indexOf("separator-")!=-1&&o.toolbar.push("|"),(Pr[S].default===!0||o.showIcons&&o.showIcons.constructor===Array&&o.showIcons.indexOf(S)!=-1)&&o.toolbar.push(S))}if(Object.prototype.hasOwnProperty.call(o,"previewClass")||(o.previewClass="editor-preview"),Object.prototype.hasOwnProperty.call(o,"status")||(o.status=["autosave","lines","words","cursor"],o.uploadImage&&o.status.unshift("upload-image")),o.previewRender||(o.previewRender=function(h){return this.parent.markdown(h)}),o.parsingConfig=fr({highlightFormatting:!0},o.parsingConfig||{}),o.insertTexts=fr({},Bd,o.insertTexts||{}),o.promptTexts=fr({},jd,o.promptTexts||{}),o.blockStyles=fr({},Hd,o.blockStyles||{}),o.autosave!=null&&(o.autosave.timeFormat=fr({},Rd,o.autosave.timeFormat||{})),o.iconClassMap=fr({},et,o.iconClassMap||{}),o.shortcuts=fr({},Ad,o.shortcuts||{}),o.maxHeight=o.maxHeight||void 0,o.direction=o.direction||"ltr",typeof o.maxHeight<"u"?o.minHeight=o.maxHeight:o.minHeight=o.minHeight||"300px",o.errorCallback=o.errorCallback||function(h){alert(h)},o.uploadImage=o.uploadImage||!1,o.imageMaxSize=o.imageMaxSize||2097152,o.imageAccept=o.imageAccept||"image/png, image/jpeg, image/gif, image/avif",o.imageTexts=fr({},Wd,o.imageTexts||{}),o.errorMessages=fr({},Ud,o.errorMessages||{}),o.imagePathAbsolute=o.imagePathAbsolute||!1,o.imageCSRFName=o.imageCSRFName||"csrfmiddlewaretoken",o.imageCSRFHeader=o.imageCSRFHeader||!1,o.autosave!=null&&o.autosave.unique_id!=null&&o.autosave.unique_id!=""&&(o.autosave.uniqueId=o.autosave.unique_id),o.overlayMode&&o.overlayMode.combine===void 0&&(o.overlayMode.combine=!0),this.options=o,this.render(),o.initialValue&&(!this.options.autosave||this.options.autosave.foundSavedValue!==!0)&&this.value(o.initialValue),o.uploadImage){var s=this;this.codemirror.on("dragenter",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbOnDragEnter),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragend",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbInit),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragleave",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbInit),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("dragover",function(h,g){s.updateStatusBar("upload-image",s.options.imageTexts.sbOnDragEnter),g.stopPropagation(),g.preventDefault()}),this.codemirror.on("drop",function(h,g){g.stopPropagation(),g.preventDefault(),o.imageUploadFunction?s.uploadImagesUsingCustomFunction(o.imageUploadFunction,g.dataTransfer.files):s.uploadImages(g.dataTransfer.files)}),this.codemirror.on("paste",function(h,g){o.imageUploadFunction?s.uploadImagesUsingCustomFunction(o.imageUploadFunction,g.clipboardData.files):s.uploadImages(g.clipboardData.files)})}}function kc(){if(typeof localStorage=="object")try{localStorage.setItem("smde_localStorage",1),localStorage.removeItem("smde_localStorage")}catch{return!1}else return!1;return!0}var mc,Md,Vn,Ad,Dd,ra,hc,et,Pr,Bd,jd,Rd,Hd,Wd,Ud,wc=Cd(()=>{mc=/Mac/.test(navigator.platform),Md=new RegExp(/()+?/g),Vn={toggleBold:Ii,toggleItalic:Ni,drawLink:Gi,toggleHeadingSmaller:Jn,toggleHeadingBigger:ji,drawImage:Zi,toggleBlockquote:Bi,toggleOrderedList:$i,toggleUnorderedList:Ui,toggleCodeBlock:Pi,togglePreview:Ji,toggleStrikethrough:Oi,toggleHeading1:Ri,toggleHeading2:Hi,toggleHeading3:Wi,toggleHeading4:na,toggleHeading5:ia,toggleHeading6:oa,cleanBlock:Ki,drawTable:Xi,drawHorizontalRule:Yi,undo:Qi,redo:Vi,toggleSideBySide:bn,toggleFullScreen:Br},Ad={toggleBold:"Cmd-B",toggleItalic:"Cmd-I",drawLink:"Cmd-K",toggleHeadingSmaller:"Cmd-H",toggleHeadingBigger:"Shift-Cmd-H",toggleHeading1:"Ctrl+Alt+1",toggleHeading2:"Ctrl+Alt+2",toggleHeading3:"Ctrl+Alt+3",toggleHeading4:"Ctrl+Alt+4",toggleHeading5:"Ctrl+Alt+5",toggleHeading6:"Ctrl+Alt+6",cleanBlock:"Cmd-E",drawImage:"Cmd-Alt-I",toggleBlockquote:"Cmd-'",toggleOrderedList:"Cmd-Alt-L",toggleUnorderedList:"Cmd-L",toggleCodeBlock:"Cmd-Alt-C",togglePreview:"Cmd-P",toggleSideBySide:"F9",toggleFullScreen:"F11"},Dd=function(o){for(var p in Vn)if(Vn[p]===o)return p;return null},ra=function(){var o=!1;return(function(p){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(p)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(p.substr(0,4)))&&(o=!0)})(navigator.userAgent||navigator.vendor||window.opera),o};hc="";et={bold:"fa fa-bold",italic:"fa fa-italic",strikethrough:"fa fa-strikethrough",heading:"fa fa-header fa-heading","heading-smaller":"fa fa-header fa-heading header-smaller","heading-bigger":"fa fa-header fa-heading header-bigger","heading-1":"fa fa-header fa-heading header-1","heading-2":"fa fa-header fa-heading header-2","heading-3":"fa fa-header fa-heading header-3",code:"fa fa-code",quote:"fa fa-quote-left","ordered-list":"fa fa-list-ol","unordered-list":"fa fa-list-ul","clean-block":"fa fa-eraser",link:"fa fa-link",image:"fa fa-image","upload-image":"fa fa-image",table:"fa fa-table","horizontal-rule":"fa fa-minus",preview:"fa fa-eye","side-by-side":"fa fa-columns",fullscreen:"fa fa-arrows-alt",guide:"fa fa-question-circle",undo:"fa fa-undo",redo:"fa fa-repeat fa-redo"},Pr={bold:{name:"bold",action:Ii,className:et.bold,title:"Bold",default:!0},italic:{name:"italic",action:Ni,className:et.italic,title:"Italic",default:!0},strikethrough:{name:"strikethrough",action:Oi,className:et.strikethrough,title:"Strikethrough"},heading:{name:"heading",action:Jn,className:et.heading,title:"Heading",default:!0},"heading-smaller":{name:"heading-smaller",action:Jn,className:et["heading-smaller"],title:"Smaller Heading"},"heading-bigger":{name:"heading-bigger",action:ji,className:et["heading-bigger"],title:"Bigger Heading"},"heading-1":{name:"heading-1",action:Ri,className:et["heading-1"],title:"Big Heading"},"heading-2":{name:"heading-2",action:Hi,className:et["heading-2"],title:"Medium Heading"},"heading-3":{name:"heading-3",action:Wi,className:et["heading-3"],title:"Small Heading"},"separator-1":{name:"separator-1"},code:{name:"code",action:Pi,className:et.code,title:"Code"},quote:{name:"quote",action:Bi,className:et.quote,title:"Quote",default:!0},"unordered-list":{name:"unordered-list",action:Ui,className:et["unordered-list"],title:"Generic List",default:!0},"ordered-list":{name:"ordered-list",action:$i,className:et["ordered-list"],title:"Numbered List",default:!0},"clean-block":{name:"clean-block",action:Ki,className:et["clean-block"],title:"Clean block"},"separator-2":{name:"separator-2"},link:{name:"link",action:Gi,className:et.link,title:"Create Link",default:!0},image:{name:"image",action:Zi,className:et.image,title:"Insert Image",default:!0},"upload-image":{name:"upload-image",action:aa,className:et["upload-image"],title:"Import an image"},table:{name:"table",action:Xi,className:et.table,title:"Insert Table"},"horizontal-rule":{name:"horizontal-rule",action:Yi,className:et["horizontal-rule"],title:"Insert Horizontal Line"},"separator-3":{name:"separator-3"},preview:{name:"preview",action:Ji,className:et.preview,noDisable:!0,title:"Toggle Preview",default:!0},"side-by-side":{name:"side-by-side",action:bn,className:et["side-by-side"],noDisable:!0,noMobile:!0,title:"Toggle Side by Side",default:!0},fullscreen:{name:"fullscreen",action:Br,className:et.fullscreen,noDisable:!0,noMobile:!0,title:"Toggle Fullscreen",default:!0},"separator-4":{name:"separator-4"},guide:{name:"guide",action:"https://www.markdownguide.org/basic-syntax/",className:et.guide,noDisable:!0,title:"Markdown Guide",default:!0},"separator-5":{name:"separator-5"},undo:{name:"undo",action:Qi,className:et.undo,noDisable:!0,title:"Undo"},redo:{name:"redo",action:Vi,className:et.redo,noDisable:!0,title:"Redo"}},Bd={link:["[","](#url#)"],image:["![","](#url#)"],uploadedImage:["![](#url#)",""],table:["",` | Column 1 | Column 2 | Column 3 | | -------- | -------- | -------- | | Text | Text | Text | `],horizontalRule:["",` ----- `]},jd={link:"URL for the link:",image:"URL of the image:"},Rd={locale:"en-US",format:{hour:"2-digit",minute:"2-digit"}},Hd={bold:"**",code:"```",italic:"*"},Wd={sbInit:"Attach files by drag and dropping or pasting from clipboard.",sbOnDragEnter:"Drop image to upload it.",sbOnDrop:"Uploading image #images_names#...",sbProgress:"Uploading #file_name#: #progress#%",sbOnUploaded:"Uploaded #image_name#",sizeUnits:" B, KB, MB"},Ud={noFileGiven:"You must select a file.",typeNotAllowed:"This image type is not allowed.",fileTooLarge:`Image #image_name# is too big (#image_size#). Maximum file size is #image_max_size#.`,importError:"Something went wrong when uploading the image #image_name#."};Te.prototype.uploadImages=function(o,p,v){if(o.length!==0){for(var C=[],b=0;b!(q.closest&&q.closest(".editor-toolbar")||q.offsetParent===null)),re=J.indexOf(O);re!==-1&&re+1!(q.closest&&q.closest(".editor-toolbar")||q.offsetParent===null)),re=J.indexOf(O);if(re!==-1)for(let q=re-1;q>=0;q--){let I=J[q];if(I){I.focus();break}}}}for(var s in p.shortcuts)p.shortcuts[s]!==null&&Vn[s]!==null&&(function(E){C[vc(p.shortcuts[E])]=function(){var O=Vn[E];typeof O=="function"?O(v):typeof O=="string"&&window.open(O,"_blank")}})(s);C.Enter="newlineAndIndentContinueMarkdownList",C.Tab=E=>{let O=E.getSelection();O&&O.length>0?E.execCommand("indentMore"):b(E)},C["Shift-Tab"]=E=>{let O=E.getSelection();O&&O.length>0?E.execCommand("indentLess"):S(E)},C.Esc=function(E){E.getOption("fullScreen")&&Br(v)},this.documentOnKeyDown=function(E){E=E||window.event,E.keyCode==27&&v.codemirror.getOption("fullScreen")&&Br(v)},document.addEventListener("keydown",this.documentOnKeyDown,!1);var h,g;p.overlayMode?(CodeMirror.defineMode("overlay-mode",function(E){return CodeMirror.overlayMode(CodeMirror.getMode(E,p.spellChecker!==!1?"spell-checker":"gfm"),p.overlayMode.mode,p.overlayMode.combine)}),h="overlay-mode",g=p.parsingConfig,g.gitHubSpice=!1):(h=p.parsingConfig,h.name="gfm",h.gitHubSpice=!1),p.spellChecker!==!1&&(h="spell-checker",g=p.parsingConfig,g.name="gfm",g.gitHubSpice=!1,typeof p.spellChecker=="function"?p.spellChecker({codeMirrorInstance:CodeMirror}):CodeMirrorSpellChecker({codeMirrorInstance:CodeMirror}));function T(E,O,G){return{addNew:!1}}if(CodeMirror.getMode("php").mime="text/x-php",this.codemirror=CodeMirror.fromTextArea(o,{mode:h,backdrop:g,theme:p.theme!=null?p.theme:"easymde",tabSize:p.tabSize!=null?p.tabSize:2,indentUnit:p.tabSize!=null?p.tabSize:2,indentWithTabs:p.indentWithTabs!==!1,lineNumbers:p.lineNumbers===!0,autofocus:p.autofocus===!0,extraKeys:C,direction:p.direction,lineWrapping:p.lineWrapping!==!1,allowDropFileTypes:["text/plain"],placeholder:p.placeholder||o.getAttribute("placeholder")||"",styleSelectedText:p.styleSelectedText!=null?p.styleSelectedText:!ra(),scrollbarStyle:p.scrollbarStyle!=null?p.scrollbarStyle:"native",configureMouse:T,inputStyle:p.inputStyle!=null?p.inputStyle:ra()?"contenteditable":"textarea",spellcheck:p.nativeSpellcheck!=null?p.nativeSpellcheck:!0,autoRefresh:p.autoRefresh!=null?p.autoRefresh:!1}),this.codemirror.getScrollerElement().style.minHeight=p.minHeight,typeof p.maxHeight<"u"&&(this.codemirror.getScrollerElement().style.height=p.maxHeight),p.forceSync===!0){var w=this.codemirror;w.on("change",function(){w.save()})}this.gui={};var c=document.createElement("div");c.classList.add("EasyMDEContainer"),c.setAttribute("role","application");var d=this.codemirror.getWrapperElement();d.parentNode.insertBefore(c,d),c.appendChild(d),p.toolbar!==!1&&(this.gui.toolbar=this.createToolbar()),p.status!==!1&&(this.gui.statusbar=this.createStatusbar()),p.autosave!=null&&p.autosave.enabled===!0&&(this.autosave(),this.codemirror.on("change",function(){clearTimeout(v._autosave_timeout),v._autosave_timeout=setTimeout(function(){v.autosave()},v.options.autosave.submit_delay||v.options.autosave.delay||1e3)}));function k(E,O){var G,J=window.getComputedStyle(document.querySelector(".CodeMirror-sizer")).width.replace("px","");return E=2){var J=G[1];if(p.imagesPreviewHandler){var re=p.imagesPreviewHandler(G[1]);typeof re=="string"&&(J=re)}if(window.EMDEimagesCache[J])M(O,window.EMDEimagesCache[J]);else{var q=document.createElement("img");q.onload=function(){window.EMDEimagesCache[J]={naturalWidth:q.naturalWidth,naturalHeight:q.naturalHeight,url:J},M(O,window.EMDEimagesCache[J])},q.src=J}}}})}this.codemirror.on("update",function(){_()}),this.gui.sideBySide=this.createSideBySide(),this._rendered=this.element,(p.autofocus===!0||o.autofocus)&&this.codemirror.focus();var W=this.codemirror;setTimeout(function(){W.refresh()}.bind(W),0)};Te.prototype.cleanup=function(){document.removeEventListener("keydown",this.documentOnKeyDown)};Te.prototype.autosave=function(){if(kc()){var o=this;if(this.options.autosave.uniqueId==null||this.options.autosave.uniqueId==""){console.log("EasyMDE: You must set a uniqueId to use the autosave feature");return}this.options.autosave.binded!==!0&&(o.element.form!=null&&o.element.form!=null&&o.element.form.addEventListener("submit",function(){clearTimeout(o.autosaveTimeoutId),o.autosaveTimeoutId=void 0,localStorage.removeItem("smde_"+o.options.autosave.uniqueId)}),this.options.autosave.binded=!0),this.options.autosave.loaded!==!0&&(typeof localStorage.getItem("smde_"+this.options.autosave.uniqueId)=="string"&&localStorage.getItem("smde_"+this.options.autosave.uniqueId)!=""&&(this.codemirror.setValue(localStorage.getItem("smde_"+this.options.autosave.uniqueId)),this.options.autosave.foundSavedValue=!0),this.options.autosave.loaded=!0);var p=o.value();p!==""?localStorage.setItem("smde_"+this.options.autosave.uniqueId,p):localStorage.removeItem("smde_"+this.options.autosave.uniqueId);var v=document.getElementById("autosaved");if(v!=null&&v!=null&&v!=""){var C=new Date,b=new Intl.DateTimeFormat([this.options.autosave.timeFormat.locale,"en-US"],this.options.autosave.timeFormat.format).format(C),S=this.options.autosave.text==null?"Autosaved: ":this.options.autosave.text;v.innerHTML=S+b}}else console.log("EasyMDE: localStorage not available, cannot autosave")};Te.prototype.clearAutosavedValue=function(){if(kc()){if(this.options.autosave==null||this.options.autosave.uniqueId==null||this.options.autosave.uniqueId==""){console.log("EasyMDE: You must set a uniqueId to clear the autosave value");return}localStorage.removeItem("smde_"+this.options.autosave.uniqueId)}else console.log("EasyMDE: localStorage not available, cannot autosave")};Te.prototype.openBrowseFileWindow=function(o,p){var v=this,C=this.gui.toolbar.getElementsByClassName("imageInput")[0];C.click();function b(S){v.options.imageUploadFunction?v.uploadImagesUsingCustomFunction(v.options.imageUploadFunction,S.target.files):v.uploadImages(S.target.files,o,p),C.removeEventListener("change",b)}C.addEventListener("change",b)};Te.prototype.uploadImage=function(o,p,v){var C=this;p=p||function(T){yc(C,T)};function b(g){C.updateStatusBar("upload-image",g),setTimeout(function(){C.updateStatusBar("upload-image",C.options.imageTexts.sbInit)},1e4),v&&typeof v=="function"&&v(g),C.options.errorCallback(g)}function S(g){var T=C.options.imageTexts.sizeUnits.split(",");return g.replace("#image_name#",o.name).replace("#image_size#",Fi(o.size,T)).replace("#image_max_size#",Fi(C.options.imageMaxSize,T))}if(o.size>this.options.imageMaxSize){b(S(this.options.errorMessages.fileTooLarge));return}var s=new FormData;s.append("image",o),C.options.imageCSRFToken&&!C.options.imageCSRFHeader&&s.append(C.options.imageCSRFName,C.options.imageCSRFToken);var h=new XMLHttpRequest;h.upload.onprogress=function(g){if(g.lengthComputable){var T=""+Math.round(g.loaded*100/g.total);C.updateStatusBar("upload-image",C.options.imageTexts.sbProgress.replace("#file_name#",o.name).replace("#progress#",T))}},h.open("POST",this.options.imageUploadEndpoint),C.options.imageCSRFToken&&C.options.imageCSRFHeader&&h.setRequestHeader(C.options.imageCSRFName,C.options.imageCSRFToken),h.onload=function(){try{var g=JSON.parse(this.responseText)}catch{console.error("EasyMDE: The server did not return a valid json."),b(S(C.options.errorMessages.importError));return}this.status===200&&g&&!g.error&&g.data&&g.data.filePath?p((C.options.imagePathAbsolute?"":window.location.origin+"/")+g.data.filePath):g.error&&g.error in C.options.errorMessages?b(S(C.options.errorMessages[g.error])):g.error?b(S(g.error)):(console.error("EasyMDE: Received an unexpected response after uploading the image."+this.status+" ("+this.statusText+")"),b(S(C.options.errorMessages.importError)))},h.onerror=function(g){console.error("EasyMDE: An unexpected error occurred when trying to upload the image."+g.target.status+" ("+g.target.statusText+")"),b(C.options.errorMessages.importError)},h.send(s)};Te.prototype.uploadImageUsingCustomFunction=function(o,p){var v=this;function C(s){yc(v,s)}function b(s){var h=S(s);v.updateStatusBar("upload-image",h),setTimeout(function(){v.updateStatusBar("upload-image",v.options.imageTexts.sbInit)},1e4),v.options.errorCallback(h)}function S(s){var h=v.options.imageTexts.sizeUnits.split(",");return s.replace("#image_name#",p.name).replace("#image_size#",Fi(p.size,h)).replace("#image_max_size#",Fi(v.options.imageMaxSize,h))}o.apply(this,[p,C,b])};Te.prototype.setPreviewMaxHeight=function(){var o=this.codemirror,p=o.getWrapperElement(),v=p.nextSibling,C=parseInt(window.getComputedStyle(p).paddingTop),b=parseInt(window.getComputedStyle(p).borderTopWidth),S=parseInt(this.options.maxHeight),s=S+C*2+b*2,h=s.toString()+"px";v.style.height=h};Te.prototype.createSideBySide=function(){var o=this.codemirror,p=o.getWrapperElement(),v=p.nextSibling;if(!v||!v.classList.contains("editor-preview-side")){if(v=document.createElement("div"),v.className="editor-preview-side",this.options.previewClass)if(Array.isArray(this.options.previewClass))for(var C=0;CsetTimeout(d,300)),this.$root._editor&&(this.$root._editor.toTextArea(),this.$root._editor=null),this.$root._editor=this.editor=new EasyMDE({autoDownloadFontAwesome:!1,autoRefresh:!0,autoSave:!1,element:this.$refs.editor,imageAccept:"image/png, image/jpeg, image/gif, image/avif, image/webp",imageUploadFunction:c,initialValue:this.state??"",maxHeight:b,minHeight:S,placeholder:s,previewImagesInEditor:!0,spellChecker:!1,status:[{className:"upload-image",defaultValue:""}],toolbar:this.getToolbar(),uploadImage:o}),this.editor.codemirror.setOption("direction",document.documentElement?.dir??"ltr"),this.editor.codemirror.on("changes",(d,k)=>{try{let z=k[k.length-1];if(z.origin==="+input"){let M="(https://)",_=z.text[z.text.length-1];if(_.endsWith(M)&&_!=="[]"+M){let W=z.from,E=z.to,G=z.text.length>1?0:W.ch;setTimeout(()=>{d.setSelection({line:E.line,ch:G+_.lastIndexOf("(")+1},{line:E.line,ch:G+_.lastIndexOf(")")})},25)}}}catch{}}),this.editor.codemirror.on("change",Alpine.debounce(()=>{this.editor&&(this.state=this.editor.value(),p&&this.$wire.commit())},C??300)),v&&this.editor.codemirror.on("blur",()=>this.$wire.commit()),this.$watch("state",()=>{this.editor&&(this.editor.codemirror.hasFocus()||Alpine.raw(this.editor).value(this.state??""))}),h&&h(this)},destroy(){this.editor.cleanup(),this.editor=null},getToolbar(){let d=[];return w.forEach(k=>{k.forEach(z=>d.push(this.getToolbarButton(z))),k.length>0&&d.push("|")}),d[d.length-1]==="|"&&d.pop(),d},getToolbarButton(d){if(d==="bold")return this.getBoldToolbarButton();if(d==="italic")return this.getItalicToolbarButton();if(d==="strike")return this.getStrikeToolbarButton();if(d==="link")return this.getLinkToolbarButton();if(d==="heading")return this.getHeadingToolbarButton();if(d==="blockquote")return this.getBlockquoteToolbarButton();if(d==="codeBlock")return this.getCodeBlockToolbarButton();if(d==="bulletList")return this.getBulletListToolbarButton();if(d==="orderedList")return this.getOrderedListToolbarButton();if(d==="table")return this.getTableToolbarButton();if(d==="attachFiles")return this.getAttachFilesToolbarButton();if(d==="undo")return this.getUndoToolbarButton();if(d==="redo")return this.getRedoToolbarButton();console.error(`Markdown editor toolbar button "${d}" not found.`)},getBoldToolbarButton(){return{name:"bold",action:EasyMDE.toggleBold,title:T.tools?.bold}},getItalicToolbarButton(){return{name:"italic",action:EasyMDE.toggleItalic,title:T.tools?.italic}},getStrikeToolbarButton(){return{name:"strikethrough",action:EasyMDE.toggleStrikethrough,title:T.tools?.strike}},getLinkToolbarButton(){return{name:"link",action:EasyMDE.drawLink,title:T.tools?.link}},getHeadingToolbarButton(){return{name:"heading",action:EasyMDE.toggleHeadingSmaller,title:T.tools?.heading}},getBlockquoteToolbarButton(){return{name:"quote",action:EasyMDE.toggleBlockquote,title:T.tools?.blockquote}},getCodeBlockToolbarButton(){return{name:"code",action:EasyMDE.toggleCodeBlock,title:T.tools?.code_block}},getBulletListToolbarButton(){return{name:"unordered-list",action:EasyMDE.toggleUnorderedList,title:T.tools?.bullet_list}},getOrderedListToolbarButton(){return{name:"ordered-list",action:EasyMDE.toggleOrderedList,title:T.tools?.ordered_list}},getTableToolbarButton(){return{name:"table",action:EasyMDE.drawTable,title:T.tools?.table}},getAttachFilesToolbarButton(){return{name:"upload-image",action:EasyMDE.drawUploadedImage,title:T.tools?.attach_files}},getUndoToolbarButton(){return{name:"undo",action:EasyMDE.undo,title:T.tools?.undo}},getRedoToolbarButton(){return{name:"redo",action:EasyMDE.redo,title:T.tools?.redo}}}}export{Kd as default}; ================================================ FILE: public/js/filament/forms/components/rich-editor.js ================================================ function ge(t){this.content=t}ge.prototype={constructor:ge,find:function(t){for(var e=0;e>1}};ge.from=function(t){if(t instanceof ge)return t;var e=[];if(t)for(var n in t)e.push(n,t[n]);return new ge(e)};var vi=ge;function ba(t,e,n){for(let r=0;;r++){if(r==t.childCount||r==e.childCount)return t.childCount==e.childCount?null:n;let o=t.child(r),i=e.child(r);if(o==i){n+=o.nodeSize;continue}if(!o.sameMarkup(i))return n;if(o.isText&&o.text!=i.text){for(let s=0;o.text[s]==i.text[s];s++)n++;return n}if(o.content.size||i.content.size){let s=ba(o.content,i.content,n+1);if(s!=null)return s}n+=o.nodeSize}}function wa(t,e,n,r){for(let o=t.childCount,i=e.childCount;;){if(o==0||i==0)return o==i?null:{a:n,b:r};let s=t.child(--o),l=e.child(--i),a=s.nodeSize;if(s==l){n-=a,r-=a;continue}if(!s.sameMarkup(l))return{a:n,b:r};if(s.isText&&s.text!=l.text){let c=0,d=Math.min(s.text.length,l.text.length);for(;ce&&r(a,o+l,i||null,s)!==!1&&a.content.size){let d=l+1;a.nodesBetween(Math.max(0,e-d),Math.min(a.content.size,n-d),r,o+d)}l=c}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,n,r,o){let i="",s=!0;return this.nodesBetween(e,n,(l,a)=>{let c=l.isText?l.text.slice(Math.max(e,a)-a,n-a):l.isLeaf?o?typeof o=="function"?o(l):o:l.type.spec.leafText?l.type.spec.leafText(l):"":"";l.isBlock&&(l.isLeaf&&c||l.isTextblock)&&r&&(s?s=!1:i+=r),i+=c},0),i}append(e){if(!e.size)return this;if(!this.size)return e;let n=this.lastChild,r=e.firstChild,o=this.content.slice(),i=0;for(n.isText&&n.sameMarkup(r)&&(o[o.length-1]=n.withText(n.text+r.text),i=1);ie)for(let i=0,s=0;se&&((sn)&&(l.isText?l=l.cut(Math.max(0,e-s),Math.min(l.text.length,n-s)):l=l.cut(Math.max(0,e-s-1),Math.min(l.content.size,n-s-1))),r.push(l),o+=l.nodeSize),s=a}return new t(r,o)}cutByIndex(e,n){return e==n?t.empty:e==0&&n==this.content.length?this:new t(this.content.slice(e,n))}replaceChild(e,n){let r=this.content[e];if(r==n)return this;let o=this.content.slice(),i=this.size+n.nodeSize-r.nodeSize;return o[e]=n,new t(o,i)}addToStart(e){return new t([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new t(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let n=0;nthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let n=0,r=0;;n++){let o=this.child(n),i=r+o.nodeSize;if(i>=e)return i==e?Ar(n+1,i):Ar(n,r);r=i}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,n){if(!n)return t.empty;if(!Array.isArray(n))throw new RangeError("Invalid input for Fragment.fromJSON");return new t(n.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return t.empty;let n,r=0;for(let o=0;othis.type.rank&&(n||(n=e.slice(0,o)),n.push(this),r=!0),n&&n.push(i)}}return n||(n=e.slice()),r||n.push(this),n}removeFromSet(e){for(let n=0;nr.type.rank-o.type.rank),n}};J.none=[];var Ft=class extends Error{},E=class t{constructor(e,n,r){this.content=e,this.openStart=n,this.openEnd=r}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,n){let r=ka(this.content,e+this.openStart,n);return r&&new t(r,this.openStart,this.openEnd)}removeBetween(e,n){return new t(xa(this.content,e+this.openStart,n+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,n){if(!n)return t.empty;let r=n.openStart||0,o=n.openEnd||0;if(typeof r!="number"||typeof o!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new t(v.fromJSON(e,n.content),r,o)}static maxOpen(e,n=!0){let r=0,o=0;for(let i=e.firstChild;i&&!i.isLeaf&&(n||!i.type.spec.isolating);i=i.firstChild)r++;for(let i=e.lastChild;i&&!i.isLeaf&&(n||!i.type.spec.isolating);i=i.lastChild)o++;return new t(e,r,o)}};E.empty=new E(v.empty,0,0);function xa(t,e,n){let{index:r,offset:o}=t.findIndex(e),i=t.maybeChild(r),{index:s,offset:l}=t.findIndex(n);if(o==e||i.isText){if(l!=n&&!t.child(s).isText)throw new RangeError("Removing non-flat range");return t.cut(0,e).append(t.cut(n))}if(r!=s)throw new RangeError("Removing non-flat range");return t.replaceChild(r,i.copy(xa(i.content,e-o-1,n-o-1)))}function ka(t,e,n,r){let{index:o,offset:i}=t.findIndex(e),s=t.maybeChild(o);if(i==e||s.isText)return r&&!r.canReplace(o,o,n)?null:t.cut(0,e).append(n).append(t.cut(e));let l=ka(s.content,e-i-1,n,s);return l&&t.replaceChild(o,s.copy(l))}function sp(t,e,n){if(n.openStart>t.depth)throw new Ft("Inserted content deeper than insertion position");if(t.depth-n.openStart!=e.depth-n.openEnd)throw new Ft("Inconsistent open depths");return Sa(t,e,n,0)}function Sa(t,e,n,r){let o=t.index(r),i=t.node(r);if(o==e.index(r)&&r=0&&t.isText&&t.sameMarkup(e[n])?e[n]=t.withText(e[n].text+t.text):e.push(t)}function zn(t,e,n,r){let o=(e||t).node(n),i=0,s=e?e.index(n):o.childCount;t&&(i=t.index(n),t.depth>n?i++:t.textOffset&&(Ht(t.nodeAfter,r),i++));for(let l=i;lo&&Ai(t,e,o+1),s=r.depth>o&&Ai(n,r,o+1),l=[];return zn(null,t,o,l),i&&s&&e.index(o)==n.index(o)?(Ca(i,s),Ht($t(i,va(t,e,n,r,o+1)),l)):(i&&Ht($t(i,Or(t,e,o+1)),l),zn(e,n,o,l),s&&Ht($t(s,Or(n,r,o+1)),l)),zn(r,null,o,l),new v(l)}function Or(t,e,n){let r=[];if(zn(null,t,n,r),t.depth>n){let o=Ai(t,e,n+1);Ht($t(o,Or(t,e,n+1)),r)}return zn(e,null,n,r),new v(r)}function lp(t,e){let n=e.depth-t.openStart,o=e.node(n).copy(t.content);for(let i=n-1;i>=0;i--)o=e.node(i).copy(v.from(o));return{start:o.resolveNoCache(t.openStart+n),end:o.resolveNoCache(o.content.size-t.openEnd-n)}}var Rr=class t{constructor(e,n,r){this.pos=e,this.path=n,this.parentOffset=r,this.depth=n.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,n=this.index(this.depth);if(n==e.childCount)return null;let r=this.pos-this.path[this.path.length-1],o=e.child(n);return r?e.child(n).cut(r):o}get nodeBefore(){let e=this.index(this.depth),n=this.pos-this.path[this.path.length-1];return n?this.parent.child(e).cut(0,n):e==0?null:this.parent.child(e-1)}posAtIndex(e,n){n=this.resolveDepth(n);let r=this.path[n*3],o=n==0?0:this.path[n*3-1]+1;for(let i=0;i0;n--)if(this.start(n)<=e&&this.end(n)>=e)return n;return 0}blockRange(e=this,n){if(e.pos=0;r--)if(e.pos<=this.end(r)&&(!n||n(this.node(r))))return new Vt(this,e,r);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&n<=e.content.size))throw new RangeError("Position "+n+" out of range");let r=[],o=0,i=n;for(let s=e;;){let{index:l,offset:a}=s.content.findIndex(i),c=i-a;if(r.push(s,l,o+a),!c||(s=s.child(l),s.isText))break;i=c-1,o+=a+1}return new t(n,r,i)}static resolveCached(e,n){let r=ca.get(e);if(r)for(let i=0;ie&&this.nodesBetween(e,n,i=>(r.isInSet(i.marks)&&(o=!0),!o)),o}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),Ma(this.marks,e)}contentMatchAt(e){let n=this.type.contentMatch.matchFragment(this.content,0,e);if(!n)throw new Error("Called contentMatchAt on a node with invalid content");return n}canReplace(e,n,r=v.empty,o=0,i=r.childCount){let s=this.contentMatchAt(e).matchFragment(r,o,i),l=s&&s.matchFragment(this.content,n);if(!l||!l.validEnd)return!1;for(let a=o;an.type.name)}`);this.content.forEach(n=>n.check())}toJSON(){let e={type:this.type.name};for(let n in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(n=>n.toJSON())),e}static fromJSON(e,n){if(!n)throw new RangeError("Invalid input for Node.fromJSON");let r;if(n.marks){if(!Array.isArray(n.marks))throw new RangeError("Invalid mark data for Node.fromJSON");r=n.marks.map(e.markFromJSON)}if(n.type=="text"){if(typeof n.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(n.text,r)}let o=v.fromJSON(e,n.content),i=e.nodeType(n.type).create(n.attrs,o,r);return i.type.checkAttrs(i.attrs),i}};ie.prototype.text=void 0;var Ni=class t extends ie{constructor(e,n,r,o){if(super(e,n,null,o),!r)throw new RangeError("Empty text nodes are not allowed");this.text=r}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):Ma(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,n){return this.text.slice(e,n)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new t(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new t(this.type,this.attrs,e,this.marks)}cut(e=0,n=this.text.length){return e==0&&n==this.text.length?this:this.withText(this.text.slice(e,n))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function Ma(t,e){for(let n=t.length-1;n>=0;n--)e=t[n].type.name+"("+e+")";return e}var _t=class t{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,n){let r=new Oi(e,n);if(r.next==null)return t.empty;let o=Ta(r);r.next&&r.err("Unexpected trailing text");let i=gp(mp(o));return yp(i,r),i}matchType(e){for(let n=0;nc.createAndFill()));for(let c=0;c=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function n(r){e.push(r);for(let o=0;o{let i=o+(r.validEnd?"*":" ")+" ";for(let s=0;s"+e.indexOf(r.next[s].next);return i}).join(` `)}};_t.empty=new _t(!0);var Oi=class{constructor(e,n){this.string=e,this.nodeTypes=n,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}};function Ta(t){let e=[];do e.push(dp(t));while(t.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function dp(t){let e=[];do e.push(up(t));while(t.next&&t.next!=")"&&t.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function up(t){let e=pp(t);for(;;)if(t.eat("+"))e={type:"plus",expr:e};else if(t.eat("*"))e={type:"star",expr:e};else if(t.eat("?"))e={type:"opt",expr:e};else if(t.eat("{"))e=fp(t,e);else break;return e}function da(t){/\D/.test(t.next)&&t.err("Expected number, got '"+t.next+"'");let e=Number(t.next);return t.pos++,e}function fp(t,e){let n=da(t),r=n;return t.eat(",")&&(t.next!="}"?r=da(t):r=-1),t.eat("}")||t.err("Unclosed braced range"),{type:"range",min:n,max:r,expr:e}}function hp(t,e){let n=t.nodeTypes,r=n[e];if(r)return[r];let o=[];for(let i in n){let s=n[i];s.isInGroup(e)&&o.push(s)}return o.length==0&&t.err("No node type or group '"+e+"' found"),o}function pp(t){if(t.eat("(")){let e=Ta(t);return t.eat(")")||t.err("Missing closing paren"),e}else if(/\W/.test(t.next))t.err("Unexpected token '"+t.next+"'");else{let e=hp(t,t.next).map(n=>(t.inline==null?t.inline=n.isInline:t.inline!=n.isInline&&t.err("Mixing inline and block content"),{type:"name",value:n}));return t.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function mp(t){let e=[[]];return o(i(t,0),n()),e;function n(){return e.push([])-1}function r(s,l,a){let c={term:a,to:l};return e[s].push(c),c}function o(s,l){s.forEach(a=>a.to=l)}function i(s,l){if(s.type=="choice")return s.exprs.reduce((a,c)=>a.concat(i(c,l)),[]);if(s.type=="seq")for(let a=0;;a++){let c=i(s.exprs[a],l);if(a==s.exprs.length-1)return c;o(c,l=n())}else if(s.type=="star"){let a=n();return r(l,a),o(i(s.expr,a),a),[r(a)]}else if(s.type=="plus"){let a=n();return o(i(s.expr,l),a),o(i(s.expr,a),a),[r(a)]}else{if(s.type=="opt")return[r(l)].concat(i(s.expr,l));if(s.type=="range"){let a=l;for(let c=0;c{t[s].forEach(({term:l,to:a})=>{if(!l)return;let c;for(let d=0;d{c||o.push([l,c=[]]),c.indexOf(d)==-1&&c.push(d)})})});let i=e[r.join(",")]=new _t(r.indexOf(t.length-1)>-1);for(let s=0;s-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:Na(this.attrs,e)}create(e=null,n,r){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new ie(this,this.computeAttrs(e),v.from(n),J.setFrom(r))}createChecked(e=null,n,r){return n=v.from(n),this.checkContent(n),new ie(this,this.computeAttrs(e),n,J.setFrom(r))}createAndFill(e=null,n,r){if(e=this.computeAttrs(e),n=v.from(n),n.size){let s=this.contentMatch.fillBefore(n);if(!s)return null;n=s.append(n)}let o=this.contentMatch.matchFragment(n),i=o&&o.fillBefore(v.empty,!0);return i?new ie(this,e,n.append(i),J.setFrom(r)):null}validContent(e){let n=this.contentMatch.matchFragment(e);if(!n||!n.validEnd)return!1;for(let r=0;r-1}allowsMarks(e){if(this.markSet==null)return!0;for(let n=0;nr[i]=new t(i,n,s));let o=n.spec.topNode||"doc";if(!r[o])throw new RangeError("Schema is missing its top node type ('"+o+"')");if(!r.text)throw new RangeError("Every schema needs a 'text' type");for(let i in r.text.attrs)throw new RangeError("The text node type should not have attributes");return r}};function bp(t,e,n){let r=n.split("|");return o=>{let i=o===null?"null":typeof o;if(r.indexOf(i)<0)throw new RangeError(`Expected value of type ${r} for attribute ${e} on type ${t}, got ${i}`)}}var Ri=class{constructor(e,n,r){this.hasDefault=Object.prototype.hasOwnProperty.call(r,"default"),this.default=r.default,this.validate=typeof r.validate=="string"?bp(e,n,r.validate):r.validate}get isRequired(){return!this.hasDefault}},$n=class t{constructor(e,n,r,o){this.name=e,this.rank=n,this.schema=r,this.spec=o,this.attrs=Ra(e,o.attrs),this.excluded=null;let i=Ea(this.attrs);this.instance=i?new J(this,i):null}create(e=null){return!e&&this.instance?this.instance:new J(this,Na(this.attrs,e))}static compile(e,n){let r=Object.create(null),o=0;return e.forEach((i,s)=>r[i]=new t(i,o++,n,s)),r}removeFromSet(e){for(var n=0;n-1}},fn=class{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let n=this.spec={};for(let o in e)n[o]=e[o];n.nodes=vi.from(e.nodes),n.marks=vi.from(e.marks||{}),this.nodes=Dr.compile(this.spec.nodes,this),this.marks=$n.compile(this.spec.marks,this);let r=Object.create(null);for(let o in this.nodes){if(o in this.marks)throw new RangeError(o+" can not be both a node and a mark");let i=this.nodes[o],s=i.spec.content||"",l=i.spec.marks;if(i.contentMatch=r[s]||(r[s]=_t.parse(s,this.nodes)),i.inlineContent=i.contentMatch.inlineContent,i.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!i.isInline||!i.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=i}i.markSet=l=="_"?null:l?fa(this,l.split(" ")):l==""||!i.inlineContent?[]:null}for(let o in this.marks){let i=this.marks[o],s=i.spec.excludes;i.excluded=s==null?[i]:s==""?[]:fa(this,s.split(" "))}this.nodeFromJSON=o=>ie.fromJSON(this,o),this.markFromJSON=o=>J.fromJSON(this,o),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,n=null,r,o){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof Dr){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(n,r,o)}text(e,n){let r=this.nodes.text;return new Ni(r,r.defaultAttrs,e,J.setFrom(n))}mark(e,n){return typeof e=="string"&&(e=this.marks[e]),e.create(n)}nodeType(e){let n=this.nodes[e];if(!n)throw new RangeError("Unknown node type: "+e);return n}};function fa(t,e){let n=[];for(let r=0;r-1)&&n.push(s=a)}if(!s)throw new SyntaxError("Unknown mark type: '"+e[r]+"'")}return n}function wp(t){return t.tag!=null}function xp(t){return t.style!=null}var Xe=class t{constructor(e,n){this.schema=e,this.rules=n,this.tags=[],this.styles=[];let r=this.matchedStyles=[];n.forEach(o=>{if(wp(o))this.tags.push(o);else if(xp(o)){let i=/[^=]*/.exec(o.style)[0];r.indexOf(i)<0&&r.push(i),this.styles.push(o)}}),this.normalizeLists=!this.tags.some(o=>{if(!/^(ul|ol)\b/.test(o.tag)||!o.node)return!1;let i=e.nodes[o.node];return i.contentMatch.matchType(i)})}parse(e,n={}){let r=new Ir(this,n,!1);return r.addAll(e,J.none,n.from,n.to),r.finish()}parseSlice(e,n={}){let r=new Ir(this,n,!0);return r.addAll(e,J.none,n.from,n.to),E.maxOpen(r.finish())}matchTag(e,n,r){for(let o=r?this.tags.indexOf(r)+1:0;oe.length&&(l.charCodeAt(e.length)!=61||l.slice(e.length+1)!=n))){if(s.getAttrs){let a=s.getAttrs(n);if(a===!1)continue;s.attrs=a||void 0}return s}}}static schemaRules(e){let n=[];function r(o){let i=o.priority==null?50:o.priority,s=0;for(;s{r(s=pa(s)),s.mark||s.ignore||s.clearMark||(s.mark=o)})}for(let o in e.nodes){let i=e.nodes[o].spec.parseDOM;i&&i.forEach(s=>{r(s=pa(s)),s.node||s.ignore||s.mark||(s.node=o)})}return n}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new t(e,t.schemaRules(e)))}},Da={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},kp={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},Ia={ol:!0,ul:!0},Fn=1,Di=2,Hn=4;function ha(t,e,n){return e!=null?(e?Fn:0)|(e==="full"?Di:0):t&&t.whitespace=="pre"?Fn|Di:n&~Hn}var un=class{constructor(e,n,r,o,i,s){this.type=e,this.attrs=n,this.marks=r,this.solid=o,this.options=s,this.content=[],this.activeMarks=J.none,this.match=i||(s&Hn?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let n=this.type.contentMatch.fillBefore(v.from(e));if(n)this.match=this.type.contentMatch.matchFragment(n);else{let r=this.type.contentMatch,o;return(o=r.findWrapping(e.type))?(this.match=r,o):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&Fn)){let r=this.content[this.content.length-1],o;if(r&&r.isText&&(o=/[ \t\r\n\u000c]+$/.exec(r.text))){let i=r;r.text.length==o[0].length?this.content.pop():this.content[this.content.length-1]=i.withText(i.text.slice(0,i.text.length-o[0].length))}}let n=v.from(this.content);return!e&&this.match&&(n=n.append(this.match.fillBefore(v.empty,!0))),this.type?this.type.create(this.attrs,n,this.marks):n}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!Da.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}},Ir=class{constructor(e,n,r){this.parser=e,this.options=n,this.isOpen=r,this.open=0,this.localPreserveWS=!1;let o=n.topNode,i,s=ha(null,n.preserveWhitespace,0)|(r?Hn:0);o?i=new un(o.type,o.attrs,J.none,!0,n.topMatch||o.type.contentMatch,s):r?i=new un(null,null,J.none,!0,null,s):i=new un(e.schema.topNodeType,null,J.none,!0,null,s),this.nodes=[i],this.find=n.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,n){e.nodeType==3?this.addTextNode(e,n):e.nodeType==1&&this.addElement(e,n)}addTextNode(e,n){let r=e.nodeValue,o=this.top,i=o.options&Di?"full":this.localPreserveWS||(o.options&Fn)>0,{schema:s}=this.parser;if(i==="full"||o.inlineContext(e)||/[^ \t\r\n\u000c]/.test(r)){if(i)if(i==="full")r=r.replace(/\r\n?/g,` `);else if(s.linebreakReplacement&&/[\r\n]/.test(r)&&this.top.findWrapping(s.linebreakReplacement.create())){let l=r.split(/\r?\n|\r/);for(let a=0;a!a.clearMark(c)):n=n.concat(this.parser.schema.marks[a.mark].create(a.attrs)),a.consuming===!1)l=a;else break}}return n}addElementByRule(e,n,r,o){let i,s;if(n.node)if(s=this.parser.schema.nodes[n.node],s.isLeaf)this.insertNode(s.create(n.attrs),r,e.nodeName=="BR")||this.leafFallback(e,r);else{let a=this.enter(s,n.attrs||null,r,n.preserveWhitespace);a&&(i=!0,r=a)}else{let a=this.parser.schema.marks[n.mark];r=r.concat(a.create(n.attrs))}let l=this.top;if(s&&s.isLeaf)this.findInside(e);else if(o)this.addElement(e,r,o);else if(n.getContent)this.findInside(e),n.getContent(e,this.parser.schema).forEach(a=>this.insertNode(a,r,!1));else{let a=e;typeof n.contentElement=="string"?a=e.querySelector(n.contentElement):typeof n.contentElement=="function"?a=n.contentElement(e):n.contentElement&&(a=n.contentElement),this.findAround(e,a,!0),this.addAll(a,r),this.findAround(e,a,!1)}i&&this.sync(l)&&this.open--}addAll(e,n,r,o){let i=r||0;for(let s=r?e.childNodes[r]:e.firstChild,l=o==null?null:e.childNodes[o];s!=l;s=s.nextSibling,++i)this.findAtPoint(e,i),this.addDOM(s,n);this.findAtPoint(e,i)}findPlace(e,n,r){let o,i;for(let s=this.open,l=0;s>=0;s--){let a=this.nodes[s],c=a.findWrapping(e);if(c&&(!o||o.length>c.length+l)&&(o=c,i=a,!c.length))break;if(a.solid){if(r)break;l+=2}}if(!o)return null;this.sync(i);for(let s=0;s(s.type?s.type.allowsMarkType(c.type):ma(c.type,e))?(a=c.addToSet(a),!1):!0),this.nodes.push(new un(e,n,a,o,null,l)),this.open++,r}closeExtra(e=!1){let n=this.nodes.length-1;if(n>this.open){for(;n>this.open;n--)this.nodes[n-1].content.push(this.nodes[n].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!!(this.isOpen||this.options.topOpen))}sync(e){for(let n=this.open;n>=0;n--){if(this.nodes[n]==e)return this.open=n,!0;this.localPreserveWS&&(this.nodes[n].options|=Fn)}return!1}get currentPos(){this.closeExtra();let e=0;for(let n=this.open;n>=0;n--){let r=this.nodes[n].content;for(let o=r.length-1;o>=0;o--)e+=r[o].nodeSize;n&&e++}return e}findAtPoint(e,n){if(this.find)for(let r=0;r-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let n=e.split("/"),r=this.options.context,o=!this.isOpen&&(!r||r.parent.type==this.nodes[0].type),i=-(r?r.depth+1:0)+(o?0:1),s=(l,a)=>{for(;l>=0;l--){let c=n[l];if(c==""){if(l==n.length-1||l==0)continue;for(;a>=i;a--)if(s(l-1,a))return!0;return!1}else{let d=a>0||a==0&&o?this.nodes[a].type:r&&a>=i?r.node(a-i).type:null;if(!d||d.name!=c&&!d.isInGroup(c))return!1;a--}}return!0};return s(n.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let n=e.depth;n>=0;n--){let r=e.node(n).contentMatchAt(e.indexAfter(n)).defaultType;if(r&&r.isTextblock&&r.defaultAttrs)return r}for(let n in this.parser.schema.nodes){let r=this.parser.schema.nodes[n];if(r.isTextblock&&r.defaultAttrs)return r}}};function Sp(t){for(let e=t.firstChild,n=null;e;e=e.nextSibling){let r=e.nodeType==1?e.nodeName.toLowerCase():null;r&&Ia.hasOwnProperty(r)&&n?(n.appendChild(e),e=n):r=="li"?n=e:r&&(n=null)}}function Cp(t,e){return(t.matches||t.msMatchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector).call(t,e)}function pa(t){let e={};for(let n in t)e[n]=t[n];return e}function ma(t,e){let n=e.schema.nodes;for(let r in n){let o=n[r];if(!o.allowsMarkType(t))continue;let i=[],s=l=>{i.push(l);for(let a=0;a{if(i.length||s.marks.length){let l=0,a=0;for(;l=0;o--){let i=this.serializeMark(e.marks[o],e.isInline,n);i&&((i.contentDOM||i.dom).appendChild(r),r=i.dom)}return r}serializeMark(e,n,r={}){let o=this.marks[e.type.name];return o&&Er(Ti(r),o(e,n),null,e.attrs)}static renderSpec(e,n,r=null,o){return Er(e,n,r,o)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new t(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let n=ga(e.nodes);return n.text||(n.text=r=>r.text),n}static marksFromSchema(e){return ga(e.marks)}};function ga(t){let e={};for(let n in t){let r=t[n].spec.toDOM;r&&(e[n]=r)}return e}function Ti(t){return t.document||window.document}var ya=new WeakMap;function vp(t){let e=ya.get(t);return e===void 0&&ya.set(t,e=Mp(t)),e}function Mp(t){let e=null;function n(r){if(r&&typeof r=="object")if(Array.isArray(r))if(typeof r[0]=="string")e||(e=[]),e.push(r);else for(let o=0;o-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let s=o.indexOf(" ");s>0&&(n=o.slice(0,s),o=o.slice(s+1));let l,a=n?t.createElementNS(n,o):t.createElement(o),c=e[1],d=1;if(c&&typeof c=="object"&&c.nodeType==null&&!Array.isArray(c)){d=2;for(let u in c)if(c[u]!=null){let f=u.indexOf(" ");f>0?a.setAttributeNS(u.slice(0,f),u.slice(f+1),c[u]):u=="style"&&a.style?a.style.cssText=c[u]:a.setAttribute(u,c[u])}}for(let u=d;ud)throw new RangeError("Content hole must be the only child of its parent node");return{dom:a,contentDOM:a}}else{let{dom:h,contentDOM:p}=Er(t,f,n,r);if(a.appendChild(h),p){if(l)throw new RangeError("Multiple content holes");l=p}}}return{dom:a,contentDOM:l}}var Ba=65535,za=Math.pow(2,16);function Tp(t,e){return t+e*za}function Pa(t){return t&Ba}function Ap(t){return(t-(t&Ba))/za}var Ha=1,$a=2,Pr=4,Fa=8,Wn=class{constructor(e,n,r){this.pos=e,this.delInfo=n,this.recover=r}get deleted(){return(this.delInfo&Fa)>0}get deletedBefore(){return(this.delInfo&(Ha|Pr))>0}get deletedAfter(){return(this.delInfo&($a|Pr))>0}get deletedAcross(){return(this.delInfo&Pr)>0}},dt=class t{constructor(e,n=!1){if(this.ranges=e,this.inverted=n,!e.length&&t.empty)return t.empty}recover(e){let n=0,r=Pa(e);if(!this.inverted)for(let o=0;oe)break;let c=this.ranges[l+i],d=this.ranges[l+s],u=a+c;if(e<=u){let f=c?e==a?-1:e==u?1:n:n,h=a+o+(f<0?0:d);if(r)return h;let p=e==(n<0?a:u)?null:Tp(l/3,e-a),m=e==a?$a:e==u?Ha:Pr;return(n<0?e!=a:e!=u)&&(m|=Fa),new Wn(h,m,p)}o+=d-c}return r?e+o:new Wn(e+o,0,null)}touches(e,n){let r=0,o=Pa(n),i=this.inverted?2:1,s=this.inverted?1:2;for(let l=0;le)break;let c=this.ranges[l+i],d=a+c;if(e<=d&&l==o*3)return!0;r+=this.ranges[l+s]-c}return!1}forEach(e){let n=this.inverted?2:1,r=this.inverted?1:2;for(let o=0,i=0;o=0;n--){let o=e.getMirror(n);this.appendMap(e._maps[n].invert(),o!=null&&o>n?r-o-1:void 0)}}invert(){let e=new t;return e.appendMappingInverted(this),e}map(e,n=1){if(this.mirror)return this._map(e,n,!0);for(let r=this.from;ri&&a!s.isAtom||!l.type.allowsMarkType(this.mark.type)?s:s.mark(this.mark.addToSet(s.marks)),o),n.openStart,n.openEnd);return ue.fromReplace(e,this.from,this.to,i)}invert(){return new ut(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};ce.jsonID("addMark",Un);var ut=class t extends ce{constructor(e,n,r){super(),this.from=e,this.to=n,this.mark=r}apply(e){let n=e.slice(this.from,this.to),r=new E(Hi(n.content,o=>o.mark(this.mark.removeFromSet(o.marks)),e),n.openStart,n.openEnd);return ue.fromReplace(e,this.from,this.to,r)}invert(){return new Un(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};ce.jsonID("removeMark",ut);var Kn=class t extends ce{constructor(e,n){super(),this.pos=e,this.mark=n}apply(e){let n=e.nodeAt(this.pos);if(!n)return ue.fail("No node at mark step's position");let r=n.type.create(n.attrs,null,this.mark.addToSet(n.marks));return ue.fromReplace(e,this.pos,this.pos+1,new E(v.from(r),0,n.isLeaf?0:1))}invert(e){let n=e.nodeAt(this.pos);if(n){let r=this.mark.addToSet(n.marks);if(r.length==n.marks.length){for(let o=0;or.pos?null:new t(n.pos,r.pos,o,i,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number"||typeof n.gapFrom!="number"||typeof n.gapTo!="number"||typeof n.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new t(n.from,n.to,n.gapFrom,n.gapTo,E.fromJSON(e,n.slice),n.insert,!!n.structure)}};ce.jsonID("replaceAround",se);function Bi(t,e,n){let r=t.resolve(e),o=n-e,i=r.depth;for(;o>0&&i>0&&r.indexAfter(i)==r.node(i).childCount;)i--,o--;if(o>0){let s=r.node(i).maybeChild(r.indexAfter(i));for(;o>0;){if(!s||s.isLeaf)return!0;s=s.firstChild,o--}}return!1}function Ep(t,e,n,r){let o=[],i=[],s,l;t.doc.nodesBetween(e,n,(a,c,d)=>{if(!a.isInline)return;let u=a.marks;if(!r.isInSet(u)&&d.type.allowsMarkType(r.type)){let f=Math.max(c,e),h=Math.min(c+a.nodeSize,n),p=r.addToSet(u);for(let m=0;mt.step(a)),i.forEach(a=>t.step(a))}function Np(t,e,n,r){let o=[],i=0;t.doc.nodesBetween(e,n,(s,l)=>{if(!s.isInline)return;i++;let a=null;if(r instanceof $n){let c=s.marks,d;for(;d=r.isInSet(c);)(a||(a=[])).push(d),c=d.removeFromSet(c)}else r?r.isInSet(s.marks)&&(a=[r]):a=s.marks;if(a&&a.length){let c=Math.min(l+s.nodeSize,n);for(let d=0;dt.step(new ut(s.from,s.to,s.style)))}function $i(t,e,n,r=n.contentMatch,o=!0){let i=t.doc.nodeAt(e),s=[],l=e+1;for(let a=0;a=0;a--)t.step(s[a])}function Op(t,e,n){return(e==0||t.canReplace(e,t.childCount))&&(n==t.childCount||t.canReplace(0,n))}function ft(t){let n=t.parent.content.cutByIndex(t.startIndex,t.endIndex);for(let r=t.depth,o=0,i=0;;--r){let s=t.$from.node(r),l=t.$from.index(r)+o,a=t.$to.indexAfter(r)-i;if(rn;p--)m||r.index(p)>0?(m=!0,d=v.from(r.node(p).copy(d)),u++):a--;let f=v.empty,h=0;for(let p=i,m=!1;p>n;p--)m||o.after(p+1)=0;s--){if(r.size){let l=n[s].type.contentMatch.matchFragment(r);if(!l||!l.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=v.from(n[s].type.create(n[s].attrs,r))}let o=e.start,i=e.end;t.step(new se(o,i,o,i,new E(r,0,0),n.length,!0))}function Lp(t,e,n,r,o){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let i=t.steps.length;t.doc.nodesBetween(e,n,(s,l)=>{let a=typeof o=="function"?o(s):o;if(s.isTextblock&&!s.hasMarkup(r,a)&&Bp(t.doc,t.mapping.slice(i).map(l),r)){let c=null;if(r.schema.linebreakReplacement){let h=r.whitespace=="pre",p=!!r.contentMatch.matchType(r.schema.linebreakReplacement);h&&!p?c=!1:!h&&p&&(c=!0)}c===!1&&_a(t,s,l,i),$i(t,t.mapping.slice(i).map(l,1),r,void 0,c===null);let d=t.mapping.slice(i),u=d.map(l,1),f=d.map(l+s.nodeSize,1);return t.step(new se(u,f,u+1,f-1,new E(v.from(r.create(a,null,s.marks)),0,0),1,!0)),c===!0&&Va(t,s,l,i),!1}})}function Va(t,e,n,r){e.forEach((o,i)=>{if(o.isText){let s,l=/\r?\n|\r/g;for(;s=l.exec(o.text);){let a=t.mapping.slice(r).map(n+1+i+s.index);t.replaceWith(a,a+1,e.type.schema.linebreakReplacement.create())}}})}function _a(t,e,n,r){e.forEach((o,i)=>{if(o.type==o.type.schema.linebreakReplacement){let s=t.mapping.slice(r).map(n+1+i);t.replaceWith(s,s+1,e.type.schema.text(` `))}})}function Bp(t,e,n){let r=t.resolve(e),o=r.index();return r.parent.canReplaceWith(o,o+1,n)}function zp(t,e,n,r,o){let i=t.doc.nodeAt(e);if(!i)throw new RangeError("No node at given position");n||(n=i.type);let s=n.create(r,null,o||i.marks);if(i.isLeaf)return t.replaceWith(e,e+i.nodeSize,s);if(!n.validContent(i.content))throw new RangeError("Invalid content for node type "+n.name);t.step(new se(e,e+i.nodeSize,e+1,e+i.nodeSize-1,new E(v.from(s),0,0),1,!0))}function Ee(t,e,n=1,r){let o=t.resolve(e),i=o.depth-n,s=r&&r[r.length-1]||o.parent;if(i<0||o.parent.type.spec.isolating||!o.parent.canReplace(o.index(),o.parent.childCount)||!s.type.validContent(o.parent.content.cutByIndex(o.index(),o.parent.childCount)))return!1;for(let c=o.depth-1,d=n-2;c>i;c--,d--){let u=o.node(c),f=o.index(c);if(u.type.spec.isolating)return!1;let h=u.content.cutByIndex(f,u.childCount),p=r&&r[d+1];p&&(h=h.replaceChild(0,p.type.create(p.attrs)));let m=r&&r[d]||u;if(!u.canReplace(f+1,u.childCount)||!m.type.validContent(h))return!1}let l=o.indexAfter(i),a=r&&r[0];return o.node(i).canReplaceWith(l,l,a?a.type:o.node(i+1).type)}function Hp(t,e,n=1,r){let o=t.doc.resolve(e),i=v.empty,s=v.empty;for(let l=o.depth,a=o.depth-n,c=n-1;l>a;l--,c--){i=v.from(o.node(l).copy(i));let d=r&&r[c];s=v.from(d?d.type.create(d.attrs,s):o.node(l).copy(s))}t.step(new ye(e,e,new E(i.append(s),n,n),!0))}function Re(t,e){let n=t.resolve(e),r=n.index();return Wa(n.nodeBefore,n.nodeAfter)&&n.parent.canReplace(r,r+1)}function $p(t,e){e.content.size||t.type.compatibleContent(e.type);let n=t.contentMatchAt(t.childCount),{linebreakReplacement:r}=t.type.schema;for(let o=0;o0?(i=r.node(o+1),l++,s=r.node(o).maybeChild(l)):(i=r.node(o).maybeChild(l-1),s=r.node(o+1)),i&&!i.isTextblock&&Wa(i,s)&&r.node(o).canReplace(l,l+1))return e;if(o==0)break;e=n<0?r.before(o):r.after(o)}}function Fp(t,e,n){let r=null,{linebreakReplacement:o}=t.doc.type.schema,i=t.doc.resolve(e-n),s=i.node().type;if(o&&s.inlineContent){let d=s.whitespace=="pre",u=!!s.contentMatch.matchType(o);d&&!u?r=!1:!d&&u&&(r=!0)}let l=t.steps.length;if(r===!1){let d=t.doc.resolve(e+n);_a(t,d.node(),d.before(),l)}s.inlineContent&&$i(t,e+n-1,s,i.node().contentMatchAt(i.index()),r==null);let a=t.mapping.slice(l),c=a.map(e-n);if(t.step(new ye(c,a.map(e+n,-1),E.empty,!0)),r===!0){let d=t.doc.resolve(c);Va(t,d.node(),d.before(),t.steps.length)}return t}function Vp(t,e,n){let r=t.resolve(e);if(r.parent.canReplaceWith(r.index(),r.index(),n))return e;if(r.parentOffset==0)for(let o=r.depth-1;o>=0;o--){let i=r.index(o);if(r.node(o).canReplaceWith(i,i,n))return r.before(o+1);if(i>0)return null}if(r.parentOffset==r.parent.content.size)for(let o=r.depth-1;o>=0;o--){let i=r.indexAfter(o);if(r.node(o).canReplaceWith(i,i,n))return r.after(o+1);if(i=0;s--){let l=s==r.depth?0:r.pos<=(r.start(s+1)+r.end(s+1))/2?-1:1,a=r.index(s)+(l>0?1:0),c=r.node(s),d=!1;if(i==1)d=c.canReplace(a,a,o);else{let u=c.contentMatchAt(a).findWrapping(o.firstChild.type);d=u&&c.canReplaceWith(a,a,u[0])}if(d)return l==0?r.pos:l<0?r.before(s+1):r.after(s+1)}return null}function qn(t,e,n=e,r=E.empty){if(e==n&&!r.size)return null;let o=t.resolve(e),i=t.resolve(n);return ja(o,i,r)?new ye(e,n,r):new zi(o,i,r).fit()}function ja(t,e,n){return!n.openStart&&!n.openEnd&&t.start()==e.start()&&t.parent.canReplace(t.index(),e.index(),n.content)}var zi=class{constructor(e,n,r){this.$from=e,this.$to=n,this.unplaced=r,this.frontier=[],this.placed=v.empty;for(let o=0;o<=e.depth;o++){let i=e.node(o);this.frontier.push({type:i.type,match:i.contentMatchAt(e.indexAfter(o))})}for(let o=e.depth;o>0;o--)this.placed=v.from(e.node(o).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let c=this.findFittable();c?this.placeNodes(c):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),n=this.placed.size-this.depth-this.$from.depth,r=this.$from,o=this.close(e<0?this.$to:r.doc.resolve(e));if(!o)return null;let i=this.placed,s=r.depth,l=o.depth;for(;s&&l&&i.childCount==1;)i=i.firstChild.content,s--,l--;let a=new E(i,s,l);return e>-1?new se(r.pos,e,this.$to.pos,this.$to.end(),a,n):a.size||r.pos!=this.$to.pos?new ye(r.pos,o.pos,a):null}findFittable(){let e=this.unplaced.openStart;for(let n=this.unplaced.content,r=0,o=this.unplaced.openEnd;r1&&(o=0),i.type.spec.isolating&&o<=r){e=r;break}n=i.content}for(let n=1;n<=2;n++)for(let r=n==1?e:this.unplaced.openStart;r>=0;r--){let o,i=null;r?(i=Pi(this.unplaced.content,r-1).firstChild,o=i.content):o=this.unplaced.content;let s=o.firstChild;for(let l=this.depth;l>=0;l--){let{type:a,match:c}=this.frontier[l],d,u=null;if(n==1&&(s?c.matchType(s.type)||(u=c.fillBefore(v.from(s),!1)):i&&a.compatibleContent(i.type)))return{sliceDepth:r,frontierDepth:l,parent:i,inject:u};if(n==2&&s&&(d=c.findWrapping(s.type)))return{sliceDepth:r,frontierDepth:l,parent:i,wrap:d};if(i&&c.matchType(i.type))break}}}openMore(){let{content:e,openStart:n,openEnd:r}=this.unplaced,o=Pi(e,n);return!o.childCount||o.firstChild.isLeaf?!1:(this.unplaced=new E(e,n+1,Math.max(r,o.size+n>=e.size-r?n+1:0)),!0)}dropNode(){let{content:e,openStart:n,openEnd:r}=this.unplaced,o=Pi(e,n);if(o.childCount<=1&&n>0){let i=e.size-n<=n+o.size;this.unplaced=new E(Vn(e,n-1,1),n-1,i?n-1:r)}else this.unplaced=new E(Vn(e,n,1),n,r)}placeNodes({sliceDepth:e,frontierDepth:n,parent:r,inject:o,wrap:i}){for(;this.depth>n;)this.closeFrontierNode();if(i)for(let m=0;m1||a==0||m.content.size)&&(u=g,d.push(Ua(m.mark(f.allowedMarks(m.marks)),c==1?a:0,c==l.childCount?h:-1)))}let p=c==l.childCount;p||(h=-1),this.placed=_n(this.placed,n,v.from(d)),this.frontier[n].match=u,p&&h<0&&r&&r.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let m=0,g=l;m1&&o==this.$to.end(--r);)++o;return o}findCloseLevel(e){e:for(let n=Math.min(this.depth,e.depth);n>=0;n--){let{match:r,type:o}=this.frontier[n],i=n=0;l--){let{match:a,type:c}=this.frontier[l],d=Li(e,l,c,a,!0);if(!d||d.childCount)continue e}return{depth:n,fit:s,move:i?e.doc.resolve(e.after(n+1)):e}}}}close(e){let n=this.findCloseLevel(e);if(!n)return null;for(;this.depth>n.depth;)this.closeFrontierNode();n.fit.childCount&&(this.placed=_n(this.placed,n.depth,n.fit)),e=n.move;for(let r=n.depth+1;r<=e.depth;r++){let o=e.node(r),i=o.type.contentMatch.fillBefore(o.content,!0,e.index(r));this.openFrontierNode(o.type,o.attrs,i)}return e}openFrontierNode(e,n=null,r){let o=this.frontier[this.depth];o.match=o.match.matchType(e),this.placed=_n(this.placed,this.depth,v.from(e.create(n,r))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let n=this.frontier.pop().match.fillBefore(v.empty,!0);n.childCount&&(this.placed=_n(this.placed,this.frontier.length,n))}};function Vn(t,e,n){return e==0?t.cutByIndex(n,t.childCount):t.replaceChild(0,t.firstChild.copy(Vn(t.firstChild.content,e-1,n)))}function _n(t,e,n){return e==0?t.append(n):t.replaceChild(t.childCount-1,t.lastChild.copy(_n(t.lastChild.content,e-1,n)))}function Pi(t,e){for(let n=0;n1&&(r=r.replaceChild(0,Ua(r.firstChild,e-1,r.childCount==1?n-1:0))),e>0&&(r=t.type.contentMatch.fillBefore(r).append(r),n<=0&&(r=r.append(t.type.contentMatch.matchFragment(r).fillBefore(v.empty,!0)))),t.copy(r)}function Li(t,e,n,r,o){let i=t.node(e),s=o?t.indexAfter(e):t.index(e);if(s==i.childCount&&!n.compatibleContent(i.type))return null;let l=r.fillBefore(i.content,!0,s);return l&&!_p(n,i.content,s)?l:null}function _p(t,e,n){for(let r=n;r0;f--,h--){let p=o.node(f).type.spec;if(p.defining||p.definingAsContext||p.isolating)break;s.indexOf(f)>-1?l=f:o.before(f)==h&&s.splice(1,0,-f)}let a=s.indexOf(l),c=[],d=r.openStart;for(let f=r.content,h=0;;h++){let p=f.firstChild;if(c.push(p),h==r.openStart)break;f=p.content}for(let f=d-1;f>=0;f--){let h=c[f],p=Wp(h.type);if(p&&!h.sameMarkup(o.node(Math.abs(l)-1)))d=f;else if(p||!h.type.isTextblock)break}for(let f=r.openStart;f>=0;f--){let h=(f+d+1)%(r.openStart+1),p=c[h];if(p)for(let m=0;m=0&&(t.replace(e,n,r),!(t.steps.length>u));f--){let h=s[f];h<0||(e=o.before(h),n=i.after(h))}}function Ka(t,e,n,r,o){if(er){let i=o.contentMatchAt(0),s=i.fillBefore(t).append(t);t=s.append(i.matchFragment(s).fillBefore(v.empty,!0))}return t}function Up(t,e,n,r){if(!r.isInline&&e==n&&t.doc.resolve(e).parent.content.size){let o=Vp(t.doc,e,r.type);o!=null&&(e=n=o)}t.replaceRange(e,n,new E(v.from(r),0,0))}function Kp(t,e,n){let r=t.doc.resolve(e),o=t.doc.resolve(n),i=qa(r,o);for(let s=0;s0&&(a||r.node(l-1).canReplace(r.index(l-1),o.indexAfter(l-1))))return t.delete(r.before(l),o.after(l))}for(let s=1;s<=r.depth&&s<=o.depth;s++)if(e-r.start(s)==r.depth-s&&n>r.end(s)&&o.end(s)-n!=o.depth-s&&r.start(s-1)==o.start(s-1)&&r.node(s-1).canReplace(r.index(s-1),o.index(s-1)))return t.delete(r.before(s),n);t.delete(e,n)}function qa(t,e){let n=[],r=Math.min(t.depth,e.depth);for(let o=r;o>=0;o--){let i=t.start(o);if(ie.pos+(e.depth-o)||t.node(o).type.spec.isolating||e.node(o).type.spec.isolating)break;(i==e.start(o)||o==t.depth&&o==e.depth&&t.parent.inlineContent&&e.parent.inlineContent&&o&&e.start(o-1)==i-1)&&n.push(o)}return n}var Lr=class t extends ce{constructor(e,n,r){super(),this.pos=e,this.attr=n,this.value=r}apply(e){let n=e.nodeAt(this.pos);if(!n)return ue.fail("No node at attribute step's position");let r=Object.create(null);for(let i in n.attrs)r[i]=n.attrs[i];r[this.attr]=this.value;let o=n.type.create(r,null,n.marks);return ue.fromReplace(e,this.pos,this.pos+1,new E(v.from(o),0,n.isLeaf?0:1))}getMap(){return dt.empty}invert(e){return new t(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let n=e.mapResult(this.pos,1);return n.deletedAfter?null:new t(n.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.pos!="number"||typeof n.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new t(n.pos,n.attr,n.value)}};ce.jsonID("attr",Lr);var Br=class t extends ce{constructor(e,n){super(),this.attr=e,this.value=n}apply(e){let n=Object.create(null);for(let o in e.attrs)n[o]=e.attrs[o];n[this.attr]=this.value;let r=e.type.create(n,e.content,e.marks);return ue.ok(r)}getMap(){return dt.empty}invert(e){return new t(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new t(n.attr,n.value)}};ce.jsonID("docAttr",Br);var pn=class extends Error{};pn=function t(e){let n=Error.call(this,e);return n.__proto__=t.prototype,n};pn.prototype=Object.create(Error.prototype);pn.prototype.constructor=pn;pn.prototype.name="TransformError";var Tt=class{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new jn}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let n=this.maybeStep(e);if(n.failed)throw new pn(n.failed);return this}maybeStep(e){let n=e.apply(this.doc);return n.failed||this.addStep(e,n.doc),n}get docChanged(){return this.steps.length>0}addStep(e,n){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=n}replace(e,n=e,r=E.empty){let o=qn(this.doc,e,n,r);return o&&this.step(o),this}replaceWith(e,n,r){return this.replace(e,n,new E(v.from(r),0,0))}delete(e,n){return this.replace(e,n,E.empty)}insert(e,n){return this.replaceWith(e,e,n)}replaceRange(e,n,r){return jp(this,e,n,r),this}replaceRangeWith(e,n,r){return Up(this,e,n,r),this}deleteRange(e,n){return Kp(this,e,n),this}lift(e,n){return Rp(this,e,n),this}join(e,n=1){return Fp(this,e,n),this}wrap(e,n){return Pp(this,e,n),this}setBlockType(e,n=e,r,o=null){return Lp(this,e,n,r,o),this}setNodeMarkup(e,n,r=null,o){return zp(this,e,n,r,o),this}setNodeAttribute(e,n,r){return this.step(new Lr(e,n,r)),this}setDocAttribute(e,n){return this.step(new Br(e,n)),this}addNodeMark(e,n){return this.step(new Kn(e,n)),this}removeNodeMark(e,n){let r=this.doc.nodeAt(e);if(!r)throw new RangeError("No node at position "+e);if(n instanceof J)n.isInSet(r.marks)&&this.step(new hn(e,n));else{let o=r.marks,i,s=[];for(;i=n.isInSet(o);)s.push(new hn(e,i)),o=i.removeFromSet(o);for(let l=s.length-1;l>=0;l--)this.step(s[l])}return this}split(e,n=1,r){return Hp(this,e,n,r),this}addMark(e,n,r){return Ep(this,e,n,r),this}removeMark(e,n,r){return Np(this,e,n,r),this}clearIncompatible(e,n,r){return $i(this,e,n,r),this}};var Fi=Object.create(null),I=class{constructor(e,n,r){this.$anchor=e,this.$head=n,this.ranges=r||[new yn(e.min(n),e.max(n))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let n=0;n=0;i--){let s=n<0?gn(e.node(0),e.node(i),e.before(i+1),e.index(i),n,r):gn(e.node(0),e.node(i),e.after(i+1),e.index(i)+1,n,r);if(s)return s}return null}static near(e,n=1){return this.findFrom(e,n)||this.findFrom(e,-n)||new ke(e.node(0))}static atStart(e){return gn(e,e,0,0,1)||new ke(e)}static atEnd(e){return gn(e,e,e.content.size,e.childCount,-1)||new ke(e)}static fromJSON(e,n){if(!n||!n.type)throw new RangeError("Invalid input for Selection.fromJSON");let r=Fi[n.type];if(!r)throw new RangeError(`No selection type ${n.type} defined`);return r.fromJSON(e,n)}static jsonID(e,n){if(e in Fi)throw new RangeError("Duplicate use of selection JSON ID "+e);return Fi[e]=n,n.prototype.jsonID=e,n}getBookmark(){return D.between(this.$anchor,this.$head).getBookmark()}};I.prototype.visible=!0;var yn=class{constructor(e,n){this.$from=e,this.$to=n}},Ja=!1;function Ga(t){!Ja&&!t.parent.inlineContent&&(Ja=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+t.parent.type.name+")"))}var D=class t extends I{constructor(e,n=e){Ga(e),Ga(n),super(e,n)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,n){let r=e.resolve(n.map(this.head));if(!r.parent.inlineContent)return I.near(r);let o=e.resolve(n.map(this.anchor));return new t(o.parent.inlineContent?o:r,r)}replace(e,n=E.empty){if(super.replace(e,n),n==E.empty){let r=this.$from.marksAcross(this.$to);r&&e.ensureMarks(r)}}eq(e){return e instanceof t&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new $r(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,n){if(typeof n.anchor!="number"||typeof n.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new t(e.resolve(n.anchor),e.resolve(n.head))}static create(e,n,r=n){let o=e.resolve(n);return new this(o,r==n?o:e.resolve(r))}static between(e,n,r){let o=e.pos-n.pos;if((!r||o)&&(r=o>=0?1:-1),!n.parent.inlineContent){let i=I.findFrom(n,r,!0)||I.findFrom(n,-r,!0);if(i)n=i.$head;else return I.near(n,r)}return e.parent.inlineContent||(o==0?e=n:(e=(I.findFrom(e,-r,!0)||I.findFrom(e,r,!0)).$anchor,e.pos0?0:1);o>0?s=0;s+=o){let l=e.child(s);if(l.isAtom){if(!i&&L.isSelectable(l))return L.create(t,n-(o<0?l.nodeSize:0))}else{let a=gn(t,l,n+o,o<0?l.childCount:0,o,i);if(a)return a}n+=l.nodeSize*o}return null}function Xa(t,e,n){let r=t.steps.length-1;if(r{s==null&&(s=d)}),t.setSelection(I.near(t.doc.resolve(s),n))}var Ya=1,Hr=2,Qa=4,Wi=class extends Tt{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=Hr,this}ensureMarks(e){return J.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&Hr)>0}addStep(e,n){super.addStep(e,n),this.updated=this.updated&~Hr,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,n=!0){let r=this.selection;return n&&(e=e.mark(this.storedMarks||(r.empty?r.$from.marks():r.$from.marksAcross(r.$to)||J.none))),r.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,n,r){let o=this.doc.type.schema;if(n==null)return e?this.replaceSelectionWith(o.text(e),!0):this.deleteSelection();{if(r==null&&(r=n),!e)return this.deleteRange(n,r);let i=this.storedMarks;if(!i){let s=this.doc.resolve(n);i=r==n?s.marks():s.marksAcross(this.doc.resolve(r))}return this.replaceRangeWith(n,r,o.text(e,i)),!this.selection.empty&&this.selection.to==n+e.length&&this.setSelection(I.near(this.selection.$to)),this}}setMeta(e,n){return this.meta[typeof e=="string"?e:e.key]=n,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=Qa,this}get scrolledIntoView(){return(this.updated&Qa)>0}};function Za(t,e){return!e||!t?t:t.bind(e)}var jt=class{constructor(e,n,r){this.name=e,this.init=Za(n.init,r),this.apply=Za(n.apply,r)}},Jp=[new jt("doc",{init(t){return t.doc||t.schema.topNodeType.createAndFill()},apply(t){return t.doc}}),new jt("selection",{init(t,e){return t.selection||I.atStart(e.doc)},apply(t){return t.selection}}),new jt("storedMarks",{init(t){return t.storedMarks||null},apply(t,e,n,r){return r.selection.$cursor?t.storedMarks:null}}),new jt("scrollToSelection",{init(){return 0},apply(t,e){return t.scrolledIntoView?e+1:e}})],Jn=class{constructor(e,n){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=Jp.slice(),n&&n.forEach(r=>{if(this.pluginsByKey[r.key])throw new RangeError("Adding different instances of a keyed plugin ("+r.key+")");this.plugins.push(r),this.pluginsByKey[r.key]=r,r.spec.state&&this.fields.push(new jt(r.key,r.spec.state,r))})}},Fr=class t{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,n=-1){for(let r=0;rr.toJSON())),e&&typeof e=="object")for(let r in e){if(r=="doc"||r=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let o=e[r],i=o.spec.state;i&&i.toJSON&&(n[r]=i.toJSON.call(o,this[o.key]))}return n}static fromJSON(e,n,r){if(!n)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let o=new Jn(e.schema,e.plugins),i=new t(o);return o.fields.forEach(s=>{if(s.name=="doc")i.doc=ie.fromJSON(e.schema,n.doc);else if(s.name=="selection")i.selection=I.fromJSON(i.doc,n.selection);else if(s.name=="storedMarks")n.storedMarks&&(i.storedMarks=n.storedMarks.map(e.schema.markFromJSON));else{if(r)for(let l in r){let a=r[l],c=a.spec.state;if(a.key==s.name&&c&&c.fromJSON&&Object.prototype.hasOwnProperty.call(n,l)){i[s.name]=c.fromJSON.call(a,e,n[l],i);return}}i[s.name]=s.init(e,i)}}),i}};function ec(t,e,n){for(let r in t){let o=t[r];o instanceof Function?o=o.bind(e):r=="handleDOMEvents"&&(o=ec(o,e,{})),n[r]=o}return n}var P=class{constructor(e){this.spec=e,this.props={},e.props&&ec(e.props,this,this.props),this.key=e.key?e.key.key:tc("plugin")}getState(e){return e[this.key]}},Vi=Object.create(null);function tc(t){return t in Vi?t+"$"+ ++Vi[t]:(Vi[t]=0,t+"$")}var H=class{constructor(e="key"){this.key=tc(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}};var Vr=(t,e)=>t.selection.empty?!1:(e&&e(t.tr.deleteSelection().scrollIntoView()),!0);function rc(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("backward",t):n.parentOffset>0)?null:n}var Ui=(t,e,n)=>{let r=rc(t,n);if(!r)return!1;let o=qi(r);if(!o){let s=r.blockRange(),l=s&&ft(s);return l==null?!1:(e&&e(t.tr.lift(s,l).scrollIntoView()),!0)}let i=o.nodeBefore;if(fc(t,o,e,-1))return!0;if(r.parent.content.size==0&&(bn(i,"end")||L.isSelectable(i)))for(let s=r.depth;;s--){let l=qn(t.doc,r.before(s),r.after(s),E.empty);if(l&&l.slice.size1)break}return i.isAtom&&o.depth==r.depth-1?(e&&e(t.tr.delete(o.pos-i.nodeSize,o.pos).scrollIntoView()),!0):!1},oc=(t,e,n)=>{let r=rc(t,n);if(!r)return!1;let o=qi(r);return o?sc(t,o,e):!1},ic=(t,e,n)=>{let r=lc(t,n);if(!r)return!1;let o=Xi(r);return o?sc(t,o,e):!1};function sc(t,e,n){let r=e.nodeBefore,o=r,i=e.pos-1;for(;!o.isTextblock;i--){if(o.type.spec.isolating)return!1;let d=o.lastChild;if(!d)return!1;o=d}let s=e.nodeAfter,l=s,a=e.pos+1;for(;!l.isTextblock;a++){if(l.type.spec.isolating)return!1;let d=l.firstChild;if(!d)return!1;l=d}let c=qn(t.doc,i,a,E.empty);if(!c||c.from!=i||c instanceof ye&&c.slice.size>=a-i)return!1;if(n){let d=t.tr.step(c);d.setSelection(D.create(d.doc,i)),n(d.scrollIntoView())}return!0}function bn(t,e,n=!1){for(let r=t;r;r=e=="start"?r.firstChild:r.lastChild){if(r.isTextblock)return!0;if(n&&r.childCount!=1)return!1}return!1}var Ki=(t,e,n)=>{let{$head:r,empty:o}=t.selection,i=r;if(!o)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("backward",t):r.parentOffset>0)return!1;i=qi(r)}let s=i&&i.nodeBefore;return!s||!L.isSelectable(s)?!1:(e&&e(t.tr.setSelection(L.create(t.doc,i.pos-s.nodeSize)).scrollIntoView()),!0)};function qi(t){if(!t.parent.type.spec.isolating)for(let e=t.depth-1;e>=0;e--){if(t.index(e)>0)return t.doc.resolve(t.before(e+1));if(t.node(e).type.spec.isolating)break}return null}function lc(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("forward",t):n.parentOffset{let r=lc(t,n);if(!r)return!1;let o=Xi(r);if(!o)return!1;let i=o.nodeAfter;if(fc(t,o,e,1))return!0;if(r.parent.content.size==0&&(bn(i,"start")||L.isSelectable(i))){let s=qn(t.doc,r.before(),r.after(),E.empty);if(s&&s.slice.size{let{$head:r,empty:o}=t.selection,i=r;if(!o)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("forward",t):r.parentOffset=0;e--){let n=t.node(e);if(t.index(e)+1{let n=t.selection,r=n instanceof L,o;if(r){if(n.node.isTextblock||!Re(t.doc,n.from))return!1;o=n.from}else if(o=Wt(t.doc,n.from,-1),o==null)return!1;if(e){let i=t.tr.join(o);r&&i.setSelection(L.create(i.doc,o-t.doc.resolve(o).nodeBefore.nodeSize)),e(i.scrollIntoView())}return!0},cc=(t,e)=>{let n=t.selection,r;if(n instanceof L){if(n.node.isTextblock||!Re(t.doc,n.to))return!1;r=n.to}else if(r=Wt(t.doc,n.to,1),r==null)return!1;return e&&e(t.tr.join(r).scrollIntoView()),!0},dc=(t,e)=>{let{$from:n,$to:r}=t.selection,o=n.blockRange(r),i=o&&ft(o);return i==null?!1:(e&&e(t.tr.lift(o,i).scrollIntoView()),!0)},Yi=(t,e)=>{let{$head:n,$anchor:r}=t.selection;return!n.parent.type.spec.code||!n.sameParent(r)?!1:(e&&e(t.tr.insertText(` `).scrollIntoView()),!0)};function Qi(t){for(let e=0;e{let{$head:n,$anchor:r}=t.selection;if(!n.parent.type.spec.code||!n.sameParent(r))return!1;let o=n.node(-1),i=n.indexAfter(-1),s=Qi(o.contentMatchAt(i));if(!s||!o.canReplaceWith(i,i,s))return!1;if(e){let l=n.after(),a=t.tr.replaceWith(l,l,s.createAndFill());a.setSelection(I.near(a.doc.resolve(l),1)),e(a.scrollIntoView())}return!0},es=(t,e)=>{let n=t.selection,{$from:r,$to:o}=n;if(n instanceof ke||r.parent.inlineContent||o.parent.inlineContent)return!1;let i=Qi(o.parent.contentMatchAt(o.indexAfter()));if(!i||!i.isTextblock)return!1;if(e){let s=(!r.parentOffset&&o.index(){let{$cursor:n}=t.selection;if(!n||n.parent.content.size)return!1;if(n.depth>1&&n.after()!=n.end(-1)){let i=n.before();if(Ee(t.doc,i))return e&&e(t.tr.split(i).scrollIntoView()),!0}let r=n.blockRange(),o=r&&ft(r);return o==null?!1:(e&&e(t.tr.lift(r,o).scrollIntoView()),!0)};function Gp(t){return(e,n)=>{let{$from:r,$to:o}=e.selection;if(e.selection instanceof L&&e.selection.node.isBlock)return!r.parentOffset||!Ee(e.doc,r.pos)?!1:(n&&n(e.tr.split(r.pos).scrollIntoView()),!0);if(!r.depth)return!1;let i=[],s,l,a=!1,c=!1;for(let h=r.depth;;h--)if(r.node(h).isBlock){a=r.end(h)==r.pos+(r.depth-h),c=r.start(h)==r.pos-(r.depth-h),l=Qi(r.node(h-1).contentMatchAt(r.indexAfter(h-1)));let m=t&&t(o.parent,a,r);i.unshift(m||(a&&l?{type:l}:null)),s=h;break}else{if(h==1)return!1;i.unshift(null)}let d=e.tr;(e.selection instanceof D||e.selection instanceof ke)&&d.deleteSelection();let u=d.mapping.map(r.pos),f=Ee(d.doc,u,i.length,i);if(f||(i[0]=l?{type:l}:null,f=Ee(d.doc,u,i.length,i)),!f)return!1;if(d.split(u,i.length,i),!a&&c&&r.node(s).type!=l){let h=d.mapping.map(r.before(s)),p=d.doc.resolve(h);l&&r.node(s-1).canReplaceWith(p.index(),p.index()+1,l)&&d.setNodeMarkup(d.mapping.map(r.before(s)),l)}return n&&n(d.scrollIntoView()),!0}}var Xp=Gp();var uc=(t,e)=>{let{$from:n,to:r}=t.selection,o,i=n.sharedDepth(r);return i==0?!1:(o=n.before(i),e&&e(t.tr.setSelection(L.create(t.doc,o))),!0)},Yp=(t,e)=>(e&&e(t.tr.setSelection(new ke(t.doc))),!0);function Qp(t,e,n){let r=e.nodeBefore,o=e.nodeAfter,i=e.index();return!r||!o||!r.type.compatibleContent(o.type)?!1:!r.content.size&&e.parent.canReplace(i-1,i)?(n&&n(t.tr.delete(e.pos-r.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(i,i+1)||!(o.isTextblock||Re(t.doc,e.pos))?!1:(n&&n(t.tr.join(e.pos).scrollIntoView()),!0)}function fc(t,e,n,r){let o=e.nodeBefore,i=e.nodeAfter,s,l,a=o.type.spec.isolating||i.type.spec.isolating;if(!a&&Qp(t,e,n))return!0;let c=!a&&e.parent.canReplace(e.index(),e.index()+1);if(c&&(s=(l=o.contentMatchAt(o.childCount)).findWrapping(i.type))&&l.matchType(s[0]||i.type).validEnd){if(n){let h=e.pos+i.nodeSize,p=v.empty;for(let y=s.length-1;y>=0;y--)p=v.from(s[y].create(null,p));p=v.from(o.copy(p));let m=t.tr.step(new se(e.pos-1,h,e.pos,h,new E(p,1,0),s.length,!0)),g=m.doc.resolve(h+2*s.length);g.nodeAfter&&g.nodeAfter.type==o.type&&Re(m.doc,g.pos)&&m.join(g.pos),n(m.scrollIntoView())}return!0}let d=i.type.spec.isolating||r>0&&a?null:I.findFrom(e,1),u=d&&d.$from.blockRange(d.$to),f=u&&ft(u);if(f!=null&&f>=e.depth)return n&&n(t.tr.lift(u,f).scrollIntoView()),!0;if(c&&bn(i,"start",!0)&&bn(o,"end")){let h=o,p=[];for(;p.push(h),!h.isTextblock;)h=h.lastChild;let m=i,g=1;for(;!m.isTextblock;m=m.firstChild)g++;if(h.canReplace(h.childCount,h.childCount,m.content)){if(n){let y=v.empty;for(let b=p.length-1;b>=0;b--)y=v.from(p[b].copy(y));let w=t.tr.step(new se(e.pos-p.length,e.pos+i.nodeSize,e.pos+g,e.pos+i.nodeSize-g,new E(y,p.length,0),0,!0));n(w.scrollIntoView())}return!0}}return!1}function hc(t){return function(e,n){let r=e.selection,o=t<0?r.$from:r.$to,i=o.depth;for(;o.node(i).isInline;){if(!i)return!1;i--}return o.node(i).isTextblock?(n&&n(e.tr.setSelection(D.create(e.doc,t<0?o.start(i):o.end(i)))),!0):!1}}var ns=hc(-1),rs=hc(1);function pc(t,e=null){return function(n,r){let{$from:o,$to:i}=n.selection,s=o.blockRange(i),l=s&&mn(s,t,e);return l?(r&&r(n.tr.wrap(s,l).scrollIntoView()),!0):!1}}function is(t,e=null){return function(n,r){let o=!1;for(let i=0;i{if(o)return!1;if(!(!a.isTextblock||a.hasMarkup(t,e)))if(a.type==t)o=!0;else{let d=n.doc.resolve(c),u=d.index();o=d.parent.canReplaceWith(u,u+1,t)}})}if(!o)return!1;if(r){let i=n.tr;for(let s=0;s=2&&e.$from.node(e.depth-1).type.compatibleContent(n)&&e.startIndex==0){if(e.$from.index(e.depth-1)==0)return!1;let a=s.resolve(e.start-2);i=new Vt(a,a,e.depth),e.endIndex=0;d--)i=v.from(n[d].type.create(n[d].attrs,i));t.step(new se(e.start-(r?2:0),e.end,e.start,e.end,new E(i,0,0),n.length,!0));let s=0;for(let d=0;ds.childCount>0&&s.firstChild.type==t);return i?n?r.node(i.depth-1).type==t?nm(e,n,t,i):rm(e,n,i):!0:!1}}function nm(t,e,n,r){let o=t.tr,i=r.end,s=r.$to.end(r.depth);im;p--)h-=o.child(p).nodeSize,r.delete(h-1,h+1);let i=r.doc.resolve(n.start),s=i.nodeAfter;if(r.mapping.map(n.end)!=n.start+i.nodeAfter.nodeSize)return!1;let l=n.startIndex==0,a=n.endIndex==o.childCount,c=i.node(-1),d=i.index(-1);if(!c.canReplace(d+(l?0:1),d+1,s.content.append(a?v.empty:v.from(o))))return!1;let u=i.pos,f=u+s.nodeSize;return r.step(new se(u-(l?1:0),f+(a?1:0),u+1,f-1,new E((l?v.empty:v.from(o.copy(v.empty))).append(a?v.empty:v.from(o.copy(v.empty))),l?0:1,a?0:1),l?0:1)),e(r.scrollIntoView()),!0}function yc(t){return function(e,n){let{$from:r,$to:o}=e.selection,i=r.blockRange(o,c=>c.childCount>0&&c.firstChild.type==t);if(!i)return!1;let s=i.startIndex;if(s==0)return!1;let l=i.parent,a=l.child(s-1);if(a.type!=t)return!1;if(n){let c=a.lastChild&&a.lastChild.type==l.type,d=v.from(c?t.create():null),u=new E(v.from(t.create(null,v.from(l.type.create(null,d)))),c?3:1,0),f=i.start,h=i.end;n(e.tr.step(new se(f-(c?3:1),h,f,h,u,1,!0)).scrollIntoView())}return!0}}var fe=function(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e},Cn=function(t){let e=t.assignedSlot||t.parentNode;return e&&e.nodeType==11?e.host:e},fs=null,pt=function(t,e,n){let r=fs||(fs=document.createRange());return r.setEnd(t,n??t.nodeValue.length),r.setStart(t,e||0),r},om=function(){fs=null},Yt=function(t,e,n,r){return n&&(bc(t,e,n,r,-1)||bc(t,e,n,r,1))},im=/^(img|br|input|textarea|hr)$/i;function bc(t,e,n,r,o){for(var i;;){if(t==n&&e==r)return!0;if(e==(o<0?0:Ie(t))){let s=t.parentNode;if(!s||s.nodeType!=1||nr(t)||im.test(t.nodeName)||t.contentEditable=="false")return!1;e=fe(t)+(o<0?0:1),t=s}else if(t.nodeType==1){let s=t.childNodes[e+(o<0?-1:0)];if(s.nodeType==1&&s.contentEditable=="false")if(!((i=s.pmViewDesc)===null||i===void 0)&&i.ignoreForSelection)e+=o;else return!1;else t=s,e=o<0?Ie(t):0}else return!1}}function Ie(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function sm(t,e){for(;;){if(t.nodeType==3&&e)return t;if(t.nodeType==1&&e>0){if(t.contentEditable=="false")return null;t=t.childNodes[e-1],e=Ie(t)}else if(t.parentNode&&!nr(t))e=fe(t),t=t.parentNode;else return null}}function lm(t,e){for(;;){if(t.nodeType==3&&e2),De=vn||(Ye?/Mac/.test(Ye.platform):!1),Zc=Ye?/Win/.test(Ye.platform):!1,mt=/Android \d/.test(It),rr=!!wc&&"webkitFontSmoothing"in wc.documentElement.style,um=rr?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function fm(t){let e=t.defaultView&&t.defaultView.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function ht(t,e){return typeof t=="number"?t:t[e]}function hm(t){let e=t.getBoundingClientRect(),n=e.width/t.offsetWidth||1,r=e.height/t.offsetHeight||1;return{left:e.left,right:e.left+t.clientWidth*n,top:e.top,bottom:e.top+t.clientHeight*r}}function xc(t,e,n){let r=t.someProp("scrollThreshold")||0,o=t.someProp("scrollMargin")||5,i=t.dom.ownerDocument;for(let s=n||t.dom;s;){if(s.nodeType!=1){s=Cn(s);continue}let l=s,a=l==i.body,c=a?fm(i):hm(l),d=0,u=0;if(e.topc.bottom-ht(r,"bottom")&&(u=e.bottom-e.top>c.bottom-c.top?e.top+ht(o,"top")-c.top:e.bottom-c.bottom+ht(o,"bottom")),e.leftc.right-ht(r,"right")&&(d=e.right-c.right+ht(o,"right")),d||u)if(a)i.defaultView.scrollBy(d,u);else{let h=l.scrollLeft,p=l.scrollTop;u&&(l.scrollTop+=u),d&&(l.scrollLeft+=d);let m=l.scrollLeft-h,g=l.scrollTop-p;e={left:e.left-m,top:e.top-g,right:e.right-m,bottom:e.bottom-g}}let f=a?"fixed":getComputedStyle(s).position;if(/^(fixed|sticky)$/.test(f))break;s=f=="absolute"?s.offsetParent:Cn(s)}}function pm(t){let e=t.dom.getBoundingClientRect(),n=Math.max(0,e.top),r,o;for(let i=(e.left+e.right)/2,s=n+1;s=n-20){r=l,o=a.top;break}}return{refDOM:r,refTop:o,stack:ed(t.dom)}}function ed(t){let e=[],n=t.ownerDocument;for(let r=t;r&&(e.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),t!=n);r=Cn(r));return e}function mm({refDOM:t,refTop:e,stack:n}){let r=t?t.getBoundingClientRect().top:0;td(n,r==0?0:r-e)}function td(t,e){for(let n=0;n=l){s=Math.max(p.bottom,s),l=Math.min(p.top,l);let m=p.left>e.left?p.left-e.left:p.right=(p.left+p.right)/2?1:0));continue}}else p.top>e.top&&!a&&p.left<=e.left&&p.right>=e.left&&(a=d,c={left:Math.max(p.left,Math.min(p.right,e.left)),top:p.top});!n&&(e.left>=p.right&&e.top>=p.top||e.left>=p.left&&e.top>=p.bottom)&&(i=u+1)}}return!n&&a&&(n=a,o=c,r=0),n&&n.nodeType==3?ym(n,o):!n||r&&n.nodeType==1?{node:t,offset:i}:nd(n,o)}function ym(t,e){let n=t.nodeValue.length,r=document.createRange(),o;for(let i=0;i=(s.left+s.right)/2?1:0)};break}}return r.detach(),o||{node:t,offset:0}}function Os(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function bm(t,e){let n=t.parentNode;return n&&/^li$/i.test(n.nodeName)&&e.left(s.left+s.right)/2?1:-1}return t.docView.posFromDOM(r,o,i)}function xm(t,e,n,r){let o=-1;for(let i=e,s=!1;i!=t.dom;){let l=t.docView.nearestDesc(i,!0),a;if(!l)return null;if(l.dom.nodeType==1&&(l.node.isBlock&&l.parent||!l.contentDOM)&&((a=l.dom.getBoundingClientRect()).width||a.height)&&(l.node.isBlock&&l.parent&&!/^T(R|BODY|HEAD|FOOT)$/.test(l.dom.nodeName)&&(!s&&a.left>r.left||a.top>r.top?o=l.posBefore:(!s&&a.right-1?o:t.docView.posFromDOM(e,n,-1)}function rd(t,e,n){let r=t.childNodes.length;if(r&&n.tope.top&&o++}let c;rr&&o&&r.nodeType==1&&(c=r.childNodes[o-1]).nodeType==1&&c.contentEditable=="false"&&c.getBoundingClientRect().top>=e.top&&o--,r==t.dom&&o==r.childNodes.length-1&&r.lastChild.nodeType==1&&e.top>r.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:(o==0||r.nodeType!=1||r.childNodes[o-1].nodeName!="BR")&&(l=xm(t,r,o,e))}l==null&&(l=wm(t,s,e));let a=t.docView.nearestDesc(s,!0);return{pos:l,inside:a?a.posAtStart-a.border:-1}}function kc(t){return t.top=0&&o==r.nodeValue.length?(a--,d=1):n<0?a--:c++,Gn(Et(pt(r,a,c),d),d<0)}if(!t.state.doc.resolve(e-(i||0)).parent.inlineContent){if(i==null&&o&&(n<0||o==Ie(r))){let a=r.childNodes[o-1];if(a.nodeType==1)return ls(a.getBoundingClientRect(),!1)}if(i==null&&o=0)}if(i==null&&o&&(n<0||o==Ie(r))){let a=r.childNodes[o-1],c=a.nodeType==3?pt(a,Ie(a)-(s?0:1)):a.nodeType==1&&(a.nodeName!="BR"||!a.nextSibling)?a:null;if(c)return Gn(Et(c,1),!1)}if(i==null&&o=0)}function Gn(t,e){if(t.width==0)return t;let n=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:n,right:n}}function ls(t,e){if(t.height==0)return t;let n=e?t.top:t.bottom;return{top:n,bottom:n,left:t.left,right:t.right}}function id(t,e,n){let r=t.state,o=t.root.activeElement;r!=e&&t.updateState(e),o!=t.dom&&t.focus();try{return n()}finally{r!=e&&t.updateState(r),o!=t.dom&&o&&o.focus()}}function Cm(t,e,n){let r=e.selection,o=n=="up"?r.$from:r.$to;return id(t,e,()=>{let{node:i}=t.docView.domFromPos(o.pos,n=="up"?-1:1);for(;;){let l=t.docView.nearestDesc(i,!0);if(!l)break;if(l.node.isBlock){i=l.contentDOM||l.dom;break}i=l.dom.parentNode}let s=od(t,o.pos,1);for(let l=i.firstChild;l;l=l.nextSibling){let a;if(l.nodeType==1)a=l.getClientRects();else if(l.nodeType==3)a=pt(l,0,l.nodeValue.length).getClientRects();else continue;for(let c=0;cd.top+1&&(n=="up"?s.top-d.top>(d.bottom-s.top)*2:d.bottom-s.bottom>(s.bottom-d.top)*2))return!1}}return!0})}var vm=/[\u0590-\u08ac]/;function Mm(t,e,n){let{$head:r}=e.selection;if(!r.parent.isTextblock)return!1;let o=r.parentOffset,i=!o,s=o==r.parent.content.size,l=t.domSelection();return l?!vm.test(r.parent.textContent)||!l.modify?n=="left"||n=="backward"?i:s:id(t,e,()=>{let{focusNode:a,focusOffset:c,anchorNode:d,anchorOffset:u}=t.domSelectionRange(),f=l.caretBidiLevel;l.modify("move",n,"character");let h=r.depth?t.docView.domAfterPos(r.before()):t.dom,{focusNode:p,focusOffset:m}=t.domSelectionRange(),g=p&&!h.contains(p.nodeType==1?p:p.parentNode)||a==p&&c==m;try{l.collapse(d,u),a&&(a!=d||c!=u)&&l.extend&&l.extend(a,c)}catch{}return f!=null&&(l.caretBidiLevel=f),g}):r.pos==r.start()||r.pos==r.end()}var Sc=null,Cc=null,vc=!1;function Tm(t,e,n){return Sc==e&&Cc==n?vc:(Sc=e,Cc=n,vc=n=="up"||n=="down"?Cm(t,e,n):Mm(t,e,n))}var Le=0,Mc=1,Kt=2,Qe=3,Qt=class{constructor(e,n,r,o){this.parent=e,this.children=n,this.dom=r,this.contentDOM=o,this.dirty=Le,r.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,n,r){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let n=0;nfe(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))o=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(n==0)for(let i=e;;i=i.parentNode){if(i==this.dom){o=!1;break}if(i.previousSibling)break}if(o==null&&n==e.childNodes.length)for(let i=e;;i=i.parentNode){if(i==this.dom){o=!0;break}if(i.nextSibling)break}}return o??r>0?this.posAtEnd:this.posAtStart}nearestDesc(e,n=!1){for(let r=!0,o=e;o;o=o.parentNode){let i=this.getDesc(o),s;if(i&&(!n||i.node))if(r&&(s=i.nodeDOM)&&!(s.nodeType==1?s.contains(e.nodeType==1?e:e.parentNode):s==e))r=!1;else return i}}getDesc(e){let n=e.pmViewDesc;for(let r=n;r;r=r.parent)if(r==this)return n}posFromDOM(e,n,r){for(let o=e;o;o=o.parentNode){let i=this.getDesc(o);if(i)return i.localPosFromDOM(e,n,r)}return-1}descAt(e){for(let n=0,r=0;ne||s instanceof jr){o=e-i;break}i=l}if(o)return this.children[r].domFromPos(o-this.children[r].border,n);for(let i;r&&!(i=this.children[r-1]).size&&i instanceof _r&&i.side>=0;r--);if(n<=0){let i,s=!0;for(;i=r?this.children[r-1]:null,!(!i||i.dom.parentNode==this.contentDOM);r--,s=!1);return i&&n&&s&&!i.border&&!i.domAtom?i.domFromPos(i.size,n):{node:this.contentDOM,offset:i?fe(i.dom)+1:0}}else{let i,s=!0;for(;i=r=d&&n<=c-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(e,n,d);e=s;for(let u=l;u>0;u--){let f=this.children[u-1];if(f.size&&f.dom.parentNode==this.contentDOM&&!f.emptyChildAt(1)){o=fe(f.dom)+1;break}e-=f.size}o==-1&&(o=0)}if(o>-1&&(c>n||l==this.children.length-1)){n=c;for(let d=l+1;dp&&sn){let p=l;l=a,a=p}let h=document.createRange();h.setEnd(a.node,a.offset),h.setStart(l.node,l.offset),c.removeAllRanges(),c.addRange(h)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,n){for(let r=0,o=0;o=r:er){let l=r+i.border,a=s-i.border;if(e>=l&&n<=a){this.dirty=e==r||n==s?Kt:Mc,e==l&&n==a&&(i.contentLost||i.dom.parentNode!=this.contentDOM)?i.dirty=Qe:i.markDirty(e-l,n-l);return}else i.dirty=i.dom==i.contentDOM&&i.dom.parentNode==this.contentDOM&&!i.children.length?Kt:Qe}r=s}this.dirty=Kt}markParentsDirty(){let e=1;for(let n=this.parent;n;n=n.parent,e++){let r=e==1?Kt:Mc;n.dirty{if(!i)return o;if(i.parent)return i.parent.posBeforeChild(i)})),!n.type.spec.raw){if(s.nodeType!=1){let l=document.createElement("span");l.appendChild(s),s=l}s.contentEditable="false",s.classList.add("ProseMirror-widget")}super(e,[],s,null),this.widget=n,this.widget=n,i=this}matchesWidget(e){return this.dirty==Le&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let n=this.widget.spec.stopEvent;return n?n(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get ignoreForSelection(){return!!this.widget.type.spec.relaxedSide}get side(){return this.widget.type.side}},gs=class extends Qt{constructor(e,n,r,o){super(e,[],n,null),this.textDOM=r,this.text=o}get size(){return this.text.length}localPosFromDOM(e,n){return e!=this.textDOM?this.posAtStart+(n?this.size:0):this.posAtStart+n}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}},Mn=class t extends Qt{constructor(e,n,r,o,i){super(e,[],r,o),this.mark=n,this.spec=i}static create(e,n,r,o){let i=o.nodeViews[n.type.name],s=i&&i(n,o,r);return(!s||!s.dom)&&(s=ct.renderSpec(document,n.type.spec.toDOM(n,r),null,n.attrs)),new t(e,n,s.dom,s.contentDOM||s.dom,s)}parseRule(){return this.dirty&Qe||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=Qe&&this.mark.eq(e)}markDirty(e,n){if(super.markDirty(e,n),this.dirty!=Le){let r=this.parent;for(;!r.node;)r=r.parent;r.dirty0&&(i=xs(i,0,e,r));for(let l=0;l{if(!a)return s;if(a.parent)return a.parent.posBeforeChild(a)},r,o),d=c&&c.dom,u=c&&c.contentDOM;if(n.isText){if(!d)d=document.createTextNode(n.text);else if(d.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else d||({dom:d,contentDOM:u}=ct.renderSpec(document,n.type.spec.toDOM(n),null,n.attrs));!u&&!n.isText&&d.nodeName!="BR"&&(d.hasAttribute("contenteditable")||(d.contentEditable="false"),n.type.spec.draggable&&(d.draggable=!0));let f=d;return d=ad(d,r,n),c?a=new ys(e,n,r,o,d,u||null,f,c,i,s+1):n.isText?new Wr(e,n,r,o,d,f,i):new t(e,n,r,o,d,u||null,f,i,s+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(e.preserveWhitespace="full"),!this.contentDOM)e.getContent=()=>this.node.content;else if(!this.contentLost)e.contentElement=this.contentDOM;else{for(let n=this.children.length-1;n>=0;n--){let r=this.children[n];if(this.dom.contains(r.dom.parentNode)){e.contentElement=r.dom.parentNode;break}}e.contentElement||(e.getContent=()=>v.empty)}return e}matchesNode(e,n,r){return this.dirty==Le&&e.eq(this.node)&&Ur(n,this.outerDeco)&&r.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,n){let r=this.node.inlineContent,o=n,i=e.composing?this.localCompositionInfo(e,n):null,s=i&&i.pos>-1?i:null,l=i&&i.pos<0,a=new ws(this,s&&s.node,e);Om(this.node,this.innerDeco,(c,d,u)=>{c.spec.marks?a.syncToMarks(c.spec.marks,r,e):c.type.side>=0&&!u&&a.syncToMarks(d==this.node.childCount?J.none:this.node.child(d).marks,r,e),a.placeWidget(c,e,o)},(c,d,u,f)=>{a.syncToMarks(c.marks,r,e);let h;a.findNodeMatch(c,d,u,f)||l&&e.state.selection.from>o&&e.state.selection.to-1&&a.updateNodeAt(c,d,u,h,e)||a.updateNextNode(c,d,u,e,f,o)||a.addNode(c,d,u,e,o),o+=c.nodeSize}),a.syncToMarks([],r,e),this.node.isTextblock&&a.addTextblockHacks(),a.destroyRest(),(a.changed||this.dirty==Kt)&&(s&&this.protectLocalComposition(e,s),sd(this.contentDOM,this.children,e),vn&&Rm(this.dom))}localCompositionInfo(e,n){let{from:r,to:o}=e.state.selection;if(!(e.state.selection instanceof D)||rn+this.node.content.size)return null;let i=e.input.compositionNode;if(!i||!this.dom.contains(i.parentNode))return null;if(this.node.inlineContent){let s=i.nodeValue,l=Dm(this.node.content,s,r-n,o-n);return l<0?null:{node:i,pos:l,text:s}}else return{node:i,pos:-1,text:""}}protectLocalComposition(e,{node:n,pos:r,text:o}){if(this.getDesc(n))return;let i=n;for(;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=void 0)}let s=new gs(this,i,n,o);e.input.compositionNodes.push(s),this.children=xs(this.children,r,r+o.length,e,s)}update(e,n,r,o){return this.dirty==Qe||!e.sameMarkup(this.node)?!1:(this.updateInner(e,n,r,o),!0)}updateInner(e,n,r,o){this.updateOuterDeco(n),this.node=e,this.innerDeco=r,this.contentDOM&&this.updateChildren(o,this.posAtStart),this.dirty=Le}updateOuterDeco(e){if(Ur(e,this.outerDeco))return;let n=this.nodeDOM.nodeType!=1,r=this.dom;this.dom=ld(this.dom,this.nodeDOM,bs(this.outerDeco,this.node,n),bs(e,this.node,n)),this.dom!=r&&(r.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.nodeDOM.draggable=!0))}deselectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.nodeDOM.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}};function Tc(t,e,n,r,o){ad(r,e,t);let i=new Dt(void 0,t,e,n,r,r,r,o,0);return i.contentDOM&&i.updateChildren(o,0),i}var Wr=class t extends Dt{constructor(e,n,r,o,i,s,l){super(e,n,r,o,i,null,s,l,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,n,r,o){return this.dirty==Qe||this.dirty!=Le&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(n),(this.dirty!=Le||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,o.trackWrites==this.nodeDOM&&(o.trackWrites=null)),this.node=e,this.dirty=Le,!0)}inParent(){let e=this.parent.contentDOM;for(let n=this.nodeDOM;n;n=n.parentNode)if(n==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,n,r){return e==this.nodeDOM?this.posAtStart+Math.min(n,this.node.text.length):super.localPosFromDOM(e,n,r)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,n,r){let o=this.node.cut(e,n),i=document.createTextNode(o.text);return new t(this.parent,o,this.outerDeco,this.innerDeco,i,i,r)}markDirty(e,n){super.markDirty(e,n),this.dom!=this.nodeDOM&&(e==0||n==this.nodeDOM.nodeValue.length)&&(this.dirty=Qe)}get domAtom(){return!1}isText(e){return this.node.text==e}},jr=class extends Qt{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==Le&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}},ys=class extends Dt{constructor(e,n,r,o,i,s,l,a,c,d){super(e,n,r,o,i,s,l,c,d),this.spec=a}update(e,n,r,o){if(this.dirty==Qe)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let i=this.spec.update(e,n,r);return i&&this.updateInner(e,n,r,o),i}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,n,r,o)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,n,r,o){this.spec.setSelection?this.spec.setSelection(e,n,r.root):super.setSelection(e,n,r,o)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}};function sd(t,e,n){let r=t.firstChild,o=!1;for(let i=0;i>1,s=Math.min(i,e.length);for(;o-1)l>this.index&&(this.changed=!0,this.destroyBetween(this.index,l)),this.top=this.top.children[this.index];else{let a=Mn.create(this.top,e[i],n,r);this.top.children.splice(this.index,0,a),this.top=a,this.changed=!0}this.index=0,i++}}findNodeMatch(e,n,r,o){let i=-1,s;if(o>=this.preMatch.index&&(s=this.preMatch.matches[o-this.preMatch.index]).parent==this.top&&s.matchesNode(e,n,r))i=this.top.children.indexOf(s,this.index);else for(let l=this.index,a=Math.min(this.top.children.length,l+5);l0;){let l;for(;;)if(r){let c=n.children[r-1];if(c instanceof Mn)n=c,r=c.children.length;else{l=c,r--;break}}else{if(n==e)break e;r=n.parent.children.indexOf(n),n=n.parent}let a=l.node;if(a){if(a!=t.child(o-1))break;--o,i.set(l,o),s.push(l)}}return{index:o,matched:i,matches:s.reverse()}}function Nm(t,e){return t.type.side-e.type.side}function Om(t,e,n,r){let o=e.locals(t),i=0;if(o.length==0){for(let c=0;ci;)l.push(o[s++]);let p=i+f.nodeSize;if(f.isText){let g=p;s!g.inline):l.slice();r(f,m,e.forChild(i,f),h),i=p}}function Rm(t){if(t.nodeName=="UL"||t.nodeName=="OL"){let e=t.style.cssText;t.style.cssText=e+"; list-style: square !important",window.getComputedStyle(t).listStyle,t.style.cssText=e}}function Dm(t,e,n,r){for(let o=0,i=0;o=n){if(i>=r&&a.slice(r-e.length-l,r-l)==e)return r-e.length;let c=l=0&&c+e.length+l>=n)return l+c;if(n==r&&a.length>=r+e.length-l&&a.slice(r-l,r-l+e.length)==e)return r}}return-1}function xs(t,e,n,r,o){let i=[];for(let s=0,l=0;s=n||d<=e?i.push(a):(cn&&i.push(a.slice(n-c,a.size,r)))}return i}function Rs(t,e=null){let n=t.domSelectionRange(),r=t.state.doc;if(!n.focusNode)return null;let o=t.docView.nearestDesc(n.focusNode),i=o&&o.size==0,s=t.docView.posFromDOM(n.focusNode,n.focusOffset,1);if(s<0)return null;let l=r.resolve(s),a,c;if(Qr(n)){for(a=s;o&&!o.node;)o=o.parent;let u=o.node;if(o&&u.isAtom&&L.isSelectable(u)&&o.parent&&!(u.isInline&&am(n.focusNode,n.focusOffset,o.dom))){let f=o.posBefore;c=new L(s==f?l:r.resolve(f))}}else{if(n instanceof t.dom.ownerDocument.defaultView.Selection&&n.rangeCount>1){let u=s,f=s;for(let h=0;h{(n.anchorNode!=r||n.anchorOffset!=o)&&(e.removeEventListener("selectionchange",t.input.hideSelectionGuard),setTimeout(()=>{(!cd(t)||t.state.selection.visible)&&t.dom.classList.remove("ProseMirror-hideselection")},20))})}function Pm(t){let e=t.domSelection();if(!e)return;let n=t.cursorWrapper.dom,r=n.nodeName=="IMG";r?e.collapse(n.parentNode,fe(n)+1):e.collapse(n,0),!r&&!t.state.selection.visible&&ve&&Rt<=11&&(n.disabled=!0,n.disabled=!1)}function dd(t,e){if(e instanceof L){let n=t.docView.descAt(e.from);n!=t.lastSelectedViewDesc&&(Rc(t),n&&n.selectNode(),t.lastSelectedViewDesc=n)}else Rc(t)}function Rc(t){t.lastSelectedViewDesc&&(t.lastSelectedViewDesc.parent&&t.lastSelectedViewDesc.deselectNode(),t.lastSelectedViewDesc=void 0)}function Ds(t,e,n,r){return t.someProp("createSelectionBetween",o=>o(t,e,n))||D.between(e,n,r)}function Dc(t){return t.editable&&!t.hasFocus()?!1:ud(t)}function ud(t){let e=t.domSelectionRange();if(!e.anchorNode)return!1;try{return t.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(t.editable||t.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function Lm(t){let e=t.docView.domFromPos(t.state.selection.anchor,0),n=t.domSelectionRange();return Yt(e.node,e.offset,n.anchorNode,n.anchorOffset)}function ks(t,e){let{$anchor:n,$head:r}=t.selection,o=e>0?n.max(r):n.min(r),i=o.parent.inlineContent?o.depth?t.doc.resolve(e>0?o.after():o.before()):null:o;return i&&I.findFrom(i,e)}function Nt(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function Ic(t,e,n){let r=t.state.selection;if(r instanceof D)if(n.indexOf("s")>-1){let{$head:o}=r,i=o.textOffset?null:e<0?o.nodeBefore:o.nodeAfter;if(!i||i.isText||!i.isLeaf)return!1;let s=t.state.doc.resolve(o.pos+i.nodeSize*(e<0?-1:1));return Nt(t,new D(r.$anchor,s))}else if(r.empty){if(t.endOfTextblock(e>0?"forward":"backward")){let o=ks(t.state,e);return o&&o instanceof L?Nt(t,o):!1}else if(!(De&&n.indexOf("m")>-1)){let o=r.$head,i=o.textOffset?null:e<0?o.nodeBefore:o.nodeAfter,s;if(!i||i.isText)return!1;let l=e<0?o.pos-i.nodeSize:o.pos;return i.isAtom||(s=t.docView.descAt(l))&&!s.contentDOM?L.isSelectable(i)?Nt(t,new L(e<0?t.state.doc.resolve(o.pos-i.nodeSize):o)):rr?Nt(t,new D(t.state.doc.resolve(e<0?l:l+i.nodeSize))):!1:!1}}else return!1;else{if(r instanceof L&&r.node.isInline)return Nt(t,new D(e>0?r.$to:r.$from));{let o=ks(t.state,e);return o?Nt(t,o):!1}}}function Kr(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function Yn(t,e){let n=t.pmViewDesc;return n&&n.size==0&&(e<0||t.nextSibling||t.nodeName!="BR")}function xn(t,e){return e<0?Bm(t):zm(t)}function Bm(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let o,i,s=!1;for(Pe&&n.nodeType==1&&r0){if(n.nodeType!=1)break;{let l=n.childNodes[r-1];if(Yn(l,-1))o=n,i=--r;else if(l.nodeType==3)n=l,r=n.nodeValue.length;else break}}else{if(fd(n))break;{let l=n.previousSibling;for(;l&&Yn(l,-1);)o=n.parentNode,i=fe(l),l=l.previousSibling;if(l)n=l,r=Kr(n);else{if(n=n.parentNode,n==t.dom)break;r=0}}}s?Ss(t,n,r):o&&Ss(t,o,i)}function zm(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let o=Kr(n),i,s;for(;;)if(r{t.state==o&>(t)},50)}function Pc(t,e){let n=t.state.doc.resolve(e);if(!(de||Zc)&&n.parent.inlineContent){let o=t.coordsAtPos(e);if(e>n.start()){let i=t.coordsAtPos(e-1),s=(i.top+i.bottom)/2;if(s>o.top&&s1)return i.lefto.top&&s1)return i.left>o.left?"ltr":"rtl"}}return getComputedStyle(t.dom).direction=="rtl"?"rtl":"ltr"}function Lc(t,e,n){let r=t.state.selection;if(r instanceof D&&!r.empty||n.indexOf("s")>-1||De&&n.indexOf("m")>-1)return!1;let{$from:o,$to:i}=r;if(!o.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){let s=ks(t.state,e);if(s&&s instanceof L)return Nt(t,s)}if(!o.parent.inlineContent){let s=e<0?o:i,l=r instanceof ke?I.near(s,e):I.findFrom(s,e);return l?Nt(t,l):!1}return!1}function Bc(t,e){if(!(t.state.selection instanceof D))return!0;let{$head:n,$anchor:r,empty:o}=t.state.selection;if(!n.sameParent(r))return!0;if(!o)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;let i=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(i&&!i.isText){let s=t.state.tr;return e<0?s.delete(n.pos-i.nodeSize,n.pos):s.delete(n.pos,n.pos+i.nodeSize),t.dispatch(s),!0}return!1}function zc(t,e,n){t.domObserver.stop(),e.contentEditable=n,t.domObserver.start()}function Fm(t){if(!we||t.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:n}=t.domSelectionRange();if(e&&e.nodeType==1&&n==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let r=e.firstChild;zc(t,r,"true"),setTimeout(()=>zc(t,r,"false"),20)}return!1}function Vm(t){let e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}function _m(t,e){let n=e.keyCode,r=Vm(e);if(n==8||De&&n==72&&r=="c")return Bc(t,-1)||xn(t,-1);if(n==46&&!e.shiftKey||De&&n==68&&r=="c")return Bc(t,1)||xn(t,1);if(n==13||n==27)return!0;if(n==37||De&&n==66&&r=="c"){let o=n==37?Pc(t,t.state.selection.from)=="ltr"?-1:1:-1;return Ic(t,o,r)||xn(t,o)}else if(n==39||De&&n==70&&r=="c"){let o=n==39?Pc(t,t.state.selection.from)=="ltr"?1:-1:1;return Ic(t,o,r)||xn(t,o)}else{if(n==38||De&&n==80&&r=="c")return Lc(t,-1,r)||xn(t,-1);if(n==40||De&&n==78&&r=="c")return Fm(t)||Lc(t,1,r)||xn(t,1);if(r==(De?"m":"c")&&(n==66||n==73||n==89||n==90))return!0}return!1}function Is(t,e){t.someProp("transformCopied",h=>{e=h(e,t)});let n=[],{content:r,openStart:o,openEnd:i}=e;for(;o>1&&i>1&&r.childCount==1&&r.firstChild.childCount==1;){o--,i--;let h=r.firstChild;n.push(h.type.name,h.attrs!=h.type.defaultAttrs?h.attrs:null),r=h.content}let s=t.someProp("clipboardSerializer")||ct.fromSchema(t.state.schema),l=bd(),a=l.createElement("div");a.appendChild(s.serializeFragment(r,{document:l}));let c=a.firstChild,d,u=0;for(;c&&c.nodeType==1&&(d=yd[c.nodeName.toLowerCase()]);){for(let h=d.length-1;h>=0;h--){let p=l.createElement(d[h]);for(;a.firstChild;)p.appendChild(a.firstChild);a.appendChild(p),u++}c=a.firstChild}c&&c.nodeType==1&&c.setAttribute("data-pm-slice",`${o} ${i}${u?` -${u}`:""} ${JSON.stringify(n)}`);let f=t.someProp("clipboardTextSerializer",h=>h(e,t))||e.content.textBetween(0,e.content.size,` `);return{dom:a,text:f,slice:e}}function hd(t,e,n,r,o){let i=o.parent.type.spec.code,s,l;if(!n&&!e)return null;let a=!!e&&(r||i||!n);if(a){if(t.someProp("transformPastedText",f=>{e=f(e,i||r,t)}),i)return l=new E(v.from(t.state.schema.text(e.replace(/\r\n?/g,` `))),0,0),t.someProp("transformPasted",f=>{l=f(l,t,!0)}),l;let u=t.someProp("clipboardTextParser",f=>f(e,o,r,t));if(u)l=u;else{let f=o.marks(),{schema:h}=t.state,p=ct.fromSchema(h);s=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(m=>{let g=s.appendChild(document.createElement("p"));m&&g.appendChild(p.serializeNode(h.text(m,f)))})}}else t.someProp("transformPastedHTML",u=>{n=u(n,t)}),s=Km(n),rr&&qm(s);let c=s&&s.querySelector("[data-pm-slice]"),d=c&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(c.getAttribute("data-pm-slice")||"");if(d&&d[3])for(let u=+d[3];u>0;u--){let f=s.firstChild;for(;f&&f.nodeType!=1;)f=f.nextSibling;if(!f)break;s=f}if(l||(l=(t.someProp("clipboardParser")||t.someProp("domParser")||Xe.fromSchema(t.state.schema)).parseSlice(s,{preserveWhitespace:!!(a||d),context:o,ruleFromNode(f){return f.nodeName=="BR"&&!f.nextSibling&&f.parentNode&&!Wm.test(f.parentNode.nodeName)?{ignore:!0}:null}})),d)l=Jm(Hc(l,+d[1],+d[2]),d[4]);else if(l=E.maxOpen(jm(l.content,o),!0),l.openStart||l.openEnd){let u=0,f=0;for(let h=l.content.firstChild;u{l=u(l,t,a)}),l}var Wm=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function jm(t,e){if(t.childCount<2)return t;for(let n=e.depth;n>=0;n--){let o=e.node(n).contentMatchAt(e.index(n)),i,s=[];if(t.forEach(l=>{if(!s)return;let a=o.findWrapping(l.type),c;if(!a)return s=null;if(c=s.length&&i.length&&md(a,i,l,s[s.length-1],0))s[s.length-1]=c;else{s.length&&(s[s.length-1]=gd(s[s.length-1],i.length));let d=pd(l,a);s.push(d),o=o.matchType(d.type),i=a}}),s)return v.from(s)}return t}function pd(t,e,n=0){for(let r=e.length-1;r>=n;r--)t=e[r].create(null,v.from(t));return t}function md(t,e,n,r,o){if(o1&&(i=0),o=n&&(l=e<0?s.contentMatchAt(0).fillBefore(l,i<=o).append(l):l.append(s.contentMatchAt(s.childCount).fillBefore(v.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(l))}function Hc(t,e,n){return en})),cs.createHTML(t)):t}function Km(t){let e=/^(\s*]*>)*/.exec(t);e&&(t=t.slice(e[0].length));let n=bd().createElement("div"),r=/<([a-z][^>\s]+)/i.exec(t),o;if((o=r&&yd[r[1].toLowerCase()])&&(t=o.map(i=>"<"+i+">").join("")+t+o.map(i=>"").reverse().join("")),n.innerHTML=Um(t),o)for(let i=0;i=0;l-=2){let a=n.nodes[r[l]];if(!a||a.hasRequiredAttrs())break;o=v.from(a.create(r[l+1],o)),i++,s++}return new E(o,i,s)}var Se={},Ce={},Gm={touchstart:!0,touchmove:!0},vs=class{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:"",button:0},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastChromeDelete=0,this.composing=!1,this.compositionNode=null,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}};function Xm(t){for(let e in Se){let n=Se[e];t.dom.addEventListener(e,t.input.eventHandlers[e]=r=>{Qm(t,r)&&!Ps(t,r)&&(t.editable||!(r.type in Ce))&&n(t,r)},Gm[e]?{passive:!0}:void 0)}we&&t.dom.addEventListener("input",()=>null),Ms(t)}function Ot(t,e){t.input.lastSelectionOrigin=e,t.input.lastSelectionTime=Date.now()}function Ym(t){t.domObserver.stop();for(let e in t.input.eventHandlers)t.dom.removeEventListener(e,t.input.eventHandlers[e]);clearTimeout(t.input.composingTimeout),clearTimeout(t.input.lastIOSEnterFallbackTimeout)}function Ms(t){t.someProp("handleDOMEvents",e=>{for(let n in e)t.input.eventHandlers[n]||t.dom.addEventListener(n,t.input.eventHandlers[n]=r=>Ps(t,r))})}function Ps(t,e){return t.someProp("handleDOMEvents",n=>{let r=n[e.type];return r?r(t,e)||e.defaultPrevented:!1})}function Qm(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let n=e.target;n!=t.dom;n=n.parentNode)if(!n||n.nodeType==11||n.pmViewDesc&&n.pmViewDesc.stopEvent(e))return!1;return!0}function Zm(t,e){!Ps(t,e)&&Se[e.type]&&(t.editable||!(e.type in Ce))&&Se[e.type](t,e)}Ce.keydown=(t,e)=>{let n=e;if(t.input.shiftKey=n.keyCode==16||n.shiftKey,!xd(t,n)&&(t.input.lastKeyCode=n.keyCode,t.input.lastKeyCodeTime=Date.now(),!(mt&&de&&n.keyCode==13)))if(n.keyCode!=229&&t.domObserver.forceFlush(),vn&&n.keyCode==13&&!n.ctrlKey&&!n.altKey&&!n.metaKey){let r=Date.now();t.input.lastIOSEnter=r,t.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{t.input.lastIOSEnter==r&&(t.someProp("handleKeyDown",o=>o(t,Ut(13,"Enter"))),t.input.lastIOSEnter=0)},200)}else t.someProp("handleKeyDown",r=>r(t,n))||_m(t,n)?n.preventDefault():Ot(t,"key")};Ce.keyup=(t,e)=>{e.keyCode==16&&(t.input.shiftKey=!1)};Ce.keypress=(t,e)=>{let n=e;if(xd(t,n)||!n.charCode||n.ctrlKey&&!n.altKey||De&&n.metaKey)return;if(t.someProp("handleKeyPress",o=>o(t,n))){n.preventDefault();return}let r=t.state.selection;if(!(r instanceof D)||!r.$from.sameParent(r.$to)){let o=String.fromCharCode(n.charCode),i=()=>t.state.tr.insertText(o).scrollIntoView();!/[\r\n]/.test(o)&&!t.someProp("handleTextInput",s=>s(t,r.$from.pos,r.$to.pos,o,i))&&t.dispatch(i()),n.preventDefault()}};function Zr(t){return{left:t.clientX,top:t.clientY}}function eg(t,e){let n=e.x-t.clientX,r=e.y-t.clientY;return n*n+r*r<100}function Ls(t,e,n,r,o){if(r==-1)return!1;let i=t.state.doc.resolve(r);for(let s=i.depth+1;s>0;s--)if(t.someProp(e,l=>s>i.depth?l(t,n,i.nodeAfter,i.before(s),o,!0):l(t,n,i.node(s),i.before(s),o,!1)))return!0;return!1}function Sn(t,e,n){if(t.focused||t.focus(),t.state.selection.eq(e))return;let r=t.state.tr.setSelection(e);n=="pointer"&&r.setMeta("pointer",!0),t.dispatch(r)}function tg(t,e){if(e==-1)return!1;let n=t.state.doc.resolve(e),r=n.nodeAfter;return r&&r.isAtom&&L.isSelectable(r)?(Sn(t,new L(n),"pointer"),!0):!1}function ng(t,e){if(e==-1)return!1;let n=t.state.selection,r,o;n instanceof L&&(r=n.node);let i=t.state.doc.resolve(e);for(let s=i.depth+1;s>0;s--){let l=s>i.depth?i.nodeAfter:i.node(s);if(L.isSelectable(l)){r&&n.$from.depth>0&&s>=n.$from.depth&&i.before(n.$from.depth+1)==n.$from.pos?o=i.before(n.$from.depth):o=i.before(s);break}}return o!=null?(Sn(t,L.create(t.state.doc,o),"pointer"),!0):!1}function rg(t,e,n,r,o){return Ls(t,"handleClickOn",e,n,r)||t.someProp("handleClick",i=>i(t,e,r))||(o?ng(t,n):tg(t,n))}function og(t,e,n,r){return Ls(t,"handleDoubleClickOn",e,n,r)||t.someProp("handleDoubleClick",o=>o(t,e,r))}function ig(t,e,n,r){return Ls(t,"handleTripleClickOn",e,n,r)||t.someProp("handleTripleClick",o=>o(t,e,r))||sg(t,n,r)}function sg(t,e,n){if(n.button!=0)return!1;let r=t.state.doc;if(e==-1)return r.inlineContent?(Sn(t,D.create(r,0,r.content.size),"pointer"),!0):!1;let o=r.resolve(e);for(let i=o.depth+1;i>0;i--){let s=i>o.depth?o.nodeAfter:o.node(i),l=o.before(i);if(s.inlineContent)Sn(t,D.create(r,l+1,l+1+s.content.size),"pointer");else if(L.isSelectable(s))Sn(t,L.create(r,l),"pointer");else continue;return!0}}function Bs(t){return qr(t)}var wd=De?"metaKey":"ctrlKey";Se.mousedown=(t,e)=>{let n=e;t.input.shiftKey=n.shiftKey;let r=Bs(t),o=Date.now(),i="singleClick";o-t.input.lastClick.time<500&&eg(n,t.input.lastClick)&&!n[wd]&&t.input.lastClick.button==n.button&&(t.input.lastClick.type=="singleClick"?i="doubleClick":t.input.lastClick.type=="doubleClick"&&(i="tripleClick")),t.input.lastClick={time:o,x:n.clientX,y:n.clientY,type:i,button:n.button};let s=t.posAtCoords(Zr(n));s&&(i=="singleClick"?(t.input.mouseDown&&t.input.mouseDown.done(),t.input.mouseDown=new Ts(t,s,n,!!r)):(i=="doubleClick"?og:ig)(t,s.pos,s.inside,n)?n.preventDefault():Ot(t,"pointer"))};var Ts=class{constructor(e,n,r,o){this.view=e,this.pos=n,this.event=r,this.flushed=o,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!r[wd],this.allowDefault=r.shiftKey;let i,s;if(n.inside>-1)i=e.state.doc.nodeAt(n.inside),s=n.inside;else{let d=e.state.doc.resolve(n.pos);i=d.parent,s=d.depth?d.before():0}let l=o?null:r.target,a=l?e.docView.nearestDesc(l,!0):null;this.target=a&&a.nodeDOM.nodeType==1?a.nodeDOM:null;let{selection:c}=e.state;(r.button==0&&i.type.spec.draggable&&i.type.spec.selectable!==!1||c instanceof L&&c.from<=s&&c.to>s)&&(this.mightDrag={node:i,pos:s,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&Pe&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),Ot(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>gt(this.view)),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let n=this.pos;this.view.state.doc!=this.startDoc&&(n=this.view.posAtCoords(Zr(e))),this.updateAllowDefault(e),this.allowDefault||!n?Ot(this.view,"pointer"):rg(this.view,n.pos,n.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||we&&this.mightDrag&&!this.mightDrag.node.isAtom||de&&!this.view.state.selection.visible&&Math.min(Math.abs(n.pos-this.view.state.selection.from),Math.abs(n.pos-this.view.state.selection.to))<=2)?(Sn(this.view,I.near(this.view.state.doc.resolve(n.pos)),"pointer"),e.preventDefault()):Ot(this.view,"pointer")}move(e){this.updateAllowDefault(e),Ot(this.view,"pointer"),e.buttons==0&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}};Se.touchstart=t=>{t.input.lastTouch=Date.now(),Bs(t),Ot(t,"pointer")};Se.touchmove=t=>{t.input.lastTouch=Date.now(),Ot(t,"pointer")};Se.contextmenu=t=>Bs(t);function xd(t,e){return t.composing?!0:we&&Math.abs(e.timeStamp-t.input.compositionEndedAt)<500?(t.input.compositionEndedAt=-2e8,!0):!1}var lg=mt?5e3:-1;Ce.compositionstart=Ce.compositionupdate=t=>{if(!t.composing){t.domObserver.flush();let{state:e}=t,n=e.selection.$to;if(e.selection instanceof D&&(e.storedMarks||!n.textOffset&&n.parentOffset&&n.nodeBefore.marks.some(r=>r.type.spec.inclusive===!1)||de&&Zc&&ag(t)))t.markCursor=t.state.storedMarks||n.marks(),qr(t,!0),t.markCursor=null;else if(qr(t,!e.selection.empty),Pe&&e.selection.empty&&n.parentOffset&&!n.textOffset&&n.nodeBefore.marks.length){let r=t.domSelectionRange();for(let o=r.focusNode,i=r.focusOffset;o&&o.nodeType==1&&i!=0;){let s=i<0?o.lastChild:o.childNodes[i-1];if(!s)break;if(s.nodeType==3){let l=t.domSelection();l&&l.collapse(s,s.nodeValue.length);break}else o=s,i=-1}}t.input.composing=!0}kd(t,lg)};function ag(t){let{focusNode:e,focusOffset:n}=t.domSelectionRange();if(!e||e.nodeType!=1||n>=e.childNodes.length)return!1;let r=e.childNodes[n];return r.nodeType==1&&r.contentEditable=="false"}Ce.compositionend=(t,e)=>{t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=e.timeStamp,t.input.compositionPendingChanges=t.domObserver.pendingRecords().length?t.input.compositionID:0,t.input.compositionNode=null,t.input.compositionPendingChanges&&Promise.resolve().then(()=>t.domObserver.flush()),t.input.compositionID++,kd(t,20))};function kd(t,e){clearTimeout(t.input.composingTimeout),e>-1&&(t.input.composingTimeout=setTimeout(()=>qr(t),e))}function Sd(t){for(t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=dg());t.input.compositionNodes.length>0;)t.input.compositionNodes.pop().markParentsDirty()}function cg(t){let e=t.domSelectionRange();if(!e.focusNode)return null;let n=sm(e.focusNode,e.focusOffset),r=lm(e.focusNode,e.focusOffset);if(n&&r&&n!=r){let o=r.pmViewDesc,i=t.domObserver.lastChangedTextNode;if(n==i||r==i)return i;if(!o||!o.isText(r.nodeValue))return r;if(t.input.compositionNode==r){let s=n.pmViewDesc;if(!(!s||!s.isText(n.nodeValue)))return r}}return n||r}function dg(){let t=document.createEvent("Event");return t.initEvent("event",!0,!0),t.timeStamp}function qr(t,e=!1){if(!(mt&&t.domObserver.flushingSoon>=0)){if(t.domObserver.forceFlush(),Sd(t),e||t.docView&&t.docView.dirty){let n=Rs(t),r=t.state.selection;return n&&!n.eq(r)?t.dispatch(t.state.tr.setSelection(n)):(t.markCursor||e)&&!r.$from.node(r.$from.sharedDepth(r.to)).inlineContent?t.dispatch(t.state.tr.deleteSelection()):t.updateState(t.state),!0}return!1}}function ug(t,e){if(!t.dom.parentNode)return;let n=t.dom.parentNode.appendChild(document.createElement("div"));n.appendChild(e),n.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),o=document.createRange();o.selectNodeContents(e),t.dom.blur(),r.removeAllRanges(),r.addRange(o),setTimeout(()=>{n.parentNode&&n.parentNode.removeChild(n),t.focus()},50)}var Qn=ve&&Rt<15||vn&&um<604;Se.copy=Ce.cut=(t,e)=>{let n=e,r=t.state.selection,o=n.type=="cut";if(r.empty)return;let i=Qn?null:n.clipboardData,s=r.content(),{dom:l,text:a}=Is(t,s);i?(n.preventDefault(),i.clearData(),i.setData("text/html",l.innerHTML),i.setData("text/plain",a)):ug(t,l),o&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function fg(t){return t.openStart==0&&t.openEnd==0&&t.content.childCount==1?t.content.firstChild:null}function hg(t,e){if(!t.dom.parentNode)return;let n=t.input.shiftKey||t.state.selection.$from.parent.type.spec.code,r=t.dom.parentNode.appendChild(document.createElement(n?"textarea":"div"));n||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let o=t.input.shiftKey&&t.input.lastKeyCode!=45;setTimeout(()=>{t.focus(),r.parentNode&&r.parentNode.removeChild(r),n?Zn(t,r.value,null,o,e):Zn(t,r.textContent,r.innerHTML,o,e)},50)}function Zn(t,e,n,r,o){let i=hd(t,e,n,r,t.state.selection.$from);if(t.someProp("handlePaste",a=>a(t,o,i||E.empty)))return!0;if(!i)return!1;let s=fg(i),l=s?t.state.tr.replaceSelectionWith(s,r):t.state.tr.replaceSelection(i);return t.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function Cd(t){let e=t.getData("text/plain")||t.getData("Text");if(e)return e;let n=t.getData("text/uri-list");return n?n.replace(/\r?\n/g," "):""}Ce.paste=(t,e)=>{let n=e;if(t.composing&&!mt)return;let r=Qn?null:n.clipboardData,o=t.input.shiftKey&&t.input.lastKeyCode!=45;r&&Zn(t,Cd(r),r.getData("text/html"),o,n)?n.preventDefault():hg(t,n)};var Jr=class{constructor(e,n,r){this.slice=e,this.move=n,this.node=r}},pg=De?"altKey":"ctrlKey";function vd(t,e){let n=t.someProp("dragCopies",r=>!r(e));return n??!e[pg]}Se.dragstart=(t,e)=>{let n=e,r=t.input.mouseDown;if(r&&r.done(),!n.dataTransfer)return;let o=t.state.selection,i=o.empty?null:t.posAtCoords(Zr(n)),s;if(!(i&&i.pos>=o.from&&i.pos<=(o instanceof L?o.to-1:o.to))){if(r&&r.mightDrag)s=L.create(t.state.doc,r.mightDrag.pos);else if(n.target&&n.target.nodeType==1){let u=t.docView.nearestDesc(n.target,!0);u&&u.node.type.spec.draggable&&u!=t.docView&&(s=L.create(t.state.doc,u.posBefore))}}let l=(s||t.state.selection).content(),{dom:a,text:c,slice:d}=Is(t,l);(!n.dataTransfer.files.length||!de||Qc>120)&&n.dataTransfer.clearData(),n.dataTransfer.setData(Qn?"Text":"text/html",a.innerHTML),n.dataTransfer.effectAllowed="copyMove",Qn||n.dataTransfer.setData("text/plain",c),t.dragging=new Jr(d,vd(t,n),s)};Se.dragend=t=>{let e=t.dragging;window.setTimeout(()=>{t.dragging==e&&(t.dragging=null)},50)};Ce.dragover=Ce.dragenter=(t,e)=>e.preventDefault();Ce.drop=(t,e)=>{try{mg(t,e,t.dragging)}finally{t.dragging=null}};function mg(t,e,n){if(!e.dataTransfer)return;let r=t.posAtCoords(Zr(e));if(!r)return;let o=t.state.doc.resolve(r.pos),i=n&&n.slice;i?t.someProp("transformPasted",h=>{i=h(i,t,!1)}):i=hd(t,Cd(e.dataTransfer),Qn?null:e.dataTransfer.getData("text/html"),!1,o);let s=!!(n&&vd(t,e));if(t.someProp("handleDrop",h=>h(t,e,i||E.empty,s))){e.preventDefault();return}if(!i)return;e.preventDefault();let l=i?zr(t.state.doc,o.pos,i):o.pos;l==null&&(l=o.pos);let a=t.state.tr;if(s){let{node:h}=n;h?h.replace(a):a.deleteSelection()}let c=a.mapping.map(l),d=i.openStart==0&&i.openEnd==0&&i.content.childCount==1,u=a.doc;if(d?a.replaceRangeWith(c,c,i.content.firstChild):a.replaceRange(c,c,i),a.doc.eq(u))return;let f=a.doc.resolve(c);if(d&&L.isSelectable(i.content.firstChild)&&f.nodeAfter&&f.nodeAfter.sameMarkup(i.content.firstChild))a.setSelection(new L(f));else{let h=a.mapping.map(l);a.mapping.maps[a.mapping.maps.length-1].forEach((p,m,g,y)=>h=y),a.setSelection(Ds(t,f,a.doc.resolve(h)))}t.focus(),t.dispatch(a.setMeta("uiEvent","drop"))}Se.focus=t=>{t.input.lastFocus=Date.now(),t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout(()=>{t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.domSelectionRange())&>(t)},20))};Se.blur=(t,e)=>{let n=e;t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),n.relatedTarget&&t.dom.contains(n.relatedTarget)&&t.domObserver.currentSelection.clear(),t.focused=!1)};Se.beforeinput=(t,e)=>{if(de&&mt&&e.inputType=="deleteContentBackward"){t.domObserver.flushSoon();let{domChangeCount:r}=t.input;setTimeout(()=>{if(t.input.domChangeCount!=r||(t.dom.blur(),t.focus(),t.someProp("handleKeyDown",i=>i(t,Ut(8,"Backspace")))))return;let{$cursor:o}=t.state.selection;o&&o.pos>0&&t.dispatch(t.state.tr.delete(o.pos-1,o.pos).scrollIntoView())},50)}};for(let t in Ce)Se[t]=Ce[t];function er(t,e){if(t==e)return!0;for(let n in t)if(t[n]!==e[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}var Gr=class t{constructor(e,n){this.toDOM=e,this.spec=n||Gt,this.side=this.spec.side||0}map(e,n,r,o){let{pos:i,deleted:s}=e.mapResult(n.from+o,this.side<0?-1:1);return s?null:new te(i-r,i-r,this)}valid(){return!0}eq(e){return this==e||e instanceof t&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&er(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}},Jt=class t{constructor(e,n){this.attrs=e,this.spec=n||Gt}map(e,n,r,o){let i=e.map(n.from+o,this.spec.inclusiveStart?-1:1)-r,s=e.map(n.to+o,this.spec.inclusiveEnd?1:-1)-r;return i>=s?null:new te(i,s,this)}valid(e,n){return n.from=e&&(!i||i(l.spec))&&r.push(l.copy(l.from+o,l.to+o))}for(let s=0;se){let l=this.children[s]+1;this.children[s+2].findInner(e-l,n-l,r,o+l,i)}}map(e,n,r){return this==be||e.maps.length==0?this:this.mapInner(e,n,0,0,r||Gt)}mapInner(e,n,r,o,i){let s;for(let l=0;l{let c=a+r,d;if(d=Td(n,l,c)){for(o||(o=this.children.slice());il&&u.to=e){this.children[l]==e&&(r=this.children[l+2]);break}let i=e+1,s=i+n.content.size;for(let l=0;li&&a.type instanceof Jt){let c=Math.max(i,a.from)-i,d=Math.min(s,a.to)-i;co.map(e,n,Gt));return t.from(r)}forChild(e,n){if(n.isLeaf)return Y.empty;let r=[];for(let o=0;on instanceof Y)?e:e.reduce((n,r)=>n.concat(r instanceof Y?r:r.members),[]))}}forEachSet(e){for(let n=0;n{let g=m-p-(h-f);for(let y=0;yw+d-u)continue;let b=l[y]+d-u;h>=b?l[y+1]=f<=b?-2:-1:f>=d&&g&&(l[y]+=g,l[y+1]+=g)}u+=g}),d=n.maps[c].map(d,-1)}let a=!1;for(let c=0;c=r.content.size){a=!0;continue}let f=n.map(t[c+1]+i,-1),h=f-o,{index:p,offset:m}=r.content.findIndex(u),g=r.maybeChild(p);if(g&&m==u&&m+g.nodeSize==h){let y=l[c+2].mapInner(n,g,d+1,t[c]+i+1,s);y!=be?(l[c]=u,l[c+1]=h,l[c+2]=y):(l[c+1]=-2,a=!0)}else a=!0}if(a){let c=yg(l,t,e,n,o,i,s),d=Yr(c,r,0,s);e=d.local;for(let u=0;un&&s.to{let c=Td(t,l,a+n);if(c){i=!0;let d=Yr(c,l,n+a+1,r);d!=be&&o.push(a,a+l.nodeSize,d)}});let s=Md(i?Ad(t):t,-n).sort(Xt);for(let l=0;l0;)e++;t.splice(e,0,n)}function ds(t){let e=[];return t.someProp("decorations",n=>{let r=n(t.state);r&&r!=be&&e.push(r)}),t.cursorWrapper&&e.push(Y.create(t.state.doc,[t.cursorWrapper.deco])),Xr.from(e)}var bg={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},wg=ve&&Rt<=11,Es=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}},Ns=class{constructor(e,n){this.view=e,this.handleDOMChange=n,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new Es,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver(r=>{for(let o=0;oo.type=="childList"&&o.removedNodes.length||o.type=="characterData"&&o.oldValue.length>o.target.nodeValue.length)?this.flushSoon():this.flush()}),wg&&(this.onCharData=r=>{this.queue.push({target:r.target,type:"characterData",oldValue:r.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,bg)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let n=0;nthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(Dc(this.view)){if(this.suppressingSelectionUpdates)return gt(this.view);if(ve&&Rt<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&Yt(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let n=new Set,r;for(let i=e.focusNode;i;i=Cn(i))n.add(i);for(let i=e.anchorNode;i;i=Cn(i))if(n.has(i)){r=i;break}let o=r&&this.view.docView.nearestDesc(r);if(o&&o.ignoreMutation({type:"selection",target:r.nodeType==3?r.parentNode:r}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let n=this.pendingRecords();n.length&&(this.queue=[]);let r=e.domSelectionRange(),o=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(r)&&Dc(e)&&!this.ignoreSelectionChange(r),i=-1,s=-1,l=!1,a=[];if(e.editable)for(let d=0;du.nodeName=="BR");if(d.length==2){let[u,f]=d;u.parentNode&&u.parentNode.parentNode==f.parentNode?f.remove():u.remove()}else{let{focusNode:u}=this.currentSelection;for(let f of d){let h=f.parentNode;h&&h.nodeName=="LI"&&(!u||Sg(e,u)!=h)&&f.remove()}}}else if((de||we)&&a.some(d=>d.nodeName=="BR")&&(e.input.lastKeyCode==8||e.input.lastKeyCode==46)){for(let d of a)if(d.nodeName=="BR"&&d.parentNode){let u=d.nextSibling;u&&u.nodeType==1&&u.contentEditable=="false"&&d.parentNode.removeChild(d)}}let c=null;i<0&&o&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||o)&&(i>-1&&(e.docView.markDirty(i,s),xg(e)),this.handleDOMChange(i,s,l,a),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(r)||gt(e),this.currentSelection.set(r))}registerMutation(e,n){if(n.indexOf(e.target)>-1)return null;let r=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(r==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!r||r.ignoreMutation(e))return null;if(e.type=="childList"){for(let d=0;do;g--){let y=r.childNodes[g-1],w=y.pmViewDesc;if(y.nodeName=="BR"&&!w){i=g;break}if(!w||w.size)break}let u=t.state.doc,f=t.someProp("domParser")||Xe.fromSchema(t.state.schema),h=u.resolve(s),p=null,m=f.parse(r,{topNode:h.parent,topMatch:h.parent.contentMatchAt(h.index()),topOpen:!0,from:o,to:i,preserveWhitespace:h.parent.type.whitespace=="pre"?"full":!0,findPositions:c,ruleFromNode:vg,context:h});if(c&&c[0].pos!=null){let g=c[0].pos,y=c[1]&&c[1].pos;y==null&&(y=g),p={anchor:g+s,head:y+s}}return{doc:m,sel:p,from:s,to:l}}function vg(t){let e=t.pmViewDesc;if(e)return e.parseRule();if(t.nodeName=="BR"&&t.parentNode){if(we&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){let n=document.createElement("div");return n.appendChild(document.createElement("li")),{skip:n}}else if(t.parentNode.lastChild==t||we&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if(t.nodeName=="IMG"&&t.getAttribute("mark-placeholder"))return{ignore:!0};return null}var Mg=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function Tg(t,e,n,r,o){let i=t.input.compositionPendingChanges||(t.composing?t.input.compositionID:0);if(t.input.compositionPendingChanges=0,e<0){let k=t.input.lastSelectionTime>Date.now()-50?t.input.lastSelectionOrigin:null,O=Rs(t,k);if(O&&!t.state.selection.eq(O)){if(de&&mt&&t.input.lastKeyCode===13&&Date.now()-100A(t,Ut(13,"Enter"))))return;let T=t.state.tr.setSelection(O);k=="pointer"?T.setMeta("pointer",!0):k=="key"&&T.scrollIntoView(),i&&T.setMeta("composition",i),t.dispatch(T)}return}let s=t.state.doc.resolve(e),l=s.sharedDepth(n);e=s.before(l+1),n=t.state.doc.resolve(n).after(l+1);let a=t.state.selection,c=Cg(t,e,n),d=t.state.doc,u=d.slice(c.from,c.to),f,h;t.input.lastKeyCode===8&&Date.now()-100Date.now()-225||mt)&&o.some(k=>k.nodeType==1&&!Mg.test(k.nodeName))&&(!p||p.endA>=p.endB)&&t.someProp("handleKeyDown",k=>k(t,Ut(13,"Enter")))){t.input.lastIOSEnter=0;return}if(!p)if(r&&a instanceof D&&!a.empty&&a.$head.sameParent(a.$anchor)&&!t.composing&&!(c.sel&&c.sel.anchor!=c.sel.head))p={start:a.from,endA:a.to,endB:a.to};else{if(c.sel){let k=jc(t,t.state.doc,c.sel);if(k&&!k.eq(t.state.selection)){let O=t.state.tr.setSelection(k);i&&O.setMeta("composition",i),t.dispatch(O)}}return}t.state.selection.fromt.state.selection.from&&p.start<=t.state.selection.from+2&&t.state.selection.from>=c.from?p.start=t.state.selection.from:p.endA=t.state.selection.to-2&&t.state.selection.to<=c.to&&(p.endB+=t.state.selection.to-p.endA,p.endA=t.state.selection.to)),ve&&Rt<=11&&p.endB==p.start+1&&p.endA==p.start&&p.start>c.from&&c.doc.textBetween(p.start-c.from-1,p.start-c.from+1)==" \xA0"&&(p.start--,p.endA--,p.endB--);let m=c.doc.resolveNoCache(p.start-c.from),g=c.doc.resolveNoCache(p.endB-c.from),y=d.resolve(p.start),w=m.sameParent(g)&&m.parent.inlineContent&&y.end()>=p.endA;if((vn&&t.input.lastIOSEnter>Date.now()-225&&(!w||o.some(k=>k.nodeName=="DIV"||k.nodeName=="P"))||!w&&m.posk(t,Ut(13,"Enter")))){t.input.lastIOSEnter=0;return}if(t.state.selection.anchor>p.start&&Eg(d,p.start,p.endA,m,g)&&t.someProp("handleKeyDown",k=>k(t,Ut(8,"Backspace")))){mt&&de&&t.domObserver.suppressSelectionUpdates();return}de&&p.endB==p.start&&(t.input.lastChromeDelete=Date.now()),mt&&!w&&m.start()!=g.start()&&g.parentOffset==0&&m.depth==g.depth&&c.sel&&c.sel.anchor==c.sel.head&&c.sel.head==p.endA&&(p.endB-=2,g=c.doc.resolveNoCache(p.endB-c.from),setTimeout(()=>{t.someProp("handleKeyDown",function(k){return k(t,Ut(13,"Enter"))})},20));let b=p.start,C=p.endA,x=k=>{let O=k||t.state.tr.replace(b,C,c.doc.slice(p.start-c.from,p.endB-c.from));if(c.sel){let T=jc(t,O.doc,c.sel);T&&!(de&&t.composing&&T.empty&&(p.start!=p.endB||t.input.lastChromeDeletegt(t),20));let k=x(t.state.tr.delete(b,C)),O=d.resolve(p.start).marksAcross(d.resolve(p.endA));O&&k.ensureMarks(O),t.dispatch(k)}else if(p.endA==p.endB&&(S=Ag(m.parent.content.cut(m.parentOffset,g.parentOffset),y.parent.content.cut(y.parentOffset,p.endA-y.start())))){let k=x(t.state.tr);S.type=="add"?k.addMark(b,C,S.mark):k.removeMark(b,C,S.mark),t.dispatch(k)}else if(m.parent.child(m.index()).isText&&m.index()==g.index()-(g.textOffset?0:1)){let k=m.parent.textBetween(m.parentOffset,g.parentOffset),O=()=>x(t.state.tr.insertText(k,b,C));t.someProp("handleTextInput",T=>T(t,b,C,k,O))||t.dispatch(O())}else t.dispatch(x());else t.dispatch(x())}function jc(t,e,n){return Math.max(n.anchor,n.head)>e.content.size?null:Ds(t,e.resolve(n.anchor),e.resolve(n.head))}function Ag(t,e){let n=t.firstChild.marks,r=e.firstChild.marks,o=n,i=r,s,l,a;for(let d=0;dd.mark(l.addToSet(d.marks));else if(o.length==0&&i.length==1)l=i[0],s="remove",a=d=>d.mark(l.removeFromSet(d.marks));else return null;let c=[];for(let d=0;dn||us(s,!0,!1)0&&(e||t.indexAfter(r)==t.node(r).childCount);)r--,o++,e=!1;if(n){let i=t.node(r).maybeChild(t.indexAfter(r));for(;i&&!i.isLeaf;)i=i.firstChild,o++}return o}function Ng(t,e,n,r,o){let i=t.findDiffStart(e,n);if(i==null)return null;let{a:s,b:l}=t.findDiffEnd(e,n+t.size,n+e.size);if(o=="end"){let a=Math.max(0,i-Math.min(s,l));r-=s+a-i}if(s=s?i-r:0;i-=a,i&&i=l?i-r:0;i-=a,i&&i=56320&&e<=57343&&n>=55296&&n<=56319}var tr=class{constructor(e,n){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new vs,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=n,this.state=n.state,this.directPlugins=n.plugins||[],this.directPlugins.forEach(Xc),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=Jc(this),qc(this),this.nodeViews=Gc(this),this.docView=Tc(this.state.doc,Kc(this),ds(this),this.dom,this),this.domObserver=new Ns(this,(r,o,i,s)=>Tg(this,r,o,i,s)),this.domObserver.start(),Xm(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let n in e)this._props[n]=e[n];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&Ms(this);let n=this._props;this._props=e,e.plugins&&(e.plugins.forEach(Xc),this.directPlugins=e.plugins),this.updateStateInner(e.state,n)}setProps(e){let n={};for(let r in this._props)n[r]=this._props[r];n.state=this.state;for(let r in e)n[r]=e[r];this.update(n)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,n){var r;let o=this.state,i=!1,s=!1;e.storedMarks&&this.composing&&(Sd(this),s=!0),this.state=e;let l=o.plugins!=e.plugins||this._props.plugins!=n.plugins;if(l||this._props.plugins!=n.plugins||this._props.nodeViews!=n.nodeViews){let h=Gc(this);Rg(h,this.nodeViews)&&(this.nodeViews=h,i=!0)}(l||n.handleDOMEvents!=this._props.handleDOMEvents)&&Ms(this),this.editable=Jc(this),qc(this);let a=ds(this),c=Kc(this),d=o.plugins!=e.plugins&&!o.doc.eq(e.doc)?"reset":e.scrollToSelection>o.scrollToSelection?"to selection":"preserve",u=i||!this.docView.matchesNode(e.doc,c,a);(u||!e.selection.eq(o.selection))&&(s=!0);let f=d=="preserve"&&s&&this.dom.style.overflowAnchor==null&&pm(this);if(s){this.domObserver.stop();let h=u&&(ve||de)&&!this.composing&&!o.selection.empty&&!e.selection.empty&&Og(o.selection,e.selection);if(u){let p=de?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=cg(this)),(i||!this.docView.update(e.doc,c,a,this))&&(this.docView.updateOuterDeco(c),this.docView.destroy(),this.docView=Tc(e.doc,c,a,this.dom,this)),p&&!this.trackWrites&&(h=!0)}h||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&Lm(this))?gt(this,h):(dd(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(o),!((r=this.dragging)===null||r===void 0)&&r.node&&!o.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,o),d=="reset"?this.dom.scrollTop=0:d=="to selection"?this.scrollToSelection():f&&mm(f)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!(!e||!this.dom.contains(e.nodeType==1?e:e.parentNode))){if(!this.someProp("handleScrollToSelection",n=>n(this)))if(this.state.selection instanceof L){let n=this.docView.domAfterPos(this.state.selection.from);n.nodeType==1&&xc(this,n.getBoundingClientRect(),e)}else xc(this,this.coordsAtPos(this.state.selection.head,1),e)}}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let n=0;n0&&this.state.doc.nodeAt(i))==r.node&&(o=i)}this.dragging=new Jr(e.slice,e.move,o<0?void 0:L.create(this.state.doc,o))}someProp(e,n){let r=this._props&&this._props[e],o;if(r!=null&&(o=n?n(r):r))return o;for(let s=0;sn.ownerDocument.getSelection()),this._root=n}return e||document}updateRoot(){this._root=null}posAtCoords(e){return km(this,e)}coordsAtPos(e,n=1){return od(this,e,n)}domAtPos(e,n=0){return this.docView.domFromPos(e,n)}nodeDOM(e){let n=this.docView.descAt(e);return n?n.nodeDOM:null}posAtDOM(e,n,r=-1){let o=this.docView.posFromDOM(e,n,r);if(o==null)throw new RangeError("DOM position not inside the editor");return o}endOfTextblock(e,n){return Tm(this,n||this.state,e)}pasteHTML(e,n){return Zn(this,"",e,!1,n||new ClipboardEvent("paste"))}pasteText(e,n){return Zn(this,e,null,!0,n||new ClipboardEvent("paste"))}serializeForClipboard(e){return Is(this,e)}destroy(){this.docView&&(Ym(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],ds(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,om())}get isDestroyed(){return this.docView==null}dispatchEvent(e){return Zm(this,e)}domSelectionRange(){let e=this.domSelection();return e?we&&this.root.nodeType===11&&cm(this.dom.ownerDocument)==this.dom&&kg(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}};tr.prototype.dispatch=function(t){let e=this._props.dispatchTransaction;e?e.call(this,t):this.updateState(this.state.apply(t))};function Kc(t){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(t.editable),t.someProp("attributes",n=>{if(typeof n=="function"&&(n=n(t.state)),n)for(let r in n)r=="class"?e.class+=" "+n[r]:r=="style"?e.style=(e.style?e.style+";":"")+n[r]:!e[r]&&r!="contenteditable"&&r!="nodeName"&&(e[r]=String(n[r]))}),e.translate||(e.translate="no"),[te.node(0,t.state.doc.content.size,e)]}function qc(t){if(t.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),t.cursorWrapper={dom:e,deco:te.widget(t.state.selection.from,e,{raw:!0,marks:t.markCursor})}}else t.cursorWrapper=null}function Jc(t){return!t.someProp("editable",e=>e(t.state)===!1)}function Og(t,e){let n=Math.min(t.$anchor.sharedDepth(t.head),e.$anchor.sharedDepth(e.head));return t.$anchor.start(n)!=e.$anchor.start(n)}function Gc(t){let e=Object.create(null);function n(r){for(let o in r)Object.prototype.hasOwnProperty.call(e,o)||(e[o]=r[o])}return t.someProp("nodeViews",n),t.someProp("markViews",n),e}function Rg(t,e){let n=0,r=0;for(let o in t){if(t[o]!=e[o])return!0;n++}for(let o in e)r++;return n!=r}function Xc(t){if(t.spec.state||t.spec.filterTransaction||t.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var yt={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},to={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Dg=typeof navigator<"u"&&/Mac/.test(navigator.platform),Ig=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(le=0;le<10;le++)yt[48+le]=yt[96+le]=String(le);var le;for(le=1;le<=24;le++)yt[le+111]="F"+le;var le;for(le=65;le<=90;le++)yt[le]=String.fromCharCode(le+32),to[le]=String.fromCharCode(le);var le;for(eo in yt)to.hasOwnProperty(eo)||(to[eo]=yt[eo]);var eo;function Ed(t){var e=Dg&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||Ig&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",n=!e&&t.key||(t.shiftKey?to:yt)[t.keyCode]||t.key||"Unidentified";return n=="Esc"&&(n="Escape"),n=="Del"&&(n="Delete"),n=="Left"&&(n="ArrowLeft"),n=="Up"&&(n="ArrowUp"),n=="Right"&&(n="ArrowRight"),n=="Down"&&(n="ArrowDown"),n}var Pg=typeof navigator<"u"&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),Lg=typeof navigator<"u"&&/Win/.test(navigator.platform);function Bg(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n=="Space"&&(n=" ");let r,o,i,s;for(let l=0;l{for(var n in e)Hg(t,n,{get:e[n],enumerable:!0})};function co(t){let{state:e,transaction:n}=t,{selection:r}=n,{doc:o}=n,{storedMarks:i}=n;return{...e,apply:e.apply.bind(e),applyTransaction:e.applyTransaction.bind(e),plugins:e.plugins,schema:e.schema,reconfigure:e.reconfigure.bind(e),toJSON:e.toJSON.bind(e),get storedMarks(){return i},get selection(){return r},get doc(){return o},get tr(){return r=n.selection,o=n.doc,i=n.storedMarks,n}}}var uo=class{constructor(t){this.editor=t.editor,this.rawCommands=this.editor.extensionManager.commands,this.customState=t.state}get hasCustomState(){return!!this.customState}get state(){return this.customState||this.editor.state}get commands(){let{rawCommands:t,editor:e,state:n}=this,{view:r}=e,{tr:o}=n,i=this.buildProps(o);return Object.fromEntries(Object.entries(t).map(([s,l])=>[s,(...c)=>{let d=l(...c)(i);return!o.getMeta("preventDispatch")&&!this.hasCustomState&&r.dispatch(o),d}]))}get chain(){return()=>this.createChain()}get can(){return()=>this.createCan()}createChain(t,e=!0){let{rawCommands:n,editor:r,state:o}=this,{view:i}=r,s=[],l=!!t,a=t||o.tr,c=()=>(!l&&e&&!a.getMeta("preventDispatch")&&!this.hasCustomState&&i.dispatch(a),s.every(u=>u===!0)),d={...Object.fromEntries(Object.entries(n).map(([u,f])=>[u,(...p)=>{let m=this.buildProps(a,e),g=f(...p)(m);return s.push(g),d}])),run:c};return d}createCan(t){let{rawCommands:e,state:n}=this,r=!1,o=t||n.tr,i=this.buildProps(o,r);return{...Object.fromEntries(Object.entries(e).map(([l,a])=>[l,(...c)=>a(...c)({...i,dispatch:void 0})])),chain:()=>this.createChain(o,r)}}buildProps(t,e=!0){let{rawCommands:n,editor:r,state:o}=this,{view:i}=r,s={tr:t,editor:r,view:i,state:co({state:o,transaction:t}),dispatch:e?()=>{}:void 0,chain:()=>this.createChain(t,e),can:()=>this.createCan(t),get commands(){return Object.fromEntries(Object.entries(n).map(([l,a])=>[l,(...c)=>a(...c)(s)]))}};return s}},Hd={};js(Hd,{blur:()=>$g,clearContent:()=>Fg,clearNodes:()=>Vg,command:()=>_g,createParagraphNear:()=>Wg,cut:()=>jg,deleteCurrentNode:()=>Ug,deleteNode:()=>Kg,deleteRange:()=>qg,deleteSelection:()=>Jg,enter:()=>Gg,exitCode:()=>Xg,extendMarkRange:()=>Yg,first:()=>Qg,focus:()=>ey,forEach:()=>ty,insertContent:()=>ny,insertContentAt:()=>iy,joinBackward:()=>ay,joinDown:()=>ly,joinForward:()=>cy,joinItemBackward:()=>dy,joinItemForward:()=>uy,joinTextblockBackward:()=>fy,joinTextblockForward:()=>hy,joinUp:()=>sy,keyboardShortcut:()=>my,lift:()=>gy,liftEmptyBlock:()=>yy,liftListItem:()=>by,newlineInCode:()=>wy,resetAttributes:()=>xy,scrollIntoView:()=>ky,selectAll:()=>Sy,selectNodeBackward:()=>Cy,selectNodeForward:()=>vy,selectParentNode:()=>My,selectTextblockEnd:()=>Ty,selectTextblockStart:()=>Ay,setContent:()=>Ey,setMark:()=>Vy,setMeta:()=>_y,setNode:()=>Wy,setNodeSelection:()=>jy,setTextDirection:()=>Uy,setTextSelection:()=>Ky,sinkListItem:()=>qy,splitBlock:()=>Jy,splitListItem:()=>Gy,toggleList:()=>Xy,toggleMark:()=>Yy,toggleNode:()=>Qy,toggleWrap:()=>Zy,undoInputRule:()=>eb,unsetAllMarks:()=>tb,unsetMark:()=>nb,unsetTextDirection:()=>rb,updateAttributes:()=>ob,wrapIn:()=>ib,wrapInList:()=>sb});var $g=()=>({editor:t,view:e})=>(requestAnimationFrame(()=>{var n;t.isDestroyed||(e.dom.blur(),(n=window?.getSelection())==null||n.removeAllRanges())}),!0),Fg=(t=!0)=>({commands:e})=>e.setContent("",{emitUpdate:t}),Vg=()=>({state:t,tr:e,dispatch:n})=>{let{selection:r}=e,{ranges:o}=r;return n&&o.forEach(({$from:i,$to:s})=>{t.doc.nodesBetween(i.pos,s.pos,(l,a)=>{if(l.type.isText)return;let{doc:c,mapping:d}=e,u=c.resolve(d.map(a)),f=c.resolve(d.map(a+l.nodeSize)),h=u.blockRange(f);if(!h)return;let p=ft(h);if(l.type.isTextblock){let{defaultType:m}=u.parent.contentMatchAt(u.index());e.setNodeMarkup(h.start,m)}(p||p===0)&&e.lift(h,p)})}),!0},_g=t=>e=>t(e),Wg=()=>({state:t,dispatch:e})=>es(t,e),jg=(t,e)=>({editor:n,tr:r})=>{let{state:o}=n,i=o.doc.slice(t.from,t.to);r.deleteRange(t.from,t.to);let s=r.mapping.map(e);return r.insert(s,i.content),r.setSelection(new D(r.doc.resolve(Math.max(s-1,0)))),!0},Ug=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,r=n.$anchor.node();if(r.content.size>0)return!1;let o=t.selection.$anchor;for(let i=o.depth;i>0;i-=1)if(o.node(i).type===r.type){if(e){let l=o.before(i),a=o.after(i);t.delete(l,a).scrollIntoView()}return!0}return!1};function ne(t,e){if(typeof t=="string"){if(!e.nodes[t])throw Error(`There is no node type named '${t}'. Maybe you forgot to add the extension?`);return e.nodes[t]}return t}var Kg=t=>({tr:e,state:n,dispatch:r})=>{let o=ne(t,n.schema),i=e.selection.$anchor;for(let s=i.depth;s>0;s-=1)if(i.node(s).type===o){if(r){let a=i.before(s),c=i.after(s);e.delete(a,c).scrollIntoView()}return!0}return!1},qg=t=>({tr:e,dispatch:n})=>{let{from:r,to:o}=t;return n&&e.delete(r,o),!0},Jg=()=>({state:t,dispatch:e})=>Vr(t,e),Gg=()=>({commands:t})=>t.keyboardShortcut("Enter"),Xg=()=>({state:t,dispatch:e})=>Zi(t,e);function Us(t){return Object.prototype.toString.call(t)==="[object RegExp]"}function lo(t,e,n={strict:!0}){let r=Object.keys(e);return r.length?r.every(o=>n.strict?e[o]===t[o]:Us(e[o])?e[o].test(t[o]):e[o]===t[o]):!0}function $d(t,e,n={}){return t.find(r=>r.type===e&&lo(Object.fromEntries(Object.keys(n).map(o=>[o,r.attrs[o]])),n))}function Od(t,e,n={}){return!!$d(t,e,n)}function Ks(t,e,n){var r;if(!t||!e)return;let o=t.parent.childAfter(t.parentOffset);if((!o.node||!o.node.marks.some(d=>d.type===e))&&(o=t.parent.childBefore(t.parentOffset)),!o.node||!o.node.marks.some(d=>d.type===e)||(n=n||((r=o.node.marks[0])==null?void 0:r.attrs),!$d([...o.node.marks],e,n)))return;let s=o.index,l=t.start()+o.offset,a=s+1,c=l+o.node.nodeSize;for(;s>0&&Od([...t.parent.child(s-1).marks],e,n);)s-=1,l-=t.parent.child(s).nodeSize;for(;a({tr:n,state:r,dispatch:o})=>{let i=wt(t,r.schema),{doc:s,selection:l}=n,{$from:a,from:c,to:d}=l;if(o){let u=Ks(a,i,e);if(u&&u.from<=c&&u.to>=d){let f=D.create(s,u.from,u.to);n.setSelection(f)}}return!0},Qg=t=>e=>{let n=typeof t=="function"?t(e):t;for(let r=0;r({editor:n,view:r,tr:o,dispatch:i})=>{e={scrollIntoView:!0,...e};let s=()=>{(qs()||Zg())&&r.dom.focus(),requestAnimationFrame(()=>{n.isDestroyed||(r.focus(),e?.scrollIntoView&&n.commands.scrollIntoView())})};if(r.hasFocus()&&t===null||t===!1)return!0;if(i&&t===null&&!fo(n.state.selection))return s(),!0;let l=Fd(o.doc,t)||n.state.selection,a=n.state.selection.eq(l);return i&&(a||o.setSelection(l),a&&o.storedMarks&&o.setStoredMarks(o.storedMarks),s()),!0},ty=(t,e)=>n=>t.every((r,o)=>e(r,{...n,index:o})),ny=(t,e)=>({tr:n,commands:r})=>r.insertContentAt({from:n.selection.from,to:n.selection.to},t,e),Vd=t=>{let e=t.childNodes;for(let n=e.length-1;n>=0;n-=1){let r=e[n];r.nodeType===3&&r.nodeValue&&/^(\n\s\s|\n)$/.test(r.nodeValue)?t.removeChild(r):r.nodeType===1&&Vd(r)}return t};function no(t){if(typeof window>"u")throw new Error("[tiptap error]: there is no window object available, so this function cannot be used");let e=`${t}`,n=new window.DOMParser().parseFromString(e,"text/html").body;return Vd(n)}function ir(t,e,n){if(t instanceof ie||t instanceof v)return t;n={slice:!0,parseOptions:{},...n};let r=typeof t=="object"&&t!==null,o=typeof t=="string";if(r)try{if(Array.isArray(t)&&t.length>0)return v.fromArray(t.map(l=>e.nodeFromJSON(l)));let s=e.nodeFromJSON(t);return n.errorOnInvalidContent&&s.check(),s}catch(i){if(n.errorOnInvalidContent)throw new Error("[tiptap error]: Invalid JSON content",{cause:i});return console.warn("[tiptap warn]: Invalid content.","Passed value:",t,"Error:",i),ir("",e,n)}if(o){if(n.errorOnInvalidContent){let s=!1,l="",a=new fn({topNode:e.spec.topNode,marks:e.spec.marks,nodes:e.spec.nodes.append({__tiptap__private__unknown__catch__all__node:{content:"inline*",group:"block",parseDOM:[{tag:"*",getAttrs:c=>(s=!0,l=typeof c=="string"?c:c.outerHTML,null)}]}})});if(n.slice?Xe.fromSchema(a).parseSlice(no(t),n.parseOptions):Xe.fromSchema(a).parse(no(t),n.parseOptions),n.errorOnInvalidContent&&s)throw new Error("[tiptap error]: Invalid HTML content",{cause:new Error(`Invalid element found: ${l}`)})}let i=Xe.fromSchema(e);return n.slice?i.parseSlice(no(t),n.parseOptions).content:i.parse(no(t),n.parseOptions)}return ir("",e,n)}function ry(t,e,n){let r=t.steps.length-1;if(r{s===0&&(s=d)}),t.setSelection(I.near(t.doc.resolve(s),n))}var oy=t=>!("type"in t),iy=(t,e,n)=>({tr:r,dispatch:o,editor:i})=>{var s;if(o){n={parseOptions:i.options.parseOptions,updateSelection:!0,applyInputRules:!1,applyPasteRules:!1,...n};let l,a=g=>{i.emit("contentError",{editor:i,error:g,disableCollaboration:()=>{"collaboration"in i.storage&&typeof i.storage.collaboration=="object"&&i.storage.collaboration&&(i.storage.collaboration.isDisabled=!0)}})},c={preserveWhitespace:"full",...n.parseOptions};if(!n.errorOnInvalidContent&&!i.options.enableContentCheck&&i.options.emitContentError)try{ir(e,i.schema,{parseOptions:c,errorOnInvalidContent:!0})}catch(g){a(g)}try{l=ir(e,i.schema,{parseOptions:c,errorOnInvalidContent:(s=n.errorOnInvalidContent)!=null?s:i.options.enableContentCheck})}catch(g){return a(g),!1}let{from:d,to:u}=typeof t=="number"?{from:t,to:t}:{from:t.from,to:t.to},f=!0,h=!0;if((oy(l)?l:[l]).forEach(g=>{g.check(),f=f?g.isText&&g.marks.length===0:!1,h=h?g.isBlock:!1}),d===u&&h){let{parent:g}=r.doc.resolve(d);g.isTextblock&&!g.type.spec.code&&!g.childCount&&(d-=1,u+=1)}let m;if(f){if(Array.isArray(e))m=e.map(g=>g.text||"").join("");else if(e instanceof v){let g="";e.forEach(y=>{y.text&&(g+=y.text)}),m=g}else typeof e=="object"&&e&&e.text?m=e.text:m=e;r.insertText(m,d,u)}else{m=l;let g=r.doc.resolve(d),y=g.node(),w=g.parentOffset===0,b=y.isText||y.isTextblock,C=y.content.size>0;w&&b&&C&&(d=Math.max(0,d-1)),r.replaceWith(d,u,m)}n.updateSelection&&ry(r,r.steps.length-1,-1),n.applyInputRules&&r.setMeta("applyInputRules",{from:d,text:m}),n.applyPasteRules&&r.setMeta("applyPasteRules",{from:d,text:m})}return!0},sy=()=>({state:t,dispatch:e})=>ac(t,e),ly=()=>({state:t,dispatch:e})=>cc(t,e),ay=()=>({state:t,dispatch:e})=>Ui(t,e),cy=()=>({state:t,dispatch:e})=>Ji(t,e),dy=()=>({state:t,dispatch:e,tr:n})=>{try{let r=Wt(t.doc,t.selection.$from.pos,-1);return r==null?!1:(n.join(r,2),e&&e(n),!0)}catch{return!1}},uy=()=>({state:t,dispatch:e,tr:n})=>{try{let r=Wt(t.doc,t.selection.$from.pos,1);return r==null?!1:(n.join(r,2),e&&e(n),!0)}catch{return!1}},fy=()=>({state:t,dispatch:e})=>oc(t,e),hy=()=>({state:t,dispatch:e})=>ic(t,e);function _d(){return typeof navigator<"u"?/Mac/.test(navigator.platform):!1}function py(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n==="Space"&&(n=" ");let r,o,i,s;for(let l=0;l({editor:e,view:n,tr:r,dispatch:o})=>{let i=py(t).split(/-(?!$)/),s=i.find(c=>!["Alt","Ctrl","Meta","Shift"].includes(c)),l=new KeyboardEvent("keydown",{key:s==="Space"?" ":s,altKey:i.includes("Alt"),ctrlKey:i.includes("Ctrl"),metaKey:i.includes("Meta"),shiftKey:i.includes("Shift"),bubbles:!0,cancelable:!0}),a=e.captureTransaction(()=>{n.someProp("handleKeyDown",c=>c(n,l))});return a?.steps.forEach(c=>{let d=c.map(r.mapping);d&&o&&r.maybeStep(d)}),!0};function Ze(t,e,n={}){let{from:r,to:o,empty:i}=t.selection,s=e?ne(e,t.schema):null,l=[];t.doc.nodesBetween(r,o,(u,f)=>{if(u.isText)return;let h=Math.max(r,f),p=Math.min(o,f+u.nodeSize);l.push({node:u,from:h,to:p})});let a=o-r,c=l.filter(u=>s?s.name===u.node.type.name:!0).filter(u=>lo(u.node.attrs,n,{strict:!1}));return i?!!c.length:c.reduce((u,f)=>u+f.to-f.from,0)>=a}var gy=(t,e={})=>({state:n,dispatch:r})=>{let o=ne(t,n.schema);return Ze(n,o,e)?dc(n,r):!1},yy=()=>({state:t,dispatch:e})=>ts(t,e),by=t=>({state:e,dispatch:n})=>{let r=ne(t,e.schema);return gc(r)(e,n)},wy=()=>({state:t,dispatch:e})=>Yi(t,e);function ho(t,e){return e.nodes[t]?"node":e.marks[t]?"mark":null}function Rd(t,e){let n=typeof e=="string"?[e]:e;return Object.keys(t).reduce((r,o)=>(n.includes(o)||(r[o]=t[o]),r),{})}var xy=(t,e)=>({tr:n,state:r,dispatch:o})=>{let i=null,s=null,l=ho(typeof t=="string"?t:t.name,r.schema);if(!l)return!1;l==="node"&&(i=ne(t,r.schema)),l==="mark"&&(s=wt(t,r.schema));let a=!1;return n.selection.ranges.forEach(c=>{r.doc.nodesBetween(c.$from.pos,c.$to.pos,(d,u)=>{i&&i===d.type&&(a=!0,o&&n.setNodeMarkup(u,void 0,Rd(d.attrs,e))),s&&d.marks.length&&d.marks.forEach(f=>{s===f.type&&(a=!0,o&&n.addMark(u,u+d.nodeSize,s.create(Rd(f.attrs,e))))})})}),a},ky=()=>({tr:t,dispatch:e})=>(e&&t.scrollIntoView(),!0),Sy=()=>({tr:t,dispatch:e})=>{if(e){let n=new ke(t.doc);t.setSelection(n)}return!0},Cy=()=>({state:t,dispatch:e})=>Ki(t,e),vy=()=>({state:t,dispatch:e})=>Gi(t,e),My=()=>({state:t,dispatch:e})=>uc(t,e),Ty=()=>({state:t,dispatch:e})=>rs(t,e),Ay=()=>({state:t,dispatch:e})=>ns(t,e);function _s(t,e,n={},r={}){return ir(t,e,{slice:!1,parseOptions:n,errorOnInvalidContent:r.errorOnInvalidContent})}var Ey=(t,{errorOnInvalidContent:e,emitUpdate:n=!0,parseOptions:r={}}={})=>({editor:o,tr:i,dispatch:s,commands:l})=>{let{doc:a}=i;if(r.preserveWhitespace!=="full"){let c=_s(t,o.schema,r,{errorOnInvalidContent:e??o.options.enableContentCheck});return s&&i.replaceWith(0,a.content.size,c).setMeta("preventUpdate",!n),!0}return s&&i.setMeta("preventUpdate",!n),l.insertContentAt({from:0,to:a.content.size},t,{parseOptions:r,errorOnInvalidContent:e??o.options.enableContentCheck})};function Wd(t,e){let n=wt(e,t.schema),{from:r,to:o,empty:i}=t.selection,s=[];i?(t.storedMarks&&s.push(...t.storedMarks),s.push(...t.selection.$head.marks())):t.doc.nodesBetween(r,o,a=>{s.push(...a.marks)});let l=s.find(a=>a.type.name===n.name);return l?{...l.attrs}:{}}function Js(t,e){let n=new Tt(t);return e.forEach(r=>{r.steps.forEach(o=>{n.step(o)})}),n}function sr(t){for(let e=0;e{e(r)&&n.push({node:r,pos:o})}),n}function jd(t,e,n){let r=[];return t.nodesBetween(e.from,e.to,(o,i)=>{n(o)&&r.push({node:o,pos:i})}),r}function Gs(t,e){for(let n=t.depth;n>0;n-=1){let r=t.node(n);if(e(r))return{pos:n>0?t.before(n):0,start:t.start(n),depth:n,node:r}}}function et(t){return e=>Gs(e.$from,t)}function B(t,e,n){return t.config[e]===void 0&&t.parent?B(t.parent,e,n):typeof t.config[e]=="function"?t.config[e].bind({...n,parent:t.parent?B(t.parent,e,n):null}):t.config[e]}function Xs(t){return t.map(e=>{let n={name:e.name,options:e.options,storage:e.storage},r=B(e,"addExtensions",n);return r?[e,...Xs(r())]:e}).flat(10)}function Ys(t,e){let n=ct.fromSchema(e).serializeFragment(t),o=document.implementation.createHTMLDocument().createElement("div");return o.appendChild(n),o.innerHTML}function Ud(t){return typeof t=="function"}function G(t,e=void 0,...n){return Ud(t)?e?t.bind(e)(...n):t(...n):t}function Ny(t={}){return Object.keys(t).length===0&&t.constructor===Object}function An(t){let e=t.filter(o=>o.type==="extension"),n=t.filter(o=>o.type==="node"),r=t.filter(o=>o.type==="mark");return{baseExtensions:e,nodeExtensions:n,markExtensions:r}}function Kd(t){let e=[],{nodeExtensions:n,markExtensions:r}=An(t),o=[...n,...r],i={default:null,validate:void 0,rendered:!0,renderHTML:null,parseHTML:null,keepOnSplit:!0,isRequired:!1};return t.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage,extensions:o},a=B(s,"addGlobalAttributes",l);if(!a)return;a().forEach(d=>{d.types.forEach(u=>{Object.entries(d.attributes).forEach(([f,h])=>{e.push({type:u,name:f,attribute:{...i,...h}})})})})}),o.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage},a=B(s,"addAttributes",l);if(!a)return;let c=a();Object.entries(c).forEach(([d,u])=>{let f={...i,...u};typeof f?.default=="function"&&(f.default=f.default()),f?.isRequired&&f?.default===void 0&&delete f.default,e.push({type:s.name,name:d,attribute:f})})}),e}function R(...t){return t.filter(e=>!!e).reduce((e,n)=>{let r={...e};return Object.entries(n).forEach(([o,i])=>{if(!r[o]){r[o]=i;return}if(o==="class"){let l=i?String(i).split(" "):[],a=r[o]?r[o].split(" "):[],c=l.filter(d=>!a.includes(d));r[o]=[...a,...c].join(" ")}else if(o==="style"){let l=i?i.split(";").map(d=>d.trim()).filter(Boolean):[],a=r[o]?r[o].split(";").map(d=>d.trim()).filter(Boolean):[],c=new Map;a.forEach(d=>{let[u,f]=d.split(":").map(h=>h.trim());c.set(u,f)}),l.forEach(d=>{let[u,f]=d.split(":").map(h=>h.trim());c.set(u,f)}),r[o]=Array.from(c.entries()).map(([d,u])=>`${d}: ${u}`).join("; ")}else r[o]=i}),r},{})}function ao(t,e){return e.filter(n=>n.type===t.type.name).filter(n=>n.attribute.rendered).map(n=>n.attribute.renderHTML?n.attribute.renderHTML(t.attrs)||{}:{[n.name]:t.attrs[n.name]}).reduce((n,r)=>R(n,r),{})}function Oy(t){return typeof t!="string"?t:t.match(/^[+-]?(?:\d*\.)?\d+$/)?Number(t):t==="true"?!0:t==="false"?!1:t}function Dd(t,e){return"style"in t?t:{...t,getAttrs:n=>{let r=t.getAttrs?t.getAttrs(n):t.attrs;if(r===!1)return!1;let o=e.reduce((i,s)=>{let l=s.attribute.parseHTML?s.attribute.parseHTML(n):Oy(n.getAttribute(s.name));return l==null?i:{...i,[s.name]:l}},{});return{...r,...o}}}}function Id(t){return Object.fromEntries(Object.entries(t).filter(([e,n])=>e==="attrs"&&Ny(n)?!1:n!=null))}function Pd(t){var e,n;let r={};return!((e=t?.attribute)!=null&&e.isRequired)&&"default"in(t?.attribute||{})&&(r.default=t.attribute.default),((n=t?.attribute)==null?void 0:n.validate)!==void 0&&(r.validate=t.attribute.validate),[t.name,r]}function Ry(t,e){var n;let r=Kd(t),{nodeExtensions:o,markExtensions:i}=An(t),s=(n=o.find(c=>B(c,"topNode")))==null?void 0:n.name,l=Object.fromEntries(o.map(c=>{let d=r.filter(y=>y.type===c.name),u={name:c.name,options:c.options,storage:c.storage,editor:e},f=t.reduce((y,w)=>{let b=B(w,"extendNodeSchema",u);return{...y,...b?b(c):{}}},{}),h=Id({...f,content:G(B(c,"content",u)),marks:G(B(c,"marks",u)),group:G(B(c,"group",u)),inline:G(B(c,"inline",u)),atom:G(B(c,"atom",u)),selectable:G(B(c,"selectable",u)),draggable:G(B(c,"draggable",u)),code:G(B(c,"code",u)),whitespace:G(B(c,"whitespace",u)),linebreakReplacement:G(B(c,"linebreakReplacement",u)),defining:G(B(c,"defining",u)),isolating:G(B(c,"isolating",u)),attrs:Object.fromEntries(d.map(Pd))}),p=G(B(c,"parseHTML",u));p&&(h.parseDOM=p.map(y=>Dd(y,d)));let m=B(c,"renderHTML",u);m&&(h.toDOM=y=>m({node:y,HTMLAttributes:ao(y,d)}));let g=B(c,"renderText",u);return g&&(h.toText=g),[c.name,h]})),a=Object.fromEntries(i.map(c=>{let d=r.filter(g=>g.type===c.name),u={name:c.name,options:c.options,storage:c.storage,editor:e},f=t.reduce((g,y)=>{let w=B(y,"extendMarkSchema",u);return{...g,...w?w(c):{}}},{}),h=Id({...f,inclusive:G(B(c,"inclusive",u)),excludes:G(B(c,"excludes",u)),group:G(B(c,"group",u)),spanning:G(B(c,"spanning",u)),code:G(B(c,"code",u)),attrs:Object.fromEntries(d.map(Pd))}),p=G(B(c,"parseHTML",u));p&&(h.parseDOM=p.map(g=>Dd(g,d)));let m=B(c,"renderHTML",u);return m&&(h.toDOM=g=>m({mark:g,HTMLAttributes:ao(g,d)})),[c.name,h]}));return new fn({topNode:s,nodes:l,marks:a})}function Dy(t){let e=t.filter((n,r)=>t.indexOf(n)!==r);return Array.from(new Set(e))}function Qs(t){return t.sort((n,r)=>{let o=B(n,"priority")||100,i=B(r,"priority")||100;return o>i?-1:or.name));return n.length&&console.warn(`[tiptap warn]: Duplicate extension names found: [${n.map(r=>`'${r}'`).join(", ")}]. This can lead to issues.`),e}function Jd(t,e,n){let{from:r,to:o}=e,{blockSeparator:i=` `,textSerializers:s={}}=n||{},l="";return t.nodesBetween(r,o,(a,c,d,u)=>{var f;a.isBlock&&c>r&&(l+=i);let h=s?.[a.type.name];if(h)return d&&(l+=h({node:a,pos:c,parent:d,index:u,range:e})),!1;a.isText&&(l+=(f=a?.text)==null?void 0:f.slice(Math.max(r,c)-c,o-c))}),l}function Iy(t,e){let n={from:0,to:t.content.size};return Jd(t,n,e)}function Gd(t){return Object.fromEntries(Object.entries(t.nodes).filter(([,e])=>e.spec.toText).map(([e,n])=>[e,n.spec.toText]))}function Py(t,e){let n=ne(e,t.schema),{from:r,to:o}=t.selection,i=[];t.doc.nodesBetween(r,o,l=>{i.push(l)});let s=i.reverse().find(l=>l.type.name===n.name);return s?{...s.attrs}:{}}function Zs(t,e){let n=ho(typeof e=="string"?e:e.name,t.schema);return n==="node"?Py(t,e):n==="mark"?Wd(t,e):{}}function Ly(t,e=JSON.stringify){let n={};return t.filter(r=>{let o=e(r);return Object.prototype.hasOwnProperty.call(n,o)?!1:n[o]=!0})}function By(t){let e=Ly(t);return e.length===1?e:e.filter((n,r)=>!e.filter((i,s)=>s!==r).some(i=>n.oldRange.from>=i.oldRange.from&&n.oldRange.to<=i.oldRange.to&&n.newRange.from>=i.newRange.from&&n.newRange.to<=i.newRange.to))}function el(t){let{mapping:e,steps:n}=t,r=[];return e.maps.forEach((o,i)=>{let s=[];if(o.ranges.length)o.forEach((l,a)=>{s.push({from:l,to:a})});else{let{from:l,to:a}=n[i];if(l===void 0||a===void 0)return;s.push({from:l,to:a})}s.forEach(({from:l,to:a})=>{let c=e.slice(i).map(l,-1),d=e.slice(i).map(a),u=e.invert().map(c,-1),f=e.invert().map(d);r.push({oldRange:{from:u,to:f},newRange:{from:c,to:d}})})}),By(r)}function po(t,e,n){let r=[];return t===e?n.resolve(t).marks().forEach(o=>{let i=n.resolve(t),s=Ks(i,o.type);s&&r.push({mark:o,...s})}):n.nodesBetween(t,e,(o,i)=>{!o||o?.nodeSize===void 0||r.push(...o.marks.map(s=>({from:i,to:i+o.nodeSize,mark:s})))}),r}var Xd=(t,e,n,r=20)=>{let o=t.doc.resolve(n),i=r,s=null;for(;i>0&&s===null;){let l=o.node(i);l?.type.name===e?s=l:i-=1}return[s,i]};function $s(t,e){return e.nodes[t]||e.marks[t]||null}function so(t,e,n){return Object.fromEntries(Object.entries(n).filter(([r])=>{let o=t.find(i=>i.type===e&&i.name===r);return o?o.attribute.keepOnSplit:!1}))}var zy=(t,e=500)=>{let n="",r=t.parentOffset;return t.parent.nodesBetween(Math.max(0,r-e),r,(o,i,s,l)=>{var a,c;let d=((c=(a=o.type.spec).toText)==null?void 0:c.call(a,{node:o,pos:i,parent:s,index:l}))||o.textContent||"%leaf%";n+=o.isAtom&&!o.isText?d:d.slice(0,Math.max(0,r-i))}),n};function Ws(t,e,n={}){let{empty:r,ranges:o}=t.selection,i=e?wt(e,t.schema):null;if(r)return!!(t.storedMarks||t.selection.$from.marks()).filter(u=>i?i.name===u.type.name:!0).find(u=>lo(u.attrs,n,{strict:!1}));let s=0,l=[];if(o.forEach(({$from:u,$to:f})=>{let h=u.pos,p=f.pos;t.doc.nodesBetween(h,p,(m,g)=>{if(!m.isText&&!m.marks.length)return;let y=Math.max(h,g),w=Math.min(p,g+m.nodeSize),b=w-y;s+=b,l.push(...m.marks.map(C=>({mark:C,from:y,to:w})))})}),s===0)return!1;let a=l.filter(u=>i?i.name===u.mark.type.name:!0).filter(u=>lo(u.mark.attrs,n,{strict:!1})).reduce((u,f)=>u+f.to-f.from,0),c=l.filter(u=>i?u.mark.type!==i&&u.mark.type.excludes(i):!0).reduce((u,f)=>u+f.to-f.from,0);return(a>0?a+c:a)>=s}function tl(t,e,n={}){if(!e)return Ze(t,null,n)||Ws(t,null,n);let r=ho(e,t.schema);return r==="node"?Ze(t,e,n):r==="mark"?Ws(t,e,n):!1}var Yd=(t,e)=>{let{$from:n,$to:r,$anchor:o}=t.selection;if(e){let i=et(l=>l.type.name===e)(t.selection);if(!i)return!1;let s=t.doc.resolve(i.pos+1);return o.pos+1===s.end()}return!(r.parentOffset{let{$from:e,$to:n}=t.selection;return!(e.parentOffset>0||e.pos!==n.pos)};function Ld(t,e){return Array.isArray(e)?e.some(n=>(typeof n=="string"?n:n.name)===t.name):e}function Bd(t,e){let{nodeExtensions:n}=An(e),r=n.find(s=>s.name===t);if(!r)return!1;let o={name:r.name,options:r.options,storage:r.storage},i=G(B(r,"group",o));return typeof i!="string"?!1:i.split(" ").includes("list")}function lr(t,{checkChildren:e=!0,ignoreWhitespace:n=!1}={}){var r;if(n){if(t.type.name==="hardBreak")return!0;if(t.isText)return/^\s*$/m.test((r=t.text)!=null?r:"")}if(t.isText)return!t.text;if(t.isAtom||t.isLeaf)return!1;if(t.content.childCount===0)return!0;if(e){let o=!0;return t.content.forEach(i=>{o!==!1&&(lr(i,{ignoreWhitespace:n,checkChildren:e})||(o=!1))}),o}return!1}function mo(t){return t instanceof L}var Zd=class eu{constructor(e){this.position=e}static fromJSON(e){return new eu(e.position)}toJSON(){return{position:this.position}}};function Hy(t,e){let n=e.mapping.mapResult(t.position);return{position:new Zd(n.pos),mapResult:n}}function $y(t){return new Zd(t)}function tu(t,e,n){let o=t.state.doc.content.size,i=bt(e,0,o),s=bt(n,0,o),l=t.coordsAtPos(i),a=t.coordsAtPos(s,-1),c=Math.min(l.top,a.top),d=Math.max(l.bottom,a.bottom),u=Math.min(l.left,a.left),f=Math.max(l.right,a.right),h=f-u,p=d-c,y={top:c,bottom:d,left:u,right:f,width:h,height:p,x:u,y:c};return{...y,toJSON:()=>y}}function Fy(t,e,n){var r;let{selection:o}=e,i=null;if(fo(o)&&(i=o.$cursor),i){let l=(r=t.storedMarks)!=null?r:i.marks();return i.parent.type.allowsMarkType(n)&&(!!n.isInSet(l)||!l.some(c=>c.type.excludes(n)))}let{ranges:s}=o;return s.some(({$from:l,$to:a})=>{let c=l.depth===0?t.doc.inlineContent&&t.doc.type.allowsMarkType(n):!1;return t.doc.nodesBetween(l.pos,a.pos,(d,u,f)=>{if(c)return!1;if(d.isInline){let h=!f||f.type.allowsMarkType(n),p=!!n.isInSet(d.marks)||!d.marks.some(m=>m.type.excludes(n));c=h&&p}return!c}),c})}var Vy=(t,e={})=>({tr:n,state:r,dispatch:o})=>{let{selection:i}=n,{empty:s,ranges:l}=i,a=wt(t,r.schema);if(o)if(s){let c=Wd(r,a);n.addStoredMark(a.create({...c,...e}))}else l.forEach(c=>{let d=c.$from.pos,u=c.$to.pos;r.doc.nodesBetween(d,u,(f,h)=>{let p=Math.max(h,d),m=Math.min(h+f.nodeSize,u);f.marks.find(y=>y.type===a)?f.marks.forEach(y=>{a===y.type&&n.addMark(p,m,a.create({...y.attrs,...e}))}):n.addMark(p,m,a.create(e))})});return Fy(r,n,a)},_y=(t,e)=>({tr:n})=>(n.setMeta(t,e),!0),Wy=(t,e={})=>({state:n,dispatch:r,chain:o})=>{let i=ne(t,n.schema),s;return n.selection.$anchor.sameParent(n.selection.$head)&&(s=n.selection.$anchor.parent.attrs),i.isTextblock?o().command(({commands:l})=>is(i,{...s,...e})(n)?!0:l.clearNodes()).command(({state:l})=>is(i,{...s,...e})(l,r)).run():(console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'),!1)},jy=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,o=bt(t,0,r.content.size),i=L.create(r,o);e.setSelection(i)}return!0},Uy=(t,e)=>({tr:n,state:r,dispatch:o})=>{let{selection:i}=r,s,l;return typeof e=="number"?(s=e,l=e):e&&"from"in e&&"to"in e?(s=e.from,l=e.to):(s=i.from,l=i.to),o&&n.doc.nodesBetween(s,l,(a,c)=>{a.isText||n.setNodeMarkup(c,void 0,{...a.attrs,dir:t})}),!0},Ky=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,{from:o,to:i}=typeof t=="number"?{from:t,to:t}:t,s=D.atStart(r).from,l=D.atEnd(r).to,a=bt(o,s,l),c=bt(i,s,l),d=D.create(r,a,c);e.setSelection(d)}return!0},qy=t=>({state:e,dispatch:n})=>{let r=ne(t,e.schema);return yc(r)(e,n)};function zd(t,e){let n=t.storedMarks||t.selection.$to.parentOffset&&t.selection.$from.marks();if(n){let r=n.filter(o=>e?.includes(o.type.name));t.tr.ensureMarks(r)}}var Jy=({keepMarks:t=!0}={})=>({tr:e,state:n,dispatch:r,editor:o})=>{let{selection:i,doc:s}=e,{$from:l,$to:a}=i,c=o.extensionManager.attributes,d=so(c,l.node().type.name,l.node().attrs);if(i instanceof L&&i.node.isBlock)return!l.parentOffset||!Ee(s,l.pos)?!1:(r&&(t&&zd(n,o.extensionManager.splittableMarks),e.split(l.pos).scrollIntoView()),!0);if(!l.parent.isBlock)return!1;let u=a.parentOffset===a.parent.content.size,f=l.depth===0?void 0:sr(l.node(-1).contentMatchAt(l.indexAfter(-1))),h=u&&f?[{type:f,attrs:d}]:void 0,p=Ee(e.doc,e.mapping.map(l.pos),1,h);if(!h&&!p&&Ee(e.doc,e.mapping.map(l.pos),1,f?[{type:f}]:void 0)&&(p=!0,h=f?[{type:f,attrs:d}]:void 0),r){if(p&&(i instanceof D&&e.deleteSelection(),e.split(e.mapping.map(l.pos),1,h),f&&!u&&!l.parentOffset&&l.parent.type!==f)){let m=e.mapping.map(l.before()),g=e.doc.resolve(m);l.node(-1).canReplaceWith(g.index(),g.index()+1,f)&&e.setNodeMarkup(e.mapping.map(l.before()),f)}t&&zd(n,o.extensionManager.splittableMarks),e.scrollIntoView()}return p},Gy=(t,e={})=>({tr:n,state:r,dispatch:o,editor:i})=>{var s;let l=ne(t,r.schema),{$from:a,$to:c}=r.selection,d=r.selection.node;if(d&&d.isBlock||a.depth<2||!a.sameParent(c))return!1;let u=a.node(-1);if(u.type!==l)return!1;let f=i.extensionManager.attributes;if(a.parent.content.size===0&&a.node(-1).childCount===a.indexAfter(-1)){if(a.depth===2||a.node(-3).type!==l||a.index(-2)!==a.node(-2).childCount-1)return!1;if(o){let y=v.empty,w=a.index(-1)?1:a.index(-2)?2:3;for(let O=a.depth-w;O>=a.depth-3;O-=1)y=v.from(a.node(O).copy(y));let b=a.indexAfter(-1){if(k>-1)return!1;O.isTextblock&&O.content.size===0&&(k=T+1)}),k>-1&&n.setSelection(D.near(n.doc.resolve(k))),n.scrollIntoView()}return!0}let h=c.pos===a.end()?u.contentMatchAt(0).defaultType:null,p={...so(f,u.type.name,u.attrs),...e},m={...so(f,a.node().type.name,a.node().attrs),...e};n.delete(a.pos,c.pos);let g=h?[{type:l,attrs:p},{type:h,attrs:m}]:[{type:l,attrs:p}];if(!Ee(n.doc,a.pos,2))return!1;if(o){let{selection:y,storedMarks:w}=r,{splittableMarks:b}=i.extensionManager,C=w||y.$to.parentOffset&&y.$from.marks();if(n.split(a.pos,2,g).scrollIntoView(),!C||!o)return!0;let x=C.filter(S=>b.includes(S.type.name));n.ensureMarks(x)}return!0},Fs=(t,e)=>{let n=et(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(Math.max(0,n.pos-1)).before(n.depth);if(r===void 0)return!0;let o=t.doc.nodeAt(r);return n.node.type===o?.type&&Re(t.doc,n.pos)&&t.join(n.pos),!0},Vs=(t,e)=>{let n=et(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(n.start).after(n.depth);if(r===void 0)return!0;let o=t.doc.nodeAt(r);return n.node.type===o?.type&&Re(t.doc,r)&&t.join(r),!0},Xy=(t,e,n,r={})=>({editor:o,tr:i,state:s,dispatch:l,chain:a,commands:c,can:d})=>{let{extensions:u,splittableMarks:f}=o.extensionManager,h=ne(t,s.schema),p=ne(e,s.schema),{selection:m,storedMarks:g}=s,{$from:y,$to:w}=m,b=y.blockRange(w),C=g||m.$to.parentOffset&&m.$from.marks();if(!b)return!1;let x=et(S=>Bd(S.type.name,u))(m);if(b.depth>=1&&x&&b.depth-x.depth<=1){if(x.node.type===h)return c.liftListItem(p);if(Bd(x.node.type.name,u)&&h.validContent(x.node.content)&&l)return a().command(()=>(i.setNodeMarkup(x.pos,h),!0)).command(()=>Fs(i,h)).command(()=>Vs(i,h)).run()}return!n||!C||!l?a().command(()=>d().wrapInList(h,r)?!0:c.clearNodes()).wrapInList(h,r).command(()=>Fs(i,h)).command(()=>Vs(i,h)).run():a().command(()=>{let S=d().wrapInList(h,r),k=C.filter(O=>f.includes(O.type.name));return i.ensureMarks(k),S?!0:c.clearNodes()}).wrapInList(h,r).command(()=>Fs(i,h)).command(()=>Vs(i,h)).run()},Yy=(t,e={},n={})=>({state:r,commands:o})=>{let{extendEmptyMarkRange:i=!1}=n,s=wt(t,r.schema);return Ws(r,s,e)?o.unsetMark(s,{extendEmptyMarkRange:i}):o.setMark(s,e)},Qy=(t,e,n={})=>({state:r,commands:o})=>{let i=ne(t,r.schema),s=ne(e,r.schema),l=Ze(r,i,n),a;return r.selection.$anchor.sameParent(r.selection.$head)&&(a=r.selection.$anchor.parent.attrs),l?o.setNode(s,a):o.setNode(i,{...a,...n})},Zy=(t,e={})=>({state:n,commands:r})=>{let o=ne(t,n.schema);return Ze(n,o,e)?r.lift(o):r.wrapIn(o,e)},eb=()=>({state:t,dispatch:e})=>{let n=t.plugins;for(let r=0;r=0;a-=1)s.step(l.steps[a].invert(l.docs[a]));if(i.text){let a=s.doc.resolve(i.from).marks();s.replaceWith(i.from,i.to,t.schema.text(i.text,a))}else s.delete(i.from,i.to)}return!0}}return!1},tb=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,{empty:r,ranges:o}=n;return r||e&&o.forEach(i=>{t.removeMark(i.$from.pos,i.$to.pos)}),!0},nb=(t,e={})=>({tr:n,state:r,dispatch:o})=>{var i;let{extendEmptyMarkRange:s=!1}=e,{selection:l}=n,a=wt(t,r.schema),{$from:c,empty:d,ranges:u}=l;if(!o)return!0;if(d&&s){let{from:f,to:h}=l,p=(i=c.marks().find(g=>g.type===a))==null?void 0:i.attrs,m=Ks(c,a,p);m&&(f=m.from,h=m.to),n.removeMark(f,h,a)}else u.forEach(f=>{n.removeMark(f.$from.pos,f.$to.pos,a)});return n.removeStoredMark(a),!0},rb=t=>({tr:e,state:n,dispatch:r})=>{let{selection:o}=n,i,s;return typeof t=="number"?(i=t,s=t):t&&"from"in t&&"to"in t?(i=t.from,s=t.to):(i=o.from,s=o.to),r&&e.doc.nodesBetween(i,s,(l,a)=>{if(l.isText)return;let c={...l.attrs};delete c.dir,e.setNodeMarkup(a,void 0,c)}),!0},ob=(t,e={})=>({tr:n,state:r,dispatch:o})=>{let i=null,s=null,l=ho(typeof t=="string"?t:t.name,r.schema);if(!l)return!1;l==="node"&&(i=ne(t,r.schema)),l==="mark"&&(s=wt(t,r.schema));let a=!1;return n.selection.ranges.forEach(c=>{let d=c.$from.pos,u=c.$to.pos,f,h,p,m;n.selection.empty?r.doc.nodesBetween(d,u,(g,y)=>{i&&i===g.type&&(a=!0,p=Math.max(y,d),m=Math.min(y+g.nodeSize,u),f=y,h=g)}):r.doc.nodesBetween(d,u,(g,y)=>{y=d&&y<=u&&(i&&i===g.type&&(a=!0,o&&n.setNodeMarkup(y,void 0,{...g.attrs,...e})),s&&g.marks.length&&g.marks.forEach(w=>{if(s===w.type&&(a=!0,o)){let b=Math.max(y,d),C=Math.min(y+g.nodeSize,u);n.addMark(b,C,s.create({...w.attrs,...e}))}}))}),h&&(f!==void 0&&o&&n.setNodeMarkup(f,void 0,{...h.attrs,...e}),s&&h.marks.length&&h.marks.forEach(g=>{s===g.type&&o&&n.addMark(p,m,s.create({...g.attrs,...e}))}))}),a},ib=(t,e={})=>({state:n,dispatch:r})=>{let o=ne(t,n.schema);return pc(o,e)(n,r)},sb=(t,e={})=>({state:n,dispatch:r})=>{let o=ne(t,n.schema);return mc(o,e)(n,r)},lb=class{constructor(){this.callbacks={}}on(t,e){return this.callbacks[t]||(this.callbacks[t]=[]),this.callbacks[t].push(e),this}emit(t,...e){let n=this.callbacks[t];return n&&n.forEach(r=>r.apply(this,e)),this}off(t,e){let n=this.callbacks[t];return n&&(e?this.callbacks[t]=n.filter(r=>r!==e):delete this.callbacks[t]),this}once(t,e){let n=(...r)=>{this.off(t,n),e.apply(this,r)};return this.on(t,n)}removeAllListeners(){this.callbacks={}}},go=class{constructor(t){var e;this.find=t.find,this.handler=t.handler,this.undoable=(e=t.undoable)!=null?e:!0}},ab=(t,e)=>{if(Us(e))return e.exec(t);let n=e(t);if(!n)return null;let r=[n.text];return r.index=n.index,r.input=t,r.data=n.data,n.replaceWith&&(n.text.includes(n.replaceWith)||console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'),r.push(n.replaceWith)),r};function ro(t){var e;let{editor:n,from:r,to:o,text:i,rules:s,plugin:l}=t,{view:a}=n;if(a.composing)return!1;let c=a.state.doc.resolve(r);if(c.parent.type.spec.code||(e=c.nodeBefore||c.nodeAfter)!=null&&e.marks.find(f=>f.type.spec.code))return!1;let d=!1,u=zy(c)+i;return s.forEach(f=>{if(d)return;let h=ab(u,f.find);if(!h)return;let p=a.state.tr,m=co({state:a.state,transaction:p}),g={from:r-(h[0].length-i.length),to:o},{commands:y,chain:w,can:b}=new uo({editor:n,state:m});f.handler({state:m,range:g,match:h,commands:y,chain:w,can:b})===null||!p.steps.length||(f.undoable&&p.setMeta(l,{transform:p,from:r,to:o,text:i}),a.dispatch(p),d=!0)}),d}function cb(t){let{editor:e,rules:n}=t,r=new P({state:{init(){return null},apply(o,i,s){let l=o.getMeta(r);if(l)return l;let a=o.getMeta("applyInputRules");return!!a&&setTimeout(()=>{let{text:d}=a;typeof d=="string"?d=d:d=Ys(v.from(d),s.schema);let{from:u}=a,f=u+d.length;ro({editor:e,from:u,to:f,text:d,rules:n,plugin:r})}),o.selectionSet||o.docChanged?null:i}},props:{handleTextInput(o,i,s,l){return ro({editor:e,from:i,to:s,text:l,rules:n,plugin:r})},handleDOMEvents:{compositionend:o=>(setTimeout(()=>{let{$cursor:i}=o.state.selection;i&&ro({editor:e,from:i.pos,to:i.pos,text:"",rules:n,plugin:r})}),!1)},handleKeyDown(o,i){if(i.key!=="Enter")return!1;let{$cursor:s}=o.state.selection;return s?ro({editor:e,from:s.pos,to:s.pos,text:` `,rules:n,plugin:r}):!1}},isInputRules:!0});return r}function db(t){return Object.prototype.toString.call(t).slice(8,-1)}function oo(t){return db(t)!=="Object"?!1:t.constructor===Object&&Object.getPrototypeOf(t)===Object.prototype}function nu(t,e){let n={...t};return oo(t)&&oo(e)&&Object.keys(e).forEach(r=>{oo(e[r])&&oo(t[r])?n[r]=nu(t[r],e[r]):n[r]=e[r]}),n}var nl=class{constructor(t={}){this.type="extendable",this.parent=null,this.child=null,this.name="",this.config={name:this.name},this.config={...this.config,...t},this.name=this.config.name}get options(){return{...G(B(this,"addOptions",{name:this.name}))||{}}}get storage(){return{...G(B(this,"addStorage",{name:this.name,options:this.options}))||{}}}configure(t={}){let e=this.extend({...this.config,addOptions:()=>nu(this.options,t)});return e.name=this.name,e.parent=this.parent,e}extend(t={}){let e=new this.constructor({...this.config,...t});return e.parent=this,this.child=e,e.name="name"in t?t.name:e.parent.name,e}},ee=class ru extends nl{constructor(){super(...arguments),this.type="mark"}static create(e={}){let n=typeof e=="function"?e():e;return new ru(n)}static handleExit({editor:e,mark:n}){let{tr:r}=e.state,o=e.state.selection.$from;if(o.pos===o.end()){let s=o.marks();if(!!!s.find(c=>c?.type.name===n.name))return!1;let a=s.find(c=>c?.type.name===n.name);return a&&r.removeStoredMark(a),r.insertText(" ",o.pos),e.view.dispatch(r),!0}return!1}configure(e){return super.configure(e)}extend(e){let n=typeof e=="function"?e():e;return super.extend(n)}};function ub(t){return typeof t=="number"}var fb=class{constructor(t){this.find=t.find,this.handler=t.handler}},hb=(t,e,n)=>{if(Us(e))return[...t.matchAll(e)];let r=e(t,n);return r?r.map(o=>{let i=[o.text];return i.index=o.index,i.input=t,i.data=o.data,o.replaceWith&&(o.text.includes(o.replaceWith)||console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'),i.push(o.replaceWith)),i}):[]};function pb(t){let{editor:e,state:n,from:r,to:o,rule:i,pasteEvent:s,dropEvent:l}=t,{commands:a,chain:c,can:d}=new uo({editor:e,state:n}),u=[];return n.doc.nodesBetween(r,o,(h,p)=>{var m,g,y,w,b;if((g=(m=h.type)==null?void 0:m.spec)!=null&&g.code||!(h.isText||h.isTextblock||h.isInline))return;let C=(b=(w=(y=h.content)==null?void 0:y.size)!=null?w:h.nodeSize)!=null?b:0,x=Math.max(r,p),S=Math.min(o,p+C);if(x>=S)return;let k=h.isText?h.text||"":h.textBetween(x-p,S-p,void 0,"\uFFFC");hb(k,i.find,s).forEach(T=>{if(T.index===void 0)return;let A=x+T.index+1,$=A+T[0].length,z={from:n.tr.mapping.map(A),to:n.tr.mapping.map($)},K=i.handler({state:n,range:z,match:T,commands:a,chain:c,can:d,pasteEvent:s,dropEvent:l});u.push(K)})}),u.every(h=>h!==null)}var io=null,mb=t=>{var e;let n=new ClipboardEvent("paste",{clipboardData:new DataTransfer});return(e=n.clipboardData)==null||e.setData("text/html",t),n};function gb(t){let{editor:e,rules:n}=t,r=null,o=!1,i=!1,s=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,l;try{l=typeof DragEvent<"u"?new DragEvent("drop"):null}catch{l=null}let a=({state:d,from:u,to:f,rule:h,pasteEvt:p})=>{let m=d.tr,g=co({state:d,transaction:m});if(!(!pb({editor:e,state:g,from:Math.max(u-1,0),to:f.b-1,rule:h,pasteEvent:p,dropEvent:l})||!m.steps.length)){try{l=typeof DragEvent<"u"?new DragEvent("drop"):null}catch{l=null}return s=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,m}};return n.map(d=>new P({view(u){let f=p=>{var m;r=(m=u.dom.parentElement)!=null&&m.contains(p.target)?u.dom.parentElement:null,r&&(io=e)},h=()=>{io&&(io=null)};return window.addEventListener("dragstart",f),window.addEventListener("dragend",h),{destroy(){window.removeEventListener("dragstart",f),window.removeEventListener("dragend",h)}}},props:{handleDOMEvents:{drop:(u,f)=>{if(i=r===u.dom.parentElement,l=f,!i){let h=io;h?.isEditable&&setTimeout(()=>{let p=h.state.selection;p&&h.commands.deleteRange({from:p.from,to:p.to})},10)}return!1},paste:(u,f)=>{var h;let p=(h=f.clipboardData)==null?void 0:h.getData("text/html");return s=f,o=!!p?.includes("data-pm-slice"),!1}}},appendTransaction:(u,f,h)=>{let p=u[0],m=p.getMeta("uiEvent")==="paste"&&!o,g=p.getMeta("uiEvent")==="drop"&&!i,y=p.getMeta("applyPasteRules"),w=!!y;if(!m&&!g&&!w)return;if(w){let{text:x}=y;typeof x=="string"?x=x:x=Ys(v.from(x),h.schema);let{from:S}=y,k=S+x.length,O=mb(x);return a({rule:d,state:h,from:S,to:{b:k},pasteEvt:O})}let b=f.doc.content.findDiffStart(h.doc.content),C=f.doc.content.findDiffEnd(h.doc.content);if(!(!ub(b)||!C||b===C.b))return a({rule:d,state:h,from:b,to:C,pasteEvt:s})}}))}var yo=class{constructor(t,e){this.splittableMarks=[],this.editor=e,this.baseExtensions=t,this.extensions=qd(t),this.schema=Ry(this.extensions,e),this.setupExtensions()}get commands(){return this.extensions.reduce((t,e)=>{let n={name:e.name,options:e.options,storage:this.editor.extensionStorage[e.name],editor:this.editor,type:$s(e.name,this.schema)},r=B(e,"addCommands",n);return r?{...t,...r()}:t},{})}get plugins(){let{editor:t}=this;return Qs([...this.extensions].reverse()).flatMap(r=>{let o={name:r.name,options:r.options,storage:this.editor.extensionStorage[r.name],editor:t,type:$s(r.name,this.schema)},i=[],s=B(r,"addKeyboardShortcuts",o),l={};if(r.type==="mark"&&B(r,"exitable",o)&&(l.ArrowRight=()=>ee.handleExit({editor:t,mark:r})),s){let f=Object.fromEntries(Object.entries(s()).map(([h,p])=>[h,()=>p({editor:t})]));l={...l,...f}}let a=Nd(l);i.push(a);let c=B(r,"addInputRules",o);if(Ld(r,t.options.enableInputRules)&&c){let f=c();if(f&&f.length){let h=cb({editor:t,rules:f}),p=Array.isArray(h)?h:[h];i.push(...p)}}let d=B(r,"addPasteRules",o);if(Ld(r,t.options.enablePasteRules)&&d){let f=d();if(f&&f.length){let h=gb({editor:t,rules:f});i.push(...h)}}let u=B(r,"addProseMirrorPlugins",o);if(u){let f=u();i.push(...f)}return i})}get attributes(){return Kd(this.extensions)}get nodeViews(){let{editor:t}=this,{nodeExtensions:e}=An(this.extensions);return Object.fromEntries(e.filter(n=>!!B(n,"addNodeView")).map(n=>{let r=this.attributes.filter(a=>a.type===n.name),o={name:n.name,options:n.options,storage:this.editor.extensionStorage[n.name],editor:t,type:ne(n.name,this.schema)},i=B(n,"addNodeView",o);if(!i)return[];let s=i();if(!s)return[];let l=(a,c,d,u,f)=>{let h=ao(a,r);return s({node:a,view:c,getPos:d,decorations:u,innerDecorations:f,editor:t,extension:n,HTMLAttributes:h})};return[n.name,l]}))}get markViews(){let{editor:t}=this,{markExtensions:e}=An(this.extensions);return Object.fromEntries(e.filter(n=>!!B(n,"addMarkView")).map(n=>{let r=this.attributes.filter(l=>l.type===n.name),o={name:n.name,options:n.options,storage:this.editor.extensionStorage[n.name],editor:t,type:wt(n.name,this.schema)},i=B(n,"addMarkView",o);if(!i)return[];let s=(l,a,c)=>{let d=ao(l,r);return i()({mark:l,view:a,inline:c,editor:t,extension:n,HTMLAttributes:d,updateAttributes:u=>{Ab(l,t,u)}})};return[n.name,s]}))}setupExtensions(){let t=this.extensions;this.editor.extensionStorage=Object.fromEntries(t.map(e=>[e.name,e.storage])),t.forEach(e=>{var n;let r={name:e.name,options:e.options,storage:this.editor.extensionStorage[e.name],editor:this.editor,type:$s(e.name,this.schema)};e.type==="mark"&&((n=G(B(e,"keepOnSplit",r)))==null||n)&&this.splittableMarks.push(e.name);let o=B(e,"onBeforeCreate",r),i=B(e,"onCreate",r),s=B(e,"onUpdate",r),l=B(e,"onSelectionUpdate",r),a=B(e,"onTransaction",r),c=B(e,"onFocus",r),d=B(e,"onBlur",r),u=B(e,"onDestroy",r);o&&this.editor.on("beforeCreate",o),i&&this.editor.on("create",i),s&&this.editor.on("update",s),l&&this.editor.on("selectionUpdate",l),a&&this.editor.on("transaction",a),c&&this.editor.on("focus",c),d&&this.editor.on("blur",d),u&&this.editor.on("destroy",u)})}};yo.resolve=qd;yo.sort=Qs;yo.flatten=Xs;var yb={};js(yb,{ClipboardTextSerializer:()=>iu,Commands:()=>su,Delete:()=>lu,Drop:()=>au,Editable:()=>cu,FocusEvents:()=>uu,Keymap:()=>fu,Paste:()=>hu,Tabindex:()=>pu,TextDirection:()=>mu,focusEventsPluginKey:()=>du});var U=class ou extends nl{constructor(){super(...arguments),this.type="extension"}static create(e={}){let n=typeof e=="function"?e():e;return new ou(n)}configure(e){return super.configure(e)}extend(e){let n=typeof e=="function"?e():e;return super.extend(n)}},iu=U.create({name:"clipboardTextSerializer",addOptions(){return{blockSeparator:void 0}},addProseMirrorPlugins(){return[new P({key:new H("clipboardTextSerializer"),props:{clipboardTextSerializer:()=>{let{editor:t}=this,{state:e,schema:n}=t,{doc:r,selection:o}=e,{ranges:i}=o,s=Math.min(...i.map(d=>d.$from.pos)),l=Math.max(...i.map(d=>d.$to.pos)),a=Gd(n);return Jd(r,{from:s,to:l},{...this.options.blockSeparator!==void 0?{blockSeparator:this.options.blockSeparator}:{},textSerializers:a})}}})]}}),su=U.create({name:"commands",addCommands(){return{...Hd}}}),lu=U.create({name:"delete",onUpdate({transaction:t,appendedTransactions:e}){var n,r,o;let i=()=>{var s,l,a,c;if((c=(a=(l=(s=this.editor.options.coreExtensionOptions)==null?void 0:s.delete)==null?void 0:l.filterTransaction)==null?void 0:a.call(l,t))!=null?c:t.getMeta("y-sync$"))return;let d=Js(t.before,[t,...e]);el(d).forEach(h=>{d.mapping.mapResult(h.oldRange.from).deletedAfter&&d.mapping.mapResult(h.oldRange.to).deletedBefore&&d.before.nodesBetween(h.oldRange.from,h.oldRange.to,(p,m)=>{let g=m+p.nodeSize-2,y=h.oldRange.from<=m&&g<=h.oldRange.to;this.editor.emit("delete",{type:"node",node:p,from:m,to:g,newFrom:d.mapping.map(m),newTo:d.mapping.map(g),deletedRange:h.oldRange,newRange:h.newRange,partial:!y,editor:this.editor,transaction:t,combinedTransform:d})})});let f=d.mapping;d.steps.forEach((h,p)=>{var m,g;if(h instanceof ut){let y=f.slice(p).map(h.from,-1),w=f.slice(p).map(h.to),b=f.invert().map(y,-1),C=f.invert().map(w),x=(m=d.doc.nodeAt(y-1))==null?void 0:m.marks.some(k=>k.eq(h.mark)),S=(g=d.doc.nodeAt(w))==null?void 0:g.marks.some(k=>k.eq(h.mark));this.editor.emit("delete",{type:"mark",mark:h.mark,from:h.from,to:h.to,deletedRange:{from:b,to:C},newRange:{from:y,to:w},partial:!!(S||x),editor:this.editor,transaction:t,combinedTransform:d})}})};(o=(r=(n=this.editor.options.coreExtensionOptions)==null?void 0:n.delete)==null?void 0:r.async)==null||o?setTimeout(i,0):i()}}),au=U.create({name:"drop",addProseMirrorPlugins(){return[new P({key:new H("tiptapDrop"),props:{handleDrop:(t,e,n,r)=>{this.editor.emit("drop",{editor:this.editor,event:e,slice:n,moved:r})}}})]}}),cu=U.create({name:"editable",addProseMirrorPlugins(){return[new P({key:new H("editable"),props:{editable:()=>this.editor.options.editable}})]}}),du=new H("focusEvents"),uu=U.create({name:"focusEvents",addProseMirrorPlugins(){let{editor:t}=this;return[new P({key:du,props:{handleDOMEvents:{focus:(e,n)=>{t.isFocused=!0;let r=t.state.tr.setMeta("focus",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1},blur:(e,n)=>{t.isFocused=!1;let r=t.state.tr.setMeta("blur",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1}}}})]}}),fu=U.create({name:"keymap",addKeyboardShortcuts(){let t=()=>this.editor.commands.first(({commands:s})=>[()=>s.undoInputRule(),()=>s.command(({tr:l})=>{let{selection:a,doc:c}=l,{empty:d,$anchor:u}=a,{pos:f,parent:h}=u,p=u.parent.isTextblock&&f>0?l.doc.resolve(f-1):u,m=p.parent.type.spec.isolating,g=u.pos-u.parentOffset,y=m&&p.parent.childCount===1?g===u.pos:I.atStart(c).from===f;return!d||!h.type.isTextblock||h.textContent.length||!y||y&&u.parent.type.name==="paragraph"?!1:s.clearNodes()}),()=>s.deleteSelection(),()=>s.joinBackward(),()=>s.selectNodeBackward()]),e=()=>this.editor.commands.first(({commands:s})=>[()=>s.deleteSelection(),()=>s.deleteCurrentNode(),()=>s.joinForward(),()=>s.selectNodeForward()]),r={Enter:()=>this.editor.commands.first(({commands:s})=>[()=>s.newlineInCode(),()=>s.createParagraphNear(),()=>s.liftEmptyBlock(),()=>s.splitBlock()]),"Mod-Enter":()=>this.editor.commands.exitCode(),Backspace:t,"Mod-Backspace":t,"Shift-Backspace":t,Delete:e,"Mod-Delete":e,"Mod-a":()=>this.editor.commands.selectAll()},o={...r},i={...r,"Ctrl-h":t,"Alt-Backspace":t,"Ctrl-d":e,"Ctrl-Alt-Backspace":e,"Alt-Delete":e,"Alt-d":e,"Ctrl-a":()=>this.editor.commands.selectTextblockStart(),"Ctrl-e":()=>this.editor.commands.selectTextblockEnd()};return qs()||_d()?i:o},addProseMirrorPlugins(){return[new P({key:new H("clearDocument"),appendTransaction:(t,e,n)=>{if(t.some(m=>m.getMeta("composition")))return;let r=t.some(m=>m.docChanged)&&!e.doc.eq(n.doc),o=t.some(m=>m.getMeta("preventClearDocument"));if(!r||o)return;let{empty:i,from:s,to:l}=e.selection,a=I.atStart(e.doc).from,c=I.atEnd(e.doc).to;if(i||!(s===a&&l===c)||!lr(n.doc))return;let f=n.tr,h=co({state:n,transaction:f}),{commands:p}=new uo({editor:this.editor,state:h});if(p.clearNodes(),!!f.steps.length)return f}})]}}),hu=U.create({name:"paste",addProseMirrorPlugins(){return[new P({key:new H("tiptapPaste"),props:{handlePaste:(t,e,n)=>{this.editor.emit("paste",{editor:this.editor,event:e,slice:n})}}})]}}),pu=U.create({name:"tabindex",addProseMirrorPlugins(){return[new P({key:new H("tabindex"),props:{attributes:()=>this.editor.isEditable?{tabindex:"0"}:{}}})]}}),mu=U.create({name:"textDirection",addOptions(){return{direction:void 0}},addGlobalAttributes(){if(!this.options.direction)return[];let{nodeExtensions:t}=An(this.extensions);return[{types:t.filter(e=>e.name!=="text").map(e=>e.name),attributes:{dir:{default:this.options.direction,parseHTML:e=>{let n=e.getAttribute("dir");return n&&(n==="ltr"||n==="rtl"||n==="auto")?n:this.options.direction},renderHTML:e=>e.dir?{dir:e.dir}:{}}}}]},addProseMirrorPlugins(){return[new P({key:new H("textDirection"),props:{attributes:()=>{let t=this.options.direction;return t?{dir:t}:{}}}})]}}),bb=class Tn{constructor(e,n,r=!1,o=null){this.currentNode=null,this.actualDepth=null,this.isBlock=r,this.resolvedPos=e,this.editor=n,this.currentNode=o}get name(){return this.node.type.name}get node(){return this.currentNode||this.resolvedPos.node()}get element(){return this.editor.view.domAtPos(this.pos).node}get depth(){var e;return(e=this.actualDepth)!=null?e:this.resolvedPos.depth}get pos(){return this.resolvedPos.pos}get content(){return this.node.content}set content(e){let n=this.from,r=this.to;if(this.isBlock){if(this.content.size===0){console.error(`You can\u2019t set content on a block node. Tried to set content on ${this.name} at ${this.pos}`);return}n=this.from+1,r=this.to-1}this.editor.commands.insertContentAt({from:n,to:r},e)}get attributes(){return this.node.attrs}get textContent(){return this.node.textContent}get size(){return this.node.nodeSize}get from(){return this.isBlock?this.pos:this.resolvedPos.start(this.resolvedPos.depth)}get range(){return{from:this.from,to:this.to}}get to(){return this.isBlock?this.pos+this.size:this.resolvedPos.end(this.resolvedPos.depth)+(this.node.isText?0:1)}get parent(){if(this.depth===0)return null;let e=this.resolvedPos.start(this.resolvedPos.depth-1),n=this.resolvedPos.doc.resolve(e);return new Tn(n,this.editor)}get before(){let e=this.resolvedPos.doc.resolve(this.from-(this.isBlock?1:2));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.from-3)),new Tn(e,this.editor)}get after(){let e=this.resolvedPos.doc.resolve(this.to+(this.isBlock?2:1));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.to+3)),new Tn(e,this.editor)}get children(){let e=[];return this.node.content.forEach((n,r)=>{let o=n.isBlock&&!n.isTextblock,i=n.isAtom&&!n.isText,s=this.pos+r+(i?0:1);if(s<0||s>this.resolvedPos.doc.nodeSize-2)return;let l=this.resolvedPos.doc.resolve(s);if(!o&&l.depth<=this.depth)return;let a=new Tn(l,this.editor,o,o?n:null);o&&(a.actualDepth=this.depth+1),e.push(new Tn(l,this.editor,o,o?n:null))}),e}get firstChild(){return this.children[0]||null}get lastChild(){let e=this.children;return e[e.length-1]||null}closest(e,n={}){let r=null,o=this.parent;for(;o&&!r;){if(o.node.type.name===e)if(Object.keys(n).length>0){let i=o.node.attrs,s=Object.keys(n);for(let l=0;l{r&&o.length>0||(s.node.type.name===e&&i.every(a=>n[a]===s.node.attrs[a])&&o.push(s),!(r&&o.length>0)&&(o=o.concat(s.querySelectorAll(e,n,r))))}),o}setAttribute(e){let{tr:n}=this.editor.state;n.setNodeMarkup(this.from,void 0,{...this.node.attrs,...e}),this.editor.view.dispatch(n)}},wb=`.ProseMirror { position: relative; } .ProseMirror { word-wrap: break-word; white-space: pre-wrap; white-space: break-spaces; -webkit-font-variant-ligatures: none; font-variant-ligatures: none; font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ } .ProseMirror [contenteditable="false"] { white-space: normal; } .ProseMirror [contenteditable="false"] [contenteditable="true"] { white-space: pre-wrap; } .ProseMirror pre { white-space: pre-wrap; } img.ProseMirror-separator { display: inline !important; border: none !important; margin: 0 !important; width: 0 !important; height: 0 !important; } .ProseMirror-gapcursor { display: none; pointer-events: none; position: absolute; margin: 0; } .ProseMirror-gapcursor:after { content: ""; display: block; position: absolute; top: -2px; width: 20px; border-top: 1px solid black; animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; } @keyframes ProseMirror-cursor-blink { to { visibility: hidden; } } .ProseMirror-hideselection *::selection { background: transparent; } .ProseMirror-hideselection *::-moz-selection { background: transparent; } .ProseMirror-hideselection * { caret-color: transparent; } .ProseMirror-focused .ProseMirror-gapcursor { display: block; }`;function xb(t,e,n){let r=document.querySelector(`style[data-tiptap-style${n?`-${n}`:""}]`);if(r!==null)return r;let o=document.createElement("style");return e&&o.setAttribute("nonce",e),o.setAttribute(`data-tiptap-style${n?`-${n}`:""}`,""),o.innerHTML=t,document.getElementsByTagName("head")[0].appendChild(o),o}var gu=class extends lb{constructor(t={}){super(),this.css=null,this.className="tiptap",this.editorView=null,this.isFocused=!1,this.isInitialized=!1,this.extensionStorage={},this.instanceId=Math.random().toString(36).slice(2,9),this.options={element:typeof document<"u"?document.createElement("div"):null,content:"",injectCSS:!0,injectNonce:void 0,extensions:[],autofocus:!1,editable:!0,textDirection:void 0,editorProps:{},parseOptions:{},coreExtensionOptions:{},enableInputRules:!0,enablePasteRules:!0,enableCoreExtensions:!0,enableContentCheck:!1,emitContentError:!1,onBeforeCreate:()=>null,onCreate:()=>null,onMount:()=>null,onUnmount:()=>null,onUpdate:()=>null,onSelectionUpdate:()=>null,onTransaction:()=>null,onFocus:()=>null,onBlur:()=>null,onDestroy:()=>null,onContentError:({error:r})=>{throw r},onPaste:()=>null,onDrop:()=>null,onDelete:()=>null},this.isCapturingTransaction=!1,this.capturedTransaction=null,this.utils={getUpdatedPosition:Hy,createMappablePosition:$y},this.setOptions(t),this.createExtensionManager(),this.createCommandManager(),this.createSchema(),this.on("beforeCreate",this.options.onBeforeCreate),this.emit("beforeCreate",{editor:this}),this.on("mount",this.options.onMount),this.on("unmount",this.options.onUnmount),this.on("contentError",this.options.onContentError),this.on("create",this.options.onCreate),this.on("update",this.options.onUpdate),this.on("selectionUpdate",this.options.onSelectionUpdate),this.on("transaction",this.options.onTransaction),this.on("focus",this.options.onFocus),this.on("blur",this.options.onBlur),this.on("destroy",this.options.onDestroy),this.on("drop",({event:r,slice:o,moved:i})=>this.options.onDrop(r,o,i)),this.on("paste",({event:r,slice:o})=>this.options.onPaste(r,o)),this.on("delete",this.options.onDelete);let e=this.createDoc(),n=Fd(e,this.options.autofocus);this.editorState=Fr.create({doc:e,schema:this.schema,selection:n||void 0}),this.options.element&&this.mount(this.options.element)}mount(t){if(typeof document>"u")throw new Error("[tiptap error]: The editor cannot be mounted because there is no 'document' defined in this environment.");this.createView(t),this.emit("mount",{editor:this}),this.css&&!document.head.contains(this.css)&&document.head.appendChild(this.css),window.setTimeout(()=>{this.isDestroyed||(this.options.autofocus!==!1&&this.options.autofocus!==null&&this.commands.focus(this.options.autofocus),this.emit("create",{editor:this}),this.isInitialized=!0)},0)}unmount(){if(this.editorView){let t=this.editorView.dom;t?.editor&&delete t.editor,this.editorView.destroy()}if(this.editorView=null,this.isInitialized=!1,this.css&&!document.querySelectorAll(`.${this.className}`).length)try{typeof this.css.remove=="function"?this.css.remove():this.css.parentNode&&this.css.parentNode.removeChild(this.css)}catch(t){console.warn("Failed to remove CSS element:",t)}this.css=null,this.emit("unmount",{editor:this})}get storage(){return this.extensionStorage}get commands(){return this.commandManager.commands}chain(){return this.commandManager.chain()}can(){return this.commandManager.can()}injectCSS(){this.options.injectCSS&&typeof document<"u"&&(this.css=xb(wb,this.options.injectNonce))}setOptions(t={}){this.options={...this.options,...t},!(!this.editorView||!this.state||this.isDestroyed)&&(this.options.editorProps&&this.view.setProps(this.options.editorProps),this.view.updateState(this.state))}setEditable(t,e=!0){this.setOptions({editable:t}),e&&this.emit("update",{editor:this,transaction:this.state.tr,appendedTransactions:[]})}get isEditable(){return this.options.editable&&this.view&&this.view.editable}get view(){return this.editorView?this.editorView:new Proxy({state:this.editorState,updateState:t=>{this.editorState=t},dispatch:t=>{this.dispatchTransaction(t)},composing:!1,dragging:null,editable:!0,isDestroyed:!1},{get:(t,e)=>{if(this.editorView)return this.editorView[e];if(e==="state")return this.editorState;if(e in t)return Reflect.get(t,e);throw new Error(`[tiptap error]: The editor view is not available. Cannot access view['${e}']. The editor may not be mounted yet.`)}})}get state(){return this.editorView&&(this.editorState=this.view.state),this.editorState}registerPlugin(t,e){let n=Ud(e)?e(t,[...this.state.plugins]):[...this.state.plugins,t],r=this.state.reconfigure({plugins:n});return this.view.updateState(r),r}unregisterPlugin(t){if(this.isDestroyed)return;let e=this.state.plugins,n=e;if([].concat(t).forEach(o=>{let i=typeof o=="string"?`${o}$`:o.key;n=n.filter(s=>!s.key.startsWith(i))}),e.length===n.length)return;let r=this.state.reconfigure({plugins:n});return this.view.updateState(r),r}createExtensionManager(){var t,e;let r=[...this.options.enableCoreExtensions?[cu,iu.configure({blockSeparator:(e=(t=this.options.coreExtensionOptions)==null?void 0:t.clipboardTextSerializer)==null?void 0:e.blockSeparator}),su,uu,fu,pu,au,hu,lu,mu.configure({direction:this.options.textDirection})].filter(o=>typeof this.options.enableCoreExtensions=="object"?this.options.enableCoreExtensions[o.name]!==!1:!0):[],...this.options.extensions].filter(o=>["extension","node","mark"].includes(o?.type));this.extensionManager=new yo(r,this)}createCommandManager(){this.commandManager=new uo({editor:this})}createSchema(){this.schema=this.extensionManager.schema}createDoc(){let t;try{t=_s(this.options.content,this.schema,this.options.parseOptions,{errorOnInvalidContent:this.options.enableContentCheck})}catch(e){if(!(e instanceof Error)||!["[tiptap error]: Invalid JSON content","[tiptap error]: Invalid HTML content"].includes(e.message))throw e;this.emit("contentError",{editor:this,error:e,disableCollaboration:()=>{"collaboration"in this.storage&&typeof this.storage.collaboration=="object"&&this.storage.collaboration&&(this.storage.collaboration.isDisabled=!0),this.options.extensions=this.options.extensions.filter(n=>n.name!=="collaboration"),this.createExtensionManager()}}),t=_s(this.options.content,this.schema,this.options.parseOptions,{errorOnInvalidContent:!1})}return t}createView(t){var e;this.editorView=new tr(t,{...this.options.editorProps,attributes:{role:"textbox",...(e=this.options.editorProps)==null?void 0:e.attributes},dispatchTransaction:this.dispatchTransaction.bind(this),state:this.editorState,markViews:this.extensionManager.markViews,nodeViews:this.extensionManager.nodeViews});let n=this.state.reconfigure({plugins:this.extensionManager.plugins});this.view.updateState(n),this.prependClass(),this.injectCSS();let r=this.view.dom;r.editor=this}createNodeViews(){this.view.isDestroyed||this.view.setProps({markViews:this.extensionManager.markViews,nodeViews:this.extensionManager.nodeViews})}prependClass(){this.view.dom.className=`${this.className} ${this.view.dom.className}`}captureTransaction(t){this.isCapturingTransaction=!0,t(),this.isCapturingTransaction=!1;let e=this.capturedTransaction;return this.capturedTransaction=null,e}dispatchTransaction(t){if(this.view.isDestroyed)return;if(this.isCapturingTransaction){if(!this.capturedTransaction){this.capturedTransaction=t;return}t.steps.forEach(c=>{var d;return(d=this.capturedTransaction)==null?void 0:d.step(c)});return}let{state:e,transactions:n}=this.state.applyTransaction(t),r=!this.state.selection.eq(e.selection),o=n.includes(t),i=this.state;if(this.emit("beforeTransaction",{editor:this,transaction:t,nextState:e}),!o)return;this.view.updateState(e),this.emit("transaction",{editor:this,transaction:t,appendedTransactions:n.slice(1)}),r&&this.emit("selectionUpdate",{editor:this,transaction:t});let s=n.findLast(c=>c.getMeta("focus")||c.getMeta("blur")),l=s?.getMeta("focus"),a=s?.getMeta("blur");l&&this.emit("focus",{editor:this,event:l.event,transaction:s}),a&&this.emit("blur",{editor:this,event:a.event,transaction:s}),!(t.getMeta("preventUpdate")||!n.some(c=>c.docChanged)||i.doc.eq(e.doc))&&this.emit("update",{editor:this,transaction:t,appendedTransactions:n.slice(1)})}getAttributes(t){return Zs(this.state,t)}isActive(t,e){let n=typeof t=="string"?t:null,r=typeof t=="string"?e:t;return tl(this.state,n,r)}getJSON(){return this.state.doc.toJSON()}getHTML(){return Ys(this.state.doc.content,this.schema)}getText(t){let{blockSeparator:e=` `,textSerializers:n={}}=t||{};return Iy(this.state.doc,{blockSeparator:e,textSerializers:{...Gd(this.schema),...n}})}get isEmpty(){return lr(this.state.doc)}destroy(){this.emit("destroy"),this.unmount(),this.removeAllListeners()}get isDestroyed(){var t,e;return(e=(t=this.editorView)==null?void 0:t.isDestroyed)!=null?e:!0}$node(t,e){var n;return((n=this.$doc)==null?void 0:n.querySelector(t,e))||null}$nodes(t,e){var n;return((n=this.$doc)==null?void 0:n.querySelectorAll(t,e))||null}$pos(t){let e=this.state.doc.resolve(t);return new bb(e,this)}get $doc(){return this.$pos(0)}};function Be(t){return new go({find:t.find,handler:({state:e,range:n,match:r})=>{let o=G(t.getAttributes,void 0,r);if(o===!1||o===null)return null;let{tr:i}=e,s=r[r.length-1],l=r[0];if(s){let a=l.search(/\S/),c=n.from+l.indexOf(s),d=c+s.length;if(po(n.from,n.to,e.doc).filter(h=>h.mark.type.excluded.find(m=>m===t.type&&m!==h.mark.type)).filter(h=>h.to>c).length)return null;dn.from&&i.delete(n.from+a,c);let f=n.from+a+s.length;i.addMark(n.from+a,f,t.type.create(o||{})),i.removeStoredMark(t.type)}},undoable:t.undoable})}function bo(t){return new go({find:t.find,handler:({state:e,range:n,match:r})=>{let o=G(t.getAttributes,void 0,r)||{},{tr:i}=e,s=n.from,l=n.to,a=t.type.create(o);if(r[1]){let c=r[0].lastIndexOf(r[1]),d=s+c;d>l?d=l:l=d+r[1].length;let u=r[0][r[0].length-1];i.insertText(u,s+r[0].length-1),i.replaceWith(d,l,a)}else if(r[0]){let c=t.type.isInline?s:s-1;i.insert(c,t.type.create(o)).delete(i.mapping.map(s),i.mapping.map(l))}i.scrollIntoView()},undoable:t.undoable})}function ar(t){return new go({find:t.find,handler:({state:e,range:n,match:r})=>{let o=e.doc.resolve(n.from),i=G(t.getAttributes,void 0,r)||{};if(!o.node(-1).canReplaceWith(o.index(-1),o.indexAfter(-1),t.type))return null;e.tr.delete(n.from,n.to).setBlockType(n.from,n.from,t.type,i)},undoable:t.undoable})}function tt(t){return new go({find:t.find,handler:({state:e,range:n,match:r,chain:o})=>{let i=G(t.getAttributes,void 0,r)||{},s=e.tr.delete(n.from,n.to),a=s.doc.resolve(n.from).blockRange(),c=a&&mn(a,t.type,i);if(!c)return null;if(s.wrap(a,c),t.keepMarks&&t.editor){let{selection:u,storedMarks:f}=e,{splittableMarks:h}=t.editor.extensionManager,p=f||u.$to.parentOffset&&u.$from.marks();if(p){let m=p.filter(g=>h.includes(g.type.name));s.ensureMarks(m)}}if(t.keepAttributes){let u=t.type.name==="bulletList"||t.type.name==="orderedList"?"listItem":"taskList";o().updateAttributes(u,i).run()}let d=s.doc.resolve(n.from-1).nodeBefore;d&&d.type===t.type&&Re(s.doc,n.from-1)&&(!t.joinPredicate||t.joinPredicate(r,d))&&s.join(n.from-1)},undoable:t.undoable})}var kb=t=>"touches"in t,yu=class{constructor(t){this.directions=["bottom-left","bottom-right","top-left","top-right"],this.minSize={height:8,width:8},this.preserveAspectRatio=!1,this.classNames={container:"",wrapper:"",handle:"",resizing:""},this.initialWidth=0,this.initialHeight=0,this.aspectRatio=1,this.isResizing=!1,this.activeHandle=null,this.startX=0,this.startY=0,this.startWidth=0,this.startHeight=0,this.isShiftKeyPressed=!1,this.lastEditableState=void 0,this.handleMap=new Map,this.handleMouseMove=l=>{if(!this.isResizing||!this.activeHandle)return;let a=l.clientX-this.startX,c=l.clientY-this.startY;this.handleResize(a,c)},this.handleTouchMove=l=>{if(!this.isResizing||!this.activeHandle)return;let a=l.touches[0];if(!a)return;let c=a.clientX-this.startX,d=a.clientY-this.startY;this.handleResize(c,d)},this.handleMouseUp=()=>{if(!this.isResizing)return;let l=this.element.offsetWidth,a=this.element.offsetHeight;this.onCommit(l,a),this.isResizing=!1,this.activeHandle=null,this.container.dataset.resizeState="false",this.classNames.resizing&&this.container.classList.remove(this.classNames.resizing),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),document.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("keyup",this.handleKeyUp)},this.handleKeyDown=l=>{l.key==="Shift"&&(this.isShiftKeyPressed=!0)},this.handleKeyUp=l=>{l.key==="Shift"&&(this.isShiftKeyPressed=!1)};var e,n,r,o,i,s;this.node=t.node,this.editor=t.editor,this.element=t.element,this.contentElement=t.contentElement,this.getPos=t.getPos,this.onResize=t.onResize,this.onCommit=t.onCommit,this.onUpdate=t.onUpdate,(e=t.options)!=null&&e.min&&(this.minSize={...this.minSize,...t.options.min}),(n=t.options)!=null&&n.max&&(this.maxSize=t.options.max),(r=t?.options)!=null&&r.directions&&(this.directions=t.options.directions),(o=t.options)!=null&&o.preserveAspectRatio&&(this.preserveAspectRatio=t.options.preserveAspectRatio),(i=t.options)!=null&&i.className&&(this.classNames={container:t.options.className.container||"",wrapper:t.options.className.wrapper||"",handle:t.options.className.handle||"",resizing:t.options.className.resizing||""}),(s=t.options)!=null&&s.createCustomHandle&&(this.createCustomHandle=t.options.createCustomHandle),this.wrapper=this.createWrapper(),this.container=this.createContainer(),this.applyInitialSize(),this.attachHandles(),this.editor.on("update",this.handleEditorUpdate.bind(this))}get dom(){return this.container}get contentDOM(){return this.contentElement}handleEditorUpdate(){let t=this.editor.isEditable;t!==this.lastEditableState&&(this.lastEditableState=t,t?t&&this.handleMap.size===0&&this.attachHandles():this.removeHandles())}update(t,e,n){return t.type!==this.node.type?!1:(this.node=t,this.onUpdate?this.onUpdate(t,e,n):!0)}destroy(){this.isResizing&&(this.container.dataset.resizeState="false",this.classNames.resizing&&this.container.classList.remove(this.classNames.resizing),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),document.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("keyup",this.handleKeyUp),this.isResizing=!1,this.activeHandle=null),this.editor.off("update",this.handleEditorUpdate.bind(this)),this.container.remove()}createContainer(){let t=document.createElement("div");return t.dataset.resizeContainer="",t.dataset.node=this.node.type.name,t.style.display="flex",this.classNames.container&&(t.className=this.classNames.container),t.appendChild(this.wrapper),t}createWrapper(){let t=document.createElement("div");return t.style.position="relative",t.style.display="block",t.dataset.resizeWrapper="",this.classNames.wrapper&&(t.className=this.classNames.wrapper),t.appendChild(this.element),t}createHandle(t){let e=document.createElement("div");return e.dataset.resizeHandle=t,e.style.position="absolute",this.classNames.handle&&(e.className=this.classNames.handle),e}positionHandle(t,e){let n=e.includes("top"),r=e.includes("bottom"),o=e.includes("left"),i=e.includes("right");n&&(t.style.top="0"),r&&(t.style.bottom="0"),o&&(t.style.left="0"),i&&(t.style.right="0"),(e==="top"||e==="bottom")&&(t.style.left="0",t.style.right="0"),(e==="left"||e==="right")&&(t.style.top="0",t.style.bottom="0")}attachHandles(){this.directions.forEach(t=>{let e;this.createCustomHandle?e=this.createCustomHandle(t):e=this.createHandle(t),e instanceof HTMLElement||(console.warn(`[ResizableNodeView] createCustomHandle("${t}") did not return an HTMLElement. Falling back to default handle.`),e=this.createHandle(t)),this.createCustomHandle||this.positionHandle(e,t),e.addEventListener("mousedown",n=>this.handleResizeStart(n,t)),e.addEventListener("touchstart",n=>this.handleResizeStart(n,t)),this.handleMap.set(t,e),this.wrapper.appendChild(e)})}removeHandles(){this.handleMap.forEach(t=>t.remove()),this.handleMap.clear()}applyInitialSize(){let t=this.node.attrs.width,e=this.node.attrs.height;t?(this.element.style.width=`${t}px`,this.initialWidth=t):this.initialWidth=this.element.offsetWidth,e?(this.element.style.height=`${e}px`,this.initialHeight=e):this.initialHeight=this.element.offsetHeight,this.initialWidth>0&&this.initialHeight>0&&(this.aspectRatio=this.initialWidth/this.initialHeight)}handleResizeStart(t,e){t.preventDefault(),t.stopPropagation(),this.isResizing=!0,this.activeHandle=e,kb(t)?(this.startX=t.touches[0].clientX,this.startY=t.touches[0].clientY):(this.startX=t.clientX,this.startY=t.clientY),this.startWidth=this.element.offsetWidth,this.startHeight=this.element.offsetHeight,this.startWidth>0&&this.startHeight>0&&(this.aspectRatio=this.startWidth/this.startHeight);let n=this.getPos();this.container.dataset.resizeState="true",this.classNames.resizing&&this.container.classList.add(this.classNames.resizing),document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("touchmove",this.handleTouchMove),document.addEventListener("mouseup",this.handleMouseUp),document.addEventListener("keydown",this.handleKeyDown),document.addEventListener("keyup",this.handleKeyUp)}handleResize(t,e){if(!this.activeHandle)return;let n=this.preserveAspectRatio||this.isShiftKeyPressed,{width:r,height:o}=this.calculateNewDimensions(this.activeHandle,t,e),i=this.applyConstraints(r,o,n);this.element.style.width=`${i.width}px`,this.element.style.height=`${i.height}px`,this.onResize&&this.onResize(i.width,i.height)}calculateNewDimensions(t,e,n){let r=this.startWidth,o=this.startHeight,i=t.includes("right"),s=t.includes("left"),l=t.includes("bottom"),a=t.includes("top");return i?r=this.startWidth+e:s&&(r=this.startWidth-e),l?o=this.startHeight+n:a&&(o=this.startHeight-n),(t==="right"||t==="left")&&(r=this.startWidth+(i?e:-e)),(t==="top"||t==="bottom")&&(o=this.startHeight+(l?n:-n)),this.preserveAspectRatio||this.isShiftKeyPressed?this.applyAspectRatio(r,o,t):{width:r,height:o}}applyConstraints(t,e,n){var r,o,i,s;if(!n){let c=Math.max(this.minSize.width,t),d=Math.max(this.minSize.height,e);return(r=this.maxSize)!=null&&r.width&&(c=Math.min(this.maxSize.width,c)),(o=this.maxSize)!=null&&o.height&&(d=Math.min(this.maxSize.height,d)),{width:c,height:d}}let l=t,a=e;return lthis.maxSize.width&&(l=this.maxSize.width,a=l/this.aspectRatio),(s=this.maxSize)!=null&&s.height&&a>this.maxSize.height&&(a=this.maxSize.height,l=a*this.aspectRatio),{width:l,height:a}}applyAspectRatio(t,e,n){let r=n==="left"||n==="right",o=n==="top"||n==="bottom";return r?{width:t,height:t/this.aspectRatio}:o?{width:e*this.aspectRatio,height:e}:{width:t,height:t/this.aspectRatio}}};function bu(t,e){let{selection:n}=t,{$from:r}=n;if(n instanceof L){let i=r.index();return r.parent.canReplaceWith(i,i+1,e)}let o=r.depth;for(;o>=0;){let i=r.index(o);if(r.node(o).contentMatchAt(i).matchType(e))return!0;o-=1}return!1}function wu(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}var Sb={};js(Sb,{createAtomBlockMarkdownSpec:()=>Cb,createBlockMarkdownSpec:()=>Zt,createInlineMarkdownSpec:()=>Tb,parseAttributes:()=>rl,parseIndentedBlocks:()=>wo,renderNestedMarkdownContent:()=>cr,serializeAttributes:()=>ol});function rl(t){if(!t?.trim())return{};let e={},n=[],r=t.replace(/["']([^"']*)["']/g,c=>(n.push(c),`__QUOTED_${n.length-1}__`)),o=r.match(/(?:^|\s)\.([a-zA-Z][\w-]*)/g);if(o){let c=o.map(d=>d.trim().slice(1));e.class=c.join(" ")}let i=r.match(/(?:^|\s)#([a-zA-Z][\w-]*)/);i&&(e.id=i[1]);let s=/([a-zA-Z][\w-]*)\s*=\s*(__QUOTED_\d+__)/g;Array.from(r.matchAll(s)).forEach(([,c,d])=>{var u;let f=parseInt(((u=d.match(/__QUOTED_(\d+)__/))==null?void 0:u[1])||"0",10),h=n[f];h&&(e[c]=h.slice(1,-1))});let a=r.replace(/(?:^|\s)\.([a-zA-Z][\w-]*)/g,"").replace(/(?:^|\s)#([a-zA-Z][\w-]*)/g,"").replace(/([a-zA-Z][\w-]*)\s*=\s*__QUOTED_\d+__/g,"").trim();return a&&a.split(/\s+/).filter(Boolean).forEach(d=>{d.match(/^[a-zA-Z][\w-]*$/)&&(e[d]=!0)}),e}function ol(t){if(!t||Object.keys(t).length===0)return"";let e=[];return t.class&&String(t.class).split(/\s+/).filter(Boolean).forEach(r=>e.push(`.${r}`)),t.id&&e.push(`#${t.id}`),Object.entries(t).forEach(([n,r])=>{n==="class"||n==="id"||(r===!0?e.push(n):r!==!1&&r!=null&&e.push(`${n}="${String(r)}"`))}),e.join(" ")}function Cb(t){let{nodeName:e,name:n,parseAttributes:r=rl,serializeAttributes:o=ol,defaultAttributes:i={},requiredAttributes:s=[],allowedAttributes:l}=t,a=n||e,c=d=>{if(!l)return d;let u={};return l.forEach(f=>{f in d&&(u[f]=d[f])}),u};return{parseMarkdown:(d,u)=>{let f={...i,...d.attributes};return u.createNode(e,f,[])},markdownTokenizer:{name:e,level:"block",start(d){var u;let f=new RegExp(`^:::${a}(?:\\s|$)`,"m"),h=(u=d.match(f))==null?void 0:u.index;return h!==void 0?h:-1},tokenize(d,u,f){let h=new RegExp(`^:::${a}(?:\\s+\\{([^}]*)\\})?\\s*:::(?:\\n|$)`),p=d.match(h);if(!p)return;let m=p[1]||"",g=r(m);if(!s.find(w=>!(w in g)))return{type:e,raw:p[0],attributes:g}}},renderMarkdown:d=>{let u=c(d.attrs||{}),f=o(u),h=f?` {${f}}`:"";return`:::${a}${h} :::`}}}function Zt(t){let{nodeName:e,name:n,getContent:r,parseAttributes:o=rl,serializeAttributes:i=ol,defaultAttributes:s={},content:l="block",allowedAttributes:a}=t,c=n||e,d=u=>{if(!a)return u;let f={};return a.forEach(h=>{h in u&&(f[h]=u[h])}),f};return{parseMarkdown:(u,f)=>{let h;if(r){let m=r(u);h=typeof m=="string"?[{type:"text",text:m}]:m}else l==="block"?h=f.parseChildren(u.tokens||[]):h=f.parseInline(u.tokens||[]);let p={...s,...u.attributes};return f.createNode(e,p,h)},markdownTokenizer:{name:e,level:"block",start(u){var f;let h=new RegExp(`^:::${c}`,"m"),p=(f=u.match(h))==null?void 0:f.index;return p!==void 0?p:-1},tokenize(u,f,h){var p;let m=new RegExp(`^:::${c}(?:\\s+\\{([^}]*)\\})?\\s*\\n`),g=u.match(m);if(!g)return;let[y,w=""]=g,b=o(w),C=1,x=y.length,S="",k=/^:::([\w-]*)(\s.*)?/gm,O=u.slice(x);for(k.lastIndex=0;;){let T=k.exec(O);if(T===null)break;let A=T.index,$=T[1];if(!((p=T[2])!=null&&p.endsWith(":::"))){if($)C+=1;else if(C-=1,C===0){let z=O.slice(0,A);S=z.trim();let K=u.slice(0,x+A+T[0].length),V=[];if(S)if(l==="block")for(V=h.blockTokens(z),V.forEach(N=>{N.text&&(!N.tokens||N.tokens.length===0)&&(N.tokens=h.inlineTokens(N.text))});V.length>0;){let N=V[V.length-1];if(N.type==="paragraph"&&(!N.text||N.text.trim()===""))V.pop();else break}else V=h.inlineTokens(S);return{type:e,raw:K,attributes:b,content:S,tokens:V}}}}}},renderMarkdown:(u,f)=>{let h=d(u.attrs||{}),p=i(h),m=p?` {${p}}`:"",g=f.renderChildren(u.content||[],` `);return`:::${c}${m} ${g} :::`}}}function vb(t){if(!t.trim())return{};let e={},n=/(\w+)=(?:"([^"]*)"|'([^']*)')/g,r=n.exec(t);for(;r!==null;){let[,o,i,s]=r;e[o]=i||s,r=n.exec(t)}return e}function Mb(t){return Object.entries(t).filter(([,e])=>e!=null).map(([e,n])=>`${e}="${n}"`).join(" ")}function Tb(t){let{nodeName:e,name:n,getContent:r,parseAttributes:o=vb,serializeAttributes:i=Mb,defaultAttributes:s={},selfClosing:l=!1,allowedAttributes:a}=t,c=n||e,d=f=>{if(!a)return f;let h={};return a.forEach(p=>{let m=typeof p=="string"?p:p.name,g=typeof p=="string"?void 0:p.skipIfDefault;if(m in f){let y=f[m];if(g!==void 0&&y===g)return;h[m]=y}}),h},u=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return{parseMarkdown:(f,h)=>{let p={...s,...f.attributes};if(l)return h.createNode(e,p);let m=r?r(f):f.content||"";return m?h.createNode(e,p,[h.createTextNode(m)]):h.createNode(e,p,[])},markdownTokenizer:{name:e,level:"inline",start(f){let h=l?new RegExp(`\\[${u}\\s*[^\\]]*\\]`):new RegExp(`\\[${u}\\s*[^\\]]*\\][\\s\\S]*?\\[\\/${u}\\]`),p=f.match(h),m=p?.index;return m!==void 0?m:-1},tokenize(f,h,p){let m=l?new RegExp(`^\\[${u}\\s*([^\\]]*)\\]`):new RegExp(`^\\[${u}\\s*([^\\]]*)\\]([\\s\\S]*?)\\[\\/${u}\\]`),g=f.match(m);if(!g)return;let y="",w="";if(l){let[,C]=g;w=C}else{let[,C,x]=g;w=C,y=x||""}let b=o(w.trim());return{type:e,raw:g[0],content:y.trim(),attributes:b}}},renderMarkdown:f=>{let h="";r?h=r(f):f.content&&f.content.length>0&&(h=f.content.filter(y=>y.type==="text").map(y=>y.text).join(""));let p=d(f.attrs||{}),m=i(p),g=m?` ${m}`:"";return l?`[${c}${g}]`:`[${c}${g}]${h}[/${c}]`}}}function wo(t,e,n){var r,o,i,s;let l=t.split(` `),a=[],c="",d=0,u=e.baseIndentSize||2;for(;d0)break;if(f.trim()===""){d+=1,c=`${c}${f} `;continue}else return}let p=e.extractItemData(h),{indentLevel:m,mainContent:g}=p;c=`${c}${f} `;let y=[g];for(d+=1;dA.trim()!=="");if(k===-1)break;if((((o=(r=l[d+1+k].match(/^(\s*)/))==null?void 0:r[1])==null?void 0:o.length)||0)>m){y.push(x),c=`${c}${x} `,d+=1;continue}else break}if((((s=(i=x.match(/^(\s*)/))==null?void 0:i[1])==null?void 0:s.length)||0)>m)y.push(x),c=`${c}${x} `,d+=1;else break}let w,b=y.slice(1);if(b.length>0){let x=b.map(S=>S.slice(m+u)).join(` `);x.trim()&&(e.customNestedParser?w=e.customNestedParser(x):w=n.blockTokens(x))}let C=e.createToken(p,w);a.push(C)}if(a.length!==0)return{items:a,raw:c}}function cr(t,e,n,r){if(!t||!Array.isArray(t.content))return"";let o=typeof n=="function"?n(r):n,[i,...s]=t.content,l=e.renderChildren([i]),a=[`${o}${l}`];return s&&s.length>0&&s.forEach(c=>{let d=e.renderChildren([c]);if(d){let u=d.split(` `).map(f=>f?e.indent(f):"").join(` `);a.push(u)}}),a.join(` `)}function Ab(t,e,n={}){let{state:r}=e,{doc:o,tr:i}=r,s=t;o.descendants((l,a)=>{let c=i.mapping.map(a),d=i.mapping.map(a)+l.nodeSize,u=null;if(l.marks.forEach(h=>{if(h!==s)return!1;u=h}),!u)return;let f=!1;if(Object.keys(n).forEach(h=>{n[h]!==u.attrs[h]&&(f=!0)}),f){let h=t.type.create({...t.attrs,...n});i.removeMark(c,d,t.type),i.addMark(c,d,h)}}),i.docChanged&&e.view.dispatch(i)}var F=class xu extends nl{constructor(){super(...arguments),this.type="node"}static create(e={}){let n=typeof e=="function"?e():e;return new xu(n)}configure(e){return super.configure(e)}extend(e){let n=typeof e=="function"?e():e;return super.extend(n)}};function Me(t){return new fb({find:t.find,handler:({state:e,range:n,match:r,pasteEvent:o})=>{let i=G(t.getAttributes,void 0,r,o);if(i===!1||i===null)return null;let{tr:s}=e,l=r[r.length-1],a=r[0],c=n.to;if(l){let d=a.search(/\S/),u=n.from+a.indexOf(l),f=u+l.length;if(po(n.from,n.to,e.doc).filter(p=>p.mark.type.excluded.find(g=>g===t.type&&g!==p.mark.type)).filter(p=>p.to>u).length)return null;fn.from&&s.delete(n.from+d,u),c=n.from+d+l.length,s.addMark(n.from+d,c,t.type.create(i||{})),s.removeStoredMark(t.type)}}})}function ku(t={}){return new P({view(e){return new il(e,t)}})}var il=class{constructor(e,n){var r;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.width=(r=n.width)!==null&&r!==void 0?r:1,this.color=n.color===!1?void 0:n.color||"black",this.class=n.class,this.handlers=["dragover","dragend","drop","dragleave"].map(o=>{let i=s=>{this[o](s)};return e.dom.addEventListener(o,i),{name:o,handler:i}})}destroy(){this.handlers.forEach(({name:e,handler:n})=>this.editorView.dom.removeEventListener(e,n))}update(e,n){this.cursorPos!=null&&n.doc!=e.state.doc&&(this.cursorPos>e.state.doc.content.size?this.setCursor(null):this.updateOverlay())}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),n=!e.parent.inlineContent,r,o=this.editorView.dom,i=o.getBoundingClientRect(),s=i.width/o.offsetWidth,l=i.height/o.offsetHeight;if(n){let u=e.nodeBefore,f=e.nodeAfter;if(u||f){let h=this.editorView.nodeDOM(this.cursorPos-(u?u.nodeSize:0));if(h){let p=h.getBoundingClientRect(),m=u?p.bottom:p.top;u&&f&&(m=(m+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let g=this.width/2*l;r={left:p.left,right:p.right,top:m-g,bottom:m+g}}}}if(!r){let u=this.editorView.coordsAtPos(this.cursorPos),f=this.width/2*s;r={left:u.left-f,right:u.left+f,top:u.top,bottom:u.bottom}}let a=this.editorView.dom.offsetParent;this.element||(this.element=a.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",n),this.element.classList.toggle("prosemirror-dropcursor-inline",!n);let c,d;if(!a||a==document.body&&getComputedStyle(a).position=="static")c=-pageXOffset,d=-pageYOffset;else{let u=a.getBoundingClientRect(),f=u.width/a.offsetWidth,h=u.height/a.offsetHeight;c=u.left-a.scrollLeft*f,d=u.top-a.scrollTop*h}this.element.style.left=(r.left-c)/s+"px",this.element.style.top=(r.top-d)/l+"px",this.element.style.width=(r.right-r.left)/s+"px",this.element.style.height=(r.bottom-r.top)/l+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}dragover(e){if(!this.editorView.editable)return;let n=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),r=n&&n.inside>=0&&this.editorView.state.doc.nodeAt(n.inside),o=r&&r.type.spec.disableDropCursor,i=typeof o=="function"?o(this.editorView,n,e):o;if(n&&!i){let s=n.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let l=zr(this.editorView.state.doc,s,this.editorView.dragging.slice);l!=null&&(s=l)}this.setCursor(s),this.scheduleRemoval(5e3)}}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}};var ae=class t extends I{constructor(e){super(e,e)}map(e,n){let r=e.resolve(n.map(this.head));return t.valid(r)?new t(r):I.near(r)}content(){return E.empty}eq(e){return e instanceof t&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,n){if(typeof n.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new t(e.resolve(n.pos))}getBookmark(){return new sl(this.anchor)}static valid(e){let n=e.parent;if(n.isTextblock||!Eb(e)||!Nb(e))return!1;let r=n.type.spec.allowGapCursor;if(r!=null)return r;let o=n.contentMatchAt(e.index()).defaultType;return o&&o.isTextblock}static findGapCursorFrom(e,n,r=!1){e:for(;;){if(!r&&t.valid(e))return e;let o=e.pos,i=null;for(let s=e.depth;;s--){let l=e.node(s);if(n>0?e.indexAfter(s)0){i=l.child(n>0?e.indexAfter(s):e.index(s)-1);break}else if(s==0)return null;o+=n;let a=e.doc.resolve(o);if(t.valid(a))return a}for(;;){let s=n>0?i.firstChild:i.lastChild;if(!s){if(i.isAtom&&!i.isText&&!L.isSelectable(i)){e=e.doc.resolve(o+i.nodeSize*n),r=!1;continue e}break}i=s,o+=n;let l=e.doc.resolve(o);if(t.valid(l))return l}return null}}};ae.prototype.visible=!1;ae.findFrom=ae.findGapCursorFrom;I.jsonID("gapcursor",ae);var sl=class t{constructor(e){this.pos=e}map(e){return new t(e.map(this.pos))}resolve(e){let n=e.resolve(this.pos);return ae.valid(n)?new ae(n):I.near(n)}};function Su(t){return t.isAtom||t.spec.isolating||t.spec.createGapCursor}function Eb(t){for(let e=t.depth;e>=0;e--){let n=t.index(e),r=t.node(e);if(n==0){if(r.type.spec.isolating)return!0;continue}for(let o=r.child(n-1);;o=o.lastChild){if(o.childCount==0&&!o.inlineContent||Su(o.type))return!0;if(o.inlineContent)return!1}}return!0}function Nb(t){for(let e=t.depth;e>=0;e--){let n=t.indexAfter(e),r=t.node(e);if(n==r.childCount){if(r.type.spec.isolating)return!0;continue}for(let o=r.child(n);;o=o.firstChild){if(o.childCount==0&&!o.inlineContent||Su(o.type))return!0;if(o.inlineContent)return!1}}return!0}function Cu(){return new P({props:{decorations:Ib,createSelectionBetween(t,e,n){return e.pos==n.pos&&ae.valid(n)?new ae(n):null},handleClick:Rb,handleKeyDown:Ob,handleDOMEvents:{beforeinput:Db}}})}var Ob=or({ArrowLeft:xo("horiz",-1),ArrowRight:xo("horiz",1),ArrowUp:xo("vert",-1),ArrowDown:xo("vert",1)});function xo(t,e){let n=t=="vert"?e>0?"down":"up":e>0?"right":"left";return function(r,o,i){let s=r.selection,l=e>0?s.$to:s.$from,a=s.empty;if(s instanceof D){if(!i.endOfTextblock(n)||l.depth==0)return!1;a=!1,l=r.doc.resolve(e>0?l.after():l.before())}let c=ae.findGapCursorFrom(l,e,a);return c?(o&&o(r.tr.setSelection(new ae(c))),!0):!1}}function Rb(t,e,n){if(!t||!t.editable)return!1;let r=t.state.doc.resolve(e);if(!ae.valid(r))return!1;let o=t.posAtCoords({left:n.clientX,top:n.clientY});return o&&o.inside>-1&&L.isSelectable(t.state.doc.nodeAt(o.inside))?!1:(t.dispatch(t.state.tr.setSelection(new ae(r))),!0)}function Db(t,e){if(e.inputType!="insertCompositionText"||!(t.state.selection instanceof ae))return!1;let{$from:n}=t.state.selection,r=n.parent.contentMatchAt(n.index()).findWrapping(t.state.schema.nodes.text);if(!r)return!1;let o=v.empty;for(let s=r.length-1;s>=0;s--)o=v.from(r[s].createAndFill(null,o));let i=t.state.tr.replace(n.pos,n.pos,new E(o,0,0));return i.setSelection(D.near(i.doc.resolve(n.pos+1))),t.dispatch(i),!1}function Ib(t){if(!(t.selection instanceof ae))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",Y.create(t.doc,[te.widget(t.selection.head,e,{key:"gapcursor"})])}var ko=200,he=function(){};he.prototype.append=function(e){return e.length?(e=he.from(e),!this.length&&e||e.length=n?he.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,n))};he.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};he.prototype.forEach=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length),n<=r?this.forEachInner(e,n,r,0):this.forEachInvertedInner(e,n,r,0)};he.prototype.map=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length);var o=[];return this.forEach(function(i,s){return o.push(e(i,s))},n,r),o};he.from=function(e){return e instanceof he?e:e&&e.length?new vu(e):he.empty};var vu=(function(t){function e(r){t.call(this),this.values=r}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(o,i){return o==0&&i==this.length?this:new e(this.values.slice(o,i))},e.prototype.getInner=function(o){return this.values[o]},e.prototype.forEachInner=function(o,i,s,l){for(var a=i;a=s;a--)if(o(this.values[a],l+a)===!1)return!1},e.prototype.leafAppend=function(o){if(this.length+o.length<=ko)return new e(this.values.concat(o.flatten()))},e.prototype.leafPrepend=function(o){if(this.length+o.length<=ko)return new e(o.flatten().concat(this.values))},n.length.get=function(){return this.values.length},n.depth.get=function(){return 0},Object.defineProperties(e.prototype,n),e})(he);he.empty=new vu([]);var Pb=(function(t){function e(n,r){t.call(this),this.left=n,this.right=r,this.length=n.length+r.length,this.depth=Math.max(n.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(r){return rl&&this.right.forEachInner(r,Math.max(o-l,0),Math.min(this.length,i)-l,s+l)===!1)return!1},e.prototype.forEachInvertedInner=function(r,o,i,s){var l=this.left.length;if(o>l&&this.right.forEachInvertedInner(r,o-l,Math.max(i,l)-l,s+l)===!1||i=i?this.right.slice(r-i,o-i):this.left.slice(r,i).append(this.right.slice(0,o-i))},e.prototype.leafAppend=function(r){var o=this.right.leafAppend(r);if(o)return new e(this.left,o)},e.prototype.leafPrepend=function(r){var o=this.left.leafPrepend(r);if(o)return new e(o,this.right)},e.prototype.appendInner=function(r){return this.left.depth>=Math.max(this.right.depth,r.depth)+1?new e(this.left,new e(this.right,r)):new e(this,r)},e})(he),ll=he;var Lb=500,tn=class t{constructor(e,n){this.items=e,this.eventCount=n}popEvent(e,n){if(this.eventCount==0)return null;let r=this.items.length;for(;;r--)if(this.items.get(r-1).selection){--r;break}let o,i;n&&(o=this.remapping(r,this.items.length),i=o.maps.length);let s=e.tr,l,a,c=[],d=[];return this.items.forEach((u,f)=>{if(!u.step){o||(o=this.remapping(r,f+1),i=o.maps.length),i--,d.push(u);return}if(o){d.push(new nt(u.map));let h=u.step.map(o.slice(i)),p;h&&s.maybeStep(h).doc&&(p=s.mapping.maps[s.mapping.maps.length-1],c.push(new nt(p,void 0,void 0,c.length+d.length))),i--,p&&o.appendMap(p,i)}else s.maybeStep(u.step);if(u.selection)return l=o?u.selection.map(o.slice(i)):u.selection,a=new t(this.items.slice(0,r).append(d.reverse().concat(c)),this.eventCount-1),!1},this.items.length,0),{remaining:a,transform:s,selection:l}}addTransform(e,n,r,o){let i=[],s=this.eventCount,l=this.items,a=!o&&l.length?l.get(l.length-1):null;for(let d=0;dzb&&(l=Bb(l,c),s-=c),new t(l.append(i),s)}remapping(e,n){let r=new jn;return this.items.forEach((o,i)=>{let s=o.mirrorOffset!=null&&i-o.mirrorOffset>=e?r.maps.length-o.mirrorOffset:void 0;r.appendMap(o.map,s)},e,n),r}addMaps(e){return this.eventCount==0?this:new t(this.items.append(e.map(n=>new nt(n))),this.eventCount)}rebased(e,n){if(!this.eventCount)return this;let r=[],o=Math.max(0,this.items.length-n),i=e.mapping,s=e.steps.length,l=this.eventCount;this.items.forEach(f=>{f.selection&&l--},o);let a=n;this.items.forEach(f=>{let h=i.getMirror(--a);if(h==null)return;s=Math.min(s,h);let p=i.maps[h];if(f.step){let m=e.steps[h].invert(e.docs[h]),g=f.selection&&f.selection.map(i.slice(a+1,h));g&&l++,r.push(new nt(p,m,g))}else r.push(new nt(p))},o);let c=[];for(let f=n;fLb&&(u=u.compress(this.items.length-r.length)),u}emptyItemCount(){let e=0;return this.items.forEach(n=>{n.step||e++}),e}compress(e=this.items.length){let n=this.remapping(0,e),r=n.maps.length,o=[],i=0;return this.items.forEach((s,l)=>{if(l>=e)o.push(s),s.selection&&i++;else if(s.step){let a=s.step.map(n.slice(r)),c=a&&a.getMap();if(r--,c&&n.appendMap(c,r),a){let d=s.selection&&s.selection.map(n.slice(r));d&&i++;let u=new nt(c.invert(),a,d),f,h=o.length-1;(f=o.length&&o[h].merge(u))?o[h]=f:o.push(u)}}else s.map&&r--},this.items.length,0),new t(ll.from(o.reverse()),i)}};tn.empty=new tn(ll.empty,0);function Bb(t,e){let n;return t.forEach((r,o)=>{if(r.selection&&e--==0)return n=o,!1}),t.slice(n)}var nt=class t{constructor(e,n,r,o){this.map=e,this.step=n,this.selection=r,this.mirrorOffset=o}merge(e){if(this.step&&e.step&&!e.selection){let n=e.step.merge(this.step);if(n)return new t(n.getMap().invert(),n,this.selection)}}},rt=class{constructor(e,n,r,o,i){this.done=e,this.undone=n,this.prevRanges=r,this.prevTime=o,this.prevComposition=i}},zb=20;function Hb(t,e,n,r){let o=n.getMeta(en),i;if(o)return o.historyState;n.getMeta(Vb)&&(t=new rt(t.done,t.undone,null,0,-1));let s=n.getMeta("appendedTransaction");if(n.steps.length==0)return t;if(s&&s.getMeta(en))return s.getMeta(en).redo?new rt(t.done.addTransform(n,void 0,r,So(e)),t.undone,Mu(n.mapping.maps),t.prevTime,t.prevComposition):new rt(t.done,t.undone.addTransform(n,void 0,r,So(e)),null,t.prevTime,t.prevComposition);if(n.getMeta("addToHistory")!==!1&&!(s&&s.getMeta("addToHistory")===!1)){let l=n.getMeta("composition"),a=t.prevTime==0||!s&&t.prevComposition!=l&&(t.prevTime<(n.time||0)-r.newGroupDelay||!$b(n,t.prevRanges)),c=s?al(t.prevRanges,n.mapping):Mu(n.mapping.maps);return new rt(t.done.addTransform(n,a?e.selection.getBookmark():void 0,r,So(e)),tn.empty,c,n.time,l??t.prevComposition)}else return(i=n.getMeta("rebased"))?new rt(t.done.rebased(n,i),t.undone.rebased(n,i),al(t.prevRanges,n.mapping),t.prevTime,t.prevComposition):new rt(t.done.addMaps(n.mapping.maps),t.undone.addMaps(n.mapping.maps),al(t.prevRanges,n.mapping),t.prevTime,t.prevComposition)}function $b(t,e){if(!e)return!1;if(!t.docChanged)return!0;let n=!1;return t.mapping.maps[0].forEach((r,o)=>{for(let i=0;i=e[i]&&(n=!0)}),n}function Mu(t){let e=[];for(let n=t.length-1;n>=0&&e.length==0;n--)t[n].forEach((r,o,i,s)=>e.push(i,s));return e}function al(t,e){if(!t)return null;let n=[];for(let r=0;r{let o=en.getState(n);if(!o||(t?o.undone:o.done).eventCount==0)return!1;if(r){let i=Fb(o,n,t);i&&r(e?i.scrollIntoView():i)}return!0}}var dl=Co(!1,!0),ul=Co(!0,!0),g1=Co(!1,!1),y1=Co(!0,!1);var C1=U.create({name:"characterCount",addOptions(){return{limit:null,mode:"textSize",textCounter:t=>t.length,wordCounter:t=>t.split(" ").filter(e=>e!=="").length}},addStorage(){return{characters:()=>0,words:()=>0}},onBeforeCreate(){this.storage.characters=t=>{let e=t?.node||this.editor.state.doc;if((t?.mode||this.options.mode)==="textSize"){let r=e.textBetween(0,e.content.size,void 0," ");return this.options.textCounter(r)}return e.nodeSize},this.storage.words=t=>{let e=t?.node||this.editor.state.doc,n=e.textBetween(0,e.content.size," "," ");return this.options.wordCounter(n)}},addProseMirrorPlugins(){let t=!1;return[new P({key:new H("characterCount"),appendTransaction:(e,n,r)=>{if(t)return;let o=this.options.limit;if(o==null||o===0){t=!0;return}let i=this.storage.characters({node:r.doc});if(i>o){let s=i-o,l=0,a=s;console.warn(`[CharacterCount] Initial content exceeded limit of ${o} characters. Content was automatically trimmed.`);let c=r.tr.deleteRange(l,a);return t=!0,c}t=!0},filterTransaction:(e,n)=>{let r=this.options.limit;if(!e.docChanged||r===0||r===null||r===void 0)return!0;let o=this.storage.characters({node:n.doc}),i=this.storage.characters({node:e.doc});if(i<=r||o>r&&i>r&&i<=o)return!0;if(o>r&&i>r&&i>o||!e.getMeta("paste"))return!1;let l=e.selection.$head.pos,a=i-r,c=l-a,d=l;return e.deleteRange(c,d),!(this.storage.characters({node:e.doc})>r)}})]}}),Nu=U.create({name:"dropCursor",addOptions(){return{color:"currentColor",width:1,class:void 0}},addProseMirrorPlugins(){return[ku(this.options)]}}),N1=U.create({name:"focus",addOptions(){return{className:"has-focus",mode:"all"}},addProseMirrorPlugins(){return[new P({key:new H("focus"),props:{decorations:({doc:t,selection:e})=>{let{isEditable:n,isFocused:r}=this.editor,{anchor:o}=e,i=[];if(!n||!r)return Y.create(t,[]);let s=0;this.options.mode==="deepest"&&t.descendants((a,c)=>{if(a.isText)return;if(!(o>=c&&o<=c+a.nodeSize-1))return!1;s+=1});let l=0;return t.descendants((a,c)=>{if(a.isText||!(o>=c&&o<=c+a.nodeSize-1))return!1;if(l+=1,this.options.mode==="deepest"&&s-l>0||this.options.mode==="shallowest"&&l>1)return this.options.mode==="deepest";i.push(te.node(c,c+a.nodeSize,{class:this.options.className}))}),Y.create(t,i)}}})]}}),Ou=U.create({name:"gapCursor",addProseMirrorPlugins(){return[Cu()]},extendNodeSchema(t){var e;let n={name:t.name,options:t.options,storage:t.storage};return{allowGapCursor:(e=G(B(t,"allowGapCursor",n)))!=null?e:null}}}),fl=U.create({name:"placeholder",addOptions(){return{emptyEditorClass:"is-editor-empty",emptyNodeClass:"is-empty",placeholder:"Write something \u2026",showOnlyWhenEditable:!0,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[new P({key:new H("placeholder"),props:{decorations:({doc:t,selection:e})=>{let n=this.editor.isEditable||!this.options.showOnlyWhenEditable,{anchor:r}=e,o=[];if(!n)return null;let i=this.editor.isEmpty;return t.descendants((s,l)=>{let a=r>=l&&r<=l+s.nodeSize,c=!s.isLeaf&&lr(s);if((a||!this.options.showOnlyCurrent)&&c){let d=[this.options.emptyNodeClass];i&&d.push(this.options.emptyEditorClass);let u=te.node(l,l+s.nodeSize,{class:d.join(" "),"data-placeholder":typeof this.options.placeholder=="function"?this.options.placeholder({editor:this.editor,node:s,pos:l,hasAnchor:a}):this.options.placeholder});o.push(u)}return this.options.includeChildren}),Y.create(t,o)}}})]}}),H1=U.create({name:"selection",addOptions(){return{className:"selection"}},addProseMirrorPlugins(){let{editor:t,options:e}=this;return[new P({key:new H("selection"),props:{decorations(n){return n.selection.empty||t.isFocused||!t.isEditable||mo(n.selection)||t.view.dragging?null:Y.create(n.doc,[te.inline(n.selection.from,n.selection.to,{class:e.className})])}}})]}});function Eu({types:t,node:e}){return e&&Array.isArray(t)&&t.includes(e.type)||e?.type===t}var V1=U.create({name:"trailingNode",addOptions(){return{node:void 0,notAfter:[]}},addProseMirrorPlugins(){var t;let e=new H(this.name),n=this.options.node||((t=this.editor.schema.topNodeType.contentMatch.defaultType)==null?void 0:t.name)||"paragraph",r=Object.entries(this.editor.schema.nodes).map(([,o])=>o).filter(o=>(this.options.notAfter||[]).concat(n).includes(o.name));return[new P({key:e,appendTransaction:(o,i,s)=>{let{doc:l,tr:a,schema:c}=s,d=e.getState(s),u=l.content.size,f=c.nodes[n];if(d)return a.insert(u,f.create())},state:{init:(o,i)=>{let s=i.tr.doc.lastChild;return!Eu({node:s,types:r})},apply:(o,i)=>{if(!o.docChanged||o.getMeta("__uniqueIDTransaction"))return i;let s=o.doc.lastChild;return!Eu({node:s,types:r})}}})]}}),Ru=U.create({name:"undoRedo",addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:t,dispatch:e})=>dl(t,e),redo:()=>({state:t,dispatch:e})=>ul(t,e)}},addProseMirrorPlugins(){return[Au(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-\u044F":()=>this.editor.commands.undo(),"Shift-Mod-\u044F":()=>this.editor.commands.redo()}}});var Nn=(t,e)=>{if(t==="slot")return 0;if(t instanceof Function)return t(e);let{children:n,...r}=e??{};if(t==="svg")throw new Error("SVG elements are not supported in the JSX syntax, use the array syntax instead");return[t,r,n]};var _b=/^\s*>\s$/,Wb=F.create({name:"blockquote",addOptions(){return{HTMLAttributes:{}}},content:"block+",group:"block",defining:!0,parseHTML(){return[{tag:"blockquote"}]},renderHTML({HTMLAttributes:t}){return Nn("blockquote",{...R(this.options.HTMLAttributes,t),children:Nn("slot",{})})},parseMarkdown:(t,e)=>e.createNode("blockquote",void 0,e.parseChildren(t.tokens||[])),renderMarkdown:(t,e)=>{if(!t.content)return"";let n=">",r=[];return t.content.forEach(o=>{let l=e.renderChildren([o]).split(` `).map(a=>a.trim()===""?n:`${n} ${a}`);r.push(l.join(` `))}),r.join(` ${n} `)},addCommands(){return{setBlockquote:()=>({commands:t})=>t.wrapIn(this.name),toggleBlockquote:()=>({commands:t})=>t.toggleWrap(this.name),unsetBlockquote:()=>({commands:t})=>t.lift(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-b":()=>this.editor.commands.toggleBlockquote()}},addInputRules(){return[tt({find:_b,type:this.type})]}}),Du=Wb;var jb=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))$/,Ub=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))/g,Kb=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))$/,qb=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))/g,Jb=ee.create({name:"bold",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"strong"},{tag:"b",getAttrs:t=>t.style.fontWeight!=="normal"&&null},{style:"font-weight=400",clearMark:t=>t.type.name===this.name},{style:"font-weight",getAttrs:t=>/^(bold(er)?|[5-9]\d{2,})$/.test(t)&&null}]},renderHTML({HTMLAttributes:t}){return Nn("strong",{...R(this.options.HTMLAttributes,t),children:Nn("slot",{})})},markdownTokenName:"strong",parseMarkdown:(t,e)=>e.applyMark("bold",e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>`**${e.renderChildren(t)}**`,addCommands(){return{setBold:()=>({commands:t})=>t.setMark(this.name),toggleBold:()=>({commands:t})=>t.toggleMark(this.name),unsetBold:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-b":()=>this.editor.commands.toggleBold(),"Mod-B":()=>this.editor.commands.toggleBold()}},addInputRules(){return[Be({find:jb,type:this.type}),Be({find:Kb,type:this.type})]},addPasteRules(){return[Me({find:Ub,type:this.type}),Me({find:qb,type:this.type})]}}),Iu=Jb;var Gb=/(^|[^`])`([^`]+)`(?!`)$/,Xb=/(^|[^`])`([^`]+)`(?!`)/g,Yb=ee.create({name:"code",addOptions(){return{HTMLAttributes:{}}},excludes:"_",code:!0,exitable:!0,parseHTML(){return[{tag:"code"}]},renderHTML({HTMLAttributes:t}){return["code",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"codespan",parseMarkdown:(t,e)=>e.applyMark("code",[{type:"text",text:t.text||""}]),renderMarkdown:(t,e)=>t.content?`\`${e.renderChildren(t.content)}\``:"",addCommands(){return{setCode:()=>({commands:t})=>t.setMark(this.name),toggleCode:()=>({commands:t})=>t.toggleMark(this.name),unsetCode:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-e":()=>this.editor.commands.toggleCode()}},addInputRules(){return[Be({find:Gb,type:this.type})]},addPasteRules(){return[Me({find:Xb,type:this.type})]}}),Pu=Yb;var hl=4,Qb=/^```([a-z]+)?[\s\n]$/,Zb=/^~~~([a-z]+)?[\s\n]$/,e0=F.create({name:"codeBlock",addOptions(){return{languageClassPrefix:"language-",exitOnTripleEnter:!0,exitOnArrowDown:!0,defaultLanguage:null,enableTabIndentation:!1,tabSize:hl,HTMLAttributes:{}}},content:"text*",marks:"",group:"block",code:!0,defining:!0,addAttributes(){return{language:{default:this.options.defaultLanguage,parseHTML:t=>{var e;let{languageClassPrefix:n}=this.options;if(!n)return null;let i=[...((e=t.firstElementChild)==null?void 0:e.classList)||[]].filter(s=>s.startsWith(n)).map(s=>s.replace(n,""))[0];return i||null},rendered:!1}}},parseHTML(){return[{tag:"pre",preserveWhitespace:"full"}]},renderHTML({node:t,HTMLAttributes:e}){return["pre",R(this.options.HTMLAttributes,e),["code",{class:t.attrs.language?this.options.languageClassPrefix+t.attrs.language:null},0]]},markdownTokenName:"code",parseMarkdown:(t,e)=>{var n;return((n=t.raw)==null?void 0:n.startsWith("```"))===!1&&t.codeBlockStyle!=="indented"?[]:e.createNode("codeBlock",{language:t.lang||null},t.text?[e.createTextNode(t.text)]:[])},renderMarkdown:(t,e)=>{var n;let r="",o=((n=t.attrs)==null?void 0:n.language)||"";return t.content?r=[`\`\`\`${o}`,e.renderChildren(t.content),"```"].join(` `):r=`\`\`\`${o} \`\`\``,r},addCommands(){return{setCodeBlock:t=>({commands:e})=>e.setNode(this.name,t),toggleCodeBlock:t=>({commands:e})=>e.toggleNode(this.name,"paragraph",t)}},addKeyboardShortcuts(){return{"Mod-Alt-c":()=>this.editor.commands.toggleCodeBlock(),Backspace:()=>{let{empty:t,$anchor:e}=this.editor.state.selection,n=e.pos===1;return!t||e.parent.type.name!==this.name?!1:n||!e.parent.textContent.length?this.editor.commands.clearNodes():!1},Tab:({editor:t})=>{var e;if(!this.options.enableTabIndentation)return!1;let n=(e=this.options.tabSize)!=null?e:hl,{state:r}=t,{selection:o}=r,{$from:i,empty:s}=o;if(i.parent.type!==this.type)return!1;let l=" ".repeat(n);return s?t.commands.insertContent(l):t.commands.command(({tr:a})=>{let{from:c,to:d}=o,h=r.doc.textBetween(c,d,` `,` `).split(` `).map(p=>l+p).join(` `);return a.replaceWith(c,d,r.schema.text(h)),!0})},"Shift-Tab":({editor:t})=>{var e;if(!this.options.enableTabIndentation)return!1;let n=(e=this.options.tabSize)!=null?e:hl,{state:r}=t,{selection:o}=r,{$from:i,empty:s}=o;return i.parent.type!==this.type?!1:s?t.commands.command(({tr:l})=>{var a;let{pos:c}=i,d=i.start(),u=i.end(),h=r.doc.textBetween(d,u,` `,` `).split(` `),p=0,m=0,g=c-d;for(let S=0;S=g){p=S;break}m+=h[S].length+1}let w=((a=h[p].match(/^ */))==null?void 0:a[0])||"",b=Math.min(w.length,n);if(b===0)return!0;let C=d;for(let S=0;S{let{from:a,to:c}=o,f=r.doc.textBetween(a,c,` `,` `).split(` `).map(h=>{var p;let m=((p=h.match(/^ */))==null?void 0:p[0])||"",g=Math.min(m.length,n);return h.slice(g)}).join(` `);return l.replaceWith(a,c,r.schema.text(f)),!0})},Enter:({editor:t})=>{if(!this.options.exitOnTripleEnter)return!1;let{state:e}=t,{selection:n}=e,{$from:r,empty:o}=n;if(!o||r.parent.type!==this.type)return!1;let i=r.parentOffset===r.parent.nodeSize-2,s=r.parent.textContent.endsWith(` `);return!i||!s?!1:t.chain().command(({tr:l})=>(l.delete(r.pos-2,r.pos),!0)).exitCode().run()},ArrowDown:({editor:t})=>{if(!this.options.exitOnArrowDown)return!1;let{state:e}=t,{selection:n,doc:r}=e,{$from:o,empty:i}=n;if(!i||o.parent.type!==this.type||!(o.parentOffset===o.parent.nodeSize-2))return!1;let l=o.after();return l===void 0?!1:r.nodeAt(l)?t.commands.command(({tr:c})=>(c.setSelection(I.near(r.resolve(l))),!0)):t.commands.exitCode()}}},addInputRules(){return[ar({find:Qb,type:this.type,getAttributes:t=>({language:t[1]})}),ar({find:Zb,type:this.type,getAttributes:t=>({language:t[1]})})]},addProseMirrorPlugins(){return[new P({key:new H("codeBlockVSCodeHandler"),props:{handlePaste:(t,e)=>{if(!e.clipboardData||this.editor.isActive(this.type.name))return!1;let n=e.clipboardData.getData("text/plain"),r=e.clipboardData.getData("vscode-editor-data"),o=r?JSON.parse(r):void 0,i=o?.mode;if(!n||!i)return!1;let{tr:s,schema:l}=t.state,a=l.text(n.replace(/\r\n?/g,` `));return s.replaceSelectionWith(this.type.create({language:i},a)),s.selection.$from.parent.type!==this.type&&s.setSelection(D.near(s.doc.resolve(Math.max(0,s.selection.from-2)))),s.setMeta("paste",!0),t.dispatch(s),!0}}})]}}),Lu=e0;var Bu=F.create({name:"customBlock",group:"block",atom:!0,defining:!0,draggable:!0,selectable:!0,isolating:!0,allowGapCursor:!0,inline:!1,addNodeView(){return({editor:t,node:e,getPos:n,HTMLAttributes:r,decorations:o,extension:i})=>{let s=document.createElement("div");s.setAttribute("data-config",e.attrs.config),s.setAttribute("data-id",e.attrs.id),s.setAttribute("data-type","customBlock");let l=document.createElement("div");if(l.className="fi-fo-rich-editor-custom-block-header fi-not-prose",s.appendChild(l),t.isEditable&&typeof e.attrs.config=="object"&&e.attrs.config!==null&&Object.keys(e.attrs.config).length>0){let c=document.createElement("div");c.className="fi-fo-rich-editor-custom-block-edit-btn-ctn",l.appendChild(c);let d=document.createElement("button");d.className="fi-icon-btn",d.type="button",d.innerHTML=i.options.editCustomBlockButtonIconHtml,d.addEventListener("click",()=>i.options.editCustomBlockUsing(e.attrs.id,e.attrs.config)),c.appendChild(d)}let a=document.createElement("p");if(a.className="fi-fo-rich-editor-custom-block-heading",a.textContent=e.attrs.label,l.appendChild(a),t.isEditable){let c=document.createElement("div");c.className="fi-fo-rich-editor-custom-block-delete-btn-ctn",l.appendChild(c);let d=document.createElement("button");d.className="fi-icon-btn",d.type="button",d.innerHTML=i.options.deleteCustomBlockButtonIconHtml,d.addEventListener("click",()=>t.chain().setNodeSelection(n()).deleteSelection().run()),c.appendChild(d)}if(e.attrs.preview){let c=document.createElement("div");c.className="fi-fo-rich-editor-custom-block-preview fi-not-prose",c.innerHTML=new TextDecoder().decode(Uint8Array.from(atob(e.attrs.preview),d=>d.charCodeAt(0))),s.appendChild(c)}return{dom:s}}},addOptions(){return{deleteCustomBlockButtonIconHtml:null,editCustomBlockButtonIconHtml:null,editCustomBlockUsing:()=>{},insertCustomBlockUsing:()=>{}}},addAttributes(){return{config:{default:null,parseHTML:t=>JSON.parse(t.getAttribute("data-config"))},id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}},label:{default:null,parseHTML:t=>t.getAttribute("data-label"),rendered:!1},preview:{default:null,parseHTML:t=>t.getAttribute("data-preview"),rendered:!1}}},parseHTML(){return[{tag:`div[data-type="${this.name}"]`}]},renderHTML({HTMLAttributes:t}){return["div",R(t)]},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:o,anchor:i}=r;if(!o)return!1;let s=new ie,l=0;return e.doc.nodesBetween(i-1,i,(a,c)=>{if(a.type.name===this.name)return n=!0,s=a,l=c,!1}),n})}},addProseMirrorPlugins(){let{insertCustomBlockUsing:t}=this.options;return[new P({props:{handleDrop(e,n){if(!n||(n.preventDefault(),!n.dataTransfer.getData("customBlock")))return!1;let r=n.dataTransfer.getData("customBlock");return t(r,e.posAtCoords({left:n.clientX,top:n.clientY}).pos),!1}}})]}});var vo=(t,e)=>e.view.domAtPos(t).node.offsetParent!==null,t0=(t,e,n)=>{for(let r=t.depth;r>0;r-=1){let o=t.node(r),i=e(o),s=vo(t.start(r),n);if(i&&s)return{pos:r>0?t.before(r):0,start:t.start(r),depth:r,node:o}}},zu=(t,e)=>{let{state:n,view:r,extensionManager:o}=t,{schema:i,selection:s}=n,{empty:l,$anchor:a}=s,c=!!o.extensions.find(y=>y.name==="gapCursor");if(!l||a.parent.type!==i.nodes.detailsSummary||!c||e==="right"&&a.parentOffset!==a.parent.nodeSize-2)return!1;let d=et(y=>y.type===i.nodes.details)(s);if(!d)return!1;let u=En(d.node,y=>y.type===i.nodes.detailsContent);if(!u.length||vo(d.start+u[0].pos+1,t))return!1;let h=n.doc.resolve(d.pos+d.node.nodeSize),p=ae.findFrom(h,1,!1);if(!p)return!1;let{tr:m}=n,g=new ae(p);return m.setSelection(g),m.scrollIntoView(),r.dispatch(m),!0},Hu=F.create({name:"details",content:"detailsSummary detailsContent",group:"block",defining:!0,isolating:!0,allowGapCursor:!1,addOptions(){return{persist:!1,openClassName:"is-open",HTMLAttributes:{}}},addAttributes(){return this.options.persist?{open:{default:!1,parseHTML:t=>t.hasAttribute("open"),renderHTML:({open:t})=>t?{open:""}:{}}}:[]},parseHTML(){return[{tag:"details"}]},renderHTML({HTMLAttributes:t}){return["details",R(this.options.HTMLAttributes,t),0]},...Zt({nodeName:"details",content:"block"}),addNodeView(){return({editor:t,getPos:e,node:n,HTMLAttributes:r})=>{let o=document.createElement("div"),i=R(this.options.HTMLAttributes,r,{"data-type":this.name});Object.entries(i).forEach(([c,d])=>o.setAttribute(c,d));let s=document.createElement("button");s.type="button",o.append(s);let l=document.createElement("div");o.append(l);let a=c=>{if(c!==void 0)if(c){if(o.classList.contains(this.options.openClassName))return;o.classList.add(this.options.openClassName)}else{if(!o.classList.contains(this.options.openClassName))return;o.classList.remove(this.options.openClassName)}else o.classList.toggle(this.options.openClassName);let d=new Event("toggleDetailsContent"),u=l.querySelector(':scope > div[data-type="detailsContent"]');u?.dispatchEvent(d)};return n.attrs.open&&setTimeout(()=>a()),s.addEventListener("click",()=>{if(a(),!this.options.persist){t.commands.focus(void 0,{scrollIntoView:!1});return}if(t.isEditable&&typeof e=="function"){let{from:c,to:d}=t.state.selection;t.chain().command(({tr:u})=>{let f=e();if(!f)return!1;let h=u.doc.nodeAt(f);return h?.type!==this.type?!1:(u.setNodeMarkup(f,void 0,{open:!h.attrs.open}),!0)}).setTextSelection({from:c,to:d}).focus(void 0,{scrollIntoView:!1}).run()}}),{dom:o,contentDOM:l,ignoreMutation(c){return c.type==="selection"?!1:!o.contains(c.target)||o===c.target},update:c=>c.type!==this.type?!1:(c.attrs.open!==void 0&&a(c.attrs.open),!0)}}},addCommands(){return{setDetails:()=>({state:t,chain:e})=>{var n;let{schema:r,selection:o}=t,{$from:i,$to:s}=o,l=i.blockRange(s);if(!l)return!1;let a=t.doc.slice(l.start,l.end);if(!r.nodes.detailsContent.contentMatch.matchFragment(a.content))return!1;let d=((n=a.toJSON())==null?void 0:n.content)||[];return e().insertContentAt({from:l.start,to:l.end},{type:this.name,content:[{type:"detailsSummary"},{type:"detailsContent",content:d}]}).setTextSelection(l.start+2).run()},unsetDetails:()=>({state:t,chain:e})=>{let{selection:n,schema:r}=t,o=et(y=>y.type===this.type)(n);if(!o)return!1;let i=En(o.node,y=>y.type===r.nodes.detailsSummary),s=En(o.node,y=>y.type===r.nodes.detailsContent);if(!i.length||!s.length)return!1;let l=i[0],a=s[0],c=o.pos,d=t.doc.resolve(c),u=c+o.node.nodeSize,f={from:c,to:u},h=a.node.content.toJSON()||[],p=d.parent.type.contentMatch.defaultType,g=[p?.create(null,l.node.content).toJSON(),...h];return e().insertContentAt(f,g).setTextSelection(c+1).run()}}},addKeyboardShortcuts(){return{Backspace:()=>{let{schema:t,selection:e}=this.editor.state,{empty:n,$anchor:r}=e;return!n||r.parent.type!==t.nodes.detailsSummary?!1:r.parentOffset!==0?this.editor.commands.command(({tr:o})=>{let i=r.pos-1,s=r.pos;return o.delete(i,s),!0}):this.editor.commands.unsetDetails()},Enter:({editor:t})=>{let{state:e,view:n}=t,{schema:r,selection:o}=e,{$head:i}=o;if(i.parent.type!==r.nodes.detailsSummary)return!1;let s=vo(i.after()+1,t),l=s?e.doc.nodeAt(i.after()):i.node(-2);if(!l)return!1;let a=s?0:i.indexAfter(-1),c=sr(l.contentMatchAt(a));if(!c||!l.canReplaceWith(a,a,c))return!1;let d=c.createAndFill();if(!d)return!1;let u=s?i.after()+1:i.after(-1),f=e.tr.replaceWith(u,u,d),h=f.doc.resolve(u),p=I.near(h,1);return f.setSelection(p),f.scrollIntoView(),n.dispatch(f),!0},ArrowRight:({editor:t})=>zu(t,"right"),ArrowDown:({editor:t})=>zu(t,"down")}},addProseMirrorPlugins(){return[new P({key:new H("detailsSelection"),appendTransaction:(t,e,n)=>{let{editor:r,type:o}=this;if(r.view.composing||!t.some(y=>y.selectionSet)||!e.selection.empty||!n.selection.empty||!tl(n,o.name))return;let{$from:a}=n.selection;if(vo(a.pos,r))return;let d=t0(a,y=>y.type===o,r);if(!d)return;let u=En(d.node,y=>y.type===n.schema.nodes.detailsSummary);if(!u.length)return;let f=u[0],p=(e.selection.from{let e=document.createElement("div"),n=R(this.options.HTMLAttributes,t,{"data-type":this.name,hidden:"hidden"});return Object.entries(n).forEach(([r,o])=>e.setAttribute(r,o)),e.addEventListener("toggleDetailsContent",()=>{e.toggleAttribute("hidden")}),{dom:e,contentDOM:e,ignoreMutation(r){return r.type==="selection"?!1:!e.contains(r.target)||e===r.target},update:r=>r.type===this.type}}},addKeyboardShortcuts(){return{Enter:({editor:t})=>{let{state:e,view:n}=t,{selection:r}=e,{$from:o,empty:i}=r,s=et($=>$.type===this.type)(r);if(!i||!s||!s.node.childCount)return!1;let l=o.index(s.depth),{childCount:a}=s.node;if(!(a===l+1))return!1;let d=s.node.type.contentMatch.defaultType,u=d?.createAndFill();if(!u)return!1;let f=e.doc.resolve(s.pos+1),h=a-1,p=s.node.child(h),m=f.posAtIndex(h,s.depth);if(!p.eq(u))return!1;let y=o.node(-3);if(!y)return!1;let w=o.indexAfter(-3),b=sr(y.contentMatchAt(w));if(!b||!y.canReplaceWith(w,w,b))return!1;let C=b.createAndFill();if(!C)return!1;let{tr:x}=e,S=o.after(-2);x.replaceWith(S,S,C);let k=x.doc.resolve(S),O=I.near(k,1);x.setSelection(O);let T=m,A=m+p.nodeSize;return x.delete(T,A),x.scrollIntoView(),n.dispatch(x),!0}}},...Zt({nodeName:"detailsContent"})}),Fu=F.create({name:"detailsSummary",content:"text*",defining:!0,selectable:!1,isolating:!0,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"summary"}]},renderHTML({HTMLAttributes:t}){return["summary",R(this.options.HTMLAttributes,t),0]},...Zt({nodeName:"detailsSummary",content:"inline"})});var n0=F.create({name:"doc",topNode:!0,content:"block+",renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` `):""}),Vu=n0;var _u=F.create({name:"grid",group:"block",defining:!0,isolating:!0,allowGapCursor:!1,content:"gridColumn+",addOptions(){return{HTMLAttributes:{class:"grid-layout"}}},addAttributes(){return{"data-cols":{default:2,parseHTML:t=>t.getAttribute("data-cols")},"data-from-breakpoint":{default:"md",parseHTML:t=>t.getAttribute("data-from-breakpoint")},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-template-columns: repeat(${t["data-cols"]}, 1fr)`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("grid-layout")&&null}]},renderHTML({HTMLAttributes:t}){return["div",R(this.options.HTMLAttributes,t),0]},addCommands(){return{insertGrid:({columns:t=[1,1],fromBreakpoint:e,coordinates:n=null}={})=>({tr:r,dispatch:o,editor:i})=>{let s=i.schema.nodes.gridColumn,l=Array.isArray(t)&&t.length?t:[1,1],a=[];for(let u=0;uNumber(u)||1).reduce((u,f)=>u+f,0),d=i.schema.nodes.grid.createChecked({"data-cols":c,"data-from-breakpoint":e},a);if(o){let u=r.selection.anchor+1;[null,void 0].includes(n?.from)?r.replaceSelectionWith(d).scrollIntoView().setSelection(D.near(r.doc.resolve(u))):r.replaceRangeWith(n.from,n.to,d).scrollIntoView().setSelection(D.near(r.doc.resolve(n.from)))}return!0}}}});var Wu=F.create({name:"gridColumn",content:"block+",isolating:!0,addOptions(){return{HTMLAttributes:{class:"grid-layout-col"}}},addAttributes(){return{"data-col-span":{default:1,parseHTML:t=>t.getAttribute("data-col-span"),renderHTML:t=>({"data-col-span":t["data-col-span"]??1})},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-column: span ${t["data-col-span"]??1};`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("grid-layout-col")&&null}]},renderHTML({HTMLAttributes:t}){return["div",R(this.options.HTMLAttributes,t),0]}});var r0=F.create({name:"hardBreak",markdownTokenName:"br",addOptions(){return{keepMarks:!0,HTMLAttributes:{}}},inline:!0,group:"inline",selectable:!1,linebreakReplacement:!0,parseHTML(){return[{tag:"br"}]},renderHTML({HTMLAttributes:t}){return["br",R(this.options.HTMLAttributes,t)]},renderText(){return` `},renderMarkdown:()=>` `,parseMarkdown:()=>({type:"hardBreak"}),addCommands(){return{setHardBreak:()=>({commands:t,chain:e,state:n,editor:r})=>t.first([()=>t.exitCode(),()=>t.command(()=>{let{selection:o,storedMarks:i}=n;if(o.$from.parent.type.spec.isolating)return!1;let{keepMarks:s}=this.options,{splittableMarks:l}=r.extensionManager,a=i||o.$to.parentOffset&&o.$from.marks();return e().insertContent({type:this.name}).command(({tr:c,dispatch:d})=>{if(d&&a&&s){let u=a.filter(f=>l.includes(f.type.name));c.ensureMarks(u)}return!0}).run()})])}},addKeyboardShortcuts(){return{"Mod-Enter":()=>this.editor.commands.setHardBreak(),"Shift-Enter":()=>this.editor.commands.setHardBreak()}}}),ju=r0;var o0=F.create({name:"heading",addOptions(){return{levels:[1,2,3,4,5,6],HTMLAttributes:{}}},content:"inline*",group:"block",defining:!0,addAttributes(){return{level:{default:1,rendered:!1}}},parseHTML(){return this.options.levels.map(t=>({tag:`h${t}`,attrs:{level:t}}))},renderHTML({node:t,HTMLAttributes:e}){return[`h${this.options.levels.includes(t.attrs.level)?t.attrs.level:this.options.levels[0]}`,R(this.options.HTMLAttributes,e),0]},parseMarkdown:(t,e)=>e.createNode("heading",{level:t.depth||1},e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>{var n;let r=(n=t.attrs)!=null&&n.level?parseInt(t.attrs.level,10):1,o="#".repeat(r);return t.content?`${o} ${e.renderChildren(t.content)}`:""},addCommands(){return{setHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.setNode(this.name,t):!1,toggleHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.toggleNode(this.name,"paragraph",t):!1}},addKeyboardShortcuts(){return this.options.levels.reduce((t,e)=>({...t,[`Mod-Alt-${e}`]:()=>this.editor.commands.toggleHeading({level:e})}),{})},addInputRules(){return this.options.levels.map(t=>ar({find:new RegExp(`^(#{${Math.min(...this.options.levels)},${t}})\\s$`),type:this.type,getAttributes:{level:t}}))}}),Uu=o0;var i0=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))$/,s0=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))/g,l0=ee.create({name:"highlight",addOptions(){return{multicolor:!1,HTMLAttributes:{}}},addAttributes(){return this.options.multicolor?{color:{default:null,parseHTML:t=>t.getAttribute("data-color")||t.style.backgroundColor,renderHTML:t=>t.color?{"data-color":t.color,style:`background-color: ${t.color}; color: inherit`}:{}}}:{}},parseHTML(){return[{tag:"mark"}]},renderHTML({HTMLAttributes:t}){return["mark",R(this.options.HTMLAttributes,t),0]},renderMarkdown:(t,e)=>`==${e.renderChildren(t)}==`,parseMarkdown:(t,e)=>e.applyMark("highlight",e.parseInline(t.tokens||[])),markdownTokenizer:{name:"highlight",level:"inline",start:t=>t.indexOf("=="),tokenize(t,e,n){let o=/^(==)([^=]+)(==)/.exec(t);if(o){let i=o[2].trim(),s=n.inlineTokens(i);return{type:"highlight",raw:o[0],text:i,tokens:s}}}},addCommands(){return{setHighlight:t=>({commands:e})=>e.setMark(this.name,t),toggleHighlight:t=>({commands:e})=>e.toggleMark(this.name,t),unsetHighlight:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-h":()=>this.editor.commands.toggleHighlight()}},addInputRules(){return[Be({find:i0,type:this.type})]},addPasteRules(){return[Me({find:s0,type:this.type})]}}),Ku=l0;var a0=F.create({name:"horizontalRule",addOptions(){return{HTMLAttributes:{},nextNodeType:"paragraph"}},group:"block",parseHTML(){return[{tag:"hr"}]},renderHTML({HTMLAttributes:t}){return["hr",R(this.options.HTMLAttributes,t)]},markdownTokenName:"hr",parseMarkdown:(t,e)=>e.createNode("horizontalRule"),renderMarkdown:()=>"---",addCommands(){return{setHorizontalRule:()=>({chain:t,state:e})=>{if(!bu(e,e.schema.nodes[this.name]))return!1;let{selection:n}=e,{$to:r}=n,o=t();return mo(n)?o.insertContentAt(r.pos,{type:this.name}):o.insertContent({type:this.name}),o.command(({state:i,tr:s,dispatch:l})=>{if(l){let{$to:a}=s.selection,c=a.end();if(a.nodeAfter)a.nodeAfter.isTextblock?s.setSelection(D.create(s.doc,a.pos+1)):a.nodeAfter.isBlock?s.setSelection(L.create(s.doc,a.pos)):s.setSelection(D.create(s.doc,a.pos));else{let d=i.schema.nodes[this.options.nextNodeType]||a.parent.type.contentMatch.defaultType,u=d?.create();u&&(s.insert(c,u),s.setSelection(D.create(s.doc,c+1)))}s.scrollIntoView()}return!0}).run()}}},addInputRules(){return[bo({find:/^(?:---|—-|___\s|\*\*\*\s)$/,type:this.type})]}}),qu=a0;var c0=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))$/,d0=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))/g,u0=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))$/,f0=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))/g,h0=ee.create({name:"italic",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"em"},{tag:"i",getAttrs:t=>t.style.fontStyle!=="normal"&&null},{style:"font-style=normal",clearMark:t=>t.type.name===this.name},{style:"font-style=italic"}]},renderHTML({HTMLAttributes:t}){return["em",R(this.options.HTMLAttributes,t),0]},addCommands(){return{setItalic:()=>({commands:t})=>t.setMark(this.name),toggleItalic:()=>({commands:t})=>t.toggleMark(this.name),unsetItalic:()=>({commands:t})=>t.unsetMark(this.name)}},markdownTokenName:"em",parseMarkdown:(t,e)=>e.applyMark("italic",e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>`*${e.renderChildren(t)}*`,addKeyboardShortcuts(){return{"Mod-i":()=>this.editor.commands.toggleItalic(),"Mod-I":()=>this.editor.commands.toggleItalic()}},addInputRules(){return[Be({find:c0,type:this.type}),Be({find:u0,type:this.type})]},addPasteRules(){return[Me({find:d0,type:this.type}),Me({find:f0,type:this.type})]}}),Ju=h0;var p0=/(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/,m0=F.create({name:"image",addOptions(){return{inline:!1,allowBase64:!1,HTMLAttributes:{},resize:!1}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},draggable:!0,addAttributes(){return{src:{default:null},alt:{default:null},title:{default:null},width:{default:null},height:{default:null}}},parseHTML(){return[{tag:this.options.allowBase64?"img[src]":'img[src]:not([src^="data:"])'}]},renderHTML({HTMLAttributes:t}){return["img",R(this.options.HTMLAttributes,t)]},parseMarkdown:(t,e)=>e.createNode("image",{src:t.href,title:t.title,alt:t.text}),renderMarkdown:t=>{var e,n,r,o,i,s;let l=(n=(e=t.attrs)==null?void 0:e.src)!=null?n:"",a=(o=(r=t.attrs)==null?void 0:r.alt)!=null?o:"",c=(s=(i=t.attrs)==null?void 0:i.title)!=null?s:"";return c?`![${a}](${l} "${c}")`:`![${a}](${l})`},addNodeView(){if(!this.options.resize||!this.options.resize.enabled||typeof document>"u")return null;let{directions:t,minWidth:e,minHeight:n,alwaysPreserveAspectRatio:r}=this.options.resize;return({node:o,getPos:i,HTMLAttributes:s,editor:l})=>{let a=document.createElement("img");Object.entries(s).forEach(([u,f])=>{if(f!=null)switch(u){case"width":case"height":break;default:a.setAttribute(u,f);break}}),a.src=s.src;let c=new yu({element:a,editor:l,node:o,getPos:i,onResize:(u,f)=>{a.style.width=`${u}px`,a.style.height=`${f}px`},onCommit:(u,f)=>{let h=i();h!==void 0&&this.editor.chain().setNodeSelection(h).updateAttributes(this.name,{width:u,height:f}).run()},onUpdate:(u,f,h)=>u.type===o.type,options:{directions:t,min:{width:e,height:n},preserveAspectRatio:r===!0}}),d=c.dom;return d.style.visibility="hidden",d.style.pointerEvents="none",a.onload=()=>{d.style.visibility="",d.style.pointerEvents=""},c}},addCommands(){return{setImage:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}},addInputRules(){return[bo({find:p0,type:this.type,getAttributes:t=>{let[,,e,n,r]=t;return{src:n,alt:e,title:r}}})]}}),Gu=m0;var Xu=Gu.extend({addAttributes(){return{...this.parent?.(),id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}},width:{default:null,parseHTML:t=>t.getAttribute("width")||t.style.width||null,renderHTML:t=>t.width?{width:t.width,style:`width: ${t.width}`}:{}},height:{default:null,parseHTML:t=>t.getAttribute("height")||t.style.height||null,renderHTML:t=>t.height?{height:t.height,style:`height: ${t.height}`}:{}}}}});var Yu=F.create({name:"lead",group:"block",content:"block+",addOptions(){return{HTMLAttributes:{class:"lead"}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("lead")}]},renderHTML({HTMLAttributes:t}){return["div",R(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleLead:()=>({commands:t})=>t.toggleWrap(this.name)}}});var g0="aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2",y0="\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2",xl="numeric",kl="ascii",Sl="alpha",fr="asciinumeric",ur="alphanumeric",Cl="domain",of="emoji",b0="scheme",w0="slashscheme",pl="whitespace";function x0(t,e){return t in e||(e[t]=[]),e[t]}function nn(t,e,n){e[xl]&&(e[fr]=!0,e[ur]=!0),e[kl]&&(e[fr]=!0,e[Sl]=!0),e[fr]&&(e[ur]=!0),e[Sl]&&(e[ur]=!0),e[ur]&&(e[Cl]=!0),e[of]&&(e[Cl]=!0);for(let r in e){let o=x0(r,n);o.indexOf(t)<0&&o.push(t)}}function k0(t,e){let n={};for(let r in e)e[r].indexOf(t)>=0&&(n[r]=!0);return n}function Te(t=null){this.j={},this.jr=[],this.jd=null,this.t=t}Te.groups={};Te.prototype={accepts(){return!!this.t},go(t){let e=this,n=e.j[t];if(n)return n;for(let r=0;rt.ta(e,n,r,o),re=(t,e,n,r,o)=>t.tr(e,n,r,o),Qu=(t,e,n,r,o)=>t.ts(e,n,r,o),M=(t,e,n,r,o)=>t.tt(e,n,r,o),St="WORD",vl="UWORD",sf="ASCIINUMERICAL",lf="ALPHANUMERICAL",br="LOCALHOST",Ml="TLD",Tl="UTLD",Eo="SCHEME",On="SLASH_SCHEME",El="NUM",Al="WS",Nl="NL",hr="OPENBRACE",pr="CLOSEBRACE",No="OPENBRACKET",Oo="CLOSEBRACKET",Ro="OPENPAREN",Do="CLOSEPAREN",Io="OPENANGLEBRACKET",Po="CLOSEANGLEBRACKET",Lo="FULLWIDTHLEFTPAREN",Bo="FULLWIDTHRIGHTPAREN",zo="LEFTCORNERBRACKET",Ho="RIGHTCORNERBRACKET",$o="LEFTWHITECORNERBRACKET",Fo="RIGHTWHITECORNERBRACKET",Vo="FULLWIDTHLESSTHAN",_o="FULLWIDTHGREATERTHAN",Wo="AMPERSAND",jo="APOSTROPHE",Uo="ASTERISK",Lt="AT",Ko="BACKSLASH",qo="BACKTICK",Jo="CARET",Bt="COLON",Ol="COMMA",Go="DOLLAR",ot="DOT",Xo="EQUALS",Rl="EXCLAMATION",He="HYPHEN",mr="PERCENT",Yo="PIPE",Qo="PLUS",Zo="POUND",gr="QUERY",Dl="QUOTE",af="FULLWIDTHMIDDLEDOT",Il="SEMI",it="SLASH",yr="TILDE",ei="UNDERSCORE",cf="EMOJI",ti="SYM",df=Object.freeze({__proto__:null,ALPHANUMERICAL:lf,AMPERSAND:Wo,APOSTROPHE:jo,ASCIINUMERICAL:sf,ASTERISK:Uo,AT:Lt,BACKSLASH:Ko,BACKTICK:qo,CARET:Jo,CLOSEANGLEBRACKET:Po,CLOSEBRACE:pr,CLOSEBRACKET:Oo,CLOSEPAREN:Do,COLON:Bt,COMMA:Ol,DOLLAR:Go,DOT:ot,EMOJI:cf,EQUALS:Xo,EXCLAMATION:Rl,FULLWIDTHGREATERTHAN:_o,FULLWIDTHLEFTPAREN:Lo,FULLWIDTHLESSTHAN:Vo,FULLWIDTHMIDDLEDOT:af,FULLWIDTHRIGHTPAREN:Bo,HYPHEN:He,LEFTCORNERBRACKET:zo,LEFTWHITECORNERBRACKET:$o,LOCALHOST:br,NL:Nl,NUM:El,OPENANGLEBRACKET:Io,OPENBRACE:hr,OPENBRACKET:No,OPENPAREN:Ro,PERCENT:mr,PIPE:Yo,PLUS:Qo,POUND:Zo,QUERY:gr,QUOTE:Dl,RIGHTCORNERBRACKET:Ho,RIGHTWHITECORNERBRACKET:Fo,SCHEME:Eo,SEMI:Il,SLASH:it,SLASH_SCHEME:On,SYM:ti,TILDE:yr,TLD:Ml,UNDERSCORE:ei,UTLD:Tl,UWORD:vl,WORD:St,WS:Al}),xt=/[a-z]/,dr=/\p{L}/u,ml=/\p{Emoji}/u;var kt=/\d/,gl=/\s/;var Zu="\r",yl=` `,S0="\uFE0F",C0="\u200D",bl="\uFFFC",Mo=null,To=null;function v0(t=[]){let e={};Te.groups=e;let n=new Te;Mo==null&&(Mo=ef(g0)),To==null&&(To=ef(y0)),M(n,"'",jo),M(n,"{",hr),M(n,"}",pr),M(n,"[",No),M(n,"]",Oo),M(n,"(",Ro),M(n,")",Do),M(n,"<",Io),M(n,">",Po),M(n,"\uFF08",Lo),M(n,"\uFF09",Bo),M(n,"\u300C",zo),M(n,"\u300D",Ho),M(n,"\u300E",$o),M(n,"\u300F",Fo),M(n,"\uFF1C",Vo),M(n,"\uFF1E",_o),M(n,"&",Wo),M(n,"*",Uo),M(n,"@",Lt),M(n,"`",qo),M(n,"^",Jo),M(n,":",Bt),M(n,",",Ol),M(n,"$",Go),M(n,".",ot),M(n,"=",Xo),M(n,"!",Rl),M(n,"-",He),M(n,"%",mr),M(n,"|",Yo),M(n,"+",Qo),M(n,"#",Zo),M(n,"?",gr),M(n,'"',Dl),M(n,"/",it),M(n,";",Il),M(n,"~",yr),M(n,"_",ei),M(n,"\\",Ko),M(n,"\u30FB",af);let r=re(n,kt,El,{[xl]:!0});re(r,kt,r);let o=re(r,xt,sf,{[fr]:!0}),i=re(r,dr,lf,{[ur]:!0}),s=re(n,xt,St,{[kl]:!0});re(s,kt,o),re(s,xt,s),re(o,kt,o),re(o,xt,o);let l=re(n,dr,vl,{[Sl]:!0});re(l,xt),re(l,kt,i),re(l,dr,l),re(i,kt,i),re(i,xt),re(i,dr,i);let a=M(n,yl,Nl,{[pl]:!0}),c=M(n,Zu,Al,{[pl]:!0}),d=re(n,gl,Al,{[pl]:!0});M(n,bl,d),M(c,yl,a),M(c,bl,d),re(c,gl,d),M(d,Zu),M(d,yl),re(d,gl,d),M(d,bl,d);let u=re(n,ml,cf,{[of]:!0});M(u,"#"),re(u,ml,u),M(u,S0,u);let f=M(u,C0);M(f,"#"),re(f,ml,u);let h=[[xt,s],[kt,o]],p=[[xt,null],[dr,l],[kt,i]];for(let m=0;mm[0]>g[0]?1:-1);for(let m=0;m=0?w[Cl]=!0:xt.test(g)?kt.test(g)?w[fr]=!0:w[kl]=!0:w[xl]=!0,Qu(n,g,g,w)}return Qu(n,"localhost",br,{ascii:!0}),n.jd=new Te(ti),{start:n,tokens:Object.assign({groups:e},df)}}function uf(t,e){let n=M0(e.replace(/[A-Z]/g,l=>l.toLowerCase())),r=n.length,o=[],i=0,s=0;for(;s=0&&(u+=n[s].length,f++),c+=n[s].length,i+=n[s].length,s++;i-=u,s-=f,c-=u,o.push({t:d.t,v:e.slice(i-c,i),s:i-c,e:i})}return o}function M0(t){let e=[],n=t.length,r=0;for(;r56319||r+1===n||(i=t.charCodeAt(r+1))<56320||i>57343?t[r]:t.slice(r,r+2);e.push(s),r+=s.length}return e}function Pt(t,e,n,r,o){let i,s=e.length;for(let l=0;l=0;)i++;if(i>0){e.push(n.join(""));for(let s=parseInt(t.substring(r,r+i),10);s>0;s--)n.pop();r+=i}else n.push(t[r]),r++}return e}var wr={defaultProtocol:"http",events:null,format:tf,formatHref:tf,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function Pl(t,e=null){let n=Object.assign({},wr);t&&(n=Object.assign(n,t instanceof Pl?t.o:t));let r=n.ignoreTags,o=[];for(let i=0;in?r.substring(0,n)+"\u2026":r},toFormattedHref(t){return t.get("formatHref",this.toHref(t.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(t=wr.defaultProtocol){return{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(t),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(t){return{type:this.t,value:this.toFormattedString(t),isLink:this.isLink,href:this.toFormattedHref(t),start:this.startIndex(),end:this.endIndex()}},validate(t){return t.get("validate",this.toString(),this)},render(t){let e=this,n=this.toHref(t.get("defaultProtocol")),r=t.get("formatHref",n,this),o=t.get("tagName",n,e),i=this.toFormattedString(t),s={},l=t.get("className",n,e),a=t.get("target",n,e),c=t.get("rel",n,e),d=t.getObj("attributes",n,e),u=t.getObj("events",n,e);return s.href=r,l&&(s.class=l),a&&(s.target=a),c&&(s.rel=c),d&&Object.assign(s,d),{tagName:o,attributes:s,content:i,eventListeners:u}}};function ni(t,e){class n extends ff{constructor(o,i){super(o,i),this.t=t}}for(let r in e)n.prototype[r]=e[r];return n.t=t,n}var nf=ni("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),rf=ni("text"),T0=ni("nl"),Ao=ni("url",{isLink:!0,toHref(t=wr.defaultProtocol){return this.hasProtocol()?this.v:`${t}://${this.v}`},hasProtocol(){let t=this.tk;return t.length>=2&&t[0].t!==br&&t[1].t===Bt}});var ze=t=>new Te(t);function A0({groups:t}){let e=t.domain.concat([Wo,Uo,Lt,Ko,qo,Jo,Go,Xo,He,El,mr,Yo,Qo,Zo,it,ti,yr,ei]),n=[jo,Bt,Ol,ot,Rl,mr,gr,Dl,Il,Io,Po,hr,pr,Oo,No,Ro,Do,Lo,Bo,zo,Ho,$o,Fo,Vo,_o],r=[Wo,jo,Uo,Ko,qo,Jo,Go,Xo,He,hr,pr,mr,Yo,Qo,Zo,gr,it,ti,yr,ei],o=ze(),i=M(o,yr);j(i,r,i),j(i,t.domain,i);let s=ze(),l=ze(),a=ze();j(o,t.domain,s),j(o,t.scheme,l),j(o,t.slashscheme,a),j(s,r,i),j(s,t.domain,s);let c=M(s,Lt);M(i,Lt,c),M(l,Lt,c),M(a,Lt,c);let d=M(i,ot);j(d,r,i),j(d,t.domain,i);let u=ze();j(c,t.domain,u),j(u,t.domain,u);let f=M(u,ot);j(f,t.domain,u);let h=ze(nf);j(f,t.tld,h),j(f,t.utld,h),M(c,br,h);let p=M(u,He);M(p,He,p),j(p,t.domain,u),j(h,t.domain,u),M(h,ot,f),M(h,He,p);let m=M(h,Bt);j(m,t.numeric,nf);let g=M(s,He),y=M(s,ot);M(g,He,g),j(g,t.domain,s),j(y,r,i),j(y,t.domain,s);let w=ze(Ao);j(y,t.tld,w),j(y,t.utld,w),j(w,t.domain,s),j(w,r,i),M(w,ot,y),M(w,He,g),M(w,Lt,c);let b=M(w,Bt),C=ze(Ao);j(b,t.numeric,C);let x=ze(Ao),S=ze();j(x,e,x),j(x,n,S),j(S,e,x),j(S,n,S),M(w,it,x),M(C,it,x);let k=M(l,Bt),O=M(a,Bt),T=M(O,it),A=M(T,it);j(l,t.domain,s),M(l,ot,y),M(l,He,g),j(a,t.domain,s),M(a,ot,y),M(a,He,g),j(k,t.domain,x),M(k,it,x),M(k,gr,x),j(A,t.domain,x),j(A,e,x),M(A,it,x);let $=[[hr,pr],[No,Oo],[Ro,Do],[Io,Po],[Lo,Bo],[zo,Ho],[$o,Fo],[Vo,_o]];for(let z=0;z<$.length;z++){let[K,V]=$[z],N=M(x,K);M(S,K,N),M(N,V,x);let _=ze(Ao);j(N,e,_);let W=ze();j(N,n),j(_,e,_),j(_,n,W),j(W,e,_),j(W,n,W),M(_,V,x),M(W,V,x)}return M(o,br,w),M(o,Nl,T0),{start:o,tokens:df}}function E0(t,e,n){let r=n.length,o=0,i=[],s=[];for(;o=0&&f++,o++,d++;if(f<0)o-=d,o0&&(i.push(wl(rf,e,s)),s=[]),o-=f,d-=f;let h=u.t,p=n.slice(o-d,o);i.push(wl(h,e,p))}}return s.length>0&&i.push(wl(rf,e,s)),i}function wl(t,e,n){let r=n[0].s,o=n[n.length-1].e,i=e.slice(r,o);return new t(i,n)}var N0=typeof console<"u"&&console&&console.warn||(()=>{}),O0="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",Z={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function hf(){return Te.groups={},Z.scanner=null,Z.parser=null,Z.tokenQueue=[],Z.pluginQueue=[],Z.customSchemes=[],Z.initialized=!1,Z}function Ll(t,e=!1){if(Z.initialized&&N0(`linkifyjs: already initialized - will not register custom scheme "${t}" ${O0}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(t))throw new Error(`linkifyjs: incorrect scheme format. 1. Must only contain digits, lowercase ASCII letters or "-" 2. Cannot start or end with "-" 3. "-" cannot repeat`);Z.customSchemes.push([t,e])}function R0(){Z.scanner=v0(Z.customSchemes);for(let t=0;t{let o=e.some(c=>c.docChanged)&&!n.doc.eq(r.doc),i=e.some(c=>c.getMeta("preventAutolink"));if(!o||i)return;let{tr:s}=r,l=Js(n.doc,[...e]);if(el(l).forEach(({newRange:c})=>{let d=jd(r.doc,c,h=>h.isTextblock),u,f;if(d.length>1)u=d[0],f=r.doc.textBetween(u.pos,u.pos+u.node.nodeSize,void 0," ");else if(d.length){let h=r.doc.textBetween(c.from,c.to," "," ");if(!I0.test(h))return;u=d[0],f=r.doc.textBetween(u.pos,c.to,void 0," ")}if(u&&f){let h=f.split(D0).filter(Boolean);if(h.length<=0)return!1;let p=h[h.length-1],m=u.pos+f.lastIndexOf(p);if(!p)return!1;let g=ri(p).map(y=>y.toObject(t.defaultProtocol));if(!L0(g))return!1;g.filter(y=>y.isLink).map(y=>({...y,from:m+y.start+1,to:m+y.end+1})).filter(y=>r.schema.marks.code?!r.doc.rangeHasMark(y.from,y.to,r.schema.marks.code):!0).filter(y=>t.validate(y.value)).filter(y=>t.shouldAutoLink(y.value)).forEach(y=>{po(y.from,y.to,r.doc).some(w=>w.mark.type===t.type)||s.addMark(y.from,y.to,t.type.create({href:y.href}))})}}),!!s.steps.length)return s}})}function z0(t){return new P({key:new H("handleClickLink"),props:{handleClick:(e,n,r)=>{var o,i;if(r.button!==0||!e.editable)return!1;let s=!1;if(t.enableClickSelection&&(s=t.editor.commands.extendMarkRange(t.type.name)),t.openOnClick){let l=null;if(r.target instanceof HTMLAnchorElement)l=r.target;else{let u=r.target,f=[];for(;u.nodeName!=="DIV";)f.push(u),u=u.parentNode;l=f.find(h=>h.nodeName==="A")}if(!l)return s;let a=Zs(e.state,t.type.name),c=(o=l?.href)!=null?o:a.href,d=(i=l?.target)!=null?i:a.target;l&&c&&(window.open(c,d),s=!0)}return s}}})}function H0(t){return new P({key:new H("handlePasteLink"),props:{handlePaste:(e,n,r)=>{let{shouldAutoLink:o}=t,{state:i}=e,{selection:s}=i,{empty:l}=s;if(l)return!1;let a="";r.content.forEach(d=>{a+=d.textContent});let c=oi(a,{defaultProtocol:t.defaultProtocol}).find(d=>d.isLink&&d.value===a);return!a||!c||o!==void 0&&!o(c.href)?!1:t.editor.commands.setMark(t.type,{href:c.href})}}})}function rn(t,e){let n=["http","https","ftp","ftps","mailto","tel","callto","sms","cid","xmpp"];return e&&e.forEach(r=>{let o=typeof r=="string"?r:r.scheme;o&&n.push(o)}),!t||t.replace(P0,"").match(new RegExp(`^(?:(?:${n.join("|")}):|[^a-z]|[a-z0-9+.-]+(?:[^a-z+.-:]|$))`,"i"))}var $0=ee.create({name:"link",priority:1e3,keepOnSplit:!1,exitable:!0,onCreate(){this.options.validate&&!this.options.shouldAutoLink&&(this.options.shouldAutoLink=this.options.validate,console.warn("The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.")),this.options.protocols.forEach(t=>{if(typeof t=="string"){Ll(t);return}Ll(t.scheme,t.optionalSlashes)})},onDestroy(){hf()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,enableClickSelection:!1,linkOnPaste:!0,autolink:!0,protocols:[],defaultProtocol:"http",HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},isAllowedUri:(t,e)=>!!rn(t,e.protocols),validate:t=>!!t,shouldAutoLink:t=>!!t}},addAttributes(){return{href:{default:null,parseHTML(t){return t.getAttribute("href")}},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:"a[href]",getAttrs:t=>{let e=t.getAttribute("href");return!e||!this.options.isAllowedUri(e,{defaultValidate:n=>!!rn(n,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:null}}]},renderHTML({HTMLAttributes:t}){return this.options.isAllowedUri(t.href,{defaultValidate:e=>!!rn(e,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?["a",R(this.options.HTMLAttributes,t),0]:["a",R(this.options.HTMLAttributes,{...t,href:""}),0]},markdownTokenName:"link",parseMarkdown:(t,e)=>e.applyMark("link",e.parseInline(t.tokens||[]),{href:t.href,title:t.title||null}),renderMarkdown:(t,e)=>{var n;let r=((n=t.attrs)==null?void 0:n.href)||"";return`[${e.renderChildren(t)}](${r})`},addCommands(){return{setLink:t=>({chain:e})=>{let{href:n}=t;return this.options.isAllowedUri(n,{defaultValidate:r=>!!rn(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?e().setMark(this.name,t).setMeta("preventAutolink",!0).run():!1},toggleLink:t=>({chain:e})=>{let{href:n}=t||{};return n&&!this.options.isAllowedUri(n,{defaultValidate:r=>!!rn(r,this.options.protocols),protocols:this.options.protocols,defaultProtocol:this.options.defaultProtocol})?!1:e().toggleMark(this.name,t,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()},unsetLink:()=>({chain:t})=>t().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[Me({find:t=>{let e=[];if(t){let{protocols:n,defaultProtocol:r}=this.options,o=oi(t).filter(i=>i.isLink&&this.options.isAllowedUri(i.value,{defaultValidate:s=>!!rn(s,n),protocols:n,defaultProtocol:r}));o.length&&o.forEach(i=>{this.options.shouldAutoLink(i.value)&&e.push({text:i.value,data:{href:i.href},index:i.start})})}return e},type:this.type,getAttributes:t=>{var e;return{href:(e=t.data)==null?void 0:e.href}}})]},addProseMirrorPlugins(){let t=[],{protocols:e,defaultProtocol:n}=this.options;return this.options.autolink&&t.push(B0({type:this.type,defaultProtocol:this.options.defaultProtocol,validate:r=>this.options.isAllowedUri(r,{defaultValidate:o=>!!rn(o,e),protocols:e,defaultProtocol:n}),shouldAutoLink:this.options.shouldAutoLink})),t.push(z0({type:this.type,editor:this.editor,openOnClick:this.options.openOnClick==="whenNotEditable"?!0:this.options.openOnClick,enableClickSelection:this.options.enableClickSelection})),this.options.linkOnPaste&&t.push(H0({editor:this.editor,defaultProtocol:this.options.defaultProtocol,type:this.type,shouldAutoLink:this.options.shouldAutoLink})),t}}),pf=$0;var F0=Object.defineProperty,V0=(t,e)=>{for(var n in e)F0(t,n,{get:e[n],enumerable:!0})},_0="listItem",mf="textStyle",gf=/^\s*([-+*])\s$/,$l=F.create({name:"bulletList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul"}]},renderHTML({HTMLAttributes:t}){return["ul",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"list",parseMarkdown:(t,e)=>t.type!=="list"||t.ordered?[]:{type:"bulletList",content:t.items?e.parseChildren(t.items):[]},renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` `):"",markdownOptions:{indentsContent:!0},addCommands(){return{toggleBulletList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(_0,this.editor.getAttributes(mf)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-8":()=>this.editor.commands.toggleBulletList()}},addInputRules(){let t=tt({find:gf,type:this.type});return(this.options.keepMarks||this.options.keepAttributes)&&(t=tt({find:gf,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:()=>this.editor.getAttributes(mf),editor:this.editor})),[t]}}),Fl=F.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"list_item",parseMarkdown:(t,e)=>{if(t.type!=="list_item")return[];let n=[];if(t.tokens&&t.tokens.length>0)if(t.tokens.some(o=>o.type==="paragraph"))n=e.parseChildren(t.tokens);else{let o=t.tokens[0];if(o&&o.type==="text"&&o.tokens&&o.tokens.length>0){if(n=[{type:"paragraph",content:e.parseInline(o.tokens)}],t.tokens.length>1){let s=t.tokens.slice(1),l=e.parseChildren(s);n.push(...l)}}else n=e.parseChildren(t.tokens)}return n.length===0&&(n=[{type:"paragraph",content:[]}]),{type:"listItem",content:n}},renderMarkdown:(t,e,n)=>cr(t,e,r=>r.parentType==="bulletList"?"- ":r.parentType==="orderedList"?`${r.index+1}. `:"- ",n),addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),W0={};V0(W0,{findListItemPos:()=>xr,getNextListDepth:()=>Vl,handleBackspace:()=>zl,handleDelete:()=>Hl,hasListBefore:()=>xf,hasListItemAfter:()=>j0,hasListItemBefore:()=>kf,listItemHasSubList:()=>Sf,nextListIsDeeper:()=>Cf,nextListIsHigher:()=>vf});var xr=(t,e)=>{let{$from:n}=e.selection,r=ne(t,e.schema),o=null,i=n.depth,s=n.pos,l=null;for(;i>0&&l===null;)o=n.node(i),o.type===r?l=i:(i-=1,s-=1);return l===null?null:{$pos:e.doc.resolve(s),depth:l}},Vl=(t,e)=>{let n=xr(t,e);if(!n)return!1;let[,r]=Xd(e,t,n.$pos.pos+4);return r},xf=(t,e,n)=>{let{$anchor:r}=t.selection,o=Math.max(0,r.pos-2),i=t.doc.resolve(o).node();return!(!i||!n.includes(i.type.name))},kf=(t,e)=>{var n;let{$anchor:r}=e.selection,o=e.doc.resolve(r.pos-2);return!(o.index()===0||((n=o.nodeBefore)==null?void 0:n.type.name)!==t)},Sf=(t,e,n)=>{if(!n)return!1;let r=ne(t,e.schema),o=!1;return n.descendants(i=>{i.type===r&&(o=!0)}),o},zl=(t,e,n)=>{if(t.commands.undoInputRule())return!0;if(t.state.selection.from!==t.state.selection.to)return!1;if(!Ze(t.state,e)&&xf(t.state,e,n)){let{$anchor:l}=t.state.selection,a=t.state.doc.resolve(l.before()-1),c=[];a.node().descendants((f,h)=>{f.type.name===e&&c.push({node:f,pos:h})});let d=c.at(-1);if(!d)return!1;let u=t.state.doc.resolve(a.start()+d.pos+1);return t.chain().cut({from:l.start()-1,to:l.end()+1},u.end()).joinForward().run()}if(!Ze(t.state,e)||!Qd(t.state))return!1;let r=xr(e,t.state);if(!r)return!1;let i=t.state.doc.resolve(r.$pos.pos-2).node(r.depth),s=Sf(e,t.state,i);return kf(e,t.state)&&!s?t.commands.joinItemBackward():t.chain().liftListItem(e).run()},Cf=(t,e)=>{let n=Vl(t,e),r=xr(t,e);return!r||!n?!1:n>r.depth},vf=(t,e)=>{let n=Vl(t,e),r=xr(t,e);return!r||!n?!1:n{if(!Ze(t.state,e)||!Yd(t.state,e))return!1;let{selection:n}=t.state,{$from:r,$to:o}=n;return!n.empty&&r.sameParent(o)?!1:Cf(e,t.state)?t.chain().focus(t.state.selection.from+4).lift(e).joinBackward().run():vf(e,t.state)?t.chain().joinForward().joinBackward().run():t.commands.joinItemForward()},j0=(t,e)=>{var n;let{$anchor:r}=e.selection,o=e.doc.resolve(r.pos-r.parentOffset-2);return!(o.index()===o.parent.childCount-1||((n=o.nodeAfter)==null?void 0:n.type.name)!==t)},U0=U.create({name:"listKeymap",addOptions(){return{listTypes:[{itemName:"listItem",wrapperNames:["bulletList","orderedList"]},{itemName:"taskItem",wrapperNames:["taskList"]}]}},addKeyboardShortcuts(){return{Delete:({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n})=>{t.state.schema.nodes[n]!==void 0&&Hl(t,n)&&(e=!0)}),e},"Mod-Delete":({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n})=>{t.state.schema.nodes[n]!==void 0&&Hl(t,n)&&(e=!0)}),e},Backspace:({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n,wrapperNames:r})=>{t.state.schema.nodes[n]!==void 0&&zl(t,n,r)&&(e=!0)}),e},"Mod-Backspace":({editor:t})=>{let e=!1;return this.options.listTypes.forEach(({itemName:n,wrapperNames:r})=>{t.state.schema.nodes[n]!==void 0&&zl(t,n,r)&&(e=!0)}),e}}}}),yf=/^(\s*)(\d+)\.\s+(.*)$/,K0=/^\s/;function q0(t){let e=[],n=0,r=0;for(;ne;)f.push(t[u]),u+=1;if(f.length>0){let h=Math.min(...f.map(m=>m.indent)),p=Mf(f,h,n);c.push({type:"list",ordered:!0,start:f[0].number,items:p,raw:f.map(m=>m.raw).join(` `)})}o.push({type:"list_item",raw:s.raw,tokens:c}),i=u}else i+=1}return o}function J0(t,e){return t.map(n=>{if(n.type!=="list_item")return e.parseChildren([n])[0];let r=[];return n.tokens&&n.tokens.length>0&&n.tokens.forEach(o=>{if(o.type==="paragraph"||o.type==="list"||o.type==="blockquote"||o.type==="code")r.push(...e.parseChildren([o]));else if(o.type==="text"&&o.tokens){let i=e.parseChildren([o]);r.push({type:"paragraph",content:i})}else{let i=e.parseChildren([o]);i.length>0&&r.push(...i)}}),{type:"listItem",content:r}})}var G0="listItem",bf="textStyle",wf=/^(\d+)\.\s$/,_l=F.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:t=>t.hasAttribute("start")?parseInt(t.getAttribute("start")||"",10):1},type:{default:null,parseHTML:t=>t.getAttribute("type")}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:t}){let{start:e,...n}=t;return e===1?["ol",R(this.options.HTMLAttributes,n),0]:["ol",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"list",parseMarkdown:(t,e)=>{if(t.type!=="list"||!t.ordered)return[];let n=t.start||1,r=t.items?J0(t.items,e):[];return n!==1?{type:"orderedList",attrs:{start:n},content:r}:{type:"orderedList",content:r}},renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` `):"",markdownTokenizer:{name:"orderedList",level:"block",start:t=>{let e=t.match(/^(\s*)(\d+)\.\s+/),n=e?.index;return n!==void 0?n:-1},tokenize:(t,e,n)=>{var r;let o=t.split(` `),[i,s]=q0(o);if(i.length===0)return;let l=Mf(i,0,n);return l.length===0?void 0:{type:"list",ordered:!0,start:((r=i[0])==null?void 0:r.number)||1,items:l,raw:o.slice(0,s).join(` `)}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleOrderedList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(G0,this.editor.getAttributes(bf)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let t=tt({find:wf,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(t=tt({find:wf,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(bf)}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1],editor:this.editor})),[t]}}),X0=/^\s*(\[([( |x])?\])\s$/,Y0=F.create({name:"taskItem",addOptions(){return{nested:!1,HTMLAttributes:{},taskListTypeName:"taskList",a11y:void 0}},content(){return this.options.nested?"paragraph block*":"paragraph+"},defining:!0,addAttributes(){return{checked:{default:!1,keepOnSplit:!1,parseHTML:t=>{let e=t.getAttribute("data-checked");return e===""||e==="true"},renderHTML:t=>({"data-checked":t.checked})}}},parseHTML(){return[{tag:`li[data-type="${this.name}"]`,priority:51}]},renderHTML({node:t,HTMLAttributes:e}){return["li",R(this.options.HTMLAttributes,e,{"data-type":this.name}),["label",["input",{type:"checkbox",checked:t.attrs.checked?"checked":null}],["span"]],["div",0]]},parseMarkdown:(t,e)=>{let n=[];if(t.tokens&&t.tokens.length>0?n.push(e.createNode("paragraph",{},e.parseInline(t.tokens))):t.text?n.push(e.createNode("paragraph",{},[e.createNode("text",{text:t.text})])):n.push(e.createNode("paragraph",{},[])),t.nestedTokens&&t.nestedTokens.length>0){let r=e.parseChildren(t.nestedTokens);n.push(...r)}return e.createNode("taskItem",{checked:t.checked||!1},n)},renderMarkdown:(t,e)=>{var n;let o=`- [${(n=t.attrs)!=null&&n.checked?"x":" "}] `;return cr(t,e,o)},addKeyboardShortcuts(){let t={Enter:()=>this.editor.commands.splitListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)};return this.options.nested?{...t,Tab:()=>this.editor.commands.sinkListItem(this.name)}:t},addNodeView(){return({node:t,HTMLAttributes:e,getPos:n,editor:r})=>{let o=document.createElement("li"),i=document.createElement("label"),s=document.createElement("span"),l=document.createElement("input"),a=document.createElement("div"),c=d=>{var u,f;l.ariaLabel=((f=(u=this.options.a11y)==null?void 0:u.checkboxLabel)==null?void 0:f.call(u,d,l.checked))||`Task item checkbox for ${d.textContent||"empty task item"}`};return c(t),i.contentEditable="false",l.type="checkbox",l.addEventListener("mousedown",d=>d.preventDefault()),l.addEventListener("change",d=>{if(!r.isEditable&&!this.options.onReadOnlyChecked){l.checked=!l.checked;return}let{checked:u}=d.target;r.isEditable&&typeof n=="function"&&r.chain().focus(void 0,{scrollIntoView:!1}).command(({tr:f})=>{let h=n();if(typeof h!="number")return!1;let p=f.doc.nodeAt(h);return f.setNodeMarkup(h,void 0,{...p?.attrs,checked:u}),!0}).run(),!r.isEditable&&this.options.onReadOnlyChecked&&(this.options.onReadOnlyChecked(t,u)||(l.checked=!l.checked))}),Object.entries(this.options.HTMLAttributes).forEach(([d,u])=>{o.setAttribute(d,u)}),o.dataset.checked=t.attrs.checked,l.checked=t.attrs.checked,i.append(l,s),o.append(i,a),Object.entries(e).forEach(([d,u])=>{o.setAttribute(d,u)}),{dom:o,contentDOM:a,update:d=>d.type!==this.type?!1:(o.dataset.checked=d.attrs.checked,l.checked=d.attrs.checked,c(d),!0)}}},addInputRules(){return[tt({find:X0,type:this.type,getAttributes:t=>({checked:t[t.length-1]==="x"})})]}}),Q0=F.create({name:"taskList",addOptions(){return{itemTypeName:"taskItem",HTMLAttributes:{}}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:`ul[data-type="${this.name}"]`,priority:51}]},renderHTML({HTMLAttributes:t}){return["ul",R(this.options.HTMLAttributes,t,{"data-type":this.name}),0]},parseMarkdown:(t,e)=>e.createNode("taskList",{},e.parseChildren(t.items||[])),renderMarkdown:(t,e)=>t.content?e.renderChildren(t.content,` `):"",markdownTokenizer:{name:"taskList",level:"block",start(t){var e;let n=(e=t.match(/^\s*[-+*]\s+\[([ xX])\]\s+/))==null?void 0:e.index;return n!==void 0?n:-1},tokenize(t,e,n){let r=i=>{let s=wo(i,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:l=>({indentLevel:l[1].length,mainContent:l[4],checked:l[3].toLowerCase()==="x"}),createToken:(l,a)=>({type:"taskItem",raw:"",mainContent:l.mainContent,indentLevel:l.indentLevel,checked:l.checked,text:l.mainContent,tokens:n.inlineTokens(l.mainContent),nestedTokens:a}),customNestedParser:r},n);return s?[{type:"taskList",raw:s.raw,items:s.items}]:n.blockTokens(i)},o=wo(t,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:i=>({indentLevel:i[1].length,mainContent:i[4],checked:i[3].toLowerCase()==="x"}),createToken:(i,s)=>({type:"taskItem",raw:"",mainContent:i.mainContent,indentLevel:i.indentLevel,checked:i.checked,text:i.mainContent,tokens:n.inlineTokens(i.mainContent),nestedTokens:s}),customNestedParser:r},n);if(o)return{type:"taskList",raw:o.raw,items:o.items}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleTaskList:()=>({commands:t})=>t.toggleList(this.name,this.options.itemTypeName)}},addKeyboardShortcuts(){return{"Mod-Shift-9":()=>this.editor.commands.toggleTaskList()}}}),dv=U.create({name:"listKit",addExtensions(){let t=[];return this.options.bulletList!==!1&&t.push($l.configure(this.options.bulletList)),this.options.listItem!==!1&&t.push(Fl.configure(this.options.listItem)),this.options.listKeymap!==!1&&t.push(U0.configure(this.options.listKeymap)),this.options.orderedList!==!1&&t.push(_l.configure(this.options.orderedList)),this.options.taskItem!==!1&&t.push(Y0.configure(this.options.taskItem)),this.options.taskList!==!1&&t.push(Q0.configure(this.options.taskList)),t}});var ii=(t,e,n={})=>{t.dom.closest("form")?.dispatchEvent(new CustomEvent(e,{composed:!0,cancelable:!0,detail:n}))},Tf=({files:t,acceptedTypes:e,acceptedTypesValidationMessage:n,maxSize:r,maxSizeValidationMessage:o})=>{for(let i of t){if(e&&!e.includes(i.type))return n;if(r&&i.size>+r*1024)return o}return null},Z0=({editor:t,acceptedTypes:e,acceptedTypesValidationMessage:n,get$WireUsing:r,key:o,maxSize:i,maxSizeValidationMessage:s,statePath:l,uploadingMessage:a})=>{let c=d=>Livewire.fireAction(r().__instance,"callSchemaComponentMethod",[o,"getUploadedFileAttachmentTemporaryUrl",{attachment:d}],{async:!0});return new P({key:new H("localFiles"),props:{handleDrop(d,u){if(!u.dataTransfer?.files.length)return!1;let f=Array.from(u.dataTransfer.files),h=Tf({files:f,acceptedTypes:e,acceptedTypesValidationMessage:n,maxSize:i,maxSizeValidationMessage:s});if(h)return d.dom.dispatchEvent(new CustomEvent("rich-editor-file-validation-message",{bubbles:!0,detail:{key:o,livewireId:r().id,validationMessage:h}})),!1;if(!f.length)return!1;ii(d,"form-processing-started",{message:a}),u.preventDefault(),u.stopPropagation();let p=d.posAtCoords({left:u.clientX,top:u.clientY});return f.forEach((m,g)=>{t.setEditable(!1),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:o,livewireId:r().id}}));let y=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,w=>(w^crypto.getRandomValues(new Uint8Array(1))[0]&15>>w/4).toString(16));r().upload(`componentFileAttachments.${l}.${y}`,m,()=>{c(y).then(w=>{w&&(t.chain().insertContentAt(p?.pos??0,{type:"image",attrs:{id:y,src:w}}).run(),t.setEditable(!0),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:o,livewireId:r().id}})),g===f.length-1&&ii(d,"form-processing-finished"))})})}),!0},handlePaste(d,u){if(!u.clipboardData?.files.length||u.clipboardData?.getData("text").length)return!1;let f=Array.from(u.clipboardData.files),h=Tf({files:f,acceptedTypes:e,acceptedTypesValidationMessage:n,maxSize:i,maxSizeValidationMessage:s});return h?(d.dom.dispatchEvent(new CustomEvent("rich-editor-file-validation-message",{bubbles:!0,detail:{key:o,livewireId:r().id,validationMessage:h}})),!1):f.length?(u.preventDefault(),u.stopPropagation(),ii(d,"form-processing-started",{message:a}),f.forEach((p,m)=>{t.setEditable(!1),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploading-file",{bubbles:!0,detail:{key:o,livewireId:r().id}}));let g=("10000000-1000-4000-8000"+-1e11).replace(/[018]/g,y=>(y^crypto.getRandomValues(new Uint8Array(1))[0]&15>>y/4).toString(16));r().upload(`componentFileAttachments.${l}.${g}`,p,()=>{c(g).then(y=>{y&&(t.chain().insertContentAt(t.state.selection.anchor,{type:"image",attrs:{id:g,src:y}}).run(),t.setEditable(!0),d.dom.dispatchEvent(new CustomEvent("rich-editor-uploaded-file",{bubbles:!0,detail:{key:o,livewireId:r().id}})),m===f.length-1&&ii(d,"form-processing-finished"))})})}),!0):!1}}})},Af=U.create({name:"localFiles",addOptions(){return{acceptedTypes:[],acceptedTypesValidationMessage:null,key:null,maxSize:null,maxSizeValidationMessage:null,statePath:null,uploadingMessage:null,get$WireUsing:null}},addProseMirrorPlugins(){return[Z0({editor:this.editor,...this.options})]}});function ew(t){var e;let{char:n,allowSpaces:r,allowToIncludeChar:o,allowedPrefixes:i,startOfLine:s,$position:l}=t,a=r&&!o,c=wu(n),d=new RegExp(`\\s${c}$`),u=s?"^":"",f=o?"":c,h=a?new RegExp(`${u}${c}.*?(?=\\s${f}|$)`,"gm"):new RegExp(`${u}(?:^)?${c}[^\\s${f}]*`,"gm"),p=((e=l.nodeBefore)==null?void 0:e.isText)&&l.nodeBefore.text;if(!p)return null;let m=l.pos-p.length,g=Array.from(p.matchAll(h)).pop();if(!g||g.input===void 0||g.index===void 0)return null;let y=g.input.slice(Math.max(0,g.index-1),g.index),w=new RegExp(`^[${i?.join("")}\0]?$`).test(y);if(i!==null&&!w)return null;let b=m+g.index,C=b+g[0].length;return a&&d.test(p.slice(C-1,C+1))&&(g[0]+=" ",C+=1),b=l.pos?{range:{from:b,to:C},query:g[0].slice(n.length),text:g[0]}:null}var tw=new H("suggestion");function nw({pluginKey:t=tw,editor:e,char:n="@",allowSpaces:r=!1,allowToIncludeChar:o=!1,allowedPrefixes:i=[" "],startOfLine:s=!1,decorationTag:l="span",decorationClass:a="suggestion",decorationContent:c="",decorationEmptyClass:d="is-empty",command:u=()=>null,items:f=()=>[],render:h=()=>({}),allow:p=()=>!0,findSuggestionMatch:m=ew}){let g,y=h?.(),w=()=>{let S=e.state.selection.$anchor.pos,k=e.view.coordsAtPos(S),{top:O,right:T,bottom:A,left:$}=k;try{return new DOMRect($,O,T-$,A-O)}catch{return null}},b=(S,k)=>k?()=>{let O=t.getState(e.state),T=O?.decorationId,A=S.dom.querySelector(`[data-decoration-id="${T}"]`);return A?.getBoundingClientRect()||null}:w;function C(S,k){var O;try{let A=t.getState(S.state),$=A?.decorationId?S.dom.querySelector(`[data-decoration-id="${A.decorationId}"]`):null,z={editor:e,range:A?.range||{from:0,to:0},query:A?.query||null,text:A?.text||null,items:[],command:K=>u({editor:e,range:A?.range||{from:0,to:0},props:K}),decorationNode:$,clientRect:b(S,$)};(O=y?.onExit)==null||O.call(y,z)}catch{}let T=S.state.tr.setMeta(k,{exit:!0});S.dispatch(T)}let x=new P({key:t,view(){return{update:async(S,k)=>{var O,T,A,$,z,K,V;let N=(O=this.key)==null?void 0:O.getState(k),_=(T=this.key)==null?void 0:T.getState(S.state),W=N.active&&_.active&&N.range.from!==_.range.from,Q=!N.active&&_.active,me=N.active&&!_.active,Ge=!Q&&!me&&N.query!==_.query,q=Q||W&&Ge,We=Ge||W,je=me||W&&Ge;if(!q&&!We&&!je)return;let dn=je&&!q?N:_,aa=S.dom.querySelector(`[data-decoration-id="${dn.decorationId}"]`);g={editor:e,range:dn.range,query:dn.query,text:dn.text,items:[],command:ip=>u({editor:e,range:dn.range,props:ip}),decorationNode:aa,clientRect:b(S,aa)},q&&((A=y?.onBeforeStart)==null||A.call(y,g)),We&&(($=y?.onBeforeUpdate)==null||$.call(y,g)),(We||q)&&(g.items=await f({editor:e,query:dn.query})),je&&((z=y?.onExit)==null||z.call(y,g)),We&&((K=y?.onUpdate)==null||K.call(y,g)),q&&((V=y?.onStart)==null||V.call(y,g))},destroy:()=>{var S;g&&((S=y?.onExit)==null||S.call(y,g))}}},state:{init(){return{active:!1,range:{from:0,to:0},query:null,text:null,composing:!1}},apply(S,k,O,T){let{isEditable:A}=e,{composing:$}=e.view,{selection:z}=S,{empty:K,from:V}=z,N={...k},_=S.getMeta(t);if(_&&_.exit)return N.active=!1,N.decorationId=null,N.range={from:0,to:0},N.query=null,N.text=null,N;if(N.composing=$,A&&(K||e.view.composing)){(Vk.range.to)&&!$&&!k.composing&&(N.active=!1);let W=m({char:n,allowSpaces:r,allowToIncludeChar:o,allowedPrefixes:i,startOfLine:s,$position:z.$from}),Q=`id_${Math.floor(Math.random()*4294967295)}`;W&&p({editor:e,state:T,range:W.range,isActive:k.active})?(N.active=!0,N.decorationId=k.decorationId?k.decorationId:Q,N.range=W.range,N.query=W.query,N.text=W.text):N.active=!1}else N.active=!1;return N.active||(N.decorationId=null,N.range={from:0,to:0},N.query=null,N.text=null),N}},props:{handleKeyDown(S,k){var O,T,A,$;let{active:z,range:K}=x.getState(S.state);if(!z)return!1;if(k.key==="Escape"||k.key==="Esc"){let N=x.getState(S.state),_=(O=g?.decorationNode)!=null?O:null,W=_??(N?.decorationId?S.dom.querySelector(`[data-decoration-id="${N.decorationId}"]`):null);if(((T=y?.onKeyDown)==null?void 0:T.call(y,{view:S,event:k,range:N.range}))||!1)return!0;let me={editor:e,range:N.range,query:N.query,text:N.text,items:[],command:Ge=>u({editor:e,range:N.range,props:Ge}),decorationNode:W,clientRect:W?()=>W.getBoundingClientRect()||null:null};return(A=y?.onExit)==null||A.call(y,me),C(S,t),!0}return(($=y?.onKeyDown)==null?void 0:$.call(y,{view:S,event:k,range:K}))||!1},decorations(S){let{active:k,range:O,decorationId:T,query:A}=x.getState(S);if(!k)return null;let $=!A?.length,z=[a];return $&&z.push(d),Y.create(S.doc,[te.inline(O.from,O.to,{nodeName:l,class:z.join(" "),"data-decoration-id":T,"data-decoration-content":c})])}}});return x}var si=nw;var rw=function({editor:t,overrideSuggestionOptions:e,extensionName:n}){let r=new H;return{editor:t,char:"{{",pluginKey:r,command:({editor:o,range:i,props:s})=>{o.view.state.selection.$to.nodeAfter?.text?.startsWith(" ")&&(i.to+=1),o.chain().focus().insertContentAt(i,[{type:n,attrs:{...s}},{type:"text",text:" "}]).run(),o.view.dom.ownerDocument.defaultView?.getSelection()?.collapseToEnd()},allow:({state:o,range:i})=>{let s=o.doc.resolve(i.from),l=o.schema.nodes[n];return!!s.parent.type.contentMatch.matchType(l)},...e}},Ef=F.create({name:"mergeTag",priority:101,addStorage(){return{mergeTags:[],suggestions:[],getSuggestionFromChar:()=>null}},addOptions(){return{HTMLAttributes:{},renderText({node:t}){return`{{ ${this.mergeTags[t.attrs.id]} }}`},deleteTriggerWithBackspace:!1,renderHTML({options:t,node:e}){return["span",R(this.HTMLAttributes,t.HTMLAttributes),`${this.mergeTags[e.attrs.id]}`]},suggestions:[],suggestion:{}}},group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}}}},parseHTML(){return[{tag:`span[data-type="${this.name}"]`}]},renderHTML({node:t,HTMLAttributes:e}){let n=this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar("{{"),r={...this.options};r.HTMLAttributes=R({"data-type":this.name},this.options.HTMLAttributes,e);let o=this.options.renderHTML({options:r,node:t,suggestion:n});return typeof o=="string"?["span",R({"data-type":this.name},this.options.HTMLAttributes,e),o]:o},renderText({node:t}){let e={options:this.options,node:t,suggestion:this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar("{{")};return this.options.renderText(e)},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:o,anchor:i}=r;if(!o)return!1;let s=new ie,l=0;return e.doc.nodesBetween(i-1,i,(a,c)=>{if(a.type.name===this.name)return n=!0,s=a,l=c,!1}),n&&t.insertText(this.options.deleteTriggerWithBackspace?"":"{{",l,l+s.nodeSize),n})}},addProseMirrorPlugins(){return[...this.storage.suggestions.map(si),new P({props:{handleDrop(t,e){if(!e||(e.preventDefault(),!e.dataTransfer.getData("mergeTag")))return!1;let n=e.dataTransfer.getData("mergeTag");return t.dispatch(t.state.tr.insert(t.posAtCoords({left:e.clientX,top:e.clientY}).pos,t.state.schema.nodes.mergeTag.create({id:n}))),!1}}})]},onBeforeCreate(){this.storage.suggestions=(this.options.suggestions.length?this.options.suggestions:[this.options.suggestion]).map(t=>rw({editor:this.editor,overrideSuggestionOptions:t,extensionName:this.name})),this.storage.getSuggestionFromChar=t=>{let e=this.storage.suggestions.find(n=>n.char===t);return e||(this.storage.suggestions.length?this.storage.suggestions[0]:null)}}});var Wl=["top","right","bottom","left"],Nf=["start","end"],jl=Wl.reduce((t,e)=>t.concat(e,e+"-"+Nf[0],e+"-"+Nf[1]),[]),$e=Math.min,pe=Math.max,Cr=Math.round;var Ue=t=>({x:t,y:t}),ow={left:"right",right:"left",bottom:"top",top:"bottom"},iw={start:"end",end:"start"};function li(t,e,n){return pe(t,$e(e,n))}function st(t,e){return typeof t=="function"?t(e):t}function Ne(t){return t.split("-")[0]}function Fe(t){return t.split("-")[1]}function Ul(t){return t==="x"?"y":"x"}function ai(t){return t==="y"?"height":"width"}var sw=new Set(["top","bottom"]);function Ke(t){return sw.has(Ne(t))?"y":"x"}function ci(t){return Ul(Ke(t))}function Kl(t,e,n){n===void 0&&(n=!1);let r=Fe(t),o=ci(t),i=ai(o),s=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return e.reference[i]>e.floating[i]&&(s=Sr(s)),[s,Sr(s)]}function Df(t){let e=Sr(t);return[kr(t),e,kr(e)]}function kr(t){return t.replace(/start|end/g,e=>iw[e])}var Of=["left","right"],Rf=["right","left"],lw=["top","bottom"],aw=["bottom","top"];function cw(t,e,n){switch(t){case"top":case"bottom":return n?e?Rf:Of:e?Of:Rf;case"left":case"right":return e?lw:aw;default:return[]}}function If(t,e,n,r){let o=Fe(t),i=cw(Ne(t),n==="start",r);return o&&(i=i.map(s=>s+"-"+o),e&&(i=i.concat(i.map(kr)))),i}function Sr(t){return t.replace(/left|right|bottom|top/g,e=>ow[e])}function dw(t){return{top:0,right:0,bottom:0,left:0,...t}}function di(t){return typeof t!="number"?dw(t):{top:t,right:t,bottom:t,left:t}}function Ct(t){let{x:e,y:n,width:r,height:o}=t;return{width:r,height:o,top:n,left:e,right:e+r,bottom:n+o,x:e,y:n}}function Pf(t,e,n){let{reference:r,floating:o}=t,i=Ke(e),s=ci(e),l=ai(s),a=Ne(e),c=i==="y",d=r.x+r.width/2-o.width/2,u=r.y+r.height/2-o.height/2,f=r[l]/2-o[l]/2,h;switch(a){case"top":h={x:d,y:r.y-o.height};break;case"bottom":h={x:d,y:r.y+r.height};break;case"right":h={x:r.x+r.width,y:u};break;case"left":h={x:r.x-o.width,y:u};break;default:h={x:r.x,y:r.y}}switch(Fe(e)){case"start":h[s]-=f*(n&&c?-1:1);break;case"end":h[s]+=f*(n&&c?-1:1);break}return h}var zf=async(t,e,n)=>{let{placement:r="bottom",strategy:o="absolute",middleware:i=[],platform:s}=n,l=i.filter(Boolean),a=await(s.isRTL==null?void 0:s.isRTL(e)),c=await s.getElementRects({reference:t,floating:e,strategy:o}),{x:d,y:u}=Pf(c,r,a),f=r,h={},p=0;for(let m=0;m({name:"arrow",options:t,async fn(e){let{x:n,y:r,placement:o,rects:i,platform:s,elements:l,middlewareData:a}=e,{element:c,padding:d=0}=st(t,e)||{};if(c==null)return{};let u=di(d),f={x:n,y:r},h=ci(o),p=ai(h),m=await s.getDimensions(c),g=h==="y",y=g?"top":"left",w=g?"bottom":"right",b=g?"clientHeight":"clientWidth",C=i.reference[p]+i.reference[h]-f[h]-i.floating[p],x=f[h]-i.reference[h],S=await(s.getOffsetParent==null?void 0:s.getOffsetParent(c)),k=S?S[b]:0;(!k||!await(s.isElement==null?void 0:s.isElement(S)))&&(k=l.floating[b]||i.floating[p]);let O=C/2-x/2,T=k/2-m[p]/2-1,A=$e(u[y],T),$=$e(u[w],T),z=A,K=k-m[p]-$,V=k/2-m[p]/2+O,N=li(z,V,K),_=!a.arrow&&Fe(o)!=null&&V!==N&&i.reference[p]/2-(VFe(o)===t),...n.filter(o=>Fe(o)!==t)]:n.filter(o=>Ne(o)===o)).filter(o=>t?Fe(o)===t||(e?kr(o)!==o:!1):!0)}var $f=function(t){return t===void 0&&(t={}),{name:"autoPlacement",options:t,async fn(e){var n,r,o;let{rects:i,middlewareData:s,placement:l,platform:a,elements:c}=e,{crossAxis:d=!1,alignment:u,allowedPlacements:f=jl,autoAlignment:h=!0,...p}=st(t,e),m=u!==void 0||f===jl?uw(u||null,h,f):f,g=await on(e,p),y=((n=s.autoPlacement)==null?void 0:n.index)||0,w=m[y];if(w==null)return{};let b=Kl(w,i,await(a.isRTL==null?void 0:a.isRTL(c.floating)));if(l!==w)return{reset:{placement:m[0]}};let C=[g[Ne(w)],g[b[0]],g[b[1]]],x=[...((r=s.autoPlacement)==null?void 0:r.overflows)||[],{placement:w,overflows:C}],S=m[y+1];if(S)return{data:{index:y+1,overflows:x},reset:{placement:S}};let k=x.map(A=>{let $=Fe(A.placement);return[A.placement,$&&d?A.overflows.slice(0,2).reduce((z,K)=>z+K,0):A.overflows[0],A.overflows]}).sort((A,$)=>A[1]-$[1]),T=((o=k.filter(A=>A[2].slice(0,Fe(A[0])?2:3).every($=>$<=0))[0])==null?void 0:o[0])||k[0][0];return T!==l?{data:{index:y+1,overflows:x},reset:{placement:T}}:{}}}},Ff=function(t){return t===void 0&&(t={}),{name:"flip",options:t,async fn(e){var n,r;let{placement:o,middlewareData:i,rects:s,initialPlacement:l,platform:a,elements:c}=e,{mainAxis:d=!0,crossAxis:u=!0,fallbackPlacements:f,fallbackStrategy:h="bestFit",fallbackAxisSideDirection:p="none",flipAlignment:m=!0,...g}=st(t,e);if((n=i.arrow)!=null&&n.alignmentOffset)return{};let y=Ne(o),w=Ke(l),b=Ne(l)===l,C=await(a.isRTL==null?void 0:a.isRTL(c.floating)),x=f||(b||!m?[Sr(l)]:Df(l)),S=p!=="none";!f&&S&&x.push(...If(l,m,p,C));let k=[l,...x],O=await on(e,g),T=[],A=((r=i.flip)==null?void 0:r.overflows)||[];if(d&&T.push(O[y]),u){let V=Kl(o,s,C);T.push(O[V[0]],O[V[1]])}if(A=[...A,{placement:o,overflows:T}],!T.every(V=>V<=0)){var $,z;let V=((($=i.flip)==null?void 0:$.index)||0)+1,N=k[V];if(N&&(!(u==="alignment"?w!==Ke(N):!1)||A.every(Q=>Ke(Q.placement)===w?Q.overflows[0]>0:!0)))return{data:{index:V,overflows:A},reset:{placement:N}};let _=(z=A.filter(W=>W.overflows[0]<=0).sort((W,Q)=>W.overflows[1]-Q.overflows[1])[0])==null?void 0:z.placement;if(!_)switch(h){case"bestFit":{var K;let W=(K=A.filter(Q=>{if(S){let me=Ke(Q.placement);return me===w||me==="y"}return!0}).map(Q=>[Q.placement,Q.overflows.filter(me=>me>0).reduce((me,Ge)=>me+Ge,0)]).sort((Q,me)=>Q[1]-me[1])[0])==null?void 0:K[0];W&&(_=W);break}case"initialPlacement":_=l;break}if(o!==_)return{reset:{placement:_}}}return{}}}};function Lf(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function Bf(t){return Wl.some(e=>t[e]>=0)}var Vf=function(t){return t===void 0&&(t={}),{name:"hide",options:t,async fn(e){let{rects:n}=e,{strategy:r="referenceHidden",...o}=st(t,e);switch(r){case"referenceHidden":{let i=await on(e,{...o,elementContext:"reference"}),s=Lf(i,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:Bf(s)}}}case"escaped":{let i=await on(e,{...o,altBoundary:!0}),s=Lf(i,n.floating);return{data:{escapedOffsets:s,escaped:Bf(s)}}}default:return{}}}}};function _f(t){let e=$e(...t.map(i=>i.left)),n=$e(...t.map(i=>i.top)),r=pe(...t.map(i=>i.right)),o=pe(...t.map(i=>i.bottom));return{x:e,y:n,width:r-e,height:o-n}}function fw(t){let e=t.slice().sort((o,i)=>o.y-i.y),n=[],r=null;for(let o=0;or.height/2?n.push([i]):n[n.length-1].push(i),r=i}return n.map(o=>Ct(_f(o)))}var Wf=function(t){return t===void 0&&(t={}),{name:"inline",options:t,async fn(e){let{placement:n,elements:r,rects:o,platform:i,strategy:s}=e,{padding:l=2,x:a,y:c}=st(t,e),d=Array.from(await(i.getClientRects==null?void 0:i.getClientRects(r.reference))||[]),u=fw(d),f=Ct(_f(d)),h=di(l);function p(){if(u.length===2&&u[0].left>u[1].right&&a!=null&&c!=null)return u.find(g=>a>g.left-h.left&&ag.top-h.top&&c=2){if(Ke(n)==="y"){let A=u[0],$=u[u.length-1],z=Ne(n)==="top",K=A.top,V=$.bottom,N=z?A.left:$.left,_=z?A.right:$.right,W=_-N,Q=V-K;return{top:K,bottom:V,left:N,right:_,width:W,height:Q,x:N,y:K}}let g=Ne(n)==="left",y=pe(...u.map(A=>A.right)),w=$e(...u.map(A=>A.left)),b=u.filter(A=>g?A.left===w:A.right===y),C=b[0].top,x=b[b.length-1].bottom,S=w,k=y,O=k-S,T=x-C;return{top:C,bottom:x,left:S,right:k,width:O,height:T,x:S,y:C}}return f}let m=await i.getElementRects({reference:{getBoundingClientRect:p},floating:r.floating,strategy:s});return o.reference.x!==m.reference.x||o.reference.y!==m.reference.y||o.reference.width!==m.reference.width||o.reference.height!==m.reference.height?{reset:{rects:m}}:{}}}},hw=new Set(["left","top"]);async function pw(t,e){let{placement:n,platform:r,elements:o}=t,i=await(r.isRTL==null?void 0:r.isRTL(o.floating)),s=Ne(n),l=Fe(n),a=Ke(n)==="y",c=hw.has(s)?-1:1,d=i&&a?-1:1,u=st(e,t),{mainAxis:f,crossAxis:h,alignmentAxis:p}=typeof u=="number"?{mainAxis:u,crossAxis:0,alignmentAxis:null}:{mainAxis:u.mainAxis||0,crossAxis:u.crossAxis||0,alignmentAxis:u.alignmentAxis};return l&&typeof p=="number"&&(h=l==="end"?p*-1:p),a?{x:h*d,y:f*c}:{x:f*c,y:h*d}}var jf=function(t){return t===void 0&&(t=0),{name:"offset",options:t,async fn(e){var n,r;let{x:o,y:i,placement:s,middlewareData:l}=e,a=await pw(e,t);return s===((n=l.offset)==null?void 0:n.placement)&&(r=l.arrow)!=null&&r.alignmentOffset?{}:{x:o+a.x,y:i+a.y,data:{...a,placement:s}}}}},Uf=function(t){return t===void 0&&(t={}),{name:"shift",options:t,async fn(e){let{x:n,y:r,placement:o}=e,{mainAxis:i=!0,crossAxis:s=!1,limiter:l={fn:g=>{let{x:y,y:w}=g;return{x:y,y:w}}},...a}=st(t,e),c={x:n,y:r},d=await on(e,a),u=Ke(Ne(o)),f=Ul(u),h=c[f],p=c[u];if(i){let g=f==="y"?"top":"left",y=f==="y"?"bottom":"right",w=h+d[g],b=h-d[y];h=li(w,h,b)}if(s){let g=u==="y"?"top":"left",y=u==="y"?"bottom":"right",w=p+d[g],b=p-d[y];p=li(w,p,b)}let m=l.fn({...e,[f]:h,[u]:p});return{...m,data:{x:m.x-n,y:m.y-r,enabled:{[f]:i,[u]:s}}}}}};var Kf=function(t){return t===void 0&&(t={}),{name:"size",options:t,async fn(e){var n,r;let{placement:o,rects:i,platform:s,elements:l}=e,{apply:a=()=>{},...c}=st(t,e),d=await on(e,c),u=Ne(o),f=Fe(o),h=Ke(o)==="y",{width:p,height:m}=i.floating,g,y;u==="top"||u==="bottom"?(g=u,y=f===(await(s.isRTL==null?void 0:s.isRTL(l.floating))?"start":"end")?"left":"right"):(y=u,g=f==="end"?"top":"bottom");let w=m-d.top-d.bottom,b=p-d.left-d.right,C=$e(m-d[g],w),x=$e(p-d[y],b),S=!e.middlewareData.shift,k=C,O=x;if((n=e.middlewareData.shift)!=null&&n.enabled.x&&(O=b),(r=e.middlewareData.shift)!=null&&r.enabled.y&&(k=w),S&&!f){let A=pe(d.left,0),$=pe(d.right,0),z=pe(d.top,0),K=pe(d.bottom,0);h?O=p-2*(A!==0||$!==0?A+$:pe(d.left,d.right)):k=m-2*(z!==0||K!==0?z+K:pe(d.top,d.bottom))}await a({...e,availableWidth:O,availableHeight:k});let T=await s.getDimensions(l.floating);return p!==T.width||m!==T.height?{reset:{rects:!0}}:{}}}};function fi(){return typeof window<"u"}function sn(t){return Jf(t)?(t.nodeName||"").toLowerCase():"#document"}function Ae(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function lt(t){var e;return(e=(Jf(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function Jf(t){return fi()?t instanceof Node||t instanceof Ae(t).Node:!1}function Ve(t){return fi()?t instanceof Element||t instanceof Ae(t).Element:!1}function qe(t){return fi()?t instanceof HTMLElement||t instanceof Ae(t).HTMLElement:!1}function qf(t){return!fi()||typeof ShadowRoot>"u"?!1:t instanceof ShadowRoot||t instanceof Ae(t).ShadowRoot}var mw=new Set(["inline","contents"]);function Rn(t){let{overflow:e,overflowX:n,overflowY:r,display:o}=_e(t);return/auto|scroll|overlay|hidden|clip/.test(e+r+n)&&!mw.has(o)}var gw=new Set(["table","td","th"]);function Gf(t){return gw.has(sn(t))}var yw=[":popover-open",":modal"];function vr(t){return yw.some(e=>{try{return t.matches(e)}catch{return!1}})}var bw=["transform","translate","scale","rotate","perspective"],ww=["transform","translate","scale","rotate","perspective","filter"],xw=["paint","layout","strict","content"];function hi(t){let e=pi(),n=Ve(t)?_e(t):t;return bw.some(r=>n[r]?n[r]!=="none":!1)||(n.containerType?n.containerType!=="normal":!1)||!e&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!e&&(n.filter?n.filter!=="none":!1)||ww.some(r=>(n.willChange||"").includes(r))||xw.some(r=>(n.contain||"").includes(r))}function Xf(t){let e=vt(t);for(;qe(e)&&!ln(e);){if(hi(e))return e;if(vr(e))return null;e=vt(e)}return null}function pi(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var kw=new Set(["html","body","#document"]);function ln(t){return kw.has(sn(t))}function _e(t){return Ae(t).getComputedStyle(t)}function Mr(t){return Ve(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function vt(t){if(sn(t)==="html")return t;let e=t.assignedSlot||t.parentNode||qf(t)&&t.host||lt(t);return qf(e)?e.host:e}function Yf(t){let e=vt(t);return ln(e)?t.ownerDocument?t.ownerDocument.body:t.body:qe(e)&&Rn(e)?e:Yf(e)}function ui(t,e,n){var r;e===void 0&&(e=[]),n===void 0&&(n=!0);let o=Yf(t),i=o===((r=t.ownerDocument)==null?void 0:r.body),s=Ae(o);if(i){let l=mi(s);return e.concat(s,s.visualViewport||[],Rn(o)?o:[],l&&n?ui(l):[])}return e.concat(o,ui(o,[],n))}function mi(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function th(t){let e=_e(t),n=parseFloat(e.width)||0,r=parseFloat(e.height)||0,o=qe(t),i=o?t.offsetWidth:n,s=o?t.offsetHeight:r,l=Cr(n)!==i||Cr(r)!==s;return l&&(n=i,r=s),{width:n,height:r,$:l}}function nh(t){return Ve(t)?t:t.contextElement}function Dn(t){let e=nh(t);if(!qe(e))return Ue(1);let n=e.getBoundingClientRect(),{width:r,height:o,$:i}=th(e),s=(i?Cr(n.width):n.width)/r,l=(i?Cr(n.height):n.height)/o;return(!s||!Number.isFinite(s))&&(s=1),(!l||!Number.isFinite(l))&&(l=1),{x:s,y:l}}var Sw=Ue(0);function rh(t){let e=Ae(t);return!pi()||!e.visualViewport?Sw:{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}}function Cw(t,e,n){return e===void 0&&(e=!1),!n||e&&n!==Ae(t)?!1:e}function Tr(t,e,n,r){e===void 0&&(e=!1),n===void 0&&(n=!1);let o=t.getBoundingClientRect(),i=nh(t),s=Ue(1);e&&(r?Ve(r)&&(s=Dn(r)):s=Dn(t));let l=Cw(i,n,r)?rh(i):Ue(0),a=(o.left+l.x)/s.x,c=(o.top+l.y)/s.y,d=o.width/s.x,u=o.height/s.y;if(i){let f=Ae(i),h=r&&Ve(r)?Ae(r):r,p=f,m=mi(p);for(;m&&r&&h!==p;){let g=Dn(m),y=m.getBoundingClientRect(),w=_e(m),b=y.left+(m.clientLeft+parseFloat(w.paddingLeft))*g.x,C=y.top+(m.clientTop+parseFloat(w.paddingTop))*g.y;a*=g.x,c*=g.y,d*=g.x,u*=g.y,a+=b,c+=C,p=Ae(m),m=mi(p)}}return Ct({width:d,height:u,x:a,y:c})}function gi(t,e){let n=Mr(t).scrollLeft;return e?e.left+n:Tr(lt(t)).left+n}function oh(t,e){let n=t.getBoundingClientRect(),r=n.left+e.scrollLeft-gi(t,n),o=n.top+e.scrollTop;return{x:r,y:o}}function vw(t){let{elements:e,rect:n,offsetParent:r,strategy:o}=t,i=o==="fixed",s=lt(r),l=e?vr(e.floating):!1;if(r===s||l&&i)return n;let a={scrollLeft:0,scrollTop:0},c=Ue(1),d=Ue(0),u=qe(r);if((u||!u&&!i)&&((sn(r)!=="body"||Rn(s))&&(a=Mr(r)),qe(r))){let h=Tr(r);c=Dn(r),d.x=h.x+r.clientLeft,d.y=h.y+r.clientTop}let f=s&&!u&&!i?oh(s,a):Ue(0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-a.scrollLeft*c.x+d.x+f.x,y:n.y*c.y-a.scrollTop*c.y+d.y+f.y}}function Mw(t){return Array.from(t.getClientRects())}function Tw(t){let e=lt(t),n=Mr(t),r=t.ownerDocument.body,o=pe(e.scrollWidth,e.clientWidth,r.scrollWidth,r.clientWidth),i=pe(e.scrollHeight,e.clientHeight,r.scrollHeight,r.clientHeight),s=-n.scrollLeft+gi(t),l=-n.scrollTop;return _e(r).direction==="rtl"&&(s+=pe(e.clientWidth,r.clientWidth)-o),{width:o,height:i,x:s,y:l}}var Qf=25;function Aw(t,e){let n=Ae(t),r=lt(t),o=n.visualViewport,i=r.clientWidth,s=r.clientHeight,l=0,a=0;if(o){i=o.width,s=o.height;let d=pi();(!d||d&&e==="fixed")&&(l=o.offsetLeft,a=o.offsetTop)}let c=gi(r);if(c<=0){let d=r.ownerDocument,u=d.body,f=getComputedStyle(u),h=d.compatMode==="CSS1Compat"&&parseFloat(f.marginLeft)+parseFloat(f.marginRight)||0,p=Math.abs(r.clientWidth-u.clientWidth-h);p<=Qf&&(i-=p)}else c<=Qf&&(i+=c);return{width:i,height:s,x:l,y:a}}var Ew=new Set(["absolute","fixed"]);function Nw(t,e){let n=Tr(t,!0,e==="fixed"),r=n.top+t.clientTop,o=n.left+t.clientLeft,i=qe(t)?Dn(t):Ue(1),s=t.clientWidth*i.x,l=t.clientHeight*i.y,a=o*i.x,c=r*i.y;return{width:s,height:l,x:a,y:c}}function Zf(t,e,n){let r;if(e==="viewport")r=Aw(t,n);else if(e==="document")r=Tw(lt(t));else if(Ve(e))r=Nw(e,n);else{let o=rh(t);r={x:e.x-o.x,y:e.y-o.y,width:e.width,height:e.height}}return Ct(r)}function ih(t,e){let n=vt(t);return n===e||!Ve(n)||ln(n)?!1:_e(n).position==="fixed"||ih(n,e)}function Ow(t,e){let n=e.get(t);if(n)return n;let r=ui(t,[],!1).filter(l=>Ve(l)&&sn(l)!=="body"),o=null,i=_e(t).position==="fixed",s=i?vt(t):t;for(;Ve(s)&&!ln(s);){let l=_e(s),a=hi(s);!a&&l.position==="fixed"&&(o=null),(i?!a&&!o:!a&&l.position==="static"&&!!o&&Ew.has(o.position)||Rn(s)&&!a&&ih(t,s))?r=r.filter(d=>d!==s):o=l,s=vt(s)}return e.set(t,r),r}function Rw(t){let{element:e,boundary:n,rootBoundary:r,strategy:o}=t,s=[...n==="clippingAncestors"?vr(e)?[]:Ow(e,this._c):[].concat(n),r],l=s[0],a=s.reduce((c,d)=>{let u=Zf(e,d,o);return c.top=pe(u.top,c.top),c.right=$e(u.right,c.right),c.bottom=$e(u.bottom,c.bottom),c.left=pe(u.left,c.left),c},Zf(e,l,o));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}}function Dw(t){let{width:e,height:n}=th(t);return{width:e,height:n}}function Iw(t,e,n){let r=qe(e),o=lt(e),i=n==="fixed",s=Tr(t,!0,i,e),l={scrollLeft:0,scrollTop:0},a=Ue(0);function c(){a.x=gi(o)}if(r||!r&&!i)if((sn(e)!=="body"||Rn(o))&&(l=Mr(e)),r){let h=Tr(e,!0,i,e);a.x=h.x+e.clientLeft,a.y=h.y+e.clientTop}else o&&c();i&&!r&&o&&c();let d=o&&!r&&!i?oh(o,l):Ue(0),u=s.left+l.scrollLeft-a.x-d.x,f=s.top+l.scrollTop-a.y-d.y;return{x:u,y:f,width:s.width,height:s.height}}function ql(t){return _e(t).position==="static"}function eh(t,e){if(!qe(t)||_e(t).position==="fixed")return null;if(e)return e(t);let n=t.offsetParent;return lt(t)===n&&(n=n.ownerDocument.body),n}function sh(t,e){let n=Ae(t);if(vr(t))return n;if(!qe(t)){let o=vt(t);for(;o&&!ln(o);){if(Ve(o)&&!ql(o))return o;o=vt(o)}return n}let r=eh(t,e);for(;r&&Gf(r)&&ql(r);)r=eh(r,e);return r&&ln(r)&&ql(r)&&!hi(r)?n:r||Xf(t)||n}var Pw=async function(t){let e=this.getOffsetParent||sh,n=this.getDimensions,r=await n(t.floating);return{reference:Iw(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function Lw(t){return _e(t).direction==="rtl"}var Bw={convertOffsetParentRelativeRectToViewportRelativeRect:vw,getDocumentElement:lt,getClippingRect:Rw,getOffsetParent:sh,getElementRects:Pw,getClientRects:Mw,getDimensions:Dw,getScale:Dn,isElement:Ve,isRTL:Lw};var lh=jf,ah=$f,In=Uf,Pn=Ff,ch=Kf,dh=Vf,uh=Hf,fh=Wf;var Ln=(t,e,n)=>{let r=new Map,o={platform:Bw,...n},i={...o.platform,_c:r};return zf(t,e,{...o,platform:i})};var hh=(t,e)=>{Ln({getBoundingClientRect:()=>{let{from:r,to:o}=t.state.selection,i=t.view.coordsAtPos(r),s=t.view.coordsAtPos(o);return{top:Math.min(i.top,s.top),bottom:Math.max(i.bottom,s.bottom),left:Math.min(i.left,s.left),right:Math.max(i.right,s.right),width:Math.abs(s.right-i.left),height:Math.abs(s.bottom-i.top),x:Math.min(i.left,s.left),y:Math.min(i.top,s.top)}}},e,{placement:"bottom-start",strategy:"absolute",middleware:[In(),Pn()]}).then(({x:r,y:o,strategy:i})=>{e.style.width="max-content",e.style.position=i,e.style.left=`${r}px`,e.style.top=`${o}px`})},ph=({items:t=[],noOptionsMessage:e=null,noSearchResultsMessage:n=null,searchPrompt:r=null,searchingMessage:o=null,isSearchable:i=!1})=>{let s=null;return{items:async({query:l})=>{if(typeof t=="function"){s&&i&&s.setLoading(!0);try{let c=t({query:l}),d=Array.isArray(c)?c:await c;return s&&s.setLoading(!1),d}catch{return s&&s.setLoading(!1),[]}}if(!l)return t;let a=String(l).toLowerCase();return t.filter(c=>{let d=typeof c=="string"?c:c?.label??c?.name??"";return String(d).toLowerCase().includes(a)})},render:()=>{let l,a=0,c=null,d=!1;s={setLoading:b=>{d=b,f()}};let u=()=>{let b=document.createElement("div");return b.className="fi-dropdown-panel fi-dropdown-list fi-scrollable",b.style.maxHeight="15rem",b.style.minWidth="12rem",b},f=()=>{if(!l||!c)return;let b=Array.isArray(c.items)?c.items:[],C=c.query??"";if(l.innerHTML="",d){let x=o??"Searching...",S=document.createElement("div");S.className="fi-dropdown-header";let k=document.createElement("span");k.style.whiteSpace="normal",k.textContent=x,S.appendChild(k),l.appendChild(S);return}if(b.length)b.forEach((x,S)=>{let k=typeof x=="string"?x:x?.label??x?.name??String(x?.id??""),O=typeof x=="object"?x?.id??k:k,T=document.createElement("button");T.className=`fi-dropdown-list-item ${S===a?"fi-selected":""}`,T.type="button",T.addEventListener("click",()=>p(O,k));let A=document.createElement("span");A.className="fi-dropdown-list-item-label",A.textContent=k,T.appendChild(A),l.appendChild(T)});else{let x=h(C);if(x){let S=document.createElement("div");S.className="fi-dropdown-header";let k=document.createElement("span");k.style.whiteSpace="normal",k.textContent=x,S.appendChild(k),l.appendChild(S)}}},h=b=>b?n:i?r:e,p=(b,C)=>{c&&c.command({id:b,label:C})},m=()=>{if(!l||!c||(c.items||[]).length===0)return;let C=l.children[a];if(C){let x=C.getBoundingClientRect(),S=l.getBoundingClientRect();(x.topS.bottom)&&C.scrollIntoView({block:"nearest"})}},g=()=>{if(!c)return;let b=Array.isArray(c.items)?c.items:[];b.length!==0&&(a=(a+b.length-1)%b.length,f(),m())},y=()=>{if(!c)return;let b=c.items||[];b.length!==0&&(a=(a+1)%b.length,f(),m())},w=()=>{let b=c?.items||[];if(b.length===0)return;let C=b[a],x=typeof C=="string"?C:C?.label??C?.name??String(C?.id??""),S=typeof C=="object"?C?.id??x:x;p(S,x)};return{onStart:b=>{c=b,a=0,l=u(),l.style.position="absolute",l.style.zIndex="50",f(),document.body.appendChild(l),b.clientRect&&hh(b.editor,l)},onUpdate:b=>{c=b,a=0,f(),m(),b.clientRect&&hh(b.editor,l)},onKeyDown:b=>b.event.key==="Escape"?(l&&l.parentNode&&l.parentNode.removeChild(l),!0):b.event.key==="ArrowUp"?(g(),!0):b.event.key==="ArrowDown"?(y(),!0):b.event.key==="Enter"?(w(),!0):!1,onExit:()=>{l&&l.parentNode&&l.parentNode.removeChild(l),s=null}}}}};var zw=function({editor:t,overrideSuggestionOptions:e,extensionName:n}){let r=new H,o=e?.char??"@",i=e?.extraAttributes??{};return{editor:t,char:o,pluginKey:r,command:({editor:s,range:l,props:a})=>{s.view.state.selection.$to.nodeAfter?.text?.startsWith(" ")&&(l.to+=1);let u={...a,char:o,extra:i};s.chain().focus().insertContentAt(l,[{type:n,attrs:u},{type:"text",text:" "}]).run(),s.view.dom.ownerDocument.defaultView?.getSelection()?.collapseToEnd()},allow:({state:s,range:l})=>{let a=s.doc.resolve(l.from),c=s.schema.nodes[n];return!!a.parent.type.contentMatch.matchType(c)},...e}},mh=F.create({name:"mention",priority:101,addStorage(){return{suggestions:[],getSuggestionFromChar:()=>null}},addOptions(){return{HTMLAttributes:{},renderText({node:t}){return`${t.attrs.char??"@"}`},deleteTriggerWithBackspace:!0,renderHTML({options:t,node:e}){return["span",R(this.HTMLAttributes,t.HTMLAttributes),`${e.attrs.char??"@"}${e.attrs.label??""}`]},suggestions:[],suggestion:{},getMentionLabelsUsing:null}},group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}},label:{default:null,keepOnSplit:!1,parseHTML:t=>t.getAttribute("data-label"),renderHTML:t=>t.label?{"data-label":t.label}:{}},char:{default:"@",parseHTML:t=>t.getAttribute("data-char")??"@",renderHTML:t=>t.char?{"data-char":t.char}:{}},extra:{default:null,renderHTML:t=>{let e=t?.extra;return!e||typeof e!="object"?{}:e}}}},parseHTML(){return[{tag:`span[data-type="${this.name}"]`}]},renderHTML({node:t,HTMLAttributes:e}){let n=this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar(t?.attrs?.char??"@"),r={...this.options};r.HTMLAttributes=R({"data-type":this.name},this.options.HTMLAttributes,e);let o=this.options.renderHTML({options:r,node:t,suggestion:n});return typeof o=="string"?["span",R({"data-type":this.name},this.options.HTMLAttributes,e),o]:o},renderText({node:t}){let e={options:this.options,node:t,suggestion:this.editor?.extensionStorage?.[this.name]?.getSuggestionFromChar(t?.attrs?.char??"@")};return this.options.renderText(e)},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:o,anchor:i}=r;if(!o)return!1;let s=new ie,l=0;if(e.doc.nodesBetween(i-1,i,(a,c)=>{if(a.type.name===this.name)return n=!0,s=a,l=c,!1}),n){let a=s?.attrs?.char??"@";t.insertText(this.options.deleteTriggerWithBackspace?"":a,l,l+s.nodeSize)}return n})}},addProseMirrorPlugins(){let t=async e=>{let{state:n,dispatch:r}=e,o=[];if(n.doc.descendants((s,l)=>{if(s.type.name!==this.name||s.attrs?.label)return;let a=s.attrs?.id,c=s.attrs?.char??"@";a&&o.push({id:a,char:c,pos:l})}),o.length===0)return;let i=this.options.getMentionLabelsUsing;if(typeof i=="function")try{let s=o.map(({id:a,char:c})=>({id:a,char:c})),l=await i(s);o.forEach(({id:a,pos:c})=>{let d=l[a];if(!d)return;let u=e.state.doc.nodeAt(c);if(!u||u.type.name!==this.name)return;let f={...u.attrs,label:d},h=e.state.tr.setNodeMarkup(c,void 0,f);r(h)})}catch{}};return[...this.storage.suggestions.map(si),new P({view:e=>(setTimeout(()=>t(e),0),{update:n=>t(n)})})]},onBeforeCreate(){let t=n=>Array.isArray(n)?n:n&&typeof n=="object"?Object.entries(n).map(([r,o])=>({id:r,label:o})):[],e=this.options.suggestions.length?this.options.suggestions:[this.options.suggestion];this.storage.suggestions=e.map(n=>{let r=n?.char??"@",o=n?.items??[],i=n?.noOptionsMessage??null,s=n?.noSearchResultsMessage??null,l=n?.isSearchable??!1,a=this.options.getMentionSearchResultsUsing,c=n;if(typeof n?.items=="function"){let d=n.items;c={...n,items:async u=>{if(u?.query&&typeof a=="function")try{let f=await a(u?.query,r);return t(f)}catch{}return await d(u)}}}else{let d=n?.extraAttributes,u=n?.searchPrompt??null,f=n?.searchingMessage??null;c={...ph({items:async({query:h})=>{if(!(Array.isArray(o)?o.length>0:o&&typeof o=="object"&&Object.keys(o).length>0)&&!h)return[];let m=t(o);if(h&&typeof a=="function")try{let y=await a(h,r);return t(y)}catch{}if(!h)return m;let g=String(h).toLowerCase();return m.filter(y=>{let w=typeof y=="string"?y:y?.label??y?.name??"";return String(w).toLowerCase().includes(g)})},isSearchable:l,noOptionsMessage:i,noSearchResultsMessage:s,searchPrompt:u,searchingMessage:f}),char:r,...d?{extraAttributes:d}:{}}}return zw({editor:this.editor,overrideSuggestionOptions:c,extensionName:this.name})}),this.storage.getSuggestionFromChar=n=>this.storage.suggestions.find(r=>r.char===n)??this.storage.suggestions[0]??null}});var Hw=F.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:t}){return["p",R(this.options.HTMLAttributes,t),0]},parseMarkdown:(t,e)=>{let n=t.tokens||[];return n.length===1&&n[0].type==="image"?e.parseChildren([n[0]]):e.createNode("paragraph",void 0,e.parseInline(n))},renderMarkdown:(t,e)=>!t||!Array.isArray(t.content)?"":e.renderChildren(t.content),addCommands(){return{setParagraph:()=>({commands:t})=>t.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}}),gh=Hw;var Jl=fl;var yh=ee.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML({HTMLAttributes:t}){return["small",t,0]},addCommands(){return{setSmall:()=>({commands:t})=>t.setMark(this.name),toggleSmall:()=>({commands:t})=>t.toggleMark(this.name),unsetSmall:()=>({commands:t})=>t.unsetMark(this.name)}}});var bh=ee.create({name:"textColor",addOptions(){return{textColors:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.classList?.contains("color")}]},renderHTML({HTMLAttributes:t}){let e={...t},n=t.class;e.class=["color",n].filter(Boolean).join(" ");let r=t["data-color"],i=(this.options.textColors||{})[r],s=typeof r=="string"&&r.length>0,l=i?`--color: ${i.color}; --dark-color: ${i.darkColor}`:s?`--color: ${r}; --dark-color: ${r}`:null;if(l){let a=typeof t.style=="string"?t.style:"";e.style=a?`${l}; ${a}`:l}return["span",e,0]},addAttributes(){return{"data-color":{default:null,parseHTML:t=>t.getAttribute("data-color"),renderHTML:t=>t["data-color"]?{"data-color":t["data-color"]}:{}}}},addCommands(){return{setTextColor:({color:t})=>({commands:e})=>e.setMark(this.name,{"data-color":t}),unsetTextColor:()=>({commands:t})=>t.unsetMark(this.name)}}});var $w=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,Fw=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,Vw=ee.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["s",R(this.options.HTMLAttributes,t),0]},markdownTokenName:"del",parseMarkdown:(t,e)=>e.applyMark("strike",e.parseInline(t.tokens||[])),renderMarkdown:(t,e)=>`~~${e.renderChildren(t)}~~`,addCommands(){return{setStrike:()=>({commands:t})=>t.setMark(this.name),toggleStrike:()=>({commands:t})=>t.toggleMark(this.name),unsetStrike:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Be({find:$w,type:this.type})]},addPasteRules(){return[Me({find:Fw,type:this.type})]}}),wh=Vw;var _w=ee.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(t){return t!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sub",R(this.options.HTMLAttributes,t),0]},addCommands(){return{setSubscript:()=>({commands:t})=>t.setMark(this.name),toggleSubscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSubscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}}),xh=_w;var Ww=ee.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(t){return t!=="super"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sup",R(this.options.HTMLAttributes,t),0]},addCommands(){return{setSuperscript:()=>({commands:t})=>t.setMark(this.name),toggleSuperscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSuperscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}}),kh=Ww;var Xl,Yl;if(typeof WeakMap<"u"){let t=new WeakMap;Xl=e=>t.get(e),Yl=(e,n)=>(t.set(e,n),n)}else{let t=[],n=0;Xl=r=>{for(let o=0;o(n==10&&(n=0),t[n++]=r,t[n++]=o)}var oe=class{constructor(t,e,n,r){this.width=t,this.height=e,this.map=n,this.problems=r}findCell(t){for(let e=0;e=n){(i||(i=[])).push({type:"overlong_rowspan",pos:d,n:y-b});break}let C=o+b*e;for(let x=0;xr&&(i+=c.attrs.colspan)}}for(let s=0;s1&&(n=!0)}e==-1?e=i:e!=i&&(e=Math.max(e,i))}return e}function Kw(t,e,n){t.problems||(t.problems=[]);let r={};for(let o=0;o0;e--)if(t.node(e).type.spec.tableRole=="row")return t.node(0).resolve(t.before(e+1));return null}function Jw(t){for(let e=t.depth;e>0;e--){let n=t.node(e).type.spec.tableRole;if(n==="cell"||n==="header_cell")return t.node(e)}return null}function Je(t){let e=t.selection.$head;for(let n=e.depth;n>0;n--)if(e.node(n).type.spec.tableRole=="row")return!0;return!1}function Si(t){let e=t.selection;if("$anchorCell"in e&&e.$anchorCell)return e.$anchorCell.pos>e.$headCell.pos?e.$anchorCell:e.$headCell;if("node"in e&&e.node&&e.node.type.spec.tableRole=="cell")return e.$anchor;let n=an(e.$head)||Gw(e.$head);if(n)return n;throw new RangeError(`No cell found around position ${e.head}`)}function Gw(t){for(let e=t.nodeAfter,n=t.pos;e;e=e.firstChild,n++){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n)}for(let e=t.nodeBefore,n=t.pos;e;e=e.lastChild,n--){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n-e.nodeSize)}}function Ql(t){return t.parent.type.spec.tableRole=="row"&&!!t.nodeAfter}function Xw(t){return t.node(0).resolve(t.pos+t.nodeAfter.nodeSize)}function ta(t,e){return t.depth==e.depth&&t.pos>=e.start(-1)&&t.pos<=e.end(-1)}function Rh(t,e,n){let r=t.node(-1),o=oe.get(r),i=t.start(-1),s=o.nextCell(t.pos-i,e,n);return s==null?null:t.node(0).resolve(i+s)}function cn(t,e,n=1){let r={...t,colspan:t.colspan-n};return r.colwidth&&(r.colwidth=r.colwidth.slice(),r.colwidth.splice(e,n),r.colwidth.some(o=>o>0)||(r.colwidth=null)),r}function Dh(t,e,n=1){let r={...t,colspan:t.colspan+n};if(r.colwidth){r.colwidth=r.colwidth.slice();for(let o=0;od!=n.pos-i);a.unshift(n.pos-i);let c=a.map(d=>{let u=r.nodeAt(d);if(!u)throw new RangeError(`No cell with offset ${d} found`);let f=i+d+1;return new yn(l.resolve(f),l.resolve(f+u.content.size))});super(c[0].$from,c[0].$to,c),this.$anchorCell=e,this.$headCell=n}map(e,n){let r=e.resolve(n.map(this.$anchorCell.pos)),o=e.resolve(n.map(this.$headCell.pos));if(Ql(r)&&Ql(o)&&ta(r,o)){let i=this.$anchorCell.node(-1)!=r.node(-1);return i&&this.isRowSelection()?Mt.rowSelection(r,o):i&&this.isColSelection()?Mt.colSelection(r,o):new Mt(r,o)}return D.between(r,o)}content(){let e=this.$anchorCell.node(-1),n=oe.get(e),r=this.$anchorCell.start(-1),o=n.rectBetween(this.$anchorCell.pos-r,this.$headCell.pos-r),i={},s=[];for(let a=o.top;a0||g>0){let y=p.attrs;if(m>0&&(y=cn(y,0,m)),g>0&&(y=cn(y,y.colspan-g,g)),h.lefto.bottom){let y={...p.attrs,rowspan:Math.min(h.bottom,o.bottom)-Math.max(h.top,o.top)};h.top0)return!1;let r=e+this.$anchorCell.nodeAfter.attrs.rowspan,o=n+this.$headCell.nodeAfter.attrs.rowspan;return Math.max(r,o)==this.$headCell.node(-1).childCount}static colSelection(e,n=e){let r=e.node(-1),o=oe.get(r),i=e.start(-1),s=o.findCell(e.pos-i),l=o.findCell(n.pos-i),a=e.node(0);return s.top<=l.top?(s.top>0&&(e=a.resolve(i+o.map[s.left])),l.bottom0&&(n=a.resolve(i+o.map[l.left])),s.bottom0)return!1;let s=o+this.$anchorCell.nodeAfter.attrs.colspan,l=i+this.$headCell.nodeAfter.attrs.colspan;return Math.max(s,l)==n.width}eq(e){return e instanceof Mt&&e.$anchorCell.pos==this.$anchorCell.pos&&e.$headCell.pos==this.$headCell.pos}static rowSelection(e,n=e){let r=e.node(-1),o=oe.get(r),i=e.start(-1),s=o.findCell(e.pos-i),l=o.findCell(n.pos-i),a=e.node(0);return s.left<=l.left?(s.left>0&&(e=a.resolve(i+o.map[s.top*o.width])),l.right0&&(n=a.resolve(i+o.map[l.top*o.width])),s.right{e.push(te.node(r,r+n.nodeSize,{class:"selectedCell"}))}),Y.create(t.doc,e)}function ex({$from:t,$to:e}){if(t.pos==e.pos||t.pos=0&&!(t.after(o+1)=0&&!(e.before(i+1)>e.start(i));i--,r--);return n==r&&/row|table/.test(t.node(o).type.spec.tableRole)}function tx({$from:t,$to:e}){let n,r;for(let o=t.depth;o>0;o--){let i=t.node(o);if(i.type.spec.tableRole==="cell"||i.type.spec.tableRole==="header_cell"){n=i;break}}for(let o=e.depth;o>0;o--){let i=e.node(o);if(i.type.spec.tableRole==="cell"||i.type.spec.tableRole==="header_cell"){r=i;break}}return n!==r&&e.parentOffset===0}function nx(t,e,n){let r=(e||t).selection,o=(e||t).doc,i,s;if(r instanceof L&&(s=r.node.type.spec.tableRole)){if(s=="cell"||s=="header_cell")i=X.create(o,r.from);else if(s=="row"){let l=o.resolve(r.from+1);i=X.rowSelection(l,l)}else if(!n){let l=oe.get(r.node),a=r.from+1,c=a+l.map[l.width*l.height-1];i=X.create(o,a+1,c)}}else r instanceof D&&ex(r)?i=D.create(o,r.from):r instanceof D&&tx(r)&&(i=D.create(o,r.$from.start(),r.$from.end()));return i&&(e||(e=t.tr)).setSelection(i),e}var rx=new H("fix-tables");function Ph(t,e,n,r){let o=t.childCount,i=e.childCount;e:for(let s=0,l=0;s{o.type.spec.tableRole=="table"&&(n=ox(t,o,i,n))};return e?e.doc!=t.doc&&Ph(e.doc,t.doc,0,r):t.doc.descendants(r),n}function ox(t,e,n,r){let o=oe.get(e);if(!o.problems)return r;r||(r=t.tr);let i=[];for(let a=0;a0){let h="cell";d.firstChild&&(h=d.firstChild.type.spec.tableRole);let p=[];for(let g=0;g0?-1:0;Yw(e,r,o+i)&&(i=o==0||o==e.width?null:0);for(let s=0;s0&&o0&&e.map[l-1]==a||o0?-1:0;sx(e,r,o+l)&&(l=o==0||o==e.height?null:0);for(let c=0,d=e.width*o;c0&&o0&&u==e.map[d-e.width]){let f=n.nodeAt(u).attrs;t.setNodeMarkup(t.mapping.slice(l).map(u+r),null,{...f,rowspan:f.rowspan-1}),c+=f.colspan-1}else if(o0&&n[i]==n[i-1]||r.right0&&n[o]==n[o-t]||r.bottom0){let d=a+1+c.content.size,u=Sh(c)?a+1:d;i.replaceWith(u+r.tableStart,d+r.tableStart,l)}i.setSelection(new X(i.doc.resolve(a+r.tableStart))),e(i)}return!0}function oa(t,e){let n=xe(t.schema);return cx(({node:r})=>n[r.type.spec.tableRole])(t,e)}function cx(t){return(e,n)=>{let r=e.selection,o,i;if(r instanceof X){if(r.$anchorCell.pos!=r.$headCell.pos)return!1;o=r.$anchorCell.nodeAfter,i=r.$anchorCell.pos}else{var s;if(o=Jw(r.$from),!o)return!1;i=(s=an(r.$from))===null||s===void 0?void 0:s.pos}if(o==null||i==null||o.attrs.colspan==1&&o.attrs.rowspan==1)return!1;if(n){let l=o.attrs,a=[],c=l.colwidth;l.rowspan>1&&(l={...l,rowspan:1}),l.colspan>1&&(l={...l,colspan:1});let d=at(e),u=e.tr;for(let h=0;h{s.attrs[t]!==e&&i.setNodeMarkup(l,null,{...s.attrs,[t]:e})}):i.setNodeMarkup(o.pos,null,{...o.nodeAfter.attrs,[t]:e}),r(i)}return!0}}function dx(t){return function(e,n){if(!Je(e))return!1;if(n){let r=xe(e.schema),o=at(e),i=e.tr,s=o.map.cellsInRect(t=="column"?{left:o.left,top:0,right:o.right,bottom:o.map.height}:t=="row"?{left:0,top:o.top,right:o.map.width,bottom:o.bottom}:o),l=s.map(a=>o.table.nodeAt(a));for(let a=0;a{let h=f+i.tableStart,p=s.doc.nodeAt(h);p&&s.setNodeMarkup(h,u,p.attrs)}),r(s)}return!0}}var cM=Bn("row",{useDeprecatedLogic:!0}),dM=Bn("column",{useDeprecatedLogic:!0}),jh=Bn("cell",{useDeprecatedLogic:!0});function ux(t,e){if(e<0){let n=t.nodeBefore;if(n)return t.pos-n.nodeSize;for(let r=t.index(-1)-1,o=t.before();r>=0;r--){let i=t.node(-1).child(r),s=i.lastChild;if(s)return o-1-s.nodeSize;o-=i.nodeSize}}else{if(t.index()0;r--)if(n.node(r).type.spec.tableRole=="table")return e&&e(t.tr.delete(n.before(r),n.after(r)).scrollIntoView()),!0;return!1}function yi(t,e){let n=t.selection;if(!(n instanceof X))return!1;if(e){let r=t.tr,o=xe(t.schema).cell.createAndFill().content;n.forEachCell((i,s)=>{i.content.eq(o)||r.replace(r.mapping.map(s+1),r.mapping.map(s+i.nodeSize-1),new E(o,0,0))}),r.docChanged&&e(r)}return!0}function fx(t){if(t.size===0)return null;let{content:e,openStart:n,openEnd:r}=t;for(;e.childCount==1&&(n>0&&r>0||e.child(0).type.spec.tableRole=="table");)n--,r--,e=e.child(0).content;let o=e.child(0),i=o.type.spec.tableRole,s=o.type.schema,l=[];if(i=="row")for(let a=0;a=0;s--){let{rowspan:l,colspan:a}=i.child(s).attrs;for(let c=o;c=e.length&&e.push(v.empty),n[o]r&&(f=f.type.createChecked(cn(f.attrs,f.attrs.colspan,d+f.attrs.colspan-r),f.content)),c.push(f),d+=f.attrs.colspan;for(let h=1;ho&&(u=u.type.create({...u.attrs,rowspan:Math.max(1,o-u.attrs.rowspan)},u.content)),a.push(u)}i.push(v.from(a))}n=i,e=o}return{width:t,height:e,rows:n}}function mx(t,e,n,r,o,i,s){let l=t.doc.type.schema,a=xe(l),c,d;if(o>e.width)for(let u=0,f=0;ue.height){let u=[];for(let p=0,m=(e.height-1)*e.width;p=e.width?!1:n.nodeAt(e.map[m+p]).type==a.header_cell;u.push(g?d||(d=a.header_cell.createAndFill()):c||(c=a.cell.createAndFill()))}let f=a.row.create(null,v.from(u)),h=[];for(let p=e.height;p{if(!o)return!1;let i=n.selection;if(i instanceof X)return xi(n,r,I.near(i.$headCell,e));if(t!="horiz"&&!i.empty)return!1;let s=Kh(o,t,e);if(s==null)return!1;if(t=="horiz")return xi(n,r,I.near(n.doc.resolve(i.head+e),e));{let l=n.doc.resolve(s),a=Rh(l,t,e),c;return a?c=I.near(a,1):e<0?c=I.near(n.doc.resolve(l.before(-1)),-1):c=I.near(n.doc.resolve(l.after(-1)),1),xi(n,r,c)}}}function wi(t,e){return(n,r,o)=>{if(!o)return!1;let i=n.selection,s;if(i instanceof X)s=i;else{let a=Kh(o,t,e);if(a==null)return!1;s=new X(n.doc.resolve(a))}let l=Rh(s.$headCell,t,e);return l?xi(n,r,new X(s.$anchorCell,l)):!1}}function yx(t,e){let n=t.state.doc,r=an(n.resolve(e));return r?(t.dispatch(t.state.tr.setSelection(new X(r))),!0):!1}function bx(t,e,n){if(!Je(t.state))return!1;let r=fx(n),o=t.state.selection;if(o instanceof X){r||(r={width:1,height:1,rows:[v.from(Zl(xe(t.state.schema).cell,n))]});let i=o.$anchorCell.node(-1),s=o.$anchorCell.start(-1),l=oe.get(i).rectBetween(o.$anchorCell.pos-s,o.$headCell.pos-s);return r=px(r,l.right-l.left,l.bottom-l.top),Th(t.state,t.dispatch,s,l,r),!0}else if(r){let i=Si(t.state),s=i.start(-1);return Th(t.state,t.dispatch,s,oe.get(i.node(-1)).findCell(i.pos-s),r),!0}else return!1}function wx(t,e){var n;if(e.button!=0||e.ctrlKey||e.metaKey)return;let r=Ah(t,e.target),o;if(e.shiftKey&&t.state.selection instanceof X)i(t.state.selection.$anchorCell,e),e.preventDefault();else if(e.shiftKey&&r&&(o=an(t.state.selection.$anchor))!=null&&((n=Gl(t,e))===null||n===void 0?void 0:n.pos)!=o.pos)i(o,e),e.preventDefault();else if(!r)return;function i(a,c){let d=Gl(t,c),u=zt.getState(t.state)==null;if(!d||!ta(a,d))if(u)d=a;else return;let f=new X(a,d);if(u||!t.state.selection.eq(f)){let h=t.state.tr.setSelection(f);u&&h.setMeta(zt,a.pos),t.dispatch(h)}}function s(){t.root.removeEventListener("mouseup",s),t.root.removeEventListener("dragstart",s),t.root.removeEventListener("mousemove",l),zt.getState(t.state)!=null&&t.dispatch(t.state.tr.setMeta(zt,-1))}function l(a){let c=a,d=zt.getState(t.state),u;if(d!=null)u=t.state.doc.resolve(d);else if(Ah(t,c.target)!=r&&(u=Gl(t,e),!u))return s();u&&i(u,c)}t.root.addEventListener("mouseup",s),t.root.addEventListener("dragstart",s),t.root.addEventListener("mousemove",l)}function Kh(t,e,n){if(!(t.state.selection instanceof D))return null;let{$head:r}=t.state.selection;for(let o=r.depth-1;o>=0;o--){let i=r.node(o);if((n<0?r.index(o):r.indexAfter(o))!=(n<0?0:i.childCount))return null;if(i.type.spec.tableRole=="cell"||i.type.spec.tableRole=="header_cell"){let s=r.before(o),l=e=="vert"?n>0?"down":"up":n>0?"right":"left";return t.endOfTextblock(l)?s:null}}return null}function Ah(t,e){for(;e&&e!=t.dom;e=e.parentNode)if(e.nodeName=="TD"||e.nodeName=="TH")return e;return null}function Gl(t,e){let n=t.posAtCoords({left:e.clientX,top:e.clientY});if(!n)return null;let{inside:r,pos:o}=n;return r>=0&&an(t.state.doc.resolve(r))||an(t.state.doc.resolve(o))}var xx=class{constructor(t,e){this.node=t,this.defaultCellMinWidth=e,this.dom=document.createElement("div"),this.dom.className="tableWrapper",this.table=this.dom.appendChild(document.createElement("table")),this.table.style.setProperty("--default-cell-min-width",`${e}px`),this.colgroup=this.table.appendChild(document.createElement("colgroup")),ea(t,this.colgroup,this.table,e),this.contentDOM=this.table.appendChild(document.createElement("tbody"))}update(t){return t.type!=this.node.type?!1:(this.node=t,ea(t,this.colgroup,this.table,this.defaultCellMinWidth),!0)}ignoreMutation(t){return t.type=="attributes"&&(t.target==this.table||this.colgroup.contains(t.target))}};function ea(t,e,n,r,o,i){let s=0,l=!0,a=e.firstChild,c=t.firstChild;if(c){for(let u=0,f=0;unew r(u,n,f)),new kx(-1,!1)},apply(s,l){return l.apply(s)}},props:{attributes:s=>{let l=Oe.getState(s);return l&&l.activeHandle>-1?{class:"resize-cursor"}:{}},handleDOMEvents:{mousemove:(s,l)=>{Sx(s,l,t,o)},mouseleave:s=>{Cx(s)},mousedown:(s,l)=>{vx(s,l,e,n)}},decorations:s=>{let l=Oe.getState(s);if(l&&l.activeHandle>-1)return Nx(s,l.activeHandle)},nodeViews:{}}});return i}var kx=class ki{constructor(e,n){this.activeHandle=e,this.dragging=n}apply(e){let n=this,r=e.getMeta(Oe);if(r&&r.setHandle!=null)return new ki(r.setHandle,!1);if(r&&r.setDragging!==void 0)return new ki(n.activeHandle,r.setDragging);if(n.activeHandle>-1&&e.docChanged){let o=e.mapping.map(n.activeHandle,-1);return Ql(e.doc.resolve(o))||(o=-1),new ki(o,n.dragging)}return n}};function Sx(t,e,n,r){if(!t.editable)return;let o=Oe.getState(t.state);if(o&&!o.dragging){let i=Tx(e.target),s=-1;if(i){let{left:l,right:a}=i.getBoundingClientRect();e.clientX-l<=n?s=Eh(t,e,"left",n):a-e.clientX<=n&&(s=Eh(t,e,"right",n))}if(s!=o.activeHandle){if(!r&&s!==-1){let l=t.state.doc.resolve(s),a=l.node(-1),c=oe.get(a),d=l.start(-1);if(c.colCount(l.pos-d)+l.nodeAfter.attrs.colspan-1==c.width-1)return}Jh(t,s)}}}function Cx(t){if(!t.editable)return;let e=Oe.getState(t.state);e&&e.activeHandle>-1&&!e.dragging&&Jh(t,-1)}function vx(t,e,n,r){var o;if(!t.editable)return!1;let i=(o=t.dom.ownerDocument.defaultView)!==null&&o!==void 0?o:window,s=Oe.getState(t.state);if(!s||s.activeHandle==-1||s.dragging)return!1;let l=t.state.doc.nodeAt(s.activeHandle),a=Mx(t,s.activeHandle,l.attrs);t.dispatch(t.state.tr.setMeta(Oe,{setDragging:{startX:e.clientX,startWidth:a}}));function c(u){i.removeEventListener("mouseup",c),i.removeEventListener("mousemove",d);let f=Oe.getState(t.state);f?.dragging&&(Ax(t,f.activeHandle,Nh(f.dragging,u,n)),t.dispatch(t.state.tr.setMeta(Oe,{setDragging:null})))}function d(u){if(!u.which)return c(u);let f=Oe.getState(t.state);if(f&&f.dragging){let h=Nh(f.dragging,u,n);Oh(t,f.activeHandle,h,r)}}return Oh(t,s.activeHandle,a,r),i.addEventListener("mouseup",c),i.addEventListener("mousemove",d),e.preventDefault(),!0}function Mx(t,e,{colspan:n,colwidth:r}){let o=r&&r[r.length-1];if(o)return o;let i=t.domAtPos(e),s=i.node.childNodes[i.offset].offsetWidth,l=n;if(r)for(let a=0;a{var e,n;let r=t.getAttribute("colwidth"),o=r?r.split(",").map(i=>parseInt(i,10)):null;if(!o){let i=(e=t.closest("table"))==null?void 0:e.querySelectorAll("colgroup > col"),s=Array.from(((n=t.parentElement)==null?void 0:n.children)||[]).indexOf(t);if(s&&s>-1&&i&&i[s]){let l=i[s].getAttribute("width");return l?[parseInt(l,10)]:null}}return o}}}},tableRole:"cell",isolating:!0,parseHTML(){return[{tag:"td"}]},renderHTML({HTMLAttributes:t}){return["td",R(this.options.HTMLAttributes,t),0]}}),Rx=F.create({name:"tableHeader",addOptions(){return{HTMLAttributes:{}}},content:"block+",addAttributes(){return{colspan:{default:1},rowspan:{default:1},colwidth:{default:null,parseHTML:t=>{let e=t.getAttribute("colwidth");return e?e.split(",").map(r=>parseInt(r,10)):null}}}},tableRole:"header_cell",isolating:!0,parseHTML(){return[{tag:"th"}]},renderHTML({HTMLAttributes:t}){return["th",R(this.options.HTMLAttributes,t),0]}}),Dx=F.create({name:"tableRow",addOptions(){return{HTMLAttributes:{}}},content:"(tableCell | tableHeader)*",tableRole:"row",parseHTML(){return[{tag:"tr"}]},renderHTML({HTMLAttributes:t}){return["tr",R(this.options.HTMLAttributes,t),0]}});function sa(t,e){return e?["width",`${Math.max(e,t)}px`]:["min-width",`${t}px`]}function Xh(t,e,n,r,o,i){var s;let l=0,a=!0,c=e.firstChild,d=t.firstChild;if(d!==null)for(let f=0,h=0;f{let r=t.nodes[n];r.spec.tableRole&&(e[r.spec.tableRole]=r)}),t.cached.tableNodeTypes=e,e}function Bx(t,e,n,r,o){let i=Lx(t),s=[],l=[];for(let c=0;c{let{selection:e}=t.state;if(!zx(e))return!1;let n=0,r=Gs(e.ranges[0].$from,i=>i.type.name==="table");return r?.node.descendants(i=>{if(i.type.name==="table")return!1;["tableCell","tableHeader"].includes(i.type.name)&&(n+=1)}),n===e.ranges.length?(t.commands.deleteTable(),!0):!1},Hx="";function $x(t){return(t||"").replace(/\s+/g," ").trim()}function Fx(t,e,n={}){var r;let o=(r=n.cellLineSeparator)!=null?r:Hx;if(!t||!t.content||t.content.length===0)return"";let i=[];t.content.forEach(p=>{let m=[];p.content&&p.content.forEach(g=>{let y="";g.content&&Array.isArray(g.content)&&g.content.length>1?y=g.content.map(x=>e.renderChildren(x)).join(o):y=g.content?e.renderChildren(g.content):"";let w=$x(y),b=g.type==="tableHeader";m.push({text:w,isHeader:b})}),i.push(m)});let s=i.reduce((p,m)=>Math.max(p,m.length),0);if(s===0)return"";let l=new Array(s).fill(0);i.forEach(p=>{var m;for(let g=0;gl[g]&&(l[g]=w),l[g]<3&&(l[g]=3)}});let a=(p,m)=>p+" ".repeat(Math.max(0,m-p.length)),c=i[0],d=c.some(p=>p.isHeader),u=` `,f=new Array(s).fill(0).map((p,m)=>d&&c[m]&&c[m].text||"");return u+=`| ${f.map((p,m)=>a(p,l[m])).join(" | ")} | `,u+=`| ${l.map(p=>"-".repeat(Math.max(3,p))).join(" | ")} | `,(d?i.slice(1):i).forEach(p=>{u+=`| ${new Array(s).fill(0).map((m,g)=>a(p[g]&&p[g].text||"",l[g])).join(" | ")} | `}),u}var Vx=Fx,_x=F.create({name:"table",addOptions(){return{HTMLAttributes:{},resizable:!1,renderWrapper:!1,handleWidth:5,cellMinWidth:25,View:Ix,lastColumnResizable:!0,allowTableNodeSelection:!1}},content:"tableRow+",tableRole:"table",isolating:!0,group:"block",parseHTML(){return[{tag:"table"}]},renderHTML({node:t,HTMLAttributes:e}){let{colgroup:n,tableWidth:r,tableMinWidth:o}=Px(t,this.options.cellMinWidth),i=e.style;function s(){return i||(r?`width: ${r}`:`min-width: ${o}`)}let l=["table",R(this.options.HTMLAttributes,e,{style:s()}),n,["tbody",0]];return this.options.renderWrapper?["div",{class:"tableWrapper"},l]:l},parseMarkdown:(t,e)=>{let n=[];if(t.header){let r=[];t.header.forEach(o=>{r.push(e.createNode("tableHeader",{},[{type:"paragraph",content:e.parseInline(o.tokens)}]))}),n.push(e.createNode("tableRow",{},r))}return t.rows&&t.rows.forEach(r=>{let o=[];r.forEach(i=>{o.push(e.createNode("tableCell",{},[{type:"paragraph",content:e.parseInline(i.tokens)}]))}),n.push(e.createNode("tableRow",{},o))}),e.createNode("table",void 0,n)},renderMarkdown:(t,e)=>Vx(t,e),addCommands(){return{insertTable:({rows:t=3,cols:e=3,withHeaderRow:n=!0}={})=>({tr:r,dispatch:o,editor:i})=>{let s=Bx(i.schema,t,e,n);if(o){let l=r.selection.from+1;r.replaceSelectionWith(s).scrollIntoView().setSelection(D.near(r.doc.resolve(l)))}return!0},addColumnBefore:()=>({state:t,dispatch:e})=>Bh(t,e),addColumnAfter:()=>({state:t,dispatch:e})=>zh(t,e),deleteColumn:()=>({state:t,dispatch:e})=>Hh(t,e),addRowBefore:()=>({state:t,dispatch:e})=>Fh(t,e),addRowAfter:()=>({state:t,dispatch:e})=>Vh(t,e),deleteRow:()=>({state:t,dispatch:e})=>_h(t,e),deleteTable:()=>({state:t,dispatch:e})=>Uh(t,e),mergeCells:()=>({state:t,dispatch:e})=>ra(t,e),splitCell:()=>({state:t,dispatch:e})=>oa(t,e),toggleHeaderColumn:()=>({state:t,dispatch:e})=>Bn("column")(t,e),toggleHeaderRow:()=>({state:t,dispatch:e})=>Bn("row")(t,e),toggleHeaderCell:()=>({state:t,dispatch:e})=>jh(t,e),mergeOrSplit:()=>({state:t,dispatch:e})=>ra(t,e)?!0:oa(t,e),setCellAttribute:(t,e)=>({state:n,dispatch:r})=>Wh(t,e)(n,r),goToNextCell:()=>({state:t,dispatch:e})=>ia(1)(t,e),goToPreviousCell:()=>({state:t,dispatch:e})=>ia(-1)(t,e),fixTables:()=>({state:t,dispatch:e})=>(e&&na(t),!0),setCellSelection:t=>({tr:e,dispatch:n})=>{if(n){let r=X.create(e.doc,t.anchorCell,t.headCell);e.setSelection(r)}return!0}}},addKeyboardShortcuts(){return{Tab:()=>this.editor.commands.goToNextCell()?!0:this.editor.can().addRowAfter()?this.editor.chain().addRowAfter().goToNextCell().run():!1,"Shift-Tab":()=>this.editor.commands.goToPreviousCell(),Backspace:Ci,"Mod-Backspace":Ci,Delete:Ci,"Mod-Delete":Ci}},addProseMirrorPlugins(){return[...this.options.resizable&&this.editor.isEditable?[qh({handleWidth:this.options.handleWidth,cellMinWidth:this.options.cellMinWidth,defaultCellMinWidth:this.options.cellMinWidth,View:this.options.View,lastColumnResizable:this.options.lastColumnResizable})]:[],Gh({allowTableNodeSelection:this.options.allowTableNodeSelection})]},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{tableRole:G(B(t,"tableRole",e))}}}),Qh=U.create({name:"tableKit",addExtensions(){let t=[];return this.options.table!==!1&&t.push(_x.configure(this.options.table)),this.options.tableCell!==!1&&t.push(Ox.configure(this.options.tableCell)),this.options.tableHeader!==!1&&t.push(Rx.configure(this.options.tableHeader)),this.options.tableRow!==!1&&t.push(Dx.configure(this.options.tableRow)),t}});var Wx=F.create({name:"text",group:"inline",parseMarkdown:t=>({type:"text",text:t.text||""}),renderMarkdown:t=>t.text||""}),Zh=Wx;var jx=U.create({name:"textAlign",addOptions(){return{types:[],alignments:["left","center","right","justify"],defaultAlignment:null}},addGlobalAttributes(){return[{types:this.options.types,attributes:{textAlign:{default:this.options.defaultAlignment,parseHTML:t=>{let e=t.style.textAlign;return this.options.alignments.includes(e)?e:this.options.defaultAlignment},renderHTML:t=>t.textAlign?{style:`text-align: ${t.textAlign}`}:{}}}}]},addCommands(){return{setTextAlign:t=>({commands:e})=>this.options.alignments.includes(t)?this.options.types.map(n=>e.updateAttributes(n,{textAlign:t})).some(n=>n):!1,unsetTextAlign:()=>({commands:t})=>this.options.types.map(e=>t.resetAttributes(e,"textAlign")).some(e=>e),toggleTextAlign:t=>({editor:e,commands:n})=>this.options.alignments.includes(t)?e.isActive({textAlign:t})?n.unsetTextAlign():n.setTextAlign(t):!1}},addKeyboardShortcuts(){return{"Mod-Shift-l":()=>this.editor.commands.setTextAlign("left"),"Mod-Shift-e":()=>this.editor.commands.setTextAlign("center"),"Mod-Shift-r":()=>this.editor.commands.setTextAlign("right"),"Mod-Shift-j":()=>this.editor.commands.setTextAlign("justify")}}}),ep=jx;var Ux=ee.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["u",R(this.options.HTMLAttributes,t),0]},parseMarkdown(t,e){return e.applyMark(this.name||"underline",e.parseInline(t.tokens||[]))},renderMarkdown(t,e){return`++${e.renderChildren(t)}++`},markdownTokenizer:{name:"underline",level:"inline",start(t){return t.indexOf("++")},tokenize(t,e,n){let o=/^(\+\+)([\s\S]+?)(\+\+)/.exec(t);if(!o)return;let i=o[2].trim();return{type:"underline",raw:o[0],text:i,tokens:n.inlineTokens(i)}}},addCommands(){return{setUnderline:()=>({commands:t})=>t.setMark(this.name),toggleUnderline:()=>({commands:t})=>t.toggleMark(this.name),unsetUnderline:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}}),tp=Ux;var np=(t,e)=>{Ln({getBoundingClientRect:()=>{let{from:r,to:o}=t.state.selection,i=t.view.coordsAtPos(r),s=t.view.coordsAtPos(o);return{top:Math.min(i.top,s.top),bottom:Math.max(i.bottom,s.bottom),left:Math.min(i.left,s.left),right:Math.max(i.right,s.right),width:Math.abs(s.right-i.left),height:Math.abs(s.bottom-i.top),x:Math.min(i.left,s.left),y:Math.min(i.top,s.top)}}},e,{placement:"bottom-start",strategy:"absolute",middleware:[In(),Pn()]}).then(({x:r,y:o,strategy:i})=>{e.style.width="max-content",e.style.position=i,e.style.left=`${r}px`,e.style.top=`${o}px`})},rp=({mergeTags:t,noMergeTagSearchResultsMessage:e})=>({items:({query:n})=>Object.entries(t).filter(([r,o])=>r.toLowerCase().replace(/\s/g,"").includes(n.toLowerCase())||o.toLowerCase().replace(/\s/g,"").includes(n.toLowerCase())).map(([r,o])=>({id:r,label:o})),render:()=>{let n,r=0,o=null,i=()=>{let f=document.createElement("div");return f.className="fi-dropdown-panel fi-dropdown-list",f.style.minWidth="12rem",f},s=()=>{if(!n||!o)return;let f=o.items||[];if(n.innerHTML="",f.length)f.forEach((h,p)=>{let m=document.createElement("button");m.className=`fi-dropdown-list-item fi-dropdown-list-item-label ${p===r?"fi-selected":""}`,m.textContent=h.label,m.type="button",m.addEventListener("click",()=>l(p)),n.appendChild(m)});else{let h=document.createElement("div");h.className="fi-dropdown-header";let p=document.createElement("span");p.style.whiteSpace="normal",p.textContent=e,h.appendChild(p),n.appendChild(h)}},l=f=>{if(!o)return;let p=(o.items||[])[f];p&&o.command({id:p.id})},a=()=>{if(!n||!o||o.items.length===0)return;let f=n.children[r];if(f){let h=f.getBoundingClientRect(),p=n.getBoundingClientRect();(h.topp.bottom)&&f.scrollIntoView({block:"nearest"})}},c=()=>{if(!o)return;let f=o.items||[];f.length!==0&&(r=(r+f.length-1)%f.length,s(),a())},d=()=>{if(!o)return;let f=o.items||[];f.length!==0&&(r=(r+1)%f.length,s(),a())},u=()=>{l(r)};return{onStart:f=>{o=f,r=0,n=i(),n.style.position="absolute",n.style.zIndex="50",s(),document.body.appendChild(n),f.clientRect&&np(f.editor,n)},onUpdate:f=>{o=f,r=0,s(),a(),f.clientRect&&np(f.editor,n)},onKeyDown:f=>f.event.key==="Escape"?(n&&n.parentNode&&n.parentNode.removeChild(n),!0):f.event.key==="ArrowUp"?(c(),!0):f.event.key==="ArrowDown"?(d(),!0):f.event.key==="Enter"?(u(),!0):!1,onExit:()=>{n&&n.parentNode&&n.parentNode.removeChild(n)}}}});var op=async({$wire:t,acceptedFileTypes:e,acceptedFileTypesValidationMessage:n,canAttachFiles:r,customExtensionUrls:o,deleteCustomBlockButtonIconHtml:i,editCustomBlockButtonIconHtml:s,editCustomBlockUsing:l,getMentionLabelsUsing:a,getMentionSearchResultsUsing:c,hasResizableImages:d,insertCustomBlockUsing:u,key:f,linkProtocols:h,maxFileSize:p,maxFileSizeValidationMessage:m,mentions:g,mergeTags:y,noMergeTagSearchResultsMessage:w,placeholder:b,statePath:C,textColors:x,uploadingFileMessage:S})=>{let k=[Du,Iu,$l,Pu,Lu,Bu.configure({deleteCustomBlockButtonIconHtml:i,editCustomBlockButtonIconHtml:s,editCustomBlockUsing:l,insertCustomBlockUsing:u}),Hu,Fu,$u,Vu,Nu.configure({class:"fi-not-prose"}),Ou,_u,Wu,ju,Uu,Ku,qu,Ju,Xu.configure({inline:!0,resize:{enabled:d,alwaysPreserveAspectRatio:!0,allowBase64:!0}}),Yu,pf.configure({autolink:!0,openOnClick:!1,protocols:h}),Fl,...r?[Af.configure({acceptedTypes:e,acceptedTypesValidationMessage:n,get$WireUsing:()=>t,key:f,maxSize:p,maxSizeValidationMessage:m,statePath:C,uploadingMessage:S})]:[],...Object.keys(y).length?[Ef.configure({deleteTriggerWithBackspace:!0,suggestion:rp({mergeTags:y,noMergeTagSearchResultsMessage:w}),mergeTags:y})]:[],...g.length?[mh.configure({HTMLAttributes:{class:"fi-fo-rich-editor-mention"},suggestions:g,getMentionSearchResultsUsing:c,getMentionLabelsUsing:a})]:[],_l,gh,Jl.configure({placeholder:b}),bh.configure({textColors:x}),yh,wh,xh,kh,Qh.configure({table:{resizable:!0}}),Zh,ep.configure({types:["heading","paragraph"],alignments:["start","center","end","justify"],defaultAlignment:"start"}),tp,Ru],O=await Promise.all(o.map(async T=>{new RegExp("^(?:[a-z+]+:)?//","i").test(T)||(T=new URL(T,document.baseURI).href);try{let $=(await import(T)).default;return typeof $=="function"?$():$}catch($){return console.error(`Failed to load rich editor custom extension from [${T}]:`,$),null}}));for(let T of O){if(!T||!T.name)continue;let A=k.findIndex($=>$.name===T.name);T.name==="placeholder"&&T.parent===null&&(T=Jl.configure(T.options)),A!==-1?k[A]=T:k.push(T)}return k};function Kx(t,e){let n=Math.min(t.top,e.top),r=Math.max(t.bottom,e.bottom),o=Math.min(t.left,e.left),s=Math.max(t.right,e.right)-o,l=r-n,a=o,c=n;return new DOMRect(a,c,s,l)}var qx=class{constructor({editor:t,element:e,view:n,updateDelay:r=250,resizeDelay:o=60,shouldShow:i,appendTo:s,getReferencedVirtualElement:l,options:a}){this.preventHide=!1,this.isVisible=!1,this.scrollTarget=window,this.floatingUIOptions={strategy:"absolute",placement:"top",offset:8,flip:{},shift:{},arrow:!1,size:!1,autoPlacement:!1,hide:!1,inline:!1,onShow:void 0,onHide:void 0,onUpdate:void 0,onDestroy:void 0},this.shouldShow=({view:d,state:u,from:f,to:h})=>{let{doc:p,selection:m}=u,{empty:g}=m,y=!p.textBetween(f,h).length&&fo(u.selection),w=this.element.contains(document.activeElement);return!(!(d.hasFocus()||w)||g||y||!this.editor.isEditable)},this.mousedownHandler=()=>{this.preventHide=!0},this.dragstartHandler=()=>{this.hide()},this.resizeHandler=()=>{this.resizeDebounceTimer&&clearTimeout(this.resizeDebounceTimer),this.resizeDebounceTimer=window.setTimeout(()=>{this.updatePosition()},this.resizeDelay)},this.focusHandler=()=>{setTimeout(()=>this.update(this.editor.view))},this.blurHandler=({event:d})=>{var u;if(this.editor.isDestroyed){this.destroy();return}if(this.preventHide){this.preventHide=!1;return}d?.relatedTarget&&((u=this.element.parentNode)!=null&&u.contains(d.relatedTarget))||d?.relatedTarget!==this.editor.view.dom&&this.hide()},this.handleDebouncedUpdate=(d,u)=>{let f=!u?.selection.eq(d.state.selection),h=!u?.doc.eq(d.state.doc);!f&&!h||(this.updateDebounceTimer&&clearTimeout(this.updateDebounceTimer),this.updateDebounceTimer=window.setTimeout(()=>{this.updateHandler(d,f,h,u)},this.updateDelay))},this.updateHandler=(d,u,f,h)=>{let{composing:p}=d;if(p||!u&&!f)return;if(!this.getShouldShow(h)){this.hide();return}this.updatePosition(),this.show()},this.transactionHandler=({transaction:d})=>{d.getMeta("bubbleMenu")==="updatePosition"&&this.updatePosition()};var c;this.editor=t,this.element=e,this.view=n,this.updateDelay=r,this.resizeDelay=o,this.appendTo=s,this.scrollTarget=(c=a?.scrollTarget)!=null?c:window,this.getReferencedVirtualElement=l,this.floatingUIOptions={...this.floatingUIOptions,...a},this.element.tabIndex=0,i&&(this.shouldShow=i),this.element.addEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.addEventListener("dragstart",this.dragstartHandler),this.editor.on("focus",this.focusHandler),this.editor.on("blur",this.blurHandler),this.editor.on("transaction",this.transactionHandler),window.addEventListener("resize",this.resizeHandler),this.scrollTarget.addEventListener("scroll",this.resizeHandler),this.update(n,n.state),this.getShouldShow()&&(this.show(),this.updatePosition())}get middlewares(){let t=[];return this.floatingUIOptions.flip&&t.push(Pn(typeof this.floatingUIOptions.flip!="boolean"?this.floatingUIOptions.flip:void 0)),this.floatingUIOptions.shift&&t.push(In(typeof this.floatingUIOptions.shift!="boolean"?this.floatingUIOptions.shift:void 0)),this.floatingUIOptions.offset&&t.push(lh(typeof this.floatingUIOptions.offset!="boolean"?this.floatingUIOptions.offset:void 0)),this.floatingUIOptions.arrow&&t.push(uh(this.floatingUIOptions.arrow)),this.floatingUIOptions.size&&t.push(ch(typeof this.floatingUIOptions.size!="boolean"?this.floatingUIOptions.size:void 0)),this.floatingUIOptions.autoPlacement&&t.push(ah(typeof this.floatingUIOptions.autoPlacement!="boolean"?this.floatingUIOptions.autoPlacement:void 0)),this.floatingUIOptions.hide&&t.push(dh(typeof this.floatingUIOptions.hide!="boolean"?this.floatingUIOptions.hide:void 0)),this.floatingUIOptions.inline&&t.push(fh(typeof this.floatingUIOptions.inline!="boolean"?this.floatingUIOptions.inline:void 0)),t}get virtualElement(){var t;let{selection:e}=this.editor.state,n=(t=this.getReferencedVirtualElement)==null?void 0:t.call(this);if(n)return n;let r=tu(this.view,e.from,e.to),o={getBoundingClientRect:()=>r,getClientRects:()=>[r]};if(e instanceof L){let i=this.view.nodeDOM(e.from),s=i.dataset.nodeViewWrapper?i:i.querySelector("[data-node-view-wrapper]");s&&(i=s),i&&(o={getBoundingClientRect:()=>i.getBoundingClientRect(),getClientRects:()=>[i.getBoundingClientRect()]})}if(e instanceof X){let{$anchorCell:i,$headCell:s}=e,l=i?i.pos:s.pos,a=s?s.pos:i.pos,c=this.view.nodeDOM(l),d=this.view.nodeDOM(a);if(!c||!d)return;let u=c===d?c.getBoundingClientRect():Kx(c.getBoundingClientRect(),d.getBoundingClientRect());o={getBoundingClientRect:()=>u,getClientRects:()=>[u]}}return o}updatePosition(){let t=this.virtualElement;t&&Ln(t,this.element,{placement:this.floatingUIOptions.placement,strategy:this.floatingUIOptions.strategy,middleware:this.middlewares}).then(({x:e,y:n,strategy:r})=>{this.element.style.width="max-content",this.element.style.position=r,this.element.style.left=`${e}px`,this.element.style.top=`${n}px`,this.isVisible&&this.floatingUIOptions.onUpdate&&this.floatingUIOptions.onUpdate()})}update(t,e){let{state:n}=t,r=n.selection.from!==n.selection.to;if(this.updateDelay>0&&r){this.handleDebouncedUpdate(t,e);return}let o=!e?.selection.eq(t.state.selection),i=!e?.doc.eq(t.state.doc);this.updateHandler(t,o,i,e)}getShouldShow(t){var e;let{state:n}=this.view,{selection:r}=n,{ranges:o}=r,i=Math.min(...o.map(a=>a.$from.pos)),s=Math.max(...o.map(a=>a.$to.pos));return((e=this.shouldShow)==null?void 0:e.call(this,{editor:this.editor,element:this.element,view:this.view,state:n,oldState:t,from:i,to:s}))||!1}show(){var t;if(this.isVisible)return;this.element.style.visibility="visible",this.element.style.opacity="1";let e=typeof this.appendTo=="function"?this.appendTo():this.appendTo;(t=e??this.view.dom.parentElement)==null||t.appendChild(this.element),this.floatingUIOptions.onShow&&this.floatingUIOptions.onShow(),this.isVisible=!0}hide(){this.isVisible&&(this.element.style.visibility="hidden",this.element.style.opacity="0",this.element.remove(),this.floatingUIOptions.onHide&&this.floatingUIOptions.onHide(),this.isVisible=!1)}destroy(){this.hide(),this.element.removeEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.removeEventListener("dragstart",this.dragstartHandler),window.removeEventListener("resize",this.resizeHandler),this.scrollTarget.removeEventListener("scroll",this.resizeHandler),this.editor.off("focus",this.focusHandler),this.editor.off("blur",this.blurHandler),this.editor.off("transaction",this.transactionHandler),this.floatingUIOptions.onDestroy&&this.floatingUIOptions.onDestroy()}},la=t=>new P({key:typeof t.pluginKey=="string"?new H(t.pluginKey):t.pluginKey,view:e=>new qx({view:e,...t})}),kT=U.create({name:"bubbleMenu",addOptions(){return{element:null,pluginKey:"bubbleMenu",updateDelay:void 0,appendTo:void 0,shouldShow:null}},addProseMirrorPlugins(){return this.options.element?[la({pluginKey:this.options.pluginKey,editor:this.editor,element:this.options.element,updateDelay:this.options.updateDelay,options:this.options.options,appendTo:this.options.appendTo,getReferencedVirtualElement:this.options.getReferencedVirtualElement,shouldShow:this.options.shouldShow})]:[]}});function Jx({acceptedFileTypes:t,acceptedFileTypesValidationMessage:e,activePanel:n,canAttachFiles:r,deleteCustomBlockButtonIconHtml:o,editCustomBlockButtonIconHtml:i,extensions:s,floatingToolbars:l,hasResizableImages:a,isDisabled:c,isLiveDebounced:d,isLiveOnBlur:u,key:f,linkProtocols:h,liveDebounce:p,livewireId:m,maxFileSize:g,maxFileSizeValidationMessage:y,mergeTags:w,mentions:b,getMentionSearchResultsUsing:C,getMentionLabelsUsing:x,noMergeTagSearchResultsMessage:S,placeholder:k,state:O,statePath:T,textColors:A,uploadingFileMessage:$}){let z,K=[],V=!1;return{state:O,activePanel:n,editorSelection:{type:"text",anchor:1,head:1},isUploadingFile:!1,fileValidationMessage:null,shouldUpdateState:!0,editorUpdatedAt:Date.now(),async init(){z=new gu({editable:!c,element:this.$refs.editor,extensions:await op({acceptedFileTypes:t,acceptedFileTypesValidationMessage:e,canAttachFiles:r,customExtensionUrls:s,deleteCustomBlockButtonIconHtml:o,editCustomBlockButtonIconHtml:i,editCustomBlockUsing:(q,We)=>this.$wire.mountAction("customBlock",{editorSelection:this.editorSelection,id:q,config:We,mode:"edit"},{schemaComponent:f}),floatingToolbars:l,hasResizableImages:a,insertCustomBlockUsing:(q,We=null)=>this.$wire.mountAction("customBlock",{id:q,dragPosition:We,mode:"insert"},{schemaComponent:f}),key:f,linkProtocols:h,maxFileSize:g,maxFileSizeValidationMessage:y,mergeTags:w,mentions:b,getMentionSearchResultsUsing:C,getMentionLabelsUsing:x,noMergeTagSearchResultsMessage:S,placeholder:k,statePath:T,textColors:A,uploadingFileMessage:$,$wire:this.$wire}),content:this.state});let N="paragraph"in l;Object.keys(l).forEach(q=>{let We=this.$refs[`floatingToolbar::${q}`];if(!We){console.warn(`Floating toolbar [${q}] not found.`);return}z.registerPlugin(la({editor:z,element:We,pluginKey:`floatingToolbar::${q}`,shouldShow:({editor:je})=>q==="paragraph"?je.isFocused&&je.isActive(q)&&!je.state.selection.empty:N&&!je.state.selection.empty&&je.isActive("paragraph")?!1:je.isFocused&&je.isActive(q),options:{placement:"bottom",offset:15}}))}),z.on("create",()=>{this.editorUpdatedAt=Date.now()});let _=Alpine.debounce(()=>{V||this.$wire.commit()},p??300);z.on("update",({editor:q})=>this.$nextTick(()=>{V||(this.editorUpdatedAt=Date.now(),this.state=q.getJSON(),this.shouldUpdateState=!1,this.fileValidationMessage=null,d&&_())})),z.on("selectionUpdate",({transaction:q})=>{V||(this.editorUpdatedAt=Date.now(),this.editorSelection=q.selection.toJSON())}),z.on("transaction",()=>{V||(this.editorUpdatedAt=Date.now())}),u&&z.on("blur",()=>{V||this.$wire.commit()}),this.$watch("state",()=>{if(!V){if(!this.shouldUpdateState){this.shouldUpdateState=!0;return}z.commands.setContent(this.state)}});let W=q=>{q.detail.livewireId===m&&q.detail.key===f&&this.runEditorCommands(q.detail)};window.addEventListener("run-rich-editor-commands",W),K.push(["run-rich-editor-commands",W]);let Q=q=>{q.detail.livewireId===m&&q.detail.key===f&&(this.isUploadingFile=!0,this.fileValidationMessage=null,q.stopPropagation())};window.addEventListener("rich-editor-uploading-file",Q),K.push(["rich-editor-uploading-file",Q]);let me=q=>{q.detail.livewireId===m&&q.detail.key===f&&(this.isUploadingFile=!1,q.stopPropagation())};window.addEventListener("rich-editor-uploaded-file",me),K.push(["rich-editor-uploaded-file",me]);let Ge=q=>{q.detail.livewireId===m&&q.detail.key===f&&(this.isUploadingFile=!1,this.fileValidationMessage=q.detail.validationMessage,q.stopPropagation())};window.addEventListener("rich-editor-file-validation-message",Ge),K.push(["rich-editor-file-validation-message",Ge]),window.dispatchEvent(new CustomEvent(`schema-component-${m}-${f}-loaded`))},getEditor(){return z},$getEditor(){return this.getEditor()},setEditorSelection(N){N&&(this.editorSelection=N,z.chain().command(({tr:_})=>(_.setSelection(I.fromJSON(z.state.doc,this.editorSelection)),!0)).run())},runEditorCommands({commands:N,editorSelection:_}){this.setEditorSelection(_);let W=z.chain();N.forEach(Q=>W=W[Q.name](...Q.arguments??[])),W.run()},togglePanel(N=null){if(this.isPanelActive(N)){this.activePanel=null;return}this.activePanel=N},isPanelActive(N=null){return N===null?this.activePanel!==null:this.activePanel===N},insertMergeTag(N){z.chain().focus().insertContent([{type:"mergeTag",attrs:{id:N}},{type:"text",text:" "}]).run()},destroy(){V=!0,K.forEach(([N,_])=>{window.removeEventListener(N,_)}),K=[],z&&(z.destroy(),z=null),this.shouldUpdateState=!0}}}export{Jx as default}; ================================================ FILE: public/js/filament/forms/components/select.js ================================================ var Ft=Math.min,vt=Math.max,Ht=Math.round;var st=n=>({x:n,y:n}),ji={left:"right",right:"left",bottom:"top",top:"bottom"},qi={start:"end",end:"start"};function De(n,t,e){return vt(n,Ft(t,e))}function Vt(n,t){return typeof n=="function"?n(t):n}function yt(n){return n.split("-")[0]}function Wt(n){return n.split("-")[1]}function Ae(n){return n==="x"?"y":"x"}function Ce(n){return n==="y"?"height":"width"}var Ji=new Set(["top","bottom"]);function ht(n){return Ji.has(yt(n))?"y":"x"}function Le(n){return Ae(ht(n))}function Je(n,t,e){e===void 0&&(e=!1);let i=Wt(n),o=Le(n),s=Ce(o),r=o==="x"?i===(e?"end":"start")?"right":"left":i==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(r=Bt(r)),[r,Bt(r)]}function Qe(n){let t=Bt(n);return[ie(n),t,ie(t)]}function ie(n){return n.replace(/start|end/g,t=>qi[t])}var je=["left","right"],qe=["right","left"],Qi=["top","bottom"],Zi=["bottom","top"];function tn(n,t,e){switch(n){case"top":case"bottom":return e?t?qe:je:t?je:qe;case"left":case"right":return t?Qi:Zi;default:return[]}}function Ze(n,t,e,i){let o=Wt(n),s=tn(yt(n),e==="start",i);return o&&(s=s.map(r=>r+"-"+o),t&&(s=s.concat(s.map(ie)))),s}function Bt(n){return n.replace(/left|right|bottom|top/g,t=>ji[t])}function en(n){return{top:0,right:0,bottom:0,left:0,...n}}function ti(n){return typeof n!="number"?en(n):{top:n,right:n,bottom:n,left:n}}function Ot(n){let{x:t,y:e,width:i,height:o}=n;return{width:i,height:o,top:e,left:t,right:t+i,bottom:e+o,x:t,y:e}}function ei(n,t,e){let{reference:i,floating:o}=n,s=ht(t),r=Le(t),a=Ce(r),l=yt(t),c=s==="y",f=i.x+i.width/2-o.width/2,d=i.y+i.height/2-o.height/2,p=i[a]/2-o[a]/2,u;switch(l){case"top":u={x:f,y:i.y-o.height};break;case"bottom":u={x:f,y:i.y+i.height};break;case"right":u={x:i.x+i.width,y:d};break;case"left":u={x:i.x-o.width,y:d};break;default:u={x:i.x,y:i.y}}switch(Wt(t)){case"start":u[r]-=p*(e&&c?-1:1);break;case"end":u[r]+=p*(e&&c?-1:1);break}return u}var ii=async(n,t,e)=>{let{placement:i="bottom",strategy:o="absolute",middleware:s=[],platform:r}=e,a=s.filter(Boolean),l=await(r.isRTL==null?void 0:r.isRTL(t)),c=await r.getElementRects({reference:n,floating:t,strategy:o}),{x:f,y:d}=ei(c,i,l),p=i,u={},g=0;for(let m=0;mk<=0)){var W,tt;let k=(((W=s.flip)==null?void 0:W.index)||0)+1,Y=q[k];if(Y&&(!(d==="alignment"?w!==ht(Y):!1)||V.every(L=>ht(L.placement)===w?L.overflows[0]>0:!0)))return{data:{index:k,overflows:V},reset:{placement:Y}};let B=(tt=V.filter(X=>X.overflows[0]<=0).sort((X,L)=>X.overflows[1]-L.overflows[1])[0])==null?void 0:tt.placement;if(!B)switch(u){case"bestFit":{var z;let X=(z=V.filter(L=>{if(F){let et=ht(L.placement);return et===w||et==="y"}return!0}).map(L=>[L.placement,L.overflows.filter(et=>et>0).reduce((et,ee)=>et+ee,0)]).sort((L,et)=>L[1]-et[1])[0])==null?void 0:z[0];X&&(B=X);break}case"initialPlacement":B=a;break}if(o!==B)return{reset:{placement:B}}}return{}}}};var nn=new Set(["left","top"]);async function on(n,t){let{placement:e,platform:i,elements:o}=n,s=await(i.isRTL==null?void 0:i.isRTL(o.floating)),r=yt(e),a=Wt(e),l=ht(e)==="y",c=nn.has(r)?-1:1,f=s&&l?-1:1,d=Vt(t,n),{mainAxis:p,crossAxis:u,alignmentAxis:g}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return a&&typeof g=="number"&&(u=a==="end"?g*-1:g),l?{x:u*f,y:p*c}:{x:p*c,y:u*f}}var oi=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(t){var e,i;let{x:o,y:s,placement:r,middlewareData:a}=t,l=await on(t,n);return r===((e=a.offset)==null?void 0:e.placement)&&(i=a.arrow)!=null&&i.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:r}}}}},si=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(t){let{x:e,y:i,placement:o}=t,{mainAxis:s=!0,crossAxis:r=!1,limiter:a={fn:S=>{let{x:E,y:w}=S;return{x:E,y:w}}},...l}=Vt(n,t),c={x:e,y:i},f=await Ie(t,l),d=ht(yt(o)),p=Ae(d),u=c[p],g=c[d];if(s){let S=p==="y"?"top":"left",E=p==="y"?"bottom":"right",w=u+f[S],D=u-f[E];u=De(w,u,D)}if(r){let S=d==="y"?"top":"left",E=d==="y"?"bottom":"right",w=g+f[S],D=g-f[E];g=De(w,g,D)}let m=a.fn({...t,[p]:u,[d]:g});return{...m,data:{x:m.x-e,y:m.y-i,enabled:{[p]:s,[d]:r}}}}}};function oe(){return typeof window<"u"}function Et(n){return ai(n)?(n.nodeName||"").toLowerCase():"#document"}function U(n){var t;return(n==null||(t=n.ownerDocument)==null?void 0:t.defaultView)||window}function ct(n){var t;return(t=(ai(n)?n.ownerDocument:n.document)||window.document)==null?void 0:t.documentElement}function ai(n){return oe()?n instanceof Node||n instanceof U(n).Node:!1}function it(n){return oe()?n instanceof Element||n instanceof U(n).Element:!1}function rt(n){return oe()?n instanceof HTMLElement||n instanceof U(n).HTMLElement:!1}function ri(n){return!oe()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof U(n).ShadowRoot}var sn=new Set(["inline","contents"]);function It(n){let{overflow:t,overflowX:e,overflowY:i,display:o}=nt(n);return/auto|scroll|overlay|hidden|clip/.test(t+i+e)&&!sn.has(o)}var rn=new Set(["table","td","th"]);function li(n){return rn.has(Et(n))}var an=[":popover-open",":modal"];function zt(n){return an.some(t=>{try{return n.matches(t)}catch{return!1}})}var ln=["transform","translate","scale","rotate","perspective"],cn=["transform","translate","scale","rotate","perspective","filter"],dn=["paint","layout","strict","content"];function se(n){let t=re(),e=it(n)?nt(n):n;return ln.some(i=>e[i]?e[i]!=="none":!1)||(e.containerType?e.containerType!=="normal":!1)||!t&&(e.backdropFilter?e.backdropFilter!=="none":!1)||!t&&(e.filter?e.filter!=="none":!1)||cn.some(i=>(e.willChange||"").includes(i))||dn.some(i=>(e.contain||"").includes(i))}function ci(n){let t=ut(n);for(;rt(t)&&!Dt(t);){if(se(t))return t;if(zt(t))return null;t=ut(t)}return null}function re(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var fn=new Set(["html","body","#document"]);function Dt(n){return fn.has(Et(n))}function nt(n){return U(n).getComputedStyle(n)}function Xt(n){return it(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function ut(n){if(Et(n)==="html")return n;let t=n.assignedSlot||n.parentNode||ri(n)&&n.host||ct(n);return ri(t)?t.host:t}function di(n){let t=ut(n);return Dt(t)?n.ownerDocument?n.ownerDocument.body:n.body:rt(t)&&It(t)?t:di(t)}function ne(n,t,e){var i;t===void 0&&(t=[]),e===void 0&&(e=!0);let o=di(n),s=o===((i=n.ownerDocument)==null?void 0:i.body),r=U(o);if(s){let a=ae(r);return t.concat(r,r.visualViewport||[],It(o)?o:[],a&&e?ne(a):[])}return t.concat(o,ne(o,[],e))}function ae(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function pi(n){let t=nt(n),e=parseFloat(t.width)||0,i=parseFloat(t.height)||0,o=rt(n),s=o?n.offsetWidth:e,r=o?n.offsetHeight:i,a=Ht(e)!==s||Ht(i)!==r;return a&&(e=s,i=r),{width:e,height:i,$:a}}function gi(n){return it(n)?n:n.contextElement}function Tt(n){let t=gi(n);if(!rt(t))return st(1);let e=t.getBoundingClientRect(),{width:i,height:o,$:s}=pi(t),r=(s?Ht(e.width):e.width)/i,a=(s?Ht(e.height):e.height)/o;return(!r||!Number.isFinite(r))&&(r=1),(!a||!Number.isFinite(a))&&(a=1),{x:r,y:a}}var hn=st(0);function mi(n){let t=U(n);return!re()||!t.visualViewport?hn:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function un(n,t,e){return t===void 0&&(t=!1),!e||t&&e!==U(n)?!1:t}function $t(n,t,e,i){t===void 0&&(t=!1),e===void 0&&(e=!1);let o=n.getBoundingClientRect(),s=gi(n),r=st(1);t&&(i?it(i)&&(r=Tt(i)):r=Tt(n));let a=un(s,e,i)?mi(s):st(0),l=(o.left+a.x)/r.x,c=(o.top+a.y)/r.y,f=o.width/r.x,d=o.height/r.y;if(s){let p=U(s),u=i&&it(i)?U(i):i,g=p,m=ae(g);for(;m&&i&&u!==g;){let S=Tt(m),E=m.getBoundingClientRect(),w=nt(m),D=E.left+(m.clientLeft+parseFloat(w.paddingLeft))*S.x,A=E.top+(m.clientTop+parseFloat(w.paddingTop))*S.y;l*=S.x,c*=S.y,f*=S.x,d*=S.y,l+=D,c+=A,g=U(m),m=ae(g)}}return Ot({width:f,height:d,x:l,y:c})}function le(n,t){let e=Xt(n).scrollLeft;return t?t.left+e:$t(ct(n)).left+e}function bi(n,t){let e=n.getBoundingClientRect(),i=e.left+t.scrollLeft-le(n,e),o=e.top+t.scrollTop;return{x:i,y:o}}function pn(n){let{elements:t,rect:e,offsetParent:i,strategy:o}=n,s=o==="fixed",r=ct(i),a=t?zt(t.floating):!1;if(i===r||a&&s)return e;let l={scrollLeft:0,scrollTop:0},c=st(1),f=st(0),d=rt(i);if((d||!d&&!s)&&((Et(i)!=="body"||It(r))&&(l=Xt(i)),rt(i))){let u=$t(i);c=Tt(i),f.x=u.x+i.clientLeft,f.y=u.y+i.clientTop}let p=r&&!d&&!s?bi(r,l):st(0);return{width:e.width*c.x,height:e.height*c.y,x:e.x*c.x-l.scrollLeft*c.x+f.x+p.x,y:e.y*c.y-l.scrollTop*c.y+f.y+p.y}}function gn(n){return Array.from(n.getClientRects())}function mn(n){let t=ct(n),e=Xt(n),i=n.ownerDocument.body,o=vt(t.scrollWidth,t.clientWidth,i.scrollWidth,i.clientWidth),s=vt(t.scrollHeight,t.clientHeight,i.scrollHeight,i.clientHeight),r=-e.scrollLeft+le(n),a=-e.scrollTop;return nt(i).direction==="rtl"&&(r+=vt(t.clientWidth,i.clientWidth)-o),{width:o,height:s,x:r,y:a}}var fi=25;function bn(n,t){let e=U(n),i=ct(n),o=e.visualViewport,s=i.clientWidth,r=i.clientHeight,a=0,l=0;if(o){s=o.width,r=o.height;let f=re();(!f||f&&t==="fixed")&&(a=o.offsetLeft,l=o.offsetTop)}let c=le(i);if(c<=0){let f=i.ownerDocument,d=f.body,p=getComputedStyle(d),u=f.compatMode==="CSS1Compat"&&parseFloat(p.marginLeft)+parseFloat(p.marginRight)||0,g=Math.abs(i.clientWidth-d.clientWidth-u);g<=fi&&(s-=g)}else c<=fi&&(s+=c);return{width:s,height:r,x:a,y:l}}var vn=new Set(["absolute","fixed"]);function yn(n,t){let e=$t(n,!0,t==="fixed"),i=e.top+n.clientTop,o=e.left+n.clientLeft,s=rt(n)?Tt(n):st(1),r=n.clientWidth*s.x,a=n.clientHeight*s.y,l=o*s.x,c=i*s.y;return{width:r,height:a,x:l,y:c}}function hi(n,t,e){let i;if(t==="viewport")i=bn(n,e);else if(t==="document")i=mn(ct(n));else if(it(t))i=yn(t,e);else{let o=mi(n);i={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return Ot(i)}function vi(n,t){let e=ut(n);return e===t||!it(e)||Dt(e)?!1:nt(e).position==="fixed"||vi(e,t)}function wn(n,t){let e=t.get(n);if(e)return e;let i=ne(n,[],!1).filter(a=>it(a)&&Et(a)!=="body"),o=null,s=nt(n).position==="fixed",r=s?ut(n):n;for(;it(r)&&!Dt(r);){let a=nt(r),l=se(r);!l&&a.position==="fixed"&&(o=null),(s?!l&&!o:!l&&a.position==="static"&&!!o&&vn.has(o.position)||It(r)&&!l&&vi(n,r))?i=i.filter(f=>f!==r):o=a,r=ut(r)}return t.set(n,i),i}function Sn(n){let{element:t,boundary:e,rootBoundary:i,strategy:o}=n,r=[...e==="clippingAncestors"?zt(t)?[]:wn(t,this._c):[].concat(e),i],a=r[0],l=r.reduce((c,f)=>{let d=hi(t,f,o);return c.top=vt(d.top,c.top),c.right=Ft(d.right,c.right),c.bottom=Ft(d.bottom,c.bottom),c.left=vt(d.left,c.left),c},hi(t,a,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function xn(n){let{width:t,height:e}=pi(n);return{width:t,height:e}}function On(n,t,e){let i=rt(t),o=ct(t),s=e==="fixed",r=$t(n,!0,s,t),a={scrollLeft:0,scrollTop:0},l=st(0);function c(){l.x=le(o)}if(i||!i&&!s)if((Et(t)!=="body"||It(o))&&(a=Xt(t)),i){let u=$t(t,!0,s,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else o&&c();s&&!i&&o&&c();let f=o&&!i&&!s?bi(o,a):st(0),d=r.left+a.scrollLeft-l.x-f.x,p=r.top+a.scrollTop-l.y-f.y;return{x:d,y:p,width:r.width,height:r.height}}function Te(n){return nt(n).position==="static"}function ui(n,t){if(!rt(n)||nt(n).position==="fixed")return null;if(t)return t(n);let e=n.offsetParent;return ct(n)===e&&(e=e.ownerDocument.body),e}function yi(n,t){let e=U(n);if(zt(n))return e;if(!rt(n)){let o=ut(n);for(;o&&!Dt(o);){if(it(o)&&!Te(o))return o;o=ut(o)}return e}let i=ui(n,t);for(;i&&li(i)&&Te(i);)i=ui(i,t);return i&&Dt(i)&&Te(i)&&!se(i)?e:i||ci(n)||e}var En=async function(n){let t=this.getOffsetParent||yi,e=this.getDimensions,i=await e(n.floating);return{reference:On(n.reference,await t(n.floating),n.strategy),floating:{x:0,y:0,width:i.width,height:i.height}}};function Dn(n){return nt(n).direction==="rtl"}var An={convertOffsetParentRelativeRectToViewportRelativeRect:pn,getDocumentElement:ct,getClippingRect:Sn,getOffsetParent:yi,getElementRects:En,getClientRects:gn,getDimensions:xn,getScale:Tt,isElement:it,isRTL:Dn};var wi=oi;var Si=si,xi=ni;var Oi=(n,t,e)=>{let i=new Map,o={platform:An,...e},s={...o.platform,_c:i};return ii(n,t,{...o,platform:s})};function Ei(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter(function(o){return Object.getOwnPropertyDescriptor(n,o).enumerable})),e.push.apply(e,i)}return e}function ft(n){for(var t=1;t=0)&&(e[o]=n[o]);return e}function In(n,t){if(n==null)return{};var e=Ln(n,t),i,o;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(n);for(o=0;o=0)&&Object.prototype.propertyIsEnumerable.call(n,i)&&(e[i]=n[i])}return e}var Tn="1.15.6";function pt(n){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(n)}var mt=pt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Zt=pt(/Edge/i),Di=pt(/firefox/i),Gt=pt(/safari/i)&&!pt(/chrome/i)&&!pt(/android/i),$e=pt(/iP(ad|od|hone)/i),Pi=pt(/chrome/i)&&pt(/android/i),Mi={capture:!1,passive:!1};function O(n,t,e){n.addEventListener(t,e,!mt&&Mi)}function x(n,t,e){n.removeEventListener(t,e,!mt&&Mi)}function ve(n,t){if(t){if(t[0]===">"&&(t=t.substring(1)),n)try{if(n.matches)return n.matches(t);if(n.msMatchesSelector)return n.msMatchesSelector(t);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(t)}catch{return!1}return!1}}function Ni(n){return n.host&&n!==document&&n.host.nodeType?n.host:n.parentNode}function lt(n,t,e,i){if(n){e=e||document;do{if(t!=null&&(t[0]===">"?n.parentNode===e&&ve(n,t):ve(n,t))||i&&n===e)return n;if(n===e)break}while(n=Ni(n))}return null}var Ai=/\s+/g;function Q(n,t,e){if(n&&t)if(n.classList)n.classList[e?"add":"remove"](t);else{var i=(" "+n.className+" ").replace(Ai," ").replace(" "+t+" "," ");n.className=(i+(e?" "+t:"")).replace(Ai," ")}}function b(n,t,e){var i=n&&n.style;if(i){if(e===void 0)return document.defaultView&&document.defaultView.getComputedStyle?e=document.defaultView.getComputedStyle(n,""):n.currentStyle&&(e=n.currentStyle),t===void 0?e:e[t];!(t in i)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),i[t]=e+(typeof e=="string"?"":"px")}}function Nt(n,t){var e="";if(typeof n=="string")e=n;else do{var i=b(n,"transform");i&&i!=="none"&&(e=i+" "+e)}while(!t&&(n=n.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(e)}function ki(n,t,e){if(n){var i=n.getElementsByTagName(t),o=0,s=i.length;if(e)for(;o=s:r=o<=s,!r)return i;if(i===dt())break;i=xt(i,!1)}return!1}function kt(n,t,e,i){for(var o=0,s=0,r=n.children;s2&&arguments[2]!==void 0?arguments[2]:{},o=i.evt,s=In(i,Fn);te.pluginEvent.bind(v)(t,e,ft({dragEl:h,parentEl:R,ghostEl:y,rootEl:I,nextEl:Lt,lastDownEl:pe,cloneEl:T,cloneHidden:St,dragStarted:Kt,putSortable:H,activeSortable:v.active,originalEvent:o,oldIndex:Mt,oldDraggableIndex:qt,newIndex:Z,newDraggableIndex:wt,hideGhostForTarget:$i,unhideGhostForTarget:Ki,cloneNowHidden:function(){St=!0},cloneNowShown:function(){St=!1},dispatchSortableEvent:function(a){K({sortable:e,name:a,originalEvent:o})}},s))};function K(n){Bn(ft({putSortable:H,cloneEl:T,targetEl:h,rootEl:I,oldIndex:Mt,oldDraggableIndex:qt,newIndex:Z,newDraggableIndex:wt},n))}var h,R,y,I,Lt,pe,T,St,Mt,Z,qt,wt,ce,H,Pt=!1,ye=!1,we=[],At,at,Pe,Me,Ii,Ti,Kt,Rt,Jt,Qt=!1,de=!1,ge,$,Ne=[],Ve=!1,Se=[],Oe=typeof document<"u",fe=$e,_i=Zt||mt?"cssFloat":"float",Hn=Oe&&!Pi&&!$e&&"draggable"in document.createElement("div"),Wi=(function(){if(Oe){if(mt)return!1;var n=document.createElement("x");return n.style.cssText="pointer-events:auto",n.style.pointerEvents==="auto"}})(),zi=function(t,e){var i=b(t),o=parseInt(i.width)-parseInt(i.paddingLeft)-parseInt(i.paddingRight)-parseInt(i.borderLeftWidth)-parseInt(i.borderRightWidth),s=kt(t,0,e),r=kt(t,1,e),a=s&&b(s),l=r&&b(r),c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+N(s).width,f=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+N(r).width;if(i.display==="flex")return i.flexDirection==="column"||i.flexDirection==="column-reverse"?"vertical":"horizontal";if(i.display==="grid")return i.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(s&&a.float&&a.float!=="none"){var d=a.float==="left"?"left":"right";return r&&(l.clear==="both"||l.clear===d)?"vertical":"horizontal"}return s&&(a.display==="block"||a.display==="flex"||a.display==="table"||a.display==="grid"||c>=o&&i[_i]==="none"||r&&i[_i]==="none"&&c+f>o)?"vertical":"horizontal"},Vn=function(t,e,i){var o=i?t.left:t.top,s=i?t.right:t.bottom,r=i?t.width:t.height,a=i?e.left:e.top,l=i?e.right:e.bottom,c=i?e.width:e.height;return o===a||s===l||o+r/2===a+c/2},Wn=function(t,e){var i;return we.some(function(o){var s=o[j].options.emptyInsertThreshold;if(!(!s||Ke(o))){var r=N(o),a=t>=r.left-s&&t<=r.right+s,l=e>=r.top-s&&e<=r.bottom+s;if(a&&l)return i=o}}),i},Xi=function(t){function e(s,r){return function(a,l,c,f){var d=a.options.group.name&&l.options.group.name&&a.options.group.name===l.options.group.name;if(s==null&&(r||d))return!0;if(s==null||s===!1)return!1;if(r&&s==="clone")return s;if(typeof s=="function")return e(s(a,l,c,f),r)(a,l,c,f);var p=(r?a:l).options.group.name;return s===!0||typeof s=="string"&&s===p||s.join&&s.indexOf(p)>-1}}var i={},o=t.group;(!o||ue(o)!="object")&&(o={name:o}),i.name=o.name,i.checkPull=e(o.pull,!0),i.checkPut=e(o.put),i.revertClone=o.revertClone,t.group=i},$i=function(){!Wi&&y&&b(y,"display","none")},Ki=function(){!Wi&&y&&b(y,"display","")};Oe&&!Pi&&document.addEventListener("click",function(n){if(ye)return n.preventDefault(),n.stopPropagation&&n.stopPropagation(),n.stopImmediatePropagation&&n.stopImmediatePropagation(),ye=!1,!1},!0);var Ct=function(t){if(h){t=t.touches?t.touches[0]:t;var e=Wn(t.clientX,t.clientY);if(e){var i={};for(var o in t)t.hasOwnProperty(o)&&(i[o]=t[o]);i.target=i.rootEl=e,i.preventDefault=void 0,i.stopPropagation=void 0,e[j]._onDragOver(i)}}},zn=function(t){h&&h.parentNode[j]._isOutsideThisEl(t.target)};function v(n,t){if(!(n&&n.nodeType&&n.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(n));this.el=n,this.options=t=gt({},t),n[j]=this;var e={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(n.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return zi(n,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(r,a){r.setData("Text",a.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:v.supportPointer!==!1&&"PointerEvent"in window&&(!Gt||$e),emptyInsertThreshold:5};te.initializePlugins(this,n,e);for(var i in e)!(i in t)&&(t[i]=e[i]);Xi(t);for(var o in this)o.charAt(0)==="_"&&typeof this[o]=="function"&&(this[o]=this[o].bind(this));this.nativeDraggable=t.forceFallback?!1:Hn,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?O(n,"pointerdown",this._onTapStart):(O(n,"mousedown",this._onTapStart),O(n,"touchstart",this._onTapStart)),this.nativeDraggable&&(O(n,"dragover",this),O(n,"dragenter",this)),we.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),gt(this,Mn())}v.prototype={constructor:v,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Rt=null)},_getDirection:function(t,e){return typeof this.options.direction=="function"?this.options.direction.call(this,t,e,h):this.options.direction},_onTapStart:function(t){if(t.cancelable){var e=this,i=this.el,o=this.options,s=o.preventOnFilter,r=t.type,a=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,l=(a||t).target,c=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||l,f=o.filter;if(qn(i),!h&&!(/mousedown|pointerdown/.test(r)&&t.button!==0||o.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&Gt&&l&&l.tagName.toUpperCase()==="SELECT")&&(l=lt(l,o.draggable,i,!1),!(l&&l.animated)&&pe!==l)){if(Mt=ot(l),qt=ot(l,o.draggable),typeof f=="function"){if(f.call(this,t,l,this)){K({sortable:e,rootEl:c,name:"filter",targetEl:l,toEl:i,fromEl:i}),G("filter",e,{evt:t}),s&&t.preventDefault();return}}else if(f&&(f=f.split(",").some(function(d){if(d=lt(c,d.trim(),i,!1),d)return K({sortable:e,rootEl:d,name:"filter",targetEl:l,fromEl:i,toEl:i}),G("filter",e,{evt:t}),!0}),f)){s&&t.preventDefault();return}o.handle&&!lt(c,o.handle,i,!1)||this._prepareDragStart(t,a,l)}}},_prepareDragStart:function(t,e,i){var o=this,s=o.el,r=o.options,a=s.ownerDocument,l;if(i&&!h&&i.parentNode===s){var c=N(i);if(I=s,h=i,R=h.parentNode,Lt=h.nextSibling,pe=i,ce=r.group,v.dragged=h,At={target:h,clientX:(e||t).clientX,clientY:(e||t).clientY},Ii=At.clientX-c.left,Ti=At.clientY-c.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,h.style["will-change"]="all",l=function(){if(G("delayEnded",o,{evt:t}),v.eventCanceled){o._onDrop();return}o._disableDelayedDragEvents(),!Di&&o.nativeDraggable&&(h.draggable=!0),o._triggerDragStart(t,e),K({sortable:o,name:"choose",originalEvent:t}),Q(h,r.chosenClass,!0)},r.ignore.split(",").forEach(function(f){ki(h,f.trim(),ke)}),O(a,"dragover",Ct),O(a,"mousemove",Ct),O(a,"touchmove",Ct),r.supportPointer?(O(a,"pointerup",o._onDrop),!this.nativeDraggable&&O(a,"pointercancel",o._onDrop)):(O(a,"mouseup",o._onDrop),O(a,"touchend",o._onDrop),O(a,"touchcancel",o._onDrop)),Di&&this.nativeDraggable&&(this.options.touchStartThreshold=4,h.draggable=!0),G("delayStart",this,{evt:t}),r.delay&&(!r.delayOnTouchOnly||e)&&(!this.nativeDraggable||!(Zt||mt))){if(v.eventCanceled){this._onDrop();return}r.supportPointer?(O(a,"pointerup",o._disableDelayedDrag),O(a,"pointercancel",o._disableDelayedDrag)):(O(a,"mouseup",o._disableDelayedDrag),O(a,"touchend",o._disableDelayedDrag),O(a,"touchcancel",o._disableDelayedDrag)),O(a,"mousemove",o._delayedDragTouchMoveHandler),O(a,"touchmove",o._delayedDragTouchMoveHandler),r.supportPointer&&O(a,"pointermove",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(l,r.delay)}else l()}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){h&&ke(h),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;x(t,"mouseup",this._disableDelayedDrag),x(t,"touchend",this._disableDelayedDrag),x(t,"touchcancel",this._disableDelayedDrag),x(t,"pointerup",this._disableDelayedDrag),x(t,"pointercancel",this._disableDelayedDrag),x(t,"mousemove",this._delayedDragTouchMoveHandler),x(t,"touchmove",this._delayedDragTouchMoveHandler),x(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||t.pointerType=="touch"&&t,!this.nativeDraggable||e?this.options.supportPointer?O(document,"pointermove",this._onTouchMove):e?O(document,"touchmove",this._onTouchMove):O(document,"mousemove",this._onTouchMove):(O(h,"dragend",this),O(I,"dragstart",this._onDragStart));try{document.selection?me(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,e){if(Pt=!1,I&&h){G("dragStarted",this,{evt:e}),this.nativeDraggable&&O(document,"dragover",zn);var i=this.options;!t&&Q(h,i.dragClass,!1),Q(h,i.ghostClass,!0),v.active=this,t&&this._appendGhost(),K({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,$i();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY),t!==e);)e=t;if(h.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){var i=void 0;if(i=e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e}),i&&!this.options.dragoverBubble)break}t=e}while(e=Ni(e));Ki()}},_onTouchMove:function(t){if(At){var e=this.options,i=e.fallbackTolerance,o=e.fallbackOffset,s=t.touches?t.touches[0]:t,r=y&&Nt(y,!0),a=y&&r&&r.a,l=y&&r&&r.d,c=fe&&$&&Li($),f=(s.clientX-At.clientX+o.x)/(a||1)+(c?c[0]-Ne[0]:0)/(a||1),d=(s.clientY-At.clientY+o.y)/(l||1)+(c?c[1]-Ne[1]:0)/(l||1);if(!v.active&&!Pt){if(i&&Math.max(Math.abs(s.clientX-this._lastX),Math.abs(s.clientY-this._lastY))=0&&(K({rootEl:R,name:"add",toEl:R,fromEl:I,originalEvent:t}),K({sortable:this,name:"remove",toEl:R,originalEvent:t}),K({rootEl:R,name:"sort",toEl:R,fromEl:I,originalEvent:t}),K({sortable:this,name:"sort",toEl:R,originalEvent:t})),H&&H.save()):Z!==Mt&&Z>=0&&(K({sortable:this,name:"update",toEl:R,originalEvent:t}),K({sortable:this,name:"sort",toEl:R,originalEvent:t})),v.active&&((Z==null||Z===-1)&&(Z=Mt,wt=qt),K({sortable:this,name:"end",toEl:R,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){G("nulling",this),I=h=R=y=Lt=T=pe=St=At=at=Kt=Z=wt=Mt=qt=Rt=Jt=H=ce=v.dragged=v.ghost=v.clone=v.active=null,Se.forEach(function(t){t.checked=!0}),Se.length=Pe=Me=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":h&&(this._onDragOver(t),Xn(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],e,i=this.el.children,o=0,s=i.length,r=this.options;oo.right+s||n.clientY>i.bottom&&n.clientX>i.left:n.clientY>o.bottom+s||n.clientX>i.right&&n.clientY>i.top}function Un(n,t,e,i,o,s,r,a){var l=i?n.clientY:n.clientX,c=i?e.height:e.width,f=i?e.top:e.left,d=i?e.bottom:e.right,p=!1;if(!r){if(a&&gef+c*s/2:ld-ge)return-Jt}else if(l>f+c*(1-o)/2&&ld-c*s/2)?l>f+c/2?1:-1:0}function Gn(n){return ot(h){},options:W,optionsLimit:tt=null,placeholder:z,position:k=null,searchableOptionFields:Y=["label"],searchDebounce:B=1e3,searchingMessage:X="Searching...",searchPrompt:L="Search...",state:et,statePath:ee=null}){this.canOptionLabelsWrap=t,this.canSelectPlaceholder=e,this.element=i,this.getOptionLabelUsing=o,this.getOptionLabelsUsing=s,this.getOptionsUsing=r,this.getSearchResultsUsing=a,this.hasDynamicOptions=l,this.hasDynamicSearchResults=c,this.hasInitialNoOptionsMessage=f,this.initialOptionLabel=d,this.initialOptionLabels=p,this.initialState=u,this.isAutofocused=g,this.isDisabled=m,this.isHtmlAllowed=S,this.isMultiple=E,this.isReorderable=w,this.isSearchable=D,this.livewireId=A,this.loadingMessage=C,this.maxItems=F,this.maxItemsMessage=q,this.noOptionsMessage=J,this.noSearchResultsMessage=_,this.onStateChange=V,this.options=W,this.optionsLimit=tt,this.originalOptions=JSON.parse(JSON.stringify(W)),this.placeholder=z,this.position=k,this.searchableOptionFields=Array.isArray(Y)?Y:["label"],this.searchDebounce=B,this.searchingMessage=X,this.searchPrompt=L,this.state=et,this.statePath=ee,this.activeSearchId=0,this.labelRepository={},this.isOpen=!1,this.selectedIndex=-1,this.searchQuery="",this.searchTimeout=null,this.isSearching=!1,this.selectedDisplayVersion=0,this.render(),this.setUpEventListeners(),this.isAutofocused&&this.selectButton.focus()}populateLabelRepositoryFromOptions(t){if(!(!t||!Array.isArray(t)))for(let e of t)e.options&&Array.isArray(e.options)?this.populateLabelRepositoryFromOptions(e.options):e.value!==void 0&&e.label!==void 0&&(this.labelRepository[e.value]=e.label)}render(){this.populateLabelRepositoryFromOptions(this.options),this.container=document.createElement("div"),this.container.className="fi-select-input-ctn",this.canOptionLabelsWrap||this.container.classList.add("fi-select-input-ctn-option-labels-not-wrapped"),this.container.setAttribute("aria-haspopup","listbox"),this.selectButton=document.createElement("button"),this.selectButton.className="fi-select-input-btn",this.selectButton.type="button",this.selectButton.setAttribute("aria-expanded","false"),this.selectedDisplay=document.createElement("div"),this.selectedDisplay.className="fi-select-input-value-ctn",this.updateSelectedDisplay(),this.selectButton.appendChild(this.selectedDisplay),this.dropdown=document.createElement("div"),this.dropdown.className="fi-dropdown-panel fi-scrollable",this.dropdown.setAttribute("role","listbox"),this.dropdown.setAttribute("tabindex","-1"),this.dropdown.style.display="none",this.dropdownId=`fi-select-input-dropdown-${Math.random().toString(36).substring(2,11)}`,this.dropdown.id=this.dropdownId,this.isMultiple&&this.dropdown.setAttribute("aria-multiselectable","true"),this.isSearchable&&(this.searchContainer=document.createElement("div"),this.searchContainer.className="fi-select-input-search-ctn",this.searchInput=document.createElement("input"),this.searchInput.className="fi-input",this.searchInput.type="text",this.searchInput.placeholder=this.searchPrompt,this.searchInput.setAttribute("aria-label","Search"),this.searchContainer.appendChild(this.searchInput),this.dropdown.appendChild(this.searchContainer),this.searchInput.addEventListener("input",t=>{this.isDisabled||this.handleSearch(t)}),this.searchInput.addEventListener("keydown",t=>{if(!this.isDisabled){if(t.key==="Tab"){t.preventDefault();let e=this.getVisibleOptions();if(e.length===0)return;t.shiftKey?this.selectedIndex=e.length-1:this.selectedIndex=0,e.forEach(i=>{i.classList.remove("fi-selected")}),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus()}else if(t.key==="ArrowDown"){if(t.preventDefault(),t.stopPropagation(),this.getVisibleOptions().length===0)return;this.selectedIndex=-1,this.searchInput.blur(),this.focusNextOption()}else if(t.key==="ArrowUp"){t.preventDefault(),t.stopPropagation();let e=this.getVisibleOptions();if(e.length===0)return;this.selectedIndex=e.length-1,this.searchInput.blur(),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus(),e[this.selectedIndex].id&&this.dropdown.setAttribute("aria-activedescendant",e[this.selectedIndex].id),this.scrollOptionIntoView(e[this.selectedIndex])}else if(t.key==="Enter"){if(t.preventDefault(),t.stopPropagation(),this.isSearching)return;let e=this.getVisibleOptions();if(e.length===0)return;let i=e.find(s=>{let r=s.getAttribute("aria-disabled")==="true",a=s.classList.contains("fi-disabled"),l=s.offsetParent===null;return!(r||a||l)});if(!i)return;let o=i.getAttribute("data-value");if(o===null)return;this.selectOption(o)}}})),this.optionsList=document.createElement("ul"),this.renderOptions(),this.container.appendChild(this.selectButton),this.container.appendChild(this.dropdown),this.element.appendChild(this.container),this.applyDisabledState()}renderOptions(){this.optionsList.innerHTML="";let t=0,e=this.options,i=0,o=!1;this.options.forEach(a=>{a.options&&Array.isArray(a.options)?(i+=a.options.length,o=!0):i++}),o?this.optionsList.className="fi-select-input-options-ctn":i>0&&(this.optionsList.className="fi-dropdown-list");let s=o?null:this.optionsList,r=0;for(let a of e){if(this.optionsLimit>0&&r>=this.optionsLimit)break;if(a.options&&Array.isArray(a.options)){let l=a.options;if(this.isMultiple&&Array.isArray(this.state)&&this.state.length>0&&(l=a.options.filter(c=>!this.state.includes(c.value))),l.length>0){if(this.optionsLimit>0){let c=this.optionsLimit-r;c{let a=this.createOptionElement(r.value,r);s.appendChild(a)}),i.appendChild(o),i.appendChild(s),this.optionsList.appendChild(i)}createOptionElement(t,e){let i=t,o=e,s=!1;typeof e=="object"&&e!==null&&"label"in e&&"value"in e&&(i=e.value,o=e.label,s=e.isDisabled||!1);let r=document.createElement("li");r.className="fi-dropdown-list-item fi-select-input-option",s&&r.classList.add("fi-disabled");let a=`fi-select-input-option-${Math.random().toString(36).substring(2,11)}`;if(r.id=a,r.setAttribute("role","option"),r.setAttribute("data-value",i),r.setAttribute("tabindex","0"),s&&r.setAttribute("aria-disabled","true"),this.isHtmlAllowed&&typeof o=="string"){let f=document.createElement("div");f.innerHTML=o;let d=f.textContent||f.innerText||o;r.setAttribute("aria-label",d)}let l=this.isMultiple?Array.isArray(this.state)&&this.state.includes(i):this.state===i;r.setAttribute("aria-selected",l?"true":"false"),l&&r.classList.add("fi-selected");let c=document.createElement("span");return this.isHtmlAllowed?c.innerHTML=o:c.textContent=o,r.appendChild(c),s||r.addEventListener("click",f=>{f.preventDefault(),f.stopPropagation(),this.selectOption(i),this.isMultiple&&(this.isSearchable&&this.searchInput?setTimeout(()=>{this.searchInput.focus()},0):setTimeout(()=>{r.focus()},0))}),r}async updateSelectedDisplay(){this.selectedDisplayVersion=this.selectedDisplayVersion+1;let t=this.selectedDisplayVersion,e=document.createDocumentFragment();if(this.isMultiple){if(!Array.isArray(this.state)||this.state.length===0){let o=document.createElement("span");o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o)}else{let o=await this.getLabelsForMultipleSelection();if(t!==this.selectedDisplayVersion)return;this.addBadgesForSelectedOptions(o,e)}t===this.selectedDisplayVersion&&(this.selectedDisplay.replaceChildren(e),this.isOpen&&this.deferPositionDropdown());return}if(this.state===null||this.state===""){let o=document.createElement("span");if(o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o),t===this.selectedDisplayVersion){this.selectedDisplay.replaceChildren(e);let s=this.container.querySelector(".fi-select-input-value-remove-btn");s&&s.remove(),this.container.classList.remove("fi-select-input-ctn-clearable")}return}let i=await this.getLabelForSingleSelection();t===this.selectedDisplayVersion&&(this.addSingleSelectionDisplay(i,e),t===this.selectedDisplayVersion&&this.selectedDisplay.replaceChildren(e))}async getLabelsForMultipleSelection(){let t=this.getSelectedOptionLabels(),e=[];if(Array.isArray(this.state)){for(let o of this.state)if(!P(this.labelRepository[o])){if(P(t[o])){this.labelRepository[o]=t[o];continue}e.push(o.toString())}}if(e.length>0&&P(this.initialOptionLabels)&&JSON.stringify(this.state)===JSON.stringify(this.initialState)){if(Array.isArray(this.initialOptionLabels))for(let o of this.initialOptionLabels)P(o)&&o.value!==void 0&&o.label!==void 0&&e.includes(o.value)&&(this.labelRepository[o.value]=o.label)}else if(e.length>0&&this.getOptionLabelsUsing)try{let o=await this.getOptionLabelsUsing();for(let s of o)P(s)&&s.value!==void 0&&s.label!==void 0&&(this.labelRepository[s.value]=s.label)}catch(o){console.error("Error fetching option labels:",o)}let i=[];if(Array.isArray(this.state))for(let o of this.state)P(this.labelRepository[o])?i.push(this.labelRepository[o]):P(t[o])?i.push(t[o]):i.push(o);return i}createBadgeElement(t,e){let i=document.createElement("span");i.className="fi-badge fi-size-md fi-color fi-color-primary fi-text-color-600 dark:fi-text-color-200",P(t)&&i.setAttribute("data-value",t);let o=document.createElement("span");o.className="fi-badge-label-ctn";let s=document.createElement("span");s.className="fi-badge-label",this.canOptionLabelsWrap&&s.classList.add("fi-wrapped"),this.isHtmlAllowed?s.innerHTML=e:s.textContent=e,o.appendChild(s),i.appendChild(o);let r=this.createRemoveButton(t,e);return i.appendChild(r),i}createRemoveButton(t,e){let i=document.createElement("button");return i.type="button",i.className="fi-badge-delete-btn",i.innerHTML='',i.setAttribute("aria-label","Remove "+(this.isHtmlAllowed?e.replace(/<[^>]*>/g,""):e)),i.addEventListener("click",o=>{o.stopPropagation(),P(t)&&this.selectOption(t)}),i.addEventListener("keydown",o=>{(o.key===" "||o.key==="Enter")&&(o.preventDefault(),o.stopPropagation(),P(t)&&this.selectOption(t))}),i}addBadgesForSelectedOptions(t,e=this.selectedDisplay){let i=document.createElement("div");i.className="fi-select-input-value-badges-ctn",t.forEach((o,s)=>{let r=Array.isArray(this.state)?this.state[s]:null,a=this.createBadgeElement(r,o);i.appendChild(a)}),e.appendChild(i),this.isReorderable&&(i.addEventListener("click",o=>{o.stopPropagation()}),i.addEventListener("mousedown",o=>{o.stopPropagation()}),new Ui(i,{animation:150,onEnd:()=>{let o=[];i.querySelectorAll("[data-value]").forEach(s=>{o.push(s.getAttribute("data-value"))}),this.state=o,this.onStateChange(this.state)}}))}async getLabelForSingleSelection(){let t=this.labelRepository[this.state];if(bt(t)&&(t=this.getSelectedOptionLabel(this.state)),bt(t)&&P(this.initialOptionLabel)&&this.state===this.initialState)t=this.initialOptionLabel,P(this.state)&&(this.labelRepository[this.state]=t);else if(bt(t)&&this.getOptionLabelUsing)try{t=await this.getOptionLabelUsing(),P(t)&&P(this.state)&&(this.labelRepository[this.state]=t)}catch(e){console.error("Error fetching option label:",e),t=this.state}else bt(t)&&(t=this.state);return t}addSingleSelectionDisplay(t,e=this.selectedDisplay){let i=document.createElement("span");if(i.className="fi-select-input-value-label",this.isHtmlAllowed?i.innerHTML=t:i.textContent=t,e.appendChild(i),!this.canSelectPlaceholder||this.container.querySelector(".fi-select-input-value-remove-btn"))return;let o=document.createElement("button");o.type="button",o.className="fi-select-input-value-remove-btn",o.innerHTML='',o.setAttribute("aria-label","Clear selection"),o.addEventListener("click",s=>{s.stopPropagation(),this.selectOption("")}),o.addEventListener("keydown",s=>{(s.key===" "||s.key==="Enter")&&(s.preventDefault(),s.stopPropagation(),this.selectOption(""))}),this.container.appendChild(o),this.container.classList.add("fi-select-input-ctn-clearable")}getSelectedOptionLabel(t){if(P(this.labelRepository[t]))return this.labelRepository[t];let e="";for(let i of this.options)if(i.options&&Array.isArray(i.options)){for(let o of i.options)if(o.value===t){e=o.label,this.labelRepository[t]=e;break}}else if(i.value===t){e=i.label,this.labelRepository[t]=e;break}return e}setUpEventListeners(){this.buttonClickListener=()=>{this.toggleDropdown()},this.documentClickListener=t=>{!this.container.contains(t.target)&&this.isOpen&&this.closeDropdown()},this.buttonKeydownListener=t=>{this.isDisabled||this.handleSelectButtonKeydown(t)},this.dropdownKeydownListener=t=>{this.isDisabled||this.isSearchable&&document.activeElement===this.searchInput&&!["Tab","Escape"].includes(t.key)||this.handleDropdownKeydown(t)},this.selectButton.addEventListener("click",this.buttonClickListener),document.addEventListener("click",this.documentClickListener),this.selectButton.addEventListener("keydown",this.buttonKeydownListener),this.dropdown.addEventListener("keydown",this.dropdownKeydownListener),!this.isMultiple&&this.livewireId&&this.statePath&&this.getOptionLabelUsing&&(this.refreshOptionLabelListener=async t=>{if(t.detail.livewireId===this.livewireId&&t.detail.statePath===this.statePath&&P(this.state))try{delete this.labelRepository[this.state];let e=await this.getOptionLabelUsing();P(e)&&(this.labelRepository[this.state]=e);let i=this.selectedDisplay.querySelector(".fi-select-input-value-label");P(i)&&(this.isHtmlAllowed?i.innerHTML=e:i.textContent=e),this.updateOptionLabelInList(this.state,e)}catch(e){console.error("Error refreshing option label:",e)}},window.addEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener))}updateOptionLabelInList(t,e){this.labelRepository[t]=e;let i=this.getVisibleOptions();for(let o of i)if(o.getAttribute("data-value")===String(t)){if(o.innerHTML="",this.isHtmlAllowed){let s=document.createElement("span");s.innerHTML=e,o.appendChild(s)}else o.appendChild(document.createTextNode(e));break}for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}for(let o of this.originalOptions)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}}handleSelectButtonKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusNextOption():this.openDropdown();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusPreviousOption():this.openDropdown();break;case" ":if(t.preventDefault(),this.isOpen){if(this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}}else this.openDropdown();break;case"Enter":break;case"Escape":this.isOpen&&(t.preventDefault(),this.closeDropdown());break;case"Tab":this.isOpen&&this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.isOpen||this.openDropdown(),this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}handleDropdownKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.focusNextOption();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.focusPreviousOption();break;case" ":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}break;case"Enter":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}else{let e=this.element.closest("form");e&&e.submit()}break;case"Escape":t.preventDefault(),this.closeDropdown(),this.selectButton.focus();break;case"Tab":this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}toggleDropdown(){if(!this.isDisabled){if(this.isOpen){this.closeDropdown();return}this.isMultiple&&!this.isSearchable&&!this.hasAvailableOptions()||this.openDropdown()}}hasAvailableOptions(){for(let t of this.options)if(t.options&&Array.isArray(t.options)){for(let e of t.options)if(!Array.isArray(this.state)||!this.state.includes(e.value))return!0}else if(!Array.isArray(this.state)||!this.state.includes(t.value))return!0;return!1}async openDropdown(){this.dropdown.style.display="block",this.dropdown.style.opacity="0";let t=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;if(this.dropdown.style.position=t?"fixed":"absolute",this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.selectButton.setAttribute("aria-expanded","true"),this.isOpen=!0,this.positionDropdown(),this.resizeListener||(this.resizeListener=()=>{this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.positionDropdown()},window.addEventListener("resize",this.resizeListener)),this.scrollListener||(this.scrollListener=()=>this.positionDropdown(),window.addEventListener("scroll",this.scrollListener,!0)),this.dropdown.style.opacity="1",this.isSearchable&&this.searchInput&&(this.searchInput.value="",this.searchQuery="",this.hasDynamicOptions||(this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())),this.hasDynamicOptions&&this.getOptionsUsing){this.showLoadingState(!1);try{let e=await this.getOptionsUsing(),i=Array.isArray(e)?e:e&&Array.isArray(e.options)?e.options:[];if(this.options=i,this.originalOptions=JSON.parse(JSON.stringify(i)),this.populateLabelRepositoryFromOptions(i),this.isSearchable&&this.searchInput&&(this.searchInput.value&&this.searchInput.value.trim()!==""||this.searchQuery&&this.searchQuery.trim()!=="")){let o=(this.searchInput.value||this.searchQuery||"").trim().toLowerCase();this.hideLoadingState(),this.filterOptions(o)}else this.renderOptions()}catch(e){console.error("Error fetching options:",e),this.hideLoadingState()}}else(!this.hasInitialNoOptionsMessage||this.searchQuery)&&this.hideLoadingState();if(this.isSearchable&&this.searchInput)this.searchInput.focus();else{this.selectedIndex=-1;let e=this.getVisibleOptions();if(this.isMultiple){if(Array.isArray(this.state)&&this.state.length>0){for(let i=0;i0&&(this.selectedIndex=0),this.selectedIndex>=0&&(e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus())}}positionDropdown(){let t=this.position==="top"?"top-start":"bottom-start",e=[wi(4),Si({padding:5})];this.position!=="top"&&this.position!=="bottom"&&e.push(xi());let i=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;Oi(this.selectButton,this.dropdown,{placement:t,middleware:e,strategy:i?"fixed":"absolute"}).then(({x:o,y:s})=>{Object.assign(this.dropdown.style,{left:`${o}px`,top:`${s}px`})})}deferPositionDropdown(){this.isOpen&&(this.positioningRequestAnimationFrame&&(cancelAnimationFrame(this.positioningRequestAnimationFrame),this.positioningRequestAnimationFrame=null),this.positioningRequestAnimationFrame=requestAnimationFrame(()=>{this.positionDropdown(),this.positioningRequestAnimationFrame=null}))}closeDropdown(){this.dropdown.style.display="none",this.selectButton.setAttribute("aria-expanded","false"),this.isOpen=!1,this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.activeSearchId++,this.isSearching=!1,this.hideLoadingState(),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.getVisibleOptions().forEach(e=>{e.classList.remove("fi-selected")}),this.dropdown.removeAttribute("aria-activedescendant")}focusNextOption(){let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex>=0&&this.selectedIndex=0&&this.selectedIndexe.bottom?this.dropdown.scrollTop+=i.bottom-e.bottom:i.top li[role="option"]')):t=Array.from(this.optionsList.querySelectorAll(':scope > ul.fi-dropdown-list > li[role="option"]'));let e=Array.from(this.optionsList.querySelectorAll('li.fi-select-input-option-group > ul > li[role="option"]'));return[...t,...e]}getSelectedOptionLabels(){if(!Array.isArray(this.state)||this.state.length===0)return{};let t={};for(let e of this.state){let i=!1;for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===e){t[e]=s.label,i=!0;break}if(i)break}else if(o.value===e){t[e]=o.label,i=!0;break}}return t}handleSearch(t){let e=t.target.value.trim();if(this.searchQuery=e,this.searchTimeout&&clearTimeout(this.searchTimeout),e===""){this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions();return}if(!this.getSearchResultsUsing||typeof this.getSearchResultsUsing!="function"||!this.hasDynamicSearchResults){this.filterOptions(e);return}this.searchTimeout=setTimeout(async()=>{this.searchTimeout=null;let i=++this.activeSearchId;this.isSearching=!0;try{this.showLoadingState(!0);let o=await this.getSearchResultsUsing(e);if(i!==this.activeSearchId||!this.isOpen)return;let s=Array.isArray(o)?o:o&&Array.isArray(o.options)?o.options:[];this.options=s,this.populateLabelRepositoryFromOptions(s),this.hideLoadingState(),this.renderOptions(),this.isOpen&&this.deferPositionDropdown(),this.options.length===0&&this.showNoResultsMessage()}catch(o){i===this.activeSearchId&&(console.error("Error fetching search results:",o),this.hideLoadingState(),this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())}finally{i===this.activeSearchId&&(this.isSearching=!1)}},this.searchDebounce)}showLoadingState(t=!1){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let e=document.createElement("div");e.className="fi-select-input-message",e.textContent=t?this.searchingMessage:this.loadingMessage,this.dropdown.appendChild(e),this.isOpen&&this.deferPositionDropdown()}hideLoadingState(){let t=this.dropdown.querySelector(".fi-select-input-message");t&&t.remove()}showNoOptionsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noOptionsMessage,this.dropdown.appendChild(t),this.isOpen&&this.deferPositionDropdown()}showNoResultsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noSearchResultsMessage,this.dropdown.appendChild(t),this.isOpen&&this.deferPositionDropdown()}filterOptions(t){let e=this.searchableOptionFields.includes("label"),i=this.searchableOptionFields.includes("value");t=t.toLowerCase();let o=[];for(let s of this.originalOptions)if(s.options&&Array.isArray(s.options)){let r=s.options.filter(a=>e&&a.label.toLowerCase().includes(t)||i&&String(a.value).toLowerCase().includes(t));r.length>0&&o.push({label:s.label,options:r})}else(e&&s.label.toLowerCase().includes(t)||i&&String(s.value).toLowerCase().includes(t))&&o.push(s);this.options=o,this.renderOptions(),this.options.length===0&&this.showNoResultsMessage(),this.isOpen&&this.positionDropdown()}selectOption(t){if(this.isDisabled)return;if(!this.isMultiple){this.state=t,this.updateSelectedDisplay(),this.renderOptions(),this.closeDropdown(),this.selectButton.focus(),this.onStateChange(this.state);return}let e=Array.isArray(this.state)?[...this.state]:[];if(e.includes(t)){let o=this.selectedDisplay.querySelector(`[data-value="${t}"]`);if(P(o)){let s=o.parentElement;P(s)&&s.children.length===1?(e=e.filter(r=>r!==t),this.state=e,this.updateSelectedDisplay()):(o.remove(),e=e.filter(r=>r!==t),this.state=e)}else e=e.filter(s=>s!==t),this.state=e,this.updateSelectedDisplay();this.renderOptions(),this.isOpen&&this.deferPositionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state);return}if(this.maxItems&&e.length>=this.maxItems){this.maxItemsMessage&&alert(this.maxItemsMessage);return}e.push(t),this.state=e;let i=this.selectedDisplay.querySelector(".fi-select-input-value-badges-ctn");bt(i)?this.updateSelectedDisplay():this.addSingleBadge(t,i),this.renderOptions(),this.isOpen&&this.deferPositionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state)}async addSingleBadge(t,e){let i=this.labelRepository[t];if(bt(i)&&(i=this.getSelectedOptionLabel(t),P(i)&&(this.labelRepository[t]=i)),bt(i)&&this.getOptionLabelsUsing)try{let s=await this.getOptionLabelsUsing();for(let r of s)if(P(r)&&r.value===t&&r.label!==void 0){i=r.label,this.labelRepository[t]=i;break}}catch(s){console.error("Error fetching option label:",s)}bt(i)&&(i=t);let o=this.createBadgeElement(t,i);e.appendChild(o)}maintainFocusInMultipleMode(){if(this.isSearchable&&this.searchInput){this.searchInput.focus();return}let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex=-1,Array.isArray(this.state)&&this.state.length>0){for(let e=0;e{e.setAttribute("disabled","disabled"),e.classList.add("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.setAttribute("disabled","disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.setAttribute("disabled","disabled"),this.searchInput.classList.add("fi-disabled"))}else{if(this.selectButton.removeAttribute("disabled"),this.selectButton.removeAttribute("aria-disabled"),this.selectButton.classList.remove("fi-disabled"),this.isMultiple&&this.container.querySelectorAll(".fi-select-input-badge-remove").forEach(e=>{e.removeAttribute("disabled"),e.classList.remove("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.removeAttribute("disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.removeAttribute("disabled"),this.searchInput.classList.remove("fi-disabled"))}}destroy(){this.selectButton&&this.buttonClickListener&&this.selectButton.removeEventListener("click",this.buttonClickListener),this.documentClickListener&&document.removeEventListener("click",this.documentClickListener),this.selectButton&&this.buttonKeydownListener&&this.selectButton.removeEventListener("keydown",this.buttonKeydownListener),this.dropdown&&this.dropdownKeydownListener&&this.dropdown.removeEventListener("keydown",this.dropdownKeydownListener),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.refreshOptionLabelListener&&window.removeEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener),this.isOpen&&this.closeDropdown(),this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.container&&this.container.remove()}};function Qn({canOptionLabelsWrap:n,canSelectPlaceholder:t,getOptionLabelUsing:e,getOptionLabelsUsing:i,getOptionsUsing:o,getSearchResultsUsing:s,hasDynamicOptions:r,hasDynamicSearchResults:a,hasInitialNoOptionsMessage:l,initialOptionLabel:c,initialOptionLabels:f,initialState:d,isAutofocused:p,isDisabled:u,isHtmlAllowed:g,isMultiple:m,isReorderable:S,isSearchable:E,livewireId:w,loadingMessage:D,maxItems:A,maxItemsMessage:C,noOptionsMessage:F,noSearchResultsMessage:q,options:J,optionsLimit:_,placeholder:V,position:W,searchDebounce:tt,searchingMessage:z,searchPrompt:k,searchableOptionFields:Y,state:B,statePath:X}){return{select:null,state:B,init(){this.select=new Ee({canOptionLabelsWrap:n,canSelectPlaceholder:t,element:this.$refs.select,getOptionLabelUsing:e,getOptionLabelsUsing:i,getOptionsUsing:o,getSearchResultsUsing:s,hasDynamicOptions:r,hasDynamicSearchResults:a,hasInitialNoOptionsMessage:l,initialOptionLabel:c,initialOptionLabels:f,initialState:d,isAutofocused:p,isDisabled:u,isHtmlAllowed:g,isMultiple:m,isReorderable:S,isSearchable:E,livewireId:w,loadingMessage:D,maxItems:A,maxItemsMessage:C,noOptionsMessage:F,noSearchResultsMessage:q,onStateChange:L=>{this.state=L},options:J,optionsLimit:_,placeholder:V,position:W,searchableOptionFields:Y,searchDebounce:tt,searchingMessage:z,searchPrompt:k,state:this.state,statePath:X}),this.$watch("state",L=>{this.$nextTick(()=>{this.select&&this.select.state!==L&&(this.select.state=L,this.select.updateSelectedDisplay(),this.select.renderOptions())})})},destroy(){this.select&&(this.select.destroy(),this.select=null)}}}export{Qn as default}; /*! Bundled license information: sortablejs/modular/sortable.esm.js: (**! * Sortable 1.15.6 * @author RubaXa * @author owenm * @license MIT *) */ ================================================ FILE: public/js/filament/forms/components/slider.js ================================================ var I;(function(r){r.Range="range",r.Steps="steps",r.Positions="positions",r.Count="count",r.Values="values"})(I||(I={}));var O;(function(r){r[r.None=-1]="None",r[r.NoValue=0]="NoValue",r[r.LargeValue=1]="LargeValue",r[r.SmallValue=2]="SmallValue"})(O||(O={}));function we(r){return rt(r)&&typeof r.from=="function"}function rt(r){return typeof r=="object"&&typeof r.to=="function"}function zt(r){r.parentElement.removeChild(r)}function St(r){return r!=null}function Ft(r){r.preventDefault()}function Ce(r){return r.filter(function(t){return this[t]?!1:this[t]=!0},{})}function Ee(r,t){return Math.round(r/t)*t}function Ae(r,t){var s=r.getBoundingClientRect(),f=r.ownerDocument,u=f.documentElement,d=Bt(f);return/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)&&(d.x=0),t?s.top+d.y-u.clientTop:s.left+d.x-u.clientLeft}function R(r){return typeof r=="number"&&!isNaN(r)&&isFinite(r)}function Rt(r,t,s){s>0&&(L(r,t),setTimeout(function(){et(r,t)},s))}function jt(r){return Math.max(Math.min(r,100),0)}function it(r){return Array.isArray(r)?r:[r]}function Pe(r){r=String(r);var t=r.split(".");return t.length>1?t[1].length:0}function L(r,t){r.classList&&!/\s/.test(t)?r.classList.add(t):r.className+=" "+t}function et(r,t){r.classList&&!/\s/.test(t)?r.classList.remove(t):r.className=r.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")}function Ve(r,t){return r.classList?r.classList.contains(t):new RegExp("\\b"+t+"\\b").test(r.className)}function Bt(r){var t=window.pageXOffset!==void 0,s=(r.compatMode||"")==="CSS1Compat",f=t?window.pageXOffset:s?r.documentElement.scrollLeft:r.body.scrollLeft,u=t?window.pageYOffset:s?r.documentElement.scrollTop:r.body.scrollTop;return{x:f,y:u}}function De(){return window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"}}function ye(){var r=!1;try{var t=Object.defineProperty({},"passive",{get:function(){r=!0}});window.addEventListener("test",null,t)}catch{}return r}function ke(){return window.CSS&&CSS.supports&&CSS.supports("touch-action","none")}function bt(r,t){return 100/(t-r)}function xt(r,t,s){return t*100/(r[s+1]-r[s])}function Ue(r,t){return xt(r,r[0]<0?t+Math.abs(r[0]):t-r[0],0)}function Me(r,t){return t*(r[1]-r[0])/100+r[0]}function G(r,t){for(var s=1;r>=t[s];)s+=1;return s}function _e(r,t,s){if(s>=r.slice(-1)[0])return 100;var f=G(s,r),u=r[f-1],d=r[f],v=t[f-1],w=t[f];return v+Ue([u,d],s)/bt(v,w)}function Le(r,t,s){if(s>=100)return r.slice(-1)[0];var f=G(s,t),u=r[f-1],d=r[f],v=t[f-1],w=t[f];return Me([u,d],(s-v)*bt(v,w))}function Oe(r,t,s,f){if(f===100)return f;var u=G(f,r),d=r[u-1],v=r[u];return s?f-d>(v-d)/2?v:d:t[u-1]?r[u-1]+Ee(f-r[u-1],t[u-1]):f}var Kt=(function(){function r(t,s,f){this.xPct=[],this.xVal=[],this.xSteps=[],this.xNumSteps=[],this.xHighestCompleteStep=[],this.xSteps=[f||!1],this.xNumSteps=[!1],this.snap=s;var u,d=[];for(Object.keys(t).forEach(function(v){d.push([it(t[v]),v])}),d.sort(function(v,w){return v[0][0]-w[0][0]}),u=0;uthis.xPct[u+1];)u++;else t===this.xPct[this.xPct.length-1]&&(u=this.xPct.length-2);!f&&t===this.xPct[u+1]&&u++,s===null&&(s=[]);var d,v=1,w=s[u],C=0,p=0,D=0,y=0;for(f?d=(t-this.xPct[u])/(this.xPct[u+1]-this.xPct[u]):d=(this.xPct[u+1]-t)/(this.xPct[u+1]-this.xPct[u]);w>0;)C=this.xPct[u+1+y]-this.xPct[u+y],s[u+y]*v+100-d*100>100?(p=C*d,v=(w-100*d)/s[u+y],d=1):(p=s[u+y]*C/100*v,v=0),f?(D=D-p,this.xPct.length+y>=1&&y--):(D=D+p,this.xPct.length-y>=1&&y++),w=s[u+y]*v;return t+D},r.prototype.toStepping=function(t){return t=_e(this.xVal,this.xPct,t),t},r.prototype.fromStepping=function(t){return Le(this.xVal,this.xPct,t)},r.prototype.getStep=function(t){return t=Oe(this.xPct,this.xSteps,this.snap,t),t},r.prototype.getDefaultStep=function(t,s,f){var u=G(t,this.xPct);return(t===100||s&&t===this.xPct[u-1])&&(u=Math.max(u-1,1)),(this.xVal[u]-this.xVal[u-1])/f},r.prototype.getNearbySteps=function(t){var s=G(t,this.xPct);return{stepBefore:{startValue:this.xVal[s-2],step:this.xNumSteps[s-2],highestStep:this.xHighestCompleteStep[s-2]},thisStep:{startValue:this.xVal[s-1],step:this.xNumSteps[s-1],highestStep:this.xHighestCompleteStep[s-1]},stepAfter:{startValue:this.xVal[s],step:this.xNumSteps[s],highestStep:this.xHighestCompleteStep[s]}}},r.prototype.countStepDecimals=function(){var t=this.xNumSteps.map(Pe);return Math.max.apply(null,t)},r.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]},r.prototype.convert=function(t){return this.getStep(this.toStepping(t))},r.prototype.handleEntryPoint=function(t,s){var f;if(t==="min"?f=0:t==="max"?f=100:f=parseFloat(t),!R(f)||!R(s[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");this.xPct.push(f),this.xVal.push(s[0]);var u=Number(s[1]);f?this.xSteps.push(isNaN(u)?!1:u):isNaN(u)||(this.xSteps[0]=u),this.xHighestCompleteStep.push(0)},r.prototype.handleStepPoint=function(t,s){if(s){if(this.xVal[t]===this.xVal[t+1]){this.xSteps[t]=this.xHighestCompleteStep[t]=this.xVal[t];return}this.xSteps[t]=xt([this.xVal[t],this.xVal[t+1]],s,0)/bt(this.xPct[t],this.xPct[t+1]);var f=(this.xVal[t+1]-this.xVal[t])/this.xNumSteps[t],u=Math.ceil(Number(f.toFixed(3))-1),d=this.xVal[t]+this.xNumSteps[t]*u;this.xHighestCompleteStep[t]=d}},r})(),Nt={to:function(r){return r===void 0?"":r.toFixed(2)},from:Number},It={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"},K={tooltips:".__tooltips",aria:".__aria"};function He(r,t){if(!R(t))throw new Error("noUiSlider: 'step' is not numeric.");r.singleStep=t}function ze(r,t){if(!R(t))throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");r.keyboardPageMultiplier=t}function Fe(r,t){if(!R(t))throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");r.keyboardMultiplier=t}function Re(r,t){if(!R(t))throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");r.keyboardDefaultStep=t}function je(r,t){if(typeof t!="object"||Array.isArray(t))throw new Error("noUiSlider: 'range' is not an object.");if(t.min===void 0||t.max===void 0)throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");r.spectrum=new Kt(t,r.snap||!1,r.singleStep)}function Ne(r,t){if(t=it(t),!Array.isArray(t)||!t.length)throw new Error("noUiSlider: 'start' option is incorrect.");r.handles=t.length,r.start=t}function Be(r,t){if(typeof t!="boolean")throw new Error("noUiSlider: 'snap' option must be a boolean.");r.snap=t}function Ke(r,t){if(typeof t!="boolean")throw new Error("noUiSlider: 'animate' option must be a boolean.");r.animate=t}function Ie(r,t){if(typeof t!="number")throw new Error("noUiSlider: 'animationDuration' option must be a number.");r.animationDuration=t}function qt(r,t){var s=[!1],f;if(t==="lower"?t=[!0,!1]:t==="upper"&&(t=[!1,!0]),t===!0||t===!1){for(f=1;f1)throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.")}}function Ye(r,t){switch(t){case"ltr":r.dir=0;break;case"rtl":r.dir=1;break;default:throw new Error("noUiSlider: 'direction' option was not recognized.")}}function We(r,t){if(typeof t!="string")throw new Error("noUiSlider: 'behaviour' must be a string containing options.");var s=t.indexOf("tap")>=0,f=t.indexOf("drag")>=0,u=t.indexOf("fixed")>=0,d=t.indexOf("snap")>=0,v=t.indexOf("hover")>=0,w=t.indexOf("unconstrained")>=0,C=t.indexOf("invert-connects")>=0,p=t.indexOf("drag-all")>=0,D=t.indexOf("smooth-steps")>=0;if(u){if(r.handles!==2)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");Tt(r,r.start[1]-r.start[0])}if(C&&r.handles!==2)throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles");if(w&&(r.margin||r.limit))throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");r.events={tap:s||d,drag:f,dragAll:p,smoothSteps:D,fixed:u,snap:d,hover:v,unconstrained:w,invertConnects:C}}function $e(r,t){if(t!==!1)if(t===!0||rt(t)){r.tooltips=[];for(var s=0;s= 2) required for mode 'count'.");for(var i=e.values-1,a=100/i,n=[];i--;)n[i]=i*a;return n.push(100),Et(n,e.stepped)}return e.mode===I.Positions?Et(e.values,e.stepped):e.mode===I.Values?e.stepped?e.values.map(function(o){return m.fromStepping(m.getStep(m.toStepping(o)))}):e.values:[]}function Et(e,i){return e.map(function(a){return m.fromStepping(i?m.getStep(a):a)})}function ie(e){function i(x,E){return Number((x+E).toFixed(7))}var a=re(e),n={},o=m.xVal[0],l=m.xVal[m.xVal.length-1],h=!1,c=!1,S=0;return a=Ce(a.slice().sort(function(x,E){return x-E})),a[0]!==o&&(a.unshift(o),h=!0),a[a.length-1]!==l&&(a.push(l),c=!0),a.forEach(function(x,E){var A,g,V,_=x,k=a[E+1],U,dt,pt,mt,Lt,gt,Ot,Ht=e.mode===I.Steps;for(Ht&&(A=m.xNumSteps[E]),A||(A=k-_),k===void 0&&(k=_),A=Math.max(A,1e-7),g=_;g<=k;g=i(g,A)){for(U=m.toStepping(g),dt=U-S,Lt=dt/(e.density||1),gt=Math.round(Lt),Ot=dt/gt,V=1;V<=gt;V+=1)pt=S+V*Ot,n[pt.toFixed(5)]=[m.fromStepping(pt),0];mt=a.indexOf(g)>-1?O.LargeValue:Ht?O.SmallValue:O.NoValue,!E&&h&&g!==k&&(mt=0),g===k&&c||(n[U.toFixed(5)]=[g,mt]),S=U}}),n}function ae(e,i,a){var n,o,l=B.createElement("div"),h=(n={},n[O.None]="",n[O.NoValue]=t.cssClasses.valueNormal,n[O.LargeValue]=t.cssClasses.valueLarge,n[O.SmallValue]=t.cssClasses.valueSub,n),c=(o={},o[O.None]="",o[O.NoValue]=t.cssClasses.markerNormal,o[O.LargeValue]=t.cssClasses.markerLarge,o[O.SmallValue]=t.cssClasses.markerSub,o),S=[t.cssClasses.valueHorizontal,t.cssClasses.valueVertical],x=[t.cssClasses.markerHorizontal,t.cssClasses.markerVertical];L(l,t.cssClasses.pips),L(l,t.ort===0?t.cssClasses.pipsHorizontal:t.cssClasses.pipsVertical);function E(g,V){var _=V===t.cssClasses.value,k=_?S:x,U=_?h:c;return V+" "+k[t.ort]+" "+U[g]}function A(g,V,_){if(_=i?i(V,_):_,_!==O.None){var k=N(l,!1);k.className=E(_,t.cssClasses.marker),k.style[t.style]=g+"%",_>O.NoValue&&(k=N(l,!1),k.className=E(_,t.cssClasses.value),k.setAttribute("data-value",String(V)),k.style[t.style]=g+"%",k.innerHTML=String(a.to(V)))}}return Object.keys(e).forEach(function(g){A(g,e[g][0],e[g][1])}),l}function ot(){y&&(zt(y),y=null)}function lt(e){ot();var i=ie(e),a=e.filter,n=e.format||{to:function(o){return String(Math.round(o))}};return y=v.appendChild(ae(i,a,n)),y}function At(){var e=w.getBoundingClientRect(),i="offset"+["Width","Height"][t.ort];return t.ort===0?e.width||w[i]:e.height||w[i]}function T(e,i,a,n){var o=function(h){var c=ne(h,n.pageOffset,n.target||i);if(!c||wt()&&!n.doNotReject||Ve(v,t.cssClasses.tap)&&!n.doNotReject||e===f.start&&c.buttons!==void 0&&c.buttons>1||n.hover&&c.buttons)return!1;d||c.preventDefault(),c.calcPoint=c.points[t.ort],a(c,n)},l=[];return e.split(" ").forEach(function(h){i.addEventListener(h,o,d?{passive:!0}:!1),l.push([h,o])}),l}function ne(e,i,a){var n=e.type.indexOf("touch")===0,o=e.type.indexOf("mouse")===0,l=e.type.indexOf("pointer")===0,h=0,c=0;if(e.type.indexOf("MSPointer")===0&&(l=!0),e.type==="mousedown"&&!e.buttons&&!e.touches)return!1;if(n){var S=function(A){var g=A.target;return g===a||a.contains(g)||e.composed&&e.composedPath().shift()===a};if(e.type==="touchstart"){var x=Array.prototype.filter.call(e.touches,S);if(x.length>1)return!1;h=x[0].pageX,c=x[0].pageY}else{var E=Array.prototype.find.call(e.changedTouches,S);if(!E)return!1;h=E.pageX,c=E.pageY}}return i=i||Bt(B),(o||l)&&(h=e.clientX+i.x,c=e.clientY+i.y),e.pageOffset=i,e.points=[h,c],e.cursor=o||l,e}function Pt(e){var i=e-Ae(w,t.ort),a=i*100/At();return a=jt(a),t.dir?100-a:a}function se(e){var i=100,a=!1;return p.forEach(function(n,o){if(!nt(o)){var l=b[o],h=Math.abs(l-e),c=h===100&&i===100,S=hl;(S||x||c)&&(a=o,i=h)}}),a}function oe(e,i){e.type==="mouseout"&&e.target.nodeName==="HTML"&&e.relatedTarget===null&&ft(e,i)}function le(e,i){if(navigator.appVersion.indexOf("MSIE 9")===-1&&e.buttons===0&&i.buttonsProperty!==0)return ft(e,i);var a=(t.dir?-1:1)*(e.calcPoint-i.startCalcPoint),n=a*100/i.baseSize;Dt(a>0,n,i.locations,i.handleNumbers,i.connect)}function ft(e,i){i.handle&&(et(i.handle,t.cssClasses.active),Y-=1),i.listeners.forEach(function(a){H.removeEventListener(a[0],a[1])}),Y===0&&(et(v,t.cssClasses.drag),vt(),e.cursor&&(J.style.cursor="",J.removeEventListener("selectstart",Ft))),t.events.smoothSteps&&(i.handleNumbers.forEach(function(a){X(a,b[a],!0,!0,!1,!1)}),i.handleNumbers.forEach(function(a){P("update",a)})),i.handleNumbers.forEach(function(a){P("change",a),P("set",a),P("end",a)})}function ut(e,i){if(!i.handleNumbers.some(nt)){var a;if(i.handleNumbers.length===1){var n=p[i.handleNumbers[0]];a=n.children[0],Y+=1,L(a,t.cssClasses.active)}e.stopPropagation();var o=[],l=T(f.move,H,le,{target:e.target,handle:a,connect:i.connect,listeners:o,startCalcPoint:e.calcPoint,baseSize:At(),pageOffset:e.pageOffset,handleNumbers:i.handleNumbers,buttonsProperty:e.buttons,locations:b.slice()}),h=T(f.end,H,ft,{target:e.target,handle:a,listeners:o,doNotReject:!0,handleNumbers:i.handleNumbers}),c=T("mouseout",H,oe,{target:e.target,handle:a,listeners:o,doNotReject:!0,handleNumbers:i.handleNumbers});o.push.apply(o,l.concat(h,c)),e.cursor&&(J.style.cursor=getComputedStyle(e.target).cursor,p.length>1&&L(v,t.cssClasses.drag),J.addEventListener("selectstart",Ft,!1)),i.handleNumbers.forEach(function(S){P("start",S)})}}function fe(e){e.stopPropagation();var i=Pt(e.calcPoint),a=se(i);a!==!1&&(t.events.snap||Rt(v,t.cssClasses.tap,t.animationDuration),X(a,i,!0,!0),vt(),P("slide",a,!0),P("update",a,!0),t.events.snap?ut(e,{handleNumbers:[a]}):(P("change",a,!0),P("set",a,!0)))}function ue(e){var i=Pt(e.calcPoint),a=m.getStep(i),n=m.fromStepping(a);Object.keys(F).forEach(function(o){o.split(".")[0]==="hover"&&F[o].forEach(function(l){l.call(tt,n)})})}function ce(e,i){if(wt()||nt(i))return!1;var a=["Left","Right"],n=["Down","Up"],o=["PageDown","PageUp"],l=["Home","End"];t.dir&&!t.ort?a.reverse():t.ort&&!t.dir&&(n.reverse(),o.reverse());var h=e.key.replace("Arrow",""),c=h===o[0],S=h===o[1],x=h===n[0]||h===a[0]||c,E=h===n[1]||h===a[1]||S,A=h===l[0],g=h===l[1];if(!x&&!E&&!A&&!g)return!0;e.preventDefault();var V;if(E||x){var _=x?0:1,k=Mt(i),U=k[_];if(U===null)return!1;U===!1&&(U=m.getDefaultStep(b[i],x,t.keyboardDefaultStep)),S||c?U*=t.keyboardPageMultiplier:U*=t.keyboardMultiplier,U=Math.max(U,1e-7),U=(x?-1:1)*U,V=z[i]+U}else g?V=t.spectrum.xVal[t.spectrum.xVal.length-1]:V=t.spectrum.xVal[0];return X(i,m.toStepping(V),!0,!0),P("slide",i),P("update",i),P("change",i),P("set",i),!1}function Vt(e){e.fixed||p.forEach(function(i,a){T(f.start,i.children[0],ut,{handleNumbers:[a]})}),e.tap&&T(f.start,w,fe,{}),e.hover&&T(f.move,w,ue,{hover:!0}),e.drag&&D.forEach(function(i,a){if(!(i===!1||a===0||a===D.length-1)){var n=p[a-1],o=p[a],l=[i],h=[n,o],c=[a-1,a];L(i,t.cssClasses.draggable),e.fixed&&(l.push(n.children[0]),l.push(o.children[0])),e.dragAll&&(h=p,c=M),l.forEach(function(S){T(f.start,S,ut,{handles:h,handleNumbers:c,connect:i})})}})}function ct(e,i){F[e]=F[e]||[],F[e].push(i),e.split(".")[0]==="update"&&p.forEach(function(a,n){P("update",n)})}function he(e){return e===K.aria||e===K.tooltips}function W(e){var i=e&&e.split(".")[0],a=i?e.substring(i.length):e;Object.keys(F).forEach(function(n){var o=n.split(".")[0],l=n.substring(o.length);(!i||i===o)&&(!a||a===l)&&(!he(l)||a===l)&&delete F[n]})}function P(e,i,a){Object.keys(F).forEach(function(n){var o=n.split(".")[0];e===o&&F[n].forEach(function(l){l.call(tt,z.map(t.format.to),i,z.slice(),a||!1,b.slice(),tt)})})}function Z(e,i,a,n,o,l,h){var c;return p.length>1&&!t.events.unconstrained&&(n&&i>0&&(c=m.getAbsoluteDistance(e[i-1],t.margin,!1),a=Math.max(a,c)),o&&i1&&t.limit&&(n&&i>0&&(c=m.getAbsoluteDistance(e[i-1],t.limit,!1),a=Math.min(a,c)),o&&i1?n.forEach(function(A,g){var V=Z(l,A,l[A]+i,S[g],x[g],!1,c);V===!1?i=0:(i=V-l[A],l[A]=V)}):S=x=[!0];var E=!1;n.forEach(function(A,g){E=X(A,a[A]+i,S[g],x[g],!1,c)||E}),E&&(n.forEach(function(A){P("update",A),P("slide",A)}),o!=null&&P("drag",h))}function yt(e,i){return t.dir?100-e-i:e}function ve(e,i){b[e]=i,z[e]=m.fromStepping(i);var a=yt(i,0)-Wt,n="translate("+ht(a+"%","0")+")";if(p[e].style[t.transformRule]=n,t.events.invertConnects&&b.length>1){var o=b.every(function(l,h,c){return h===0||l>=c[h-1]});if(q!==!o){xe();return}}$(e),$(e+1),q&&($(e-1),$(e+2))}function vt(){M.forEach(function(e){var i=b[e]>50?-1:1,a=3+(p.length+i*e);p[e].style.zIndex=String(a)})}function X(e,i,a,n,o,l){return o||(i=Z(b,e,i,a,n,!1,l)),i===!1?!1:(ve(e,i),!0)}function $(e){if(D[e]){var i=b.slice();q&&i.sort(function(c,S){return c-S});var a=0,n=100;e!==0&&(a=i[e-1]),e!==D.length-1&&(n=i[e]);var o=n-a,l="translate("+ht(yt(a,o)+"%","0")+")",h="scale("+ht(o/100,"1")+")";D[e].style[t.transformRule]=l+" "+h}}function kt(e,i){return e===null||e===!1||e===void 0||(typeof e=="number"&&(e=String(e)),e=t.format.from(e),e!==!1&&(e=m.toStepping(e)),e===!1||isNaN(e))?b[i]:e}function Q(e,i,a){var n=it(e),o=b[0]===void 0;i=i===void 0?!0:i,t.animate&&!o&&Rt(v,t.cssClasses.tap,t.animationDuration),M.forEach(function(c){X(c,kt(n[c],c),!0,!1,a)});var l=M.length===1?0:1;if(o&&m.hasNoSize()&&(a=!0,b[0]=0,M.length>1)){var h=100/(M.length-1);M.forEach(function(c){b[c]=c*h})}for(;l=0&&ea.stepAfter.startValue&&(o=a.stepAfter.startValue-n),n>a.thisStep.startValue?l=a.thisStep.step:a.stepBefore.step===!1?l=!1:l=n-a.stepBefore.highestStep,i===100?o=null:i===0&&(l=null);var h=m.countStepDecimals();return o!==null&&o!==!1&&(o=Number(o.toFixed(h))),l!==null&&l!==!1&&(l=Number(l.toFixed(h))),[l,o]}function ge(){return M.map(Mt)}function Se(e,i){var a=Ut(),n=["margin","limit","padding","range","animate","snap","step","format","pips","tooltips","connect"];n.forEach(function(l){e[l]!==void 0&&(s[l]=e[l])});var o=Xt(s);n.forEach(function(l){e[l]!==void 0&&(t[l]=o[l])}),m=o.spectrum,t.margin=o.margin,t.limit=o.limit,t.padding=o.padding,t.pips?lt(t.pips):ot(),t.tooltips?Ct():st(),b=[],Q(St(e.start)?e.start:a,i),e.connect&&_t()}function _t(){for(;C.firstChild;)C.removeChild(C.firstChild);for(var e=0;e<=t.handles;e++)D[e]=at(C,t.connect[e]),$(e);Vt({drag:t.events.drag,fixed:!0})}function xe(){q=!q,qt(t,t.connect.map(function(e){return!e})),_t()}function be(){w=Jt(v),Gt(t.connect,w),Vt(t.events),Q(t.start),t.pips&<(t.pips),t.tooltips&&Ct(),ee()}be();var tt={destroy:me,steps:ge,on:ct,off:W,get:Ut,set:Q,setHandle:pe,reset:de,disable:Qt,enable:te,__moveHandles:function(e,i,a){Dt(e,i,b,a)},options:s,updateOptions:Se,target:v,removePips:ot,removeTooltips:st,getPositions:function(){return b.slice()},getTooltips:function(){return j},getOrigins:function(){return p},pips:lt};return tt}function ar(r,t){if(!r||!r.nodeName)throw new Error("noUiSlider: create requires a single element, got: "+r);if(r.noUiSlider)throw new Error("noUiSlider: Slider was already initialized.");var s=Xt(t),f=ir(r,s,t);return r.noUiSlider=f,f}var Yt={__spectrum:Kt,cssClasses:It,create:ar};function nr({arePipsStepped:r,behavior:t,decimalPlaces:s,fillTrack:f,isDisabled:u,isRtl:d,isVertical:v,maxDifference:w,minDifference:C,maxValue:p,minValue:D,nonLinearPoints:y,pipsDensity:j,pipsFilter:m,pipsFormatter:z,pipsMode:b,pipsValues:M,rangePadding:Y,state:F,step:q,tooltips:B}){return{state:F,slider:null,init(){this.slider=Yt.create(this.$el,{behaviour:t,direction:d?"rtl":"ltr",connect:f,format:{from:H=>+H,to:H=>s!==null?+H.toFixed(s):H},limit:w,margin:C,orientation:v?"vertical":"horizontal",padding:Y,pips:b?{density:j??10,filter:m,format:z,mode:b,stepped:r,values:M}:null,range:{min:D,...y??{},max:p},start:Alpine.raw(this.state),step:q,tooltips:B}),u&&this.slider.disable(),this.slider.on("change",H=>{this.state=H.length>1?H:H[0]}),this.$watch("state",()=>{this.slider.set(Alpine.raw(this.state))})},destroy(){this.slider.destroy(),this.slider=null}}}export{nr as default}; ================================================ FILE: public/js/filament/forms/components/tags-input.js ================================================ function s({state:n,splitKeys:a}){return{newTag:"",state:n,createTag(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag(t){this.state=this.state.filter(e=>e!==t)},reorderTags(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{"x-on:blur":"createTag()","x-model":"newTag","x-on:keydown"(t){["Enter",...a].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},"x-on:paste"(){this.$nextTick(()=>{if(a.length===0){this.createTag();return}let t=a.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{s as default}; ================================================ FILE: public/js/filament/forms/components/textarea.js ================================================ function n({initialHeight:e,shouldAutosize:i,state:h}){return{state:h,wrapperEl:null,init(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=e+"rem")},resize(){if(this.$el.scrollHeight<=0)return;let t=this.$el.style.height;this.$el.style.height="0px";let r=this.$el.scrollHeight;this.$el.style.height=t;let l=parseFloat(e)*parseFloat(getComputedStyle(document.documentElement).fontSize),s=Math.max(r,l)+"px";this.wrapperEl.style.height!==s&&(this.wrapperEl.style.height=s)},setUpResizeObserver(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{n as default}; ================================================ FILE: public/js/filament/notifications/notifications.js ================================================ (()=>{function c(s,t=()=>{}){let i=!1;return function(){i?t.apply(this,arguments):(i=!0,s.apply(this,arguments))}}var d=s=>{s.data("notificationComponent",({notification:t})=>({isShown:!1,computedStyle:null,transitionDuration:null,transitionEasing:null,unsubscribeLivewireHook:null,init(){this.computedStyle=window.getComputedStyle(this.$el),this.transitionDuration=parseFloat(this.computedStyle.transitionDuration)*1e3,this.transitionEasing=this.computedStyle.transitionTimingFunction,this.configureTransitions(),this.configureAnimations(),t.duration&&t.duration!=="persistent"&&setTimeout(()=>{if(!this.$el.matches(":hover")){this.close();return}this.$el.addEventListener("mouseleave",()=>this.close())},t.duration),this.isShown=!0},configureTransitions(){let i=this.computedStyle.display,e=()=>{s.mutateDom(()=>{this.$el.style.setProperty("display",i),this.$el.style.setProperty("visibility","visible")}),this.$el._x_isShown=!0},o=()=>{s.mutateDom(()=>{this.$el._x_isShown?this.$el.style.setProperty("visibility","hidden"):this.$el.style.setProperty("display","none")})},r=c(n=>n?e():o(),n=>{this.$el._x_toggleAndCascadeWithTransitions(this.$el,n,e,o)});s.effect(()=>r(this.isShown))},configureAnimations(){let i;this.unsubscribeLivewireHook=Livewire.interceptMessage(({onFinish:e,onSuccess:o})=>{requestAnimationFrame(()=>{let r=()=>this.$el.getBoundingClientRect().top,n=r();e(()=>{i=()=>{this.isShown&&this.$el.animate([{transform:`translateY(${n-r()}px)`},{transform:"translateY(0px)"}],{duration:this.transitionDuration,easing:this.transitionEasing})},this.$el.getAnimations().forEach(l=>l.finish())}),o(({payload:l})=>{l?.snapshot?.data?.isFilamentNotificationsComponent&&typeof i=="function"&&i()})})})},close(){this.isShown=!1,setTimeout(()=>window.dispatchEvent(new CustomEvent("notificationClosed",{detail:{id:t.id}})),this.transitionDuration)},markAsRead(){window.dispatchEvent(new CustomEvent("markedNotificationAsRead",{detail:{id:t.id}}))},markAsUnread(){window.dispatchEvent(new CustomEvent("markedNotificationAsUnread",{detail:{id:t.id}}))},destroy(){this.unsubscribeLivewireHook?.()}}))};var h=class{constructor(){return this.id(crypto.randomUUID?.()??"10000000-1000-4000-8000-100000000000".replace(/[018]/g,t=>(+t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>+t/4).toString(16))),this}id(t){return this.id=t,this}title(t){return this.title=t,this}body(t){return this.body=t,this}actions(t){return this.actions=t,this}status(t){return this.status=t,this}color(t){return this.color=t,this}icon(t){return this.icon=t,this}iconColor(t){return this.iconColor=t,this}duration(t){return this.duration=t,this}seconds(t){return this.duration(t*1e3),this}persistent(){return this.duration("persistent"),this}danger(){return this.status("danger"),this}info(){return this.status("info"),this}success(){return this.status("success"),this}warning(){return this.status("warning"),this}view(t){return this.view=t,this}viewData(t){return this.viewData=t,this}send(){return window.dispatchEvent(new CustomEvent("notificationSent",{detail:{notification:this}})),this}},a=class{constructor(t){return this.name(t),this}name(t){return this.name=t,this}color(t){return this.color=t,this}dispatch(t,i){return this.event(t),this.eventData(i),this}dispatchSelf(t,i){return this.dispatch(t,i),this.dispatchDirection="self",this}dispatchTo(t,i,e){return this.dispatch(i,e),this.dispatchDirection="to",this.dispatchToComponent=t,this}emit(t,i){return this.dispatch(t,i),this}emitSelf(t,i){return this.dispatchSelf(t,i),this}emitTo(t,i,e){return this.dispatchTo(t,i,e),this}dispatchDirection(t){return this.dispatchDirection=t,this}dispatchToComponent(t){return this.dispatchToComponent=t,this}event(t){return this.event=t,this}eventData(t){return this.eventData=t,this}extraAttributes(t){return this.extraAttributes=t,this}icon(t){return this.icon=t,this}iconPosition(t){return this.iconPosition=t,this}outlined(t=!0){return this.isOutlined=t,this}disabled(t=!0){return this.isDisabled=t,this}label(t){return this.label=t,this}close(t=!0){return this.shouldClose=t,this}openUrlInNewTab(t=!0){return this.shouldOpenUrlInNewTab=t,this}size(t){return this.size=t,this}url(t){return this.url=t,this}view(t){return this.view=t,this}button(){return this.view("filament::components.button.index"),this}grouped(){return this.view("filament::components.dropdown.list.item"),this}iconButton(){return this.view("filament::components.icon-button"),this}link(){return this.view("filament::components.link"),this}},u=class{constructor(t){return this.actions(t),this}actions(t){return this.actions=t.map(i=>i.grouped()),this}color(t){return this.color=t,this}icon(t){return this.icon=t,this}iconPosition(t){return this.iconPosition=t,this}label(t){return this.label=t,this}tooltip(t){return this.tooltip=t,this}};window.FilamentNotificationAction=a;window.FilamentNotificationActionGroup=u;window.FilamentNotification=h;document.addEventListener("alpine:init",()=>{window.Alpine.plugin(d)});})(); ================================================ FILE: public/js/filament/schemas/components/actions.js ================================================ var i=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let e=this.$el.parentElement;e&&(this.updateWidth(),this.resizeObserver=new ResizeObserver(()=>this.updateWidth()),this.resizeObserver.observe(e),this.boundUpdateWidth=this.updateWidth.bind(this),window.addEventListener("resize",this.boundUpdateWidth))},enableSticky(){this.isSticky=this.$el.getBoundingClientRect().top>0},disableSticky(){this.isSticky=!1},updateWidth(){let e=this.$el.parentElement;if(!e)return;let t=getComputedStyle(this.$root.querySelector(".fi-ac"));this.width=e.offsetWidth+parseInt(t.marginInlineStart,10)*-1+parseInt(t.marginInlineEnd,10)*-1},destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.boundUpdateWidth&&(window.removeEventListener("resize",this.boundUpdateWidth),this.boundUpdateWidth=null)}});export{i as default}; ================================================ FILE: public/js/filament/schemas/components/tabs.js ================================================ function v({activeTab:w,isScrollable:f,isTabPersistedInQueryString:m,livewireId:g,tab:T,tabQueryStringKey:r}){return{boundResizeHandler:null,isScrollable:f,resizeDebounceTimer:null,tab:T,unsubscribeLivewireHook:null,withinDropdownIndex:null,withinDropdownMounted:!1,init(){let t=this.getTabs(),e=new URLSearchParams(window.location.search);m&&e.has(r)&&t.includes(e.get(r))&&(this.tab=e.get(r)),(!this.tab||!t.includes(this.tab))&&(this.tab=t[w-1]),this.$watch("tab",()=>{this.updateQueryString(),this.autofocusFields()}),this.autofocusFields(!0),this.unsubscribeLivewireHook=Livewire.interceptMessage(({message:i,onSuccess:a})=>{a(()=>{this.$nextTick(()=>{if(i.component.id!==g)return;let l=this.getTabs();l.includes(this.tab)||(this.tab=l[w-1]??this.tab)})})}),f||(this.boundResizeHandler=this.debouncedUpdateTabsWithinDropdown.bind(this),window.addEventListener("resize",this.boundResizeHandler),this.updateTabsWithinDropdown())},calculateAvailableWidth(t){let e=window.getComputedStyle(t);return Math.floor(t.clientWidth)-Math.ceil(parseFloat(e.paddingLeft))*2},calculateContainerGap(t){let e=window.getComputedStyle(t);return Math.ceil(parseFloat(e.columnGap))},calculateDropdownIconWidth(t){let e=t.querySelector(".fi-icon");return Math.ceil(e.clientWidth)},calculateTabItemGap(t){let e=window.getComputedStyle(t);return Math.ceil(parseFloat(e.columnGap)||8)},calculateTabItemPadding(t){let e=window.getComputedStyle(t);return Math.ceil(parseFloat(e.paddingLeft))+Math.ceil(parseFloat(e.paddingRight))},findOverflowIndex(t,e,i,a,l,h){let u=t.map(n=>Math.ceil(n.clientWidth)),b=t.map(n=>{let c=n.querySelector(".fi-tabs-item-label"),s=n.querySelector(".fi-badge"),o=Math.ceil(c.clientWidth),d=s?Math.ceil(s.clientWidth):0;return{label:o,badge:d,total:o+(d>0?a+d:0)}});for(let n=0;np+y,0),s=n*i,o=b.slice(n+1),d=o.length>0,D=d?Math.max(...o.map(p=>p.total)):0,W=d?l+D+a+h+i:0;if(c+s+W>e)return n}return-1},get isDropdownButtonVisible(){return this.withinDropdownMounted?this.withinDropdownIndex===null?!1:this.getTabs().findIndex(e=>e===this.tab){if(t&&document.activeElement&&document.activeElement!==document.body&&this.$el.compareDocumentPosition(document.activeElement)&Node.DOCUMENT_POSITION_PRECEDING)return;let e=this.$el.querySelectorAll(".fi-sc-tabs-tab.fi-active [autofocus]");for(let i of e)if(i.focus(),document.activeElement===i)break})},debouncedUpdateTabsWithinDropdown(){clearTimeout(this.resizeDebounceTimer),this.resizeDebounceTimer=setTimeout(()=>this.updateTabsWithinDropdown(),150)},async updateTabsWithinDropdown(){this.withinDropdownIndex=null,this.withinDropdownMounted=!1,await this.$nextTick();let t=this.$el.querySelector(".fi-tabs"),e=t.querySelector(".fi-tabs-item:last-child"),i=Array.from(t.children).slice(0,-1),a=i.map(s=>s.style.display);i.forEach(s=>s.style.display=""),t.offsetHeight;let l=this.calculateAvailableWidth(t),h=this.calculateContainerGap(t),u=this.calculateDropdownIconWidth(e),b=this.calculateTabItemGap(i[0]),n=this.calculateTabItemPadding(i[0]),c=this.findOverflowIndex(i,l,h,b,n,u);i.forEach((s,o)=>s.style.display=a[o]),c!==-1&&(this.withinDropdownIndex=c),this.withinDropdownMounted=!0},destroy(){this.unsubscribeLivewireHook?.(),this.boundResizeHandler&&window.removeEventListener("resize",this.boundResizeHandler),clearTimeout(this.resizeDebounceTimer)}}}export{v as default}; ================================================ FILE: public/js/filament/schemas/components/wizard.js ================================================ function p({isSkippable:i,isStepPersistedInQueryString:n,key:r,startStep:o,stepQueryStringKey:h}){return{step:null,init(){this.step=this.getSteps().at(o-1),this.$watch("step",()=>{this.updateQueryString(),this.autofocusFields()}),this.autofocusFields(!0)},async requestNextStep(){await this.$wire.callSchemaComponentMethod(r,"nextStep",{currentStepIndex:this.getStepIndex(this.step)})},goToNextStep(){let t=this.getStepIndex(this.step)+1;t>=this.getSteps().length||(this.step=this.getSteps()[t],this.scroll())},goToPreviousStep(){let t=this.getStepIndex(this.step)-1;t<0||(this.step=this.getSteps()[t],this.scroll())},goToStep(t){let e=this.getStepIndex(t);e<=-1||!i&&e>this.getStepIndex(this.step)||(this.step=t,this.scroll())},scroll(){this.$nextTick(()=>{this.$refs.header?.children[this.getStepIndex(this.step)].scrollIntoView({behavior:"smooth",block:"start"})})},autofocusFields(t=!1){this.$nextTick(()=>{if(t&&document.activeElement&&document.activeElement!==document.body&&this.$el.compareDocumentPosition(document.activeElement)&Node.DOCUMENT_POSITION_PRECEDING)return;let e=this.$refs[`step-${this.step}`]?.querySelectorAll("[autofocus]")??[];for(let s of e)if(s.focus(),document.activeElement===s)break})},getStepIndex(t){let e=this.getSteps().findIndex(s=>s===t);return e===-1?0:e},getSteps(){return JSON.parse(this.$refs.stepsData.value)},isFirstStep(){return this.getStepIndex(this.step)<=0},isLastStep(){return this.getStepIndex(this.step)+1>=this.getSteps().length},isStepAccessible(t){return i||this.getStepIndex(this.step)>this.getStepIndex(t)},updateQueryString(){if(!n)return;let t=new URL(window.location.href);t.searchParams.set(h,this.step),history.replaceState(null,document.title,t.toString())}}}export{p as default}; ================================================ FILE: public/js/filament/schemas/schemas.js ================================================ (()=>{var o=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let i=this.$el.parentElement;i&&(this.updateWidth(),this.resizeObserver=new ResizeObserver(()=>this.updateWidth()),this.resizeObserver.observe(i),this.boundUpdateWidth=this.updateWidth.bind(this),window.addEventListener("resize",this.boundUpdateWidth))},enableSticky(){this.isSticky=this.$el.getBoundingClientRect().top>0},disableSticky(){this.isSticky=!1},updateWidth(){let i=this.$el.parentElement;if(!i)return;let e=getComputedStyle(this.$root.querySelector(".fi-ac"));this.width=i.offsetWidth+parseInt(e.marginInlineStart,10)*-1+parseInt(e.marginInlineEnd,10)*-1},destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.boundUpdateWidth&&(window.removeEventListener("resize",this.boundUpdateWidth),this.boundUpdateWidth=null)}});var a=function(i,e,n){let t=i;if(e.startsWith("/")&&(n=!0,e=e.slice(1)),n)return e;for(;e.startsWith("../");)t=t.includes(".")?t.slice(0,t.lastIndexOf(".")):null,e=e.slice(3);return["",null,void 0].includes(t)?e:["",null,void 0].includes(e)?t:`${t}.${e}`},d=i=>{let e=Alpine.findClosest(i,n=>n.__livewire);if(!e)throw"Could not find Livewire component in DOM tree.";return e.__livewire};document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentSchema",({livewireId:i})=>({handleFormValidationError(e){e.detail.livewireId===i&&this.$nextTick(()=>{let n=this.$el.querySelector("[data-validation-error]");if(!n)return;let t=n;for(;t;)t.dispatchEvent(new CustomEvent("expand")),t=t.parentNode;setTimeout(()=>n.closest("[data-field-wrapper]").scrollIntoView({behavior:"smooth",block:"start",inline:"start"}),200)})},isStateChanged(e,n){if(e===void 0)return!1;try{return JSON.stringify(e)!==JSON.stringify(n)}catch{return e!==n}}})),window.Alpine.data("filamentSchemaComponent",({path:i,containerPath:e,$wire:n})=>({$statePath:i,$get:(t,r)=>n.$get(a(e,t,r)),$set:(t,r,s,l=!1)=>n.$set(a(e,t,s),r,l),get $state(){return n.$get(i)}})),window.Alpine.data("filamentActionsSchemaComponent",o),Livewire.interceptMessage(({message:i,onSuccess:e})=>{e(({payload:n})=>{n.effects?.dispatches?.forEach(t=>{if(!t.params?.awaitSchemaComponent)return;let r=Array.from(i.component.el.querySelectorAll(`[wire\\:partial="schema-component::${t.params.awaitSchemaComponent}"]`)).filter(s=>d(s)===i.component);if(r.length!==1){if(r.length>1)throw`Multiple schema components found with key [${t.params.awaitSchemaComponent}].`;window.addEventListener(`schema-component-${component.id}-${t.params.awaitSchemaComponent}-loaded`,()=>{window.dispatchEvent(new CustomEvent(t.name,{detail:t.params}))},{once:!0})}})})})});})(); ================================================ FILE: public/js/filament/support/async-alpine.js ================================================ (()=>{(()=>{var d=Object.defineProperty,m=t=>d(t,"__esModule",{value:!0}),f=(t,e)=>{m(t);for(var i in e)d(t,i,{get:e[i],enumerable:!0})},o={};f(o,{eager:()=>g,event:()=>w,idle:()=>y,media:()=>b,visible:()=>E});var c=()=>!0,g=c,v=({component:t,argument:e})=>new Promise(i=>{if(e)window.addEventListener(e,()=>i(),{once:!0});else{let n=a=>{a.detail.id===t.id&&(window.removeEventListener("async-alpine:load",n),i())};window.addEventListener("async-alpine:load",n)}}),w=v,x=()=>new Promise(t=>{"requestIdleCallback"in window?window.requestIdleCallback(t):setTimeout(t,200)}),y=x,A=({argument:t})=>new Promise(e=>{if(!t)return console.log("Async Alpine: media strategy requires a media query. Treating as 'eager'"),e();let i=window.matchMedia(`(${t})`);i.matches?e():i.addEventListener("change",e,{once:!0})}),b=A,$=({component:t,argument:e})=>new Promise(i=>{let n=e||"0px 0px 0px 0px",a=new IntersectionObserver(r=>{r[0].isIntersecting&&(a.disconnect(),i())},{rootMargin:n});a.observe(t.el)}),E=$;function P(t){let e=q(t),i=u(e);return i.type==="method"?{type:"expression",operator:"&&",parameters:[i]}:i}function q(t){let e=/\s*([()])\s*|\s*(\|\||&&|\|)\s*|\s*((?:[^()&|]+\([^()]+\))|[^()&|]+)\s*/g,i=[],n;for(;(n=e.exec(t))!==null;){let[,a,r,s]=n;if(a!==void 0)i.push({type:"parenthesis",value:a});else if(r!==void 0)i.push({type:"operator",value:r==="|"?"&&":r});else{let p={type:"method",method:s.trim()};s.includes("(")&&(p.method=s.substring(0,s.indexOf("(")).trim(),p.argument=s.substring(s.indexOf("(")+1,s.indexOf(")"))),s.method==="immediate"&&(s.method="eager"),i.push(p)}}return i}function u(t){let e=h(t);for(;t.length>0&&(t[0].value==="&&"||t[0].value==="|"||t[0].value==="||");){let i=t.shift().value,n=h(t);e.type==="expression"&&e.operator===i?e.parameters.push(n):e={type:"expression",operator:i,parameters:[e,n]}}return e}function h(t){if(t[0].value==="("){t.shift();let e=u(t);return t[0].value===")"&&t.shift(),e}else return t.shift()}var _="__internal_",l={Alpine:null,_options:{prefix:"ax-",alpinePrefix:"x-",root:"load",inline:"load-src",defaultStrategy:"eager"},_alias:!1,_data:{},_realIndex:0,get _index(){return this._realIndex++},init(t,e={}){return this.Alpine=t,this._options={...this._options,...e},this},start(){return this._processInline(),this._setupComponents(),this._mutations(),this},data(t,e=!1){return this._data[t]={loaded:!1,download:e},this},url(t,e){!t||!e||(this._data[t]||this.data(t),this._data[t].download=()=>import(this._parseUrl(e)))},alias(t){this._alias=t},_processInline(){let t=document.querySelectorAll(`[${this._options.prefix}${this._options.inline}]`);for(let e of t)this._inlineElement(e)},_inlineElement(t){let e=t.getAttribute(`${this._options.alpinePrefix}data`),i=t.getAttribute(`${this._options.prefix}${this._options.inline}`);if(!e||!i)return;let n=this._parseName(e);this.url(n,i)},_setupComponents(){let t=document.querySelectorAll(`[${this._options.prefix}${this._options.root}]`);for(let e of t)this._setupComponent(e)},_setupComponent(t){let e=t.getAttribute(`${this._options.alpinePrefix}data`);t.setAttribute(`${this._options.alpinePrefix}ignore`,"");let i=this._parseName(e),n=t.getAttribute(`${this._options.prefix}${this._options.root}`)||this._options.defaultStrategy;this._componentStrategy({name:i,strategy:n,el:t,id:t.id||this._index})},async _componentStrategy(t){let e=P(t.strategy);await this._generateRequirements(t,e),await this._download(t.name),this._activate(t)},_generateRequirements(t,e){if(e.type==="expression"){if(e.operator==="&&")return Promise.all(e.parameters.map(i=>this._generateRequirements(t,i)));if(e.operator==="||")return Promise.any(e.parameters.map(i=>this._generateRequirements(t,i)))}return o[e.method]?o[e.method]({component:t,argument:e.argument}):!1},async _download(t){if(t.startsWith(_)||(this._handleAlias(t),!this._data[t]||this._data[t].loaded))return;let e=await this._getModule(t);this.Alpine.data(t,e),this._data[t].loaded=!0},async _getModule(t){if(!this._data[t])return;let e=await this._data[t].download(t);return typeof e=="function"?e:e[t]||e.default||Object.values(e)[0]||!1},_activate(t){this.Alpine.destroyTree(t.el),t.el.removeAttribute(`${this._options.alpinePrefix}ignore`),t.el._x_ignore=!1,this.Alpine.initTree(t.el)},_mutations(){new MutationObserver(t=>{for(let e of t)if(e.addedNodes)for(let i of e.addedNodes)i.nodeType===1&&(i.hasAttribute(`${this._options.prefix}${this._options.root}`)&&this._mutationEl(i),i.querySelectorAll(`[${this._options.prefix}${this._options.root}]`).forEach(n=>this._mutationEl(n)))}).observe(document,{attributes:!0,childList:!0,subtree:!0})},_mutationEl(t){t.hasAttribute(`${this._options.prefix}${this._options.inline}`)&&this._inlineElement(t),this._setupComponent(t)},_handleAlias(t){if(!(!this._alias||this._data[t])){if(typeof this._alias=="function"){this.data(t,this._alias);return}this.url(t,this._alias.replaceAll("[name]",t))}},_parseName(t){return(t||"").split(/[({]/g)[0]||`${_}${this._index}`},_parseUrl(t){return new RegExp("^(?:[a-z+]+:)?//","i").test(t)?t:new URL(t,document.baseURI).href}};document.addEventListener("alpine:init",()=>{window.AsyncAlpine=l,l.init(Alpine,window.AsyncAlpineOptions||{}),document.dispatchEvent(new CustomEvent("async-alpine:init")),l.start()})})();})(); ================================================ FILE: public/js/filament/support/support.js ================================================ (()=>{var qo=Object.create;var Ti=Object.defineProperty;var Go=Object.getOwnPropertyDescriptor;var Ko=Object.getOwnPropertyNames;var Jo=Object.getPrototypeOf,Qo=Object.prototype.hasOwnProperty;var Kr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Zo=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ko(t))!Qo.call(e,i)&&i!==r&&Ti(e,i,{get:()=>t[i],enumerable:!(n=Go(t,i))||n.enumerable});return e};var ea=(e,t,r)=>(r=e!=null?qo(Jo(e)):{},Zo(t||!e||!e.__esModule?Ti(r,"default",{value:e,enumerable:!0}):r,e));var uo=Kr(()=>{});var po=Kr(()=>{});var ho=Kr((Hs,yr)=>{(function(){"use strict";var e="input is invalid type",t="finalize already called",r=typeof window=="object",n=r?window:{};n.JS_MD5_NO_WINDOW&&(r=!1);var i=!r&&typeof self=="object",o=!n.JS_MD5_NO_NODE_JS&&typeof process=="object"&&process.versions&&process.versions.node;o?n=global:i&&(n=self);var a=!n.JS_MD5_NO_COMMON_JS&&typeof yr=="object"&&yr.exports,c=typeof define=="function"&&define.amd,f=!n.JS_MD5_NO_ARRAY_BUFFER&&typeof ArrayBuffer<"u",u="0123456789abcdef".split(""),y=[128,32768,8388608,-2147483648],m=[0,8,16,24],O=["hex","array","digest","buffer","arrayBuffer","base64"],S="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),x=[],M;if(f){var I=new ArrayBuffer(68);M=new Uint8Array(I),x=new Uint32Array(I)}var $=Array.isArray;(n.JS_MD5_NO_NODE_JS||!$)&&($=function(l){return Object.prototype.toString.call(l)==="[object Array]"});var A=ArrayBuffer.isView;f&&(n.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW||!A)&&(A=function(l){return typeof l=="object"&&l.buffer&&l.buffer.constructor===ArrayBuffer});var N=function(l){var h=typeof l;if(h==="string")return[l,!0];if(h!=="object"||l===null)throw new Error(e);if(f&&l.constructor===ArrayBuffer)return[new Uint8Array(l),!1];if(!$(l)&&!A(l))throw new Error(e);return[l,!1]},Y=function(l){return function(h){return new X(!0).update(h)[l]()}},ne=function(){var l=Y("hex");o&&(l=J(l)),l.create=function(){return new X},l.update=function(p){return l.create().update(p)};for(var h=0;h>>6,ze[P++]=128|p&63):p<55296||p>=57344?(ze[P++]=224|p>>>12,ze[P++]=128|p>>>6&63,ze[P++]=128|p&63):(p=65536+((p&1023)<<10|l.charCodeAt(++j)&1023),ze[P++]=240|p>>>18,ze[P++]=128|p>>>12&63,ze[P++]=128|p>>>6&63,ze[P++]=128|p&63);else for(P=this.start;j>>2]|=p<>>2]|=(192|p>>>6)<>>2]|=(128|p&63)<=57344?(Z[P>>>2]|=(224|p>>>12)<>>2]|=(128|p>>>6&63)<>>2]|=(128|p&63)<>>2]|=(240|p>>>18)<>>2]|=(128|p>>>12&63)<>>2]|=(128|p>>>6&63)<>>2]|=(128|p&63)<>>2]|=l[j]<=64?(this.start=P-64,this.hash(),this.hashed=!0):this.start=P}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this},X.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var l=this.blocks,h=this.lastByteIndex;l[h>>>2]|=y[h&3],h>=56&&(this.hashed||this.hash(),l[0]=l[16],l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0),l[14]=this.bytes<<3,l[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},X.prototype.hash=function(){var l,h,v,p,j,P,R=this.blocks;this.first?(l=R[0]-680876937,l=(l<<7|l>>>25)-271733879<<0,p=(-1732584194^l&2004318071)+R[1]-117830708,p=(p<<12|p>>>20)+l<<0,v=(-271733879^p&(l^-271733879))+R[2]-1126478375,v=(v<<17|v>>>15)+p<<0,h=(l^v&(p^l))+R[3]-1316259209,h=(h<<22|h>>>10)+v<<0):(l=this.h0,h=this.h1,v=this.h2,p=this.h3,l+=(p^h&(v^p))+R[0]-680876936,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+R[1]-389564586,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+R[2]+606105819,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+R[3]-1044525330,h=(h<<22|h>>>10)+v<<0),l+=(p^h&(v^p))+R[4]-176418897,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+R[5]+1200080426,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+R[6]-1473231341,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+R[7]-45705983,h=(h<<22|h>>>10)+v<<0,l+=(p^h&(v^p))+R[8]+1770035416,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+R[9]-1958414417,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+R[10]-42063,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+R[11]-1990404162,h=(h<<22|h>>>10)+v<<0,l+=(p^h&(v^p))+R[12]+1804603682,l=(l<<7|l>>>25)+h<<0,p+=(v^l&(h^v))+R[13]-40341101,p=(p<<12|p>>>20)+l<<0,v+=(h^p&(l^h))+R[14]-1502002290,v=(v<<17|v>>>15)+p<<0,h+=(l^v&(p^l))+R[15]+1236535329,h=(h<<22|h>>>10)+v<<0,l+=(v^p&(h^v))+R[1]-165796510,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+R[6]-1069501632,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+R[11]+643717713,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+R[0]-373897302,h=(h<<20|h>>>12)+v<<0,l+=(v^p&(h^v))+R[5]-701558691,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+R[10]+38016083,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+R[15]-660478335,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+R[4]-405537848,h=(h<<20|h>>>12)+v<<0,l+=(v^p&(h^v))+R[9]+568446438,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+R[14]-1019803690,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+R[3]-187363961,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+R[8]+1163531501,h=(h<<20|h>>>12)+v<<0,l+=(v^p&(h^v))+R[13]-1444681467,l=(l<<5|l>>>27)+h<<0,p+=(h^v&(l^h))+R[2]-51403784,p=(p<<9|p>>>23)+l<<0,v+=(l^h&(p^l))+R[7]+1735328473,v=(v<<14|v>>>18)+p<<0,h+=(p^l&(v^p))+R[12]-1926607734,h=(h<<20|h>>>12)+v<<0,j=h^v,l+=(j^p)+R[5]-378558,l=(l<<4|l>>>28)+h<<0,p+=(j^l)+R[8]-2022574463,p=(p<<11|p>>>21)+l<<0,P=p^l,v+=(P^h)+R[11]+1839030562,v=(v<<16|v>>>16)+p<<0,h+=(P^v)+R[14]-35309556,h=(h<<23|h>>>9)+v<<0,j=h^v,l+=(j^p)+R[1]-1530992060,l=(l<<4|l>>>28)+h<<0,p+=(j^l)+R[4]+1272893353,p=(p<<11|p>>>21)+l<<0,P=p^l,v+=(P^h)+R[7]-155497632,v=(v<<16|v>>>16)+p<<0,h+=(P^v)+R[10]-1094730640,h=(h<<23|h>>>9)+v<<0,j=h^v,l+=(j^p)+R[13]+681279174,l=(l<<4|l>>>28)+h<<0,p+=(j^l)+R[0]-358537222,p=(p<<11|p>>>21)+l<<0,P=p^l,v+=(P^h)+R[3]-722521979,v=(v<<16|v>>>16)+p<<0,h+=(P^v)+R[6]+76029189,h=(h<<23|h>>>9)+v<<0,j=h^v,l+=(j^p)+R[9]-640364487,l=(l<<4|l>>>28)+h<<0,p+=(j^l)+R[12]-421815835,p=(p<<11|p>>>21)+l<<0,P=p^l,v+=(P^h)+R[15]+530742520,v=(v<<16|v>>>16)+p<<0,h+=(P^v)+R[2]-995338651,h=(h<<23|h>>>9)+v<<0,l+=(v^(h|~p))+R[0]-198630844,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+R[7]+1126891415,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+R[14]-1416354905,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+R[5]-57434055,h=(h<<21|h>>>11)+v<<0,l+=(v^(h|~p))+R[12]+1700485571,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+R[3]-1894986606,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+R[10]-1051523,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+R[1]-2054922799,h=(h<<21|h>>>11)+v<<0,l+=(v^(h|~p))+R[8]+1873313359,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+R[15]-30611744,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+R[6]-1560198380,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+R[13]+1309151649,h=(h<<21|h>>>11)+v<<0,l+=(v^(h|~p))+R[4]-145523070,l=(l<<6|l>>>26)+h<<0,p+=(h^(l|~v))+R[11]-1120210379,p=(p<<10|p>>>22)+l<<0,v+=(l^(p|~h))+R[2]+718787259,v=(v<<15|v>>>17)+p<<0,h+=(p^(v|~l))+R[9]-343485551,h=(h<<21|h>>>11)+v<<0,this.first?(this.h0=l+1732584193<<0,this.h1=h-271733879<<0,this.h2=v-1732584194<<0,this.h3=p+271733878<<0,this.first=!1):(this.h0=this.h0+l<<0,this.h1=this.h1+h<<0,this.h2=this.h2+v<<0,this.h3=this.h3+p<<0)},X.prototype.hex=function(){this.finalize();var l=this.h0,h=this.h1,v=this.h2,p=this.h3;return u[l>>>4&15]+u[l&15]+u[l>>>12&15]+u[l>>>8&15]+u[l>>>20&15]+u[l>>>16&15]+u[l>>>28&15]+u[l>>>24&15]+u[h>>>4&15]+u[h&15]+u[h>>>12&15]+u[h>>>8&15]+u[h>>>20&15]+u[h>>>16&15]+u[h>>>28&15]+u[h>>>24&15]+u[v>>>4&15]+u[v&15]+u[v>>>12&15]+u[v>>>8&15]+u[v>>>20&15]+u[v>>>16&15]+u[v>>>28&15]+u[v>>>24&15]+u[p>>>4&15]+u[p&15]+u[p>>>12&15]+u[p>>>8&15]+u[p>>>20&15]+u[p>>>16&15]+u[p>>>28&15]+u[p>>>24&15]},X.prototype.toString=X.prototype.hex,X.prototype.digest=function(){this.finalize();var l=this.h0,h=this.h1,v=this.h2,p=this.h3;return[l&255,l>>>8&255,l>>>16&255,l>>>24&255,h&255,h>>>8&255,h>>>16&255,h>>>24&255,v&255,v>>>8&255,v>>>16&255,v>>>24&255,p&255,p>>>8&255,p>>>16&255,p>>>24&255]},X.prototype.array=X.prototype.digest,X.prototype.arrayBuffer=function(){this.finalize();var l=new ArrayBuffer(16),h=new Uint32Array(l);return h[0]=this.h0,h[1]=this.h1,h[2]=this.h2,h[3]=this.h3,l},X.prototype.buffer=X.prototype.arrayBuffer,X.prototype.base64=function(){for(var l,h,v,p="",j=this.array(),P=0;P<15;)l=j[P++],h=j[P++],v=j[P++],p+=S[l>>>2]+S[(l<<4|h>>>4)&63]+S[(h<<2|v>>>6)&63]+S[v&63];return l=j[P],p+=S[l>>>2]+S[l<<4&63]+"==",p};function Q(l,h){var v,p=N(l);if(l=p[0],p[1]){var j=[],P=l.length,R=0,Z;for(v=0;v>>6,j[R++]=128|Z&63):Z<55296||Z>=57344?(j[R++]=224|Z>>>12,j[R++]=128|Z>>>6&63,j[R++]=128|Z&63):(Z=65536+((Z&1023)<<10|l.charCodeAt(++v)&1023),j[R++]=240|Z>>>18,j[R++]=128|Z>>>12&63,j[R++]=128|Z>>>6&63,j[R++]=128|Z&63);l=j}l.length>64&&(l=new X(!0).update(l).array());var ze=[],Rt=[];for(v=0;v<64;++v){var Ut=l[v]||0;ze[v]=92^Ut,Rt[v]=54^Ut}X.call(this,h),this.update(Rt),this.oKeyPad=ze,this.inner=!0,this.sharedMemory=h}Q.prototype=new X,Q.prototype.finalize=function(){if(X.prototype.finalize.call(this),this.inner){this.inner=!1;var l=this.array();X.call(this,this.sharedMemory),this.update(this.oKeyPad),this.update(l),X.prototype.finalize.call(this)}};var me=ne();me.md5=me,me.md5.hmac=de(),a?yr.exports=me:(n.md5=me,c&&define(function(){return me}))})()});var Hi=["top","right","bottom","left"],Pi=["start","end"],Mi=Hi.reduce((e,t)=>e.concat(t,t+"-"+Pi[0],t+"-"+Pi[1]),[]),Et=Math.min,tt=Math.max,hr=Math.round,pr=Math.floor,nn=e=>({x:e,y:e}),ta={left:"right",right:"left",bottom:"top",top:"bottom"},na={start:"end",end:"start"};function Jr(e,t,r){return tt(e,Et(t,r))}function jt(e,t){return typeof e=="function"?e(t):e}function pt(e){return e.split("-")[0]}function xt(e){return e.split("-")[1]}function $i(e){return e==="x"?"y":"x"}function Qr(e){return e==="y"?"height":"width"}function Pn(e){return["top","bottom"].includes(pt(e))?"y":"x"}function Zr(e){return $i(Pn(e))}function Wi(e,t,r){r===void 0&&(r=!1);let n=xt(e),i=Zr(e),o=Qr(i),a=i==="x"?n===(r?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(a=mr(a)),[a,mr(a)]}function ra(e){let t=mr(e);return[vr(e),t,vr(t)]}function vr(e){return e.replace(/start|end/g,t=>na[t])}function ia(e,t,r){let n=["left","right"],i=["right","left"],o=["top","bottom"],a=["bottom","top"];switch(e){case"top":case"bottom":return r?t?i:n:t?n:i;case"left":case"right":return t?o:a;default:return[]}}function oa(e,t,r,n){let i=xt(e),o=ia(pt(e),r==="start",n);return i&&(o=o.map(a=>a+"-"+i),t&&(o=o.concat(o.map(vr)))),o}function mr(e){return e.replace(/left|right|bottom|top/g,t=>ta[t])}function aa(e){return{top:0,right:0,bottom:0,left:0,...e}}function ei(e){return typeof e!="number"?aa(e):{top:e,right:e,bottom:e,left:e}}function Dn(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}function Ri(e,t,r){let{reference:n,floating:i}=e,o=Pn(t),a=Zr(t),c=Qr(a),f=pt(t),u=o==="y",y=n.x+n.width/2-i.width/2,m=n.y+n.height/2-i.height/2,O=n[c]/2-i[c]/2,S;switch(f){case"top":S={x:y,y:n.y-i.height};break;case"bottom":S={x:y,y:n.y+n.height};break;case"right":S={x:n.x+n.width,y:m};break;case"left":S={x:n.x-i.width,y:m};break;default:S={x:n.x,y:n.y}}switch(xt(t)){case"start":S[a]-=O*(r&&u?-1:1);break;case"end":S[a]+=O*(r&&u?-1:1);break}return S}var sa=async(e,t,r)=>{let{placement:n="bottom",strategy:i="absolute",middleware:o=[],platform:a}=r,c=o.filter(Boolean),f=await(a.isRTL==null?void 0:a.isRTL(t)),u=await a.getElementRects({reference:e,floating:t,strategy:i}),{x:y,y:m}=Ri(u,n,f),O=n,S={},x=0;for(let M=0;M({name:"arrow",options:e,async fn(t){let{x:r,y:n,placement:i,rects:o,platform:a,elements:c,middlewareData:f}=t,{element:u,padding:y=0}=jt(e,t)||{};if(u==null)return{};let m=ei(y),O={x:r,y:n},S=Zr(i),x=Qr(S),M=await a.getDimensions(u),I=S==="y",$=I?"top":"left",A=I?"bottom":"right",N=I?"clientHeight":"clientWidth",Y=o.reference[x]+o.reference[S]-O[S]-o.floating[x],ne=O[S]-o.reference[S],J=await(a.getOffsetParent==null?void 0:a.getOffsetParent(u)),V=J?J[N]:0;(!V||!await(a.isElement==null?void 0:a.isElement(J)))&&(V=c.floating[N]||o.floating[x]);let de=Y/2-ne/2,X=V/2-M[x]/2-1,Q=Et(m[$],X),me=Et(m[A],X),l=Q,h=V-M[x]-me,v=V/2-M[x]/2+de,p=Jr(l,v,h),j=!f.arrow&&xt(i)!=null&&v!==p&&o.reference[x]/2-(vxt(i)===e),...r.filter(i=>xt(i)!==e)]:r.filter(i=>pt(i)===i)).filter(i=>e?xt(i)===e||(t?vr(i)!==i:!1):!0)}var fa=function(e){return e===void 0&&(e={}),{name:"autoPlacement",options:e,async fn(t){var r,n,i;let{rects:o,middlewareData:a,placement:c,platform:f,elements:u}=t,{crossAxis:y=!1,alignment:m,allowedPlacements:O=Mi,autoAlignment:S=!0,...x}=jt(e,t),M=m!==void 0||O===Mi?ca(m||null,S,O):O,I=await _n(t,x),$=((r=a.autoPlacement)==null?void 0:r.index)||0,A=M[$];if(A==null)return{};let N=Wi(A,o,await(f.isRTL==null?void 0:f.isRTL(u.floating)));if(c!==A)return{reset:{placement:M[0]}};let Y=[I[pt(A)],I[N[0]],I[N[1]]],ne=[...((n=a.autoPlacement)==null?void 0:n.overflows)||[],{placement:A,overflows:Y}],J=M[$+1];if(J)return{data:{index:$+1,overflows:ne},reset:{placement:J}};let V=ne.map(Q=>{let me=xt(Q.placement);return[Q.placement,me&&y?Q.overflows.slice(0,2).reduce((l,h)=>l+h,0):Q.overflows[0],Q.overflows]}).sort((Q,me)=>Q[1]-me[1]),X=((i=V.filter(Q=>Q[2].slice(0,xt(Q[0])?2:3).every(me=>me<=0))[0])==null?void 0:i[0])||V[0][0];return X!==c?{data:{index:$+1,overflows:ne},reset:{placement:X}}:{}}}},ua=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var r,n;let{placement:i,middlewareData:o,rects:a,initialPlacement:c,platform:f,elements:u}=t,{mainAxis:y=!0,crossAxis:m=!0,fallbackPlacements:O,fallbackStrategy:S="bestFit",fallbackAxisSideDirection:x="none",flipAlignment:M=!0,...I}=jt(e,t);if((r=o.arrow)!=null&&r.alignmentOffset)return{};let $=pt(i),A=pt(c)===c,N=await(f.isRTL==null?void 0:f.isRTL(u.floating)),Y=O||(A||!M?[mr(c)]:ra(c));!O&&x!=="none"&&Y.push(...oa(c,M,x,N));let ne=[c,...Y],J=await _n(t,I),V=[],de=((n=o.flip)==null?void 0:n.overflows)||[];if(y&&V.push(J[$]),m){let l=Wi(i,a,N);V.push(J[l[0]],J[l[1]])}if(de=[...de,{placement:i,overflows:V}],!V.every(l=>l<=0)){var X,Q;let l=(((X=o.flip)==null?void 0:X.index)||0)+1,h=ne[l];if(h)return{data:{index:l,overflows:de},reset:{placement:h}};let v=(Q=de.filter(p=>p.overflows[0]<=0).sort((p,j)=>p.overflows[1]-j.overflows[1])[0])==null?void 0:Q.placement;if(!v)switch(S){case"bestFit":{var me;let p=(me=de.map(j=>[j.placement,j.overflows.filter(P=>P>0).reduce((P,R)=>P+R,0)]).sort((j,P)=>j[1]-P[1])[0])==null?void 0:me[0];p&&(v=p);break}case"initialPlacement":v=c;break}if(i!==v)return{reset:{placement:v}}}return{}}}};function Ii(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Li(e){return Hi.some(t=>e[t]>=0)}var da=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){let{rects:r}=t,{strategy:n="referenceHidden",...i}=jt(e,t);switch(n){case"referenceHidden":{let o=await _n(t,{...i,elementContext:"reference"}),a=Ii(o,r.reference);return{data:{referenceHiddenOffsets:a,referenceHidden:Li(a)}}}case"escaped":{let o=await _n(t,{...i,altBoundary:!0}),a=Ii(o,r.floating);return{data:{escapedOffsets:a,escaped:Li(a)}}}default:return{}}}}};function Ui(e){let t=Et(...e.map(o=>o.left)),r=Et(...e.map(o=>o.top)),n=tt(...e.map(o=>o.right)),i=tt(...e.map(o=>o.bottom));return{x:t,y:r,width:n-t,height:i-r}}function pa(e){let t=e.slice().sort((i,o)=>i.y-o.y),r=[],n=null;for(let i=0;in.height/2?r.push([o]):r[r.length-1].push(o),n=o}return r.map(i=>Dn(Ui(i)))}var ha=function(e){return e===void 0&&(e={}),{name:"inline",options:e,async fn(t){let{placement:r,elements:n,rects:i,platform:o,strategy:a}=t,{padding:c=2,x:f,y:u}=jt(e,t),y=Array.from(await(o.getClientRects==null?void 0:o.getClientRects(n.reference))||[]),m=pa(y),O=Dn(Ui(y)),S=ei(c);function x(){if(m.length===2&&m[0].left>m[1].right&&f!=null&&u!=null)return m.find(I=>f>I.left-S.left&&fI.top-S.top&&u=2){if(Pn(r)==="y"){let Q=m[0],me=m[m.length-1],l=pt(r)==="top",h=Q.top,v=me.bottom,p=l?Q.left:me.left,j=l?Q.right:me.right,P=j-p,R=v-h;return{top:h,bottom:v,left:p,right:j,width:P,height:R,x:p,y:h}}let I=pt(r)==="left",$=tt(...m.map(Q=>Q.right)),A=Et(...m.map(Q=>Q.left)),N=m.filter(Q=>I?Q.left===A:Q.right===$),Y=N[0].top,ne=N[N.length-1].bottom,J=A,V=$,de=V-J,X=ne-Y;return{top:Y,bottom:ne,left:J,right:V,width:de,height:X,x:J,y:Y}}return O}let M=await o.getElementRects({reference:{getBoundingClientRect:x},floating:n.floating,strategy:a});return i.reference.x!==M.reference.x||i.reference.y!==M.reference.y||i.reference.width!==M.reference.width||i.reference.height!==M.reference.height?{reset:{rects:M}}:{}}}};async function va(e,t){let{placement:r,platform:n,elements:i}=e,o=await(n.isRTL==null?void 0:n.isRTL(i.floating)),a=pt(r),c=xt(r),f=Pn(r)==="y",u=["left","top"].includes(a)?-1:1,y=o&&f?-1:1,m=jt(t,e),{mainAxis:O,crossAxis:S,alignmentAxis:x}=typeof m=="number"?{mainAxis:m,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...m};return c&&typeof x=="number"&&(S=c==="end"?x*-1:x),f?{x:S*y,y:O*u}:{x:O*u,y:S*y}}var Vi=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var r,n;let{x:i,y:o,placement:a,middlewareData:c}=t,f=await va(t,e);return a===((r=c.offset)==null?void 0:r.placement)&&(n=c.arrow)!=null&&n.alignmentOffset?{}:{x:i+f.x,y:o+f.y,data:{...f,placement:a}}}}},ma=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){let{x:r,y:n,placement:i}=t,{mainAxis:o=!0,crossAxis:a=!1,limiter:c={fn:I=>{let{x:$,y:A}=I;return{x:$,y:A}}},...f}=jt(e,t),u={x:r,y:n},y=await _n(t,f),m=Pn(pt(i)),O=$i(m),S=u[O],x=u[m];if(o){let I=O==="y"?"top":"left",$=O==="y"?"bottom":"right",A=S+y[I],N=S-y[$];S=Jr(A,S,N)}if(a){let I=m==="y"?"top":"left",$=m==="y"?"bottom":"right",A=x+y[I],N=x-y[$];x=Jr(A,x,N)}let M=c.fn({...t,[O]:S,[m]:x});return{...M,data:{x:M.x-r,y:M.y-n}}}}},ga=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){let{placement:r,rects:n,platform:i,elements:o}=t,{apply:a=()=>{},...c}=jt(e,t),f=await _n(t,c),u=pt(r),y=xt(r),m=Pn(r)==="y",{width:O,height:S}=n.floating,x,M;u==="top"||u==="bottom"?(x=u,M=y===(await(i.isRTL==null?void 0:i.isRTL(o.floating))?"start":"end")?"left":"right"):(M=u,x=y==="end"?"top":"bottom");let I=S-f[x],$=O-f[M],A=!t.middlewareData.shift,N=I,Y=$;if(m){let J=O-f.left-f.right;Y=y||A?Et($,J):J}else{let J=S-f.top-f.bottom;N=y||A?Et(I,J):J}if(A&&!y){let J=tt(f.left,0),V=tt(f.right,0),de=tt(f.top,0),X=tt(f.bottom,0);m?Y=O-2*(J!==0||V!==0?J+V:tt(f.left,f.right)):N=S-2*(de!==0||X!==0?de+X:tt(f.top,f.bottom))}await a({...t,availableWidth:Y,availableHeight:N});let ne=await i.getDimensions(o.floating);return O!==ne.width||S!==ne.height?{reset:{rects:!0}}:{}}}};function rn(e){return zi(e)?(e.nodeName||"").toLowerCase():"#document"}function ct(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Bt(e){var t;return(t=(zi(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function zi(e){return e instanceof Node||e instanceof ct(e).Node}function Nt(e){return e instanceof Element||e instanceof ct(e).Element}function Tt(e){return e instanceof HTMLElement||e instanceof ct(e).HTMLElement}function Fi(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof ct(e).ShadowRoot}function zn(e){let{overflow:t,overflowX:r,overflowY:n,display:i}=ht(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+r)&&!["inline","contents"].includes(i)}function ba(e){return["table","td","th"].includes(rn(e))}function ti(e){let t=ni(),r=ht(e);return r.transform!=="none"||r.perspective!=="none"||(r.containerType?r.containerType!=="normal":!1)||!t&&(r.backdropFilter?r.backdropFilter!=="none":!1)||!t&&(r.filter?r.filter!=="none":!1)||["transform","perspective","filter"].some(n=>(r.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(r.contain||"").includes(n))}function ya(e){let t=Tn(e);for(;Tt(t)&&!gr(t);){if(ti(t))return t;t=Tn(t)}return null}function ni(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function gr(e){return["html","body","#document"].includes(rn(e))}function ht(e){return ct(e).getComputedStyle(e)}function br(e){return Nt(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Tn(e){if(rn(e)==="html")return e;let t=e.assignedSlot||e.parentNode||Fi(e)&&e.host||Bt(e);return Fi(t)?t.host:t}function Yi(e){let t=Tn(e);return gr(t)?e.ownerDocument?e.ownerDocument.body:e.body:Tt(t)&&zn(t)?t:Yi(t)}function Vn(e,t,r){var n;t===void 0&&(t=[]),r===void 0&&(r=!0);let i=Yi(e),o=i===((n=e.ownerDocument)==null?void 0:n.body),a=ct(i);return o?t.concat(a,a.visualViewport||[],zn(i)?i:[],a.frameElement&&r?Vn(a.frameElement):[]):t.concat(i,Vn(i,[],r))}function Xi(e){let t=ht(e),r=parseFloat(t.width)||0,n=parseFloat(t.height)||0,i=Tt(e),o=i?e.offsetWidth:r,a=i?e.offsetHeight:n,c=hr(r)!==o||hr(n)!==a;return c&&(r=o,n=a),{width:r,height:n,$:c}}function ri(e){return Nt(e)?e:e.contextElement}function Cn(e){let t=ri(e);if(!Tt(t))return nn(1);let r=t.getBoundingClientRect(),{width:n,height:i,$:o}=Xi(t),a=(o?hr(r.width):r.width)/n,c=(o?hr(r.height):r.height)/i;return(!a||!Number.isFinite(a))&&(a=1),(!c||!Number.isFinite(c))&&(c=1),{x:a,y:c}}var wa=nn(0);function qi(e){let t=ct(e);return!ni()||!t.visualViewport?wa:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function xa(e,t,r){return t===void 0&&(t=!1),!r||t&&r!==ct(e)?!1:t}function vn(e,t,r,n){t===void 0&&(t=!1),r===void 0&&(r=!1);let i=e.getBoundingClientRect(),o=ri(e),a=nn(1);t&&(n?Nt(n)&&(a=Cn(n)):a=Cn(e));let c=xa(o,r,n)?qi(o):nn(0),f=(i.left+c.x)/a.x,u=(i.top+c.y)/a.y,y=i.width/a.x,m=i.height/a.y;if(o){let O=ct(o),S=n&&Nt(n)?ct(n):n,x=O,M=x.frameElement;for(;M&&n&&S!==x;){let I=Cn(M),$=M.getBoundingClientRect(),A=ht(M),N=$.left+(M.clientLeft+parseFloat(A.paddingLeft))*I.x,Y=$.top+(M.clientTop+parseFloat(A.paddingTop))*I.y;f*=I.x,u*=I.y,y*=I.x,m*=I.y,f+=N,u+=Y,x=ct(M),M=x.frameElement}}return Dn({width:y,height:m,x:f,y:u})}var Ea=[":popover-open",":modal"];function Gi(e){return Ea.some(t=>{try{return e.matches(t)}catch{return!1}})}function Oa(e){let{elements:t,rect:r,offsetParent:n,strategy:i}=e,o=i==="fixed",a=Bt(n),c=t?Gi(t.floating):!1;if(n===a||c&&o)return r;let f={scrollLeft:0,scrollTop:0},u=nn(1),y=nn(0),m=Tt(n);if((m||!m&&!o)&&((rn(n)!=="body"||zn(a))&&(f=br(n)),Tt(n))){let O=vn(n);u=Cn(n),y.x=O.x+n.clientLeft,y.y=O.y+n.clientTop}return{width:r.width*u.x,height:r.height*u.y,x:r.x*u.x-f.scrollLeft*u.x+y.x,y:r.y*u.y-f.scrollTop*u.y+y.y}}function Sa(e){return Array.from(e.getClientRects())}function Ki(e){return vn(Bt(e)).left+br(e).scrollLeft}function Aa(e){let t=Bt(e),r=br(e),n=e.ownerDocument.body,i=tt(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),o=tt(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight),a=-r.scrollLeft+Ki(e),c=-r.scrollTop;return ht(n).direction==="rtl"&&(a+=tt(t.clientWidth,n.clientWidth)-i),{width:i,height:o,x:a,y:c}}function Ca(e,t){let r=ct(e),n=Bt(e),i=r.visualViewport,o=n.clientWidth,a=n.clientHeight,c=0,f=0;if(i){o=i.width,a=i.height;let u=ni();(!u||u&&t==="fixed")&&(c=i.offsetLeft,f=i.offsetTop)}return{width:o,height:a,x:c,y:f}}function Da(e,t){let r=vn(e,!0,t==="fixed"),n=r.top+e.clientTop,i=r.left+e.clientLeft,o=Tt(e)?Cn(e):nn(1),a=e.clientWidth*o.x,c=e.clientHeight*o.y,f=i*o.x,u=n*o.y;return{width:a,height:c,x:f,y:u}}function ki(e,t,r){let n;if(t==="viewport")n=Ca(e,r);else if(t==="document")n=Aa(Bt(e));else if(Nt(t))n=Da(t,r);else{let i=qi(e);n={...t,x:t.x-i.x,y:t.y-i.y}}return Dn(n)}function Ji(e,t){let r=Tn(e);return r===t||!Nt(r)||gr(r)?!1:ht(r).position==="fixed"||Ji(r,t)}function _a(e,t){let r=t.get(e);if(r)return r;let n=Vn(e,[],!1).filter(c=>Nt(c)&&rn(c)!=="body"),i=null,o=ht(e).position==="fixed",a=o?Tn(e):e;for(;Nt(a)&&!gr(a);){let c=ht(a),f=ti(a);!f&&c.position==="fixed"&&(i=null),(o?!f&&!i:!f&&c.position==="static"&&!!i&&["absolute","fixed"].includes(i.position)||zn(a)&&!f&&Ji(e,a))?n=n.filter(y=>y!==a):i=c,a=Tn(a)}return t.set(e,n),n}function Ta(e){let{element:t,boundary:r,rootBoundary:n,strategy:i}=e,a=[...r==="clippingAncestors"?_a(t,this._c):[].concat(r),n],c=a[0],f=a.reduce((u,y)=>{let m=ki(t,y,i);return u.top=tt(m.top,u.top),u.right=Et(m.right,u.right),u.bottom=Et(m.bottom,u.bottom),u.left=tt(m.left,u.left),u},ki(t,c,i));return{width:f.right-f.left,height:f.bottom-f.top,x:f.left,y:f.top}}function Pa(e){let{width:t,height:r}=Xi(e);return{width:t,height:r}}function Ma(e,t,r){let n=Tt(t),i=Bt(t),o=r==="fixed",a=vn(e,!0,o,t),c={scrollLeft:0,scrollTop:0},f=nn(0);if(n||!n&&!o)if((rn(t)!=="body"||zn(i))&&(c=br(t)),n){let m=vn(t,!0,o,t);f.x=m.x+t.clientLeft,f.y=m.y+t.clientTop}else i&&(f.x=Ki(i));let u=a.left+c.scrollLeft-f.x,y=a.top+c.scrollTop-f.y;return{x:u,y,width:a.width,height:a.height}}function Ni(e,t){return!Tt(e)||ht(e).position==="fixed"?null:t?t(e):e.offsetParent}function Qi(e,t){let r=ct(e);if(!Tt(e)||Gi(e))return r;let n=Ni(e,t);for(;n&&ba(n)&&ht(n).position==="static";)n=Ni(n,t);return n&&(rn(n)==="html"||rn(n)==="body"&&ht(n).position==="static"&&!ti(n))?r:n||ya(e)||r}var Ra=async function(e){let t=this.getOffsetParent||Qi,r=this.getDimensions;return{reference:Ma(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,...await r(e.floating)}}};function Ia(e){return ht(e).direction==="rtl"}var La={convertOffsetParentRelativeRectToViewportRelativeRect:Oa,getDocumentElement:Bt,getClippingRect:Ta,getOffsetParent:Qi,getElementRects:Ra,getClientRects:Sa,getDimensions:Pa,getScale:Cn,isElement:Nt,isRTL:Ia};function Fa(e,t){let r=null,n,i=Bt(e);function o(){var c;clearTimeout(n),(c=r)==null||c.disconnect(),r=null}function a(c,f){c===void 0&&(c=!1),f===void 0&&(f=1),o();let{left:u,top:y,width:m,height:O}=e.getBoundingClientRect();if(c||t(),!m||!O)return;let S=pr(y),x=pr(i.clientWidth-(u+m)),M=pr(i.clientHeight-(y+O)),I=pr(u),A={rootMargin:-S+"px "+-x+"px "+-M+"px "+-I+"px",threshold:tt(0,Et(1,f))||1},N=!0;function Y(ne){let J=ne[0].intersectionRatio;if(J!==f){if(!N)return a();J?a(!1,J):n=setTimeout(()=>{a(!1,1e-7)},100)}N=!1}try{r=new IntersectionObserver(Y,{...A,root:i.ownerDocument})}catch{r=new IntersectionObserver(Y,A)}r.observe(e)}return a(!0),o}function ji(e,t,r,n){n===void 0&&(n={});let{ancestorScroll:i=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:c=typeof IntersectionObserver=="function",animationFrame:f=!1}=n,u=ri(e),y=i||o?[...u?Vn(u):[],...Vn(t)]:[];y.forEach($=>{i&&$.addEventListener("scroll",r,{passive:!0}),o&&$.addEventListener("resize",r)});let m=u&&c?Fa(u,r):null,O=-1,S=null;a&&(S=new ResizeObserver($=>{let[A]=$;A&&A.target===u&&S&&(S.unobserve(t),cancelAnimationFrame(O),O=requestAnimationFrame(()=>{var N;(N=S)==null||N.observe(t)})),r()}),u&&!f&&S.observe(u),S.observe(t));let x,M=f?vn(e):null;f&&I();function I(){let $=vn(e);M&&($.x!==M.x||$.y!==M.y||$.width!==M.width||$.height!==M.height)&&r(),M=$,x=requestAnimationFrame(I)}return r(),()=>{var $;y.forEach(A=>{i&&A.removeEventListener("scroll",r),o&&A.removeEventListener("resize",r)}),m?.(),($=S)==null||$.disconnect(),S=null,f&&cancelAnimationFrame(x)}}var ii=fa,Zi=ma,eo=ua,to=ga,no=da,ro=la,io=ha,Bi=(e,t,r)=>{let n=new Map,i={platform:La,...r},o={...i.platform,_c:n};return sa(e,t,{...i,platform:o})},ka=e=>{let t={placement:"bottom",strategy:"absolute",middleware:[]},r=Object.keys(e),n=i=>e[i];return r.includes("offset")&&t.middleware.push(Vi(n("offset"))),r.includes("teleport")&&(t.strategy="fixed"),r.includes("placement")&&(t.placement=n("placement")),r.some(i=>/^auto-?placement$/i.test(i))&&!r.includes("flip")&&t.middleware.push(ii(n("autoPlacement"))),r.includes("flip")&&t.middleware.push(eo(n("flip"))),r.includes("shift")&&t.middleware.push(Zi(n("shift"))),r.includes("inline")&&t.middleware.push(io(n("inline"))),r.includes("arrow")&&t.middleware.push(ro(n("arrow"))),r.includes("hide")&&t.middleware.push(no(n("hide"))),r.includes("size")&&t.middleware.push(to(n("size"))),t},Na=(e,t)=>{let r={component:{trap:!1},float:{placement:"bottom",strategy:"absolute",middleware:[]}},n=i=>e[e.indexOf(i)+1];if(e.includes("trap")&&(r.component.trap=!0),e.includes("teleport")&&(r.float.strategy="fixed"),e.includes("offset")&&r.float.middleware.push(Vi(t.offset||10)),e.includes("placement")&&(r.float.placement=n("placement")),e.some(i=>/^auto-?placement$/i.test(i))&&!e.includes("flip")&&r.float.middleware.push(ii(t.autoPlacement)),e.includes("flip")&&r.float.middleware.push(eo(t.flip)),e.includes("shift")&&r.float.middleware.push(Zi(t.shift)),e.includes("inline")&&r.float.middleware.push(io(t.inline)),e.includes("arrow")&&r.float.middleware.push(ro(t.arrow)),e.includes("hide")&&r.float.middleware.push(no(t.hide)),e.includes("size")){let i=t.size?.availableWidth??null,o=t.size?.availableHeight??null;i&&delete t.size.availableWidth,o&&delete t.size.availableHeight,r.float.middleware.push(to({...t.size,apply({availableWidth:a,availableHeight:c,elements:f}){Object.assign(f.floating.style,{maxWidth:`${i??a}px`,maxHeight:`${o??c}px`})}}))}return r},ja=e=>{var t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".split(""),r="";e||(e=Math.floor(Math.random()*t.length));for(var n=0;n{}){let r=!1;return function(){r?t.apply(this,arguments):(r=!0,e.apply(this,arguments))}}function Ha(e){let t={dismissable:!0,trap:!1};function r(n,i=null){if(n){if(n.hasAttribute("aria-expanded")||n.setAttribute("aria-expanded",!1),i.hasAttribute("id"))n.setAttribute("aria-controls",i.getAttribute("id"));else{let o=`panel-${ja(8)}`;n.setAttribute("aria-controls",o),i.setAttribute("id",o)}i.setAttribute("aria-modal",!0),i.setAttribute("role","dialog")}}e.magic("float",n=>(i={},o={})=>{let a={...t,...o},c=Object.keys(i).length>0?ka(i):{middleware:[ii()]},f=n,u=n.parentElement.closest("[x-data]"),y=u.querySelector('[x-ref="panel"]');r(f,y);function m(){return y.style.display=="block"}function O(){y.style.display="none",f.setAttribute("aria-expanded","false"),a.trap&&y.setAttribute("x-trap","false"),ji(n,y,M)}function S(){y.style.display="block",f.setAttribute("aria-expanded","true"),a.trap&&y.setAttribute("x-trap","true"),M()}function x(){m()?O():S()}async function M(){return await Bi(n,y,c).then(({middlewareData:I,placement:$,x:A,y:N})=>{if(I.arrow){let Y=I.arrow?.x,ne=I.arrow?.y,J=c.middleware.filter(de=>de.name=="arrow")[0].options.element,V={top:"bottom",right:"left",bottom:"top",left:"right"}[$.split("-")[0]];Object.assign(J.style,{left:Y!=null?`${Y}px`:"",top:ne!=null?`${ne}px`:"",right:"",bottom:"",[V]:"-4px"})}if(I.hide){let{referenceHidden:Y}=I.hide;Object.assign(y.style,{visibility:Y?"hidden":"visible"})}Object.assign(y.style,{left:`${A}px`,top:`${N}px`})})}a.dismissable&&(window.addEventListener("click",I=>{!u.contains(I.target)&&m()&&x()}),window.addEventListener("keydown",I=>{I.key==="Escape"&&m()&&x()},!0)),x()}),e.directive("float",(n,{modifiers:i,expression:o},{evaluate:a,effect:c})=>{let f=o?a(o):{},u=i.length>0?Na(i,f):{},y=null;u.float.strategy=="fixed"&&(n.style.position="fixed");let m=V=>n.parentElement&&!n.parentElement.closest("[x-data]").contains(V.target)?n.close():null,O=V=>V.key==="Escape"?n.close():null,S=n.getAttribute("x-ref"),x=n.parentElement.closest("[x-data]"),M=x.querySelectorAll(`[\\@click^="$refs.${S}"]`),I=x.querySelectorAll(`[x-on\\:click^="$refs.${S}"]`);n.style.setProperty("display","none"),r([...M,...I][0],n),n._x_isShown=!1,n.trigger=null,n._x_doHide||(n._x_doHide=()=>{n.style.setProperty("display","none",i.includes("important")?"important":void 0)}),n._x_doShow||(n._x_doShow=()=>{n.style.setProperty("display","block",i.includes("important")?"important":void 0)});let $=()=>{n._x_doHide(),n._x_isShown=!1},A=()=>{n._x_doShow(),n._x_isShown=!0},N=()=>setTimeout(A),Y=Ba(V=>V?A():$(),V=>{typeof n._x_toggleAndCascadeWithTransitions=="function"?n._x_toggleAndCascadeWithTransitions(n,V,A,$):V?N():$()}),ne,J=!0;c(()=>a(V=>{!J&&V===ne||(i.includes("immediate")&&(V?N():$()),Y(V),ne=V,J=!1)})),n.open=async function(V){n.trigger=V.currentTarget?V.currentTarget:V,Y(!0),n.trigger.setAttribute("aria-expanded","true"),u.component.trap&&n.setAttribute("x-trap","true"),y=ji(n.trigger,n,()=>{Bi(n.trigger,n,u.float).then(({middlewareData:de,placement:X,x:Q,y:me})=>{if(de.arrow){let l=de.arrow?.x,h=de.arrow?.y,v=u.float.middleware.filter(j=>j.name=="arrow")[0].options.element,p={top:"bottom",right:"left",bottom:"top",left:"right"}[X.split("-")[0]];Object.assign(v.style,{left:l!=null?`${l}px`:"",top:h!=null?`${h}px`:"",right:"",bottom:"",[p]:"-4px"})}if(de.hide){let{referenceHidden:l}=de.hide;Object.assign(n.style,{visibility:l?"hidden":"visible"})}Object.assign(n.style,{left:`${Q}px`,top:`${me}px`})})}),window.addEventListener("click",m),window.addEventListener("keydown",O,!0)},n.close=function(){if(!n._x_isShown)return!1;Y(!1),n.trigger.setAttribute("aria-expanded","false"),u.component.trap&&n.setAttribute("x-trap","false"),y(),window.removeEventListener("click",m),window.removeEventListener("keydown",O,!1)},n.toggle=function(V){n._x_isShown?n.close():n.open(V)}})}var oo=Ha;function $a(e){e.store("lazyLoadedAssets",{loaded:new Set,check(a){return Array.isArray(a)?a.every(c=>this.loaded.has(c)):this.loaded.has(a)},markLoaded(a){Array.isArray(a)?a.forEach(c=>this.loaded.add(c)):this.loaded.add(a)}});let t=a=>new CustomEvent(a,{bubbles:!0,composed:!0,cancelable:!0}),r=(a,c={},f,u)=>{let y=document.createElement(a);return Object.entries(c).forEach(([m,O])=>y[m]=O),f&&(u?f.insertBefore(y,u):f.appendChild(y)),y},n=(a,c,f={},u=null,y=null)=>{let m=a==="link"?`link[href="${c}"]`:`script[src="${c}"]`;if(document.querySelector(m)||e.store("lazyLoadedAssets").check(c))return Promise.resolve();let O=a==="link"?{...f,href:c}:{...f,src:c},S=r(a,O,u,y);return new Promise((x,M)=>{S.onload=()=>{e.store("lazyLoadedAssets").markLoaded(c),x()},S.onerror=()=>{M(new Error(`Failed to load ${a}: ${c}`))}})},i=async(a,c,f=null,u=null)=>{let y={type:"text/css",rel:"stylesheet"};c&&(y.media=c);let m=document.head,O=null;if(f&&u){let S=document.querySelector(`link[href*="${u}"]`);S?(m=S.parentElement,O=f==="before"?S:S.nextSibling):(console.warn(`Target (${u}) not found for ${a}. Appending to head.`),m=document.head,O=null)}await n("link",a,y,m,O)},o=async(a,c,f=null,u=null,y=null)=>{let m=document.head,O=null;if(f&&u){let x=document.querySelector(`script[src*="${u}"]`);x?(m=x.parentElement,O=f==="before"?x:x.nextSibling):(console.warn(`Target (${u}) not found for ${a}. Falling back to head or body.`),m=document.head,O=null)}else(c.has("body-start")||c.has("body-end"))&&(m=document.body,c.has("body-start")&&(O=document.body.firstChild));let S={};y&&(S.type="module"),await n("script",a,S,m,O)};e.directive("load-css",(a,{expression:c},{evaluate:f})=>{let u=f(c),y=a.media,m=a.getAttribute("data-dispatch"),O=a.getAttribute("data-css-before")?"before":a.getAttribute("data-css-after")?"after":null,S=a.getAttribute("data-css-before")||a.getAttribute("data-css-after")||null;Promise.all(u.map(x=>i(x,y,O,S))).then(()=>{m&&window.dispatchEvent(t(`${m}-css`))}).catch(console.error)}),e.directive("load-js",(a,{expression:c,modifiers:f},{evaluate:u})=>{let y=u(c),m=new Set(f),O=a.getAttribute("data-js-before")?"before":a.getAttribute("data-js-after")?"after":null,S=a.getAttribute("data-js-before")||a.getAttribute("data-js-after")||null,x=a.getAttribute("data-js-as-module")||a.getAttribute("data-as-module")||!1,M=a.getAttribute("data-dispatch");Promise.all(y.map(I=>o(I,m,O,S,x))).then(()=>{M&&window.dispatchEvent(t(`${M}-js`))}).catch(console.error)})}var ao=$a;function Wa(){return!0}function Ua({component:e,argument:t}){return new Promise(r=>{if(t)window.addEventListener(t,()=>r(),{once:!0});else{let n=i=>{i.detail.id===e.id&&(window.removeEventListener("async-alpine:load",n),r())};window.addEventListener("async-alpine:load",n)}})}function Va(){return new Promise(e=>{"requestIdleCallback"in window?window.requestIdleCallback(e):setTimeout(e,200)})}function za({argument:e}){return new Promise(t=>{if(!e)return console.log("Async Alpine: media strategy requires a media query. Treating as 'eager'"),t();let r=window.matchMedia(`(${e})`);r.matches?t():r.addEventListener("change",t,{once:!0})})}function Ya({component:e,argument:t}){return new Promise(r=>{let n=t||"0px 0px 0px 0px",i=new IntersectionObserver(o=>{o[0].isIntersecting&&(i.disconnect(),r())},{rootMargin:n});i.observe(e.el)})}var so={eager:Wa,event:Ua,idle:Va,media:za,visible:Ya};async function Xa(e){let t=qa(e.strategy);await oi(e,t)}async function oi(e,t){if(t.type==="expression"){if(t.operator==="&&")return Promise.all(t.parameters.map(r=>oi(e,r)));if(t.operator==="||")return Promise.any(t.parameters.map(r=>oi(e,r)))}return so[t.method]?so[t.method]({component:e,argument:t.argument}):!1}function qa(e){let t=Ga(e),r=co(t);return r.type==="method"?{type:"expression",operator:"&&",parameters:[r]}:r}function Ga(e){let t=/\s*([()])\s*|\s*(\|\||&&|\|)\s*|\s*((?:[^()&|]+\([^()]+\))|[^()&|]+)\s*/g,r=[],n;for(;(n=t.exec(e))!==null;){let[i,o,a,c]=n;if(o!==void 0)r.push({type:"parenthesis",value:o});else if(a!==void 0)r.push({type:"operator",value:a==="|"?"&&":a});else{let f={type:"method",method:c.trim()};c.includes("(")&&(f.method=c.substring(0,c.indexOf("(")).trim(),f.argument=c.substring(c.indexOf("(")+1,c.indexOf(")"))),c.method==="immediate"&&(c.method="eager"),r.push(f)}}return r}function co(e){let t=lo(e);for(;e.length>0&&(e[0].value==="&&"||e[0].value==="|"||e[0].value==="||");){let r=e.shift().value,n=lo(e);t.type==="expression"&&t.operator===r?t.parameters.push(n):t={type:"expression",operator:r,parameters:[t,n]}}return t}function lo(e){if(e[0].value==="("){e.shift();let t=co(e);return e[0].value===")"&&e.shift(),t}else return e.shift()}function fo(e){let t="load",r=e.prefixed("load-src"),n=e.prefixed("ignore"),i={defaultStrategy:"eager",keepRelativeURLs:!1},o=!1,a={},c=0;function f(){return c++}e.asyncOptions=A=>{i={...i,...A}},e.asyncData=(A,N=!1)=>{a[A]={loaded:!1,download:N}},e.asyncUrl=(A,N)=>{!A||!N||a[A]||(a[A]={loaded:!1,download:()=>import($(N))})},e.asyncAlias=A=>{o=A};let u=A=>{e.skipDuringClone(()=>{A._x_async||(A._x_async="init",A._x_ignore=!0,A.setAttribute(n,""))})()},y=async A=>{e.skipDuringClone(async()=>{if(A._x_async!=="init")return;A._x_async="await";let{name:N,strategy:Y}=m(A);await Xa({name:N,strategy:Y,el:A,id:A.id||f()}),A.isConnected&&(await O(N),A.isConnected&&(x(A),A._x_async="loaded"))})()};y.inline=u,e.directive(t,y).before("ignore");function m(A){let N=I(A.getAttribute(e.prefixed("data"))),Y=A.getAttribute(e.prefixed(t))||i.defaultStrategy,ne=A.getAttribute(r);return ne&&e.asyncUrl(N,ne),{name:N,strategy:Y}}async function O(A){if(A.startsWith("_x_async_")||(M(A),!a[A]||a[A].loaded))return;let N=await S(A);e.data(A,N),a[A].loaded=!0}async function S(A){if(!a[A])return;let N=await a[A].download(A);return typeof N=="function"?N:N[A]||N.default||Object.values(N)[0]||!1}function x(A){e.destroyTree(A),A._x_ignore=!1,A.removeAttribute(n),!A.closest(`[${n}]`)&&e.initTree(A)}function M(A){if(!(!o||a[A])){if(typeof o=="function"){e.asyncData(A,o);return}e.asyncUrl(A,o.replaceAll("[name]",A))}}function I(A){return(A||"").trim().split(/[({]/g)[0]||`_x_async_${f()}`}function $(A){return i.keepRelativeURLs||new RegExp("^(?:[a-z+]+:)?//","i").test(A)?A:new URL(A,document.baseURI).href}}var Xo=ea(ho(),1);function vo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Mt(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function Qa(e,t){if(e==null)return{};var r=Ja(e,t),n,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var Za="1.15.6";function Ht(e){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(e)}var Wt=Ht(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),er=Ht(/Edge/i),mo=Ht(/firefox/i),Gn=Ht(/safari/i)&&!Ht(/chrome/i)&&!Ht(/android/i),yi=Ht(/iP(ad|od|hone)/i),So=Ht(/chrome/i)&&Ht(/android/i),Ao={capture:!1,passive:!1};function Oe(e,t,r){e.addEventListener(t,r,!Wt&&Ao)}function Ee(e,t,r){e.removeEventListener(t,r,!Wt&&Ao)}function Tr(e,t){if(t){if(t[0]===">"&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function Co(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function St(e,t,r,n){if(e){r=r||document;do{if(t!=null&&(t[0]===">"?e.parentNode===r&&Tr(e,t):Tr(e,t))||n&&e===r)return e;if(e===r)break}while(e=Co(e))}return null}var go=/\s+/g;function ft(e,t,r){if(e&&t)if(e.classList)e.classList[r?"add":"remove"](t);else{var n=(" "+e.className+" ").replace(go," ").replace(" "+t+" "," ");e.className=(n+(r?" "+t:"")).replace(go," ")}}function ae(e,t,r){var n=e&&e.style;if(n){if(r===void 0)return document.defaultView&&document.defaultView.getComputedStyle?r=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(r=e.currentStyle),t===void 0?r:r[t];!(t in n)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),n[t]=r+(typeof r=="string"?"":"px")}}function Fn(e,t){var r="";if(typeof e=="string")r=e;else do{var n=ae(e,"transform");n&&n!=="none"&&(r=n+" "+r)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(r)}function Do(e,t,r){if(e){var n=e.getElementsByTagName(t),i=0,o=n.length;if(r)for(;i=o:a=i<=o,!a)return n;if(n===Pt())break;n=sn(n,!1)}return!1}function kn(e,t,r,n){for(var i=0,o=0,a=e.children;o2&&arguments[2]!==void 0?arguments[2]:{},i=n.evt,o=Qa(n,ss);tr.pluginEvent.bind(se)(t,r,Mt({dragEl:k,parentEl:Ve,ghostEl:ue,rootEl:Ne,nextEl:bn,lastDownEl:Ar,cloneEl:We,cloneHidden:an,dragStarted:Yn,putSortable:Qe,activeSortable:se.active,originalEvent:i,oldIndex:Ln,oldDraggableIndex:Jn,newIndex:ut,newDraggableIndex:on,hideGhostForTarget:Fo,unhideGhostForTarget:ko,cloneNowHidden:function(){an=!0},cloneNowShown:function(){an=!1},dispatchSortableEvent:function(c){it({sortable:r,name:c,originalEvent:i})}},o))};function it(e){as(Mt({putSortable:Qe,cloneEl:We,targetEl:k,rootEl:Ne,oldIndex:Ln,oldDraggableIndex:Jn,newIndex:ut,newDraggableIndex:on},e))}var k,Ve,ue,Ne,bn,Ar,We,an,Ln,ut,Jn,on,wr,Qe,In=!1,Pr=!1,Mr=[],mn,Ot,li,ci,wo,xo,Yn,Rn,Qn,Zn=!1,xr=!1,Cr,nt,fi=[],vi=!1,Rr=[],Lr=typeof document<"u",Er=yi,Eo=er||Wt?"cssFloat":"float",ls=Lr&&!So&&!yi&&"draggable"in document.createElement("div"),Ro=(function(){if(Lr){if(Wt)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto",e.style.pointerEvents==="auto"}})(),Io=function(t,r){var n=ae(t),i=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),o=kn(t,0,r),a=kn(t,1,r),c=o&&ae(o),f=a&&ae(a),u=c&&parseInt(c.marginLeft)+parseInt(c.marginRight)+qe(o).width,y=f&&parseInt(f.marginLeft)+parseInt(f.marginRight)+qe(a).width;if(n.display==="flex")return n.flexDirection==="column"||n.flexDirection==="column-reverse"?"vertical":"horizontal";if(n.display==="grid")return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(o&&c.float&&c.float!=="none"){var m=c.float==="left"?"left":"right";return a&&(f.clear==="both"||f.clear===m)?"vertical":"horizontal"}return o&&(c.display==="block"||c.display==="flex"||c.display==="table"||c.display==="grid"||u>=i&&n[Eo]==="none"||a&&n[Eo]==="none"&&u+y>i)?"vertical":"horizontal"},cs=function(t,r,n){var i=n?t.left:t.top,o=n?t.right:t.bottom,a=n?t.width:t.height,c=n?r.left:r.top,f=n?r.right:r.bottom,u=n?r.width:r.height;return i===c||o===f||i+a/2===c+u/2},fs=function(t,r){var n;return Mr.some(function(i){var o=i[st].options.emptyInsertThreshold;if(!(!o||wi(i))){var a=qe(i),c=t>=a.left-o&&t<=a.right+o,f=r>=a.top-o&&r<=a.bottom+o;if(c&&f)return n=i}}),n},Lo=function(t){function r(o,a){return function(c,f,u,y){var m=c.options.group.name&&f.options.group.name&&c.options.group.name===f.options.group.name;if(o==null&&(a||m))return!0;if(o==null||o===!1)return!1;if(a&&o==="clone")return o;if(typeof o=="function")return r(o(c,f,u,y),a)(c,f,u,y);var O=(a?c:f).options.group.name;return o===!0||typeof o=="string"&&o===O||o.join&&o.indexOf(O)>-1}}var n={},i=t.group;(!i||Sr(i)!="object")&&(i={name:i}),n.name=i.name,n.checkPull=r(i.pull,!0),n.checkPut=r(i.put),n.revertClone=i.revertClone,t.group=n},Fo=function(){!Ro&&ue&&ae(ue,"display","none")},ko=function(){!Ro&&ue&&ae(ue,"display","")};Lr&&!So&&document.addEventListener("click",function(e){if(Pr)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),Pr=!1,!1},!0);var gn=function(t){if(k){t=t.touches?t.touches[0]:t;var r=fs(t.clientX,t.clientY);if(r){var n={};for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);n.target=n.rootEl=r,n.preventDefault=void 0,n.stopPropagation=void 0,r[st]._onDragOver(n)}}},us=function(t){k&&k.parentNode[st]._isOutsideThisEl(t.target)};function se(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=$t({},t),e[st]=this;var r={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Io(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(a,c){a.setData("Text",c.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:se.supportPointer!==!1&&"PointerEvent"in window&&(!Gn||yi),emptyInsertThreshold:5};tr.initializePlugins(this,e,r);for(var n in r)!(n in t)&&(t[n]=r[n]);Lo(t);for(var i in this)i.charAt(0)==="_"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this));this.nativeDraggable=t.forceFallback?!1:ls,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?Oe(e,"pointerdown",this._onTapStart):(Oe(e,"mousedown",this._onTapStart),Oe(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(Oe(e,"dragover",this),Oe(e,"dragenter",this)),Mr.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),$t(this,rs())}se.prototype={constructor:se,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Rn=null)},_getDirection:function(t,r){return typeof this.options.direction=="function"?this.options.direction.call(this,t,r,k):this.options.direction},_onTapStart:function(t){if(t.cancelable){var r=this,n=this.el,i=this.options,o=i.preventOnFilter,a=t.type,c=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,f=(c||t).target,u=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||f,y=i.filter;if(ys(n),!k&&!(/mousedown|pointerdown/.test(a)&&t.button!==0||i.disabled)&&!u.isContentEditable&&!(!this.nativeDraggable&&Gn&&f&&f.tagName.toUpperCase()==="SELECT")&&(f=St(f,i.draggable,n,!1),!(f&&f.animated)&&Ar!==f)){if(Ln=vt(f),Jn=vt(f,i.draggable),typeof y=="function"){if(y.call(this,t,f,this)){it({sortable:r,rootEl:u,name:"filter",targetEl:f,toEl:n,fromEl:n}),at("filter",r,{evt:t}),o&&t.preventDefault();return}}else if(y&&(y=y.split(",").some(function(m){if(m=St(u,m.trim(),n,!1),m)return it({sortable:r,rootEl:m,name:"filter",targetEl:f,fromEl:n,toEl:n}),at("filter",r,{evt:t}),!0}),y)){o&&t.preventDefault();return}i.handle&&!St(u,i.handle,n,!1)||this._prepareDragStart(t,c,f)}}},_prepareDragStart:function(t,r,n){var i=this,o=i.el,a=i.options,c=o.ownerDocument,f;if(n&&!k&&n.parentNode===o){var u=qe(n);if(Ne=o,k=n,Ve=k.parentNode,bn=k.nextSibling,Ar=n,wr=a.group,se.dragged=k,mn={target:k,clientX:(r||t).clientX,clientY:(r||t).clientY},wo=mn.clientX-u.left,xo=mn.clientY-u.top,this._lastX=(r||t).clientX,this._lastY=(r||t).clientY,k.style["will-change"]="all",f=function(){if(at("delayEnded",i,{evt:t}),se.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!mo&&i.nativeDraggable&&(k.draggable=!0),i._triggerDragStart(t,r),it({sortable:i,name:"choose",originalEvent:t}),ft(k,a.chosenClass,!0)},a.ignore.split(",").forEach(function(y){Do(k,y.trim(),ui)}),Oe(c,"dragover",gn),Oe(c,"mousemove",gn),Oe(c,"touchmove",gn),a.supportPointer?(Oe(c,"pointerup",i._onDrop),!this.nativeDraggable&&Oe(c,"pointercancel",i._onDrop)):(Oe(c,"mouseup",i._onDrop),Oe(c,"touchend",i._onDrop),Oe(c,"touchcancel",i._onDrop)),mo&&this.nativeDraggable&&(this.options.touchStartThreshold=4,k.draggable=!0),at("delayStart",this,{evt:t}),a.delay&&(!a.delayOnTouchOnly||r)&&(!this.nativeDraggable||!(er||Wt))){if(se.eventCanceled){this._onDrop();return}a.supportPointer?(Oe(c,"pointerup",i._disableDelayedDrag),Oe(c,"pointercancel",i._disableDelayedDrag)):(Oe(c,"mouseup",i._disableDelayedDrag),Oe(c,"touchend",i._disableDelayedDrag),Oe(c,"touchcancel",i._disableDelayedDrag)),Oe(c,"mousemove",i._delayedDragTouchMoveHandler),Oe(c,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&Oe(c,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(f,a.delay)}else f()}},_delayedDragTouchMoveHandler:function(t){var r=t.touches?t.touches[0]:t;Math.max(Math.abs(r.clientX-this._lastX),Math.abs(r.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){k&&ui(k),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;Ee(t,"mouseup",this._disableDelayedDrag),Ee(t,"touchend",this._disableDelayedDrag),Ee(t,"touchcancel",this._disableDelayedDrag),Ee(t,"pointerup",this._disableDelayedDrag),Ee(t,"pointercancel",this._disableDelayedDrag),Ee(t,"mousemove",this._delayedDragTouchMoveHandler),Ee(t,"touchmove",this._delayedDragTouchMoveHandler),Ee(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,r){r=r||t.pointerType=="touch"&&t,!this.nativeDraggable||r?this.options.supportPointer?Oe(document,"pointermove",this._onTouchMove):r?Oe(document,"touchmove",this._onTouchMove):Oe(document,"mousemove",this._onTouchMove):(Oe(k,"dragend",this),Oe(Ne,"dragstart",this._onDragStart));try{document.selection?Dr(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,r){if(In=!1,Ne&&k){at("dragStarted",this,{evt:r}),this.nativeDraggable&&Oe(document,"dragover",us);var n=this.options;!t&&ft(k,n.dragClass,!1),ft(k,n.ghostClass,!0),se.active=this,t&&this._appendGhost(),it({sortable:this,name:"start",originalEvent:r})}else this._nulling()},_emulateDragOver:function(){if(Ot){this._lastX=Ot.clientX,this._lastY=Ot.clientY,Fo();for(var t=document.elementFromPoint(Ot.clientX,Ot.clientY),r=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(Ot.clientX,Ot.clientY),t!==r);)r=t;if(k.parentNode[st]._isOutsideThisEl(t),r)do{if(r[st]){var n=void 0;if(n=r[st]._onDragOver({clientX:Ot.clientX,clientY:Ot.clientY,target:t,rootEl:r}),n&&!this.options.dragoverBubble)break}t=r}while(r=Co(r));ko()}},_onTouchMove:function(t){if(mn){var r=this.options,n=r.fallbackTolerance,i=r.fallbackOffset,o=t.touches?t.touches[0]:t,a=ue&&Fn(ue,!0),c=ue&&a&&a.a,f=ue&&a&&a.d,u=Er&&nt&&yo(nt),y=(o.clientX-mn.clientX+i.x)/(c||1)+(u?u[0]-fi[0]:0)/(c||1),m=(o.clientY-mn.clientY+i.y)/(f||1)+(u?u[1]-fi[1]:0)/(f||1);if(!se.active&&!In){if(n&&Math.max(Math.abs(o.clientX-this._lastX),Math.abs(o.clientY-this._lastY))=0&&(it({rootEl:Ve,name:"add",toEl:Ve,fromEl:Ne,originalEvent:t}),it({sortable:this,name:"remove",toEl:Ve,originalEvent:t}),it({rootEl:Ve,name:"sort",toEl:Ve,fromEl:Ne,originalEvent:t}),it({sortable:this,name:"sort",toEl:Ve,originalEvent:t})),Qe&&Qe.save()):ut!==Ln&&ut>=0&&(it({sortable:this,name:"update",toEl:Ve,originalEvent:t}),it({sortable:this,name:"sort",toEl:Ve,originalEvent:t})),se.active&&((ut==null||ut===-1)&&(ut=Ln,on=Jn),it({sortable:this,name:"end",toEl:Ve,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){at("nulling",this),Ne=k=Ve=ue=bn=We=Ar=an=mn=Ot=Yn=ut=on=Ln=Jn=Rn=Qn=Qe=wr=se.dragged=se.ghost=se.clone=se.active=null,Rr.forEach(function(t){t.checked=!0}),Rr.length=li=ci=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":k&&(this._onDragOver(t),ds(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],r,n=this.el.children,i=0,o=n.length,a=this.options;ii.right+o||e.clientY>n.bottom&&e.clientX>n.left:e.clientY>i.bottom+o||e.clientX>n.right&&e.clientY>n.top}function ms(e,t,r,n,i,o,a,c){var f=n?e.clientY:e.clientX,u=n?r.height:r.width,y=n?r.top:r.left,m=n?r.bottom:r.right,O=!1;if(!a){if(c&&Cry+u*o/2:fm-Cr)return-Qn}else if(f>y+u*(1-i)/2&&fm-u*o/2)?f>y+u/2?1:-1:0}function gs(e){return vt(k){e.directive("sortable",t=>{let r=parseInt(t.dataset?.sortableAnimationDuration);r!==0&&!r&&(r=300),t.sortable=Oi.create(t,{group:t.getAttribute("x-sortable-group"),draggable:"[x-sortable-item]",handle:"[x-sortable-handle]",dataIdAttr:"x-sortable-item",animation:r,ghostClass:"fi-sortable-ghost",onEnd(n){let{item:i,to:o,oldDraggableIndex:a,newDraggableIndex:c}=n;if(a===c)return;let f=this.options.draggable,u=o.querySelectorAll(`:scope > ${f}`)[c-1];u&&o.insertBefore(i,u.nextSibling)}})})};var xs=Object.create,Ci=Object.defineProperty,Es=Object.getPrototypeOf,Os=Object.prototype.hasOwnProperty,Ss=Object.getOwnPropertyNames,As=Object.getOwnPropertyDescriptor,Cs=e=>Ci(e,"__esModule",{value:!0}),Bo=(e,t)=>()=>(t||(t={exports:{}},e(t.exports,t)),t.exports),Ds=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ss(t))!Os.call(e,n)&&n!=="default"&&Ci(e,n,{get:()=>t[n],enumerable:!(r=As(t,n))||r.enumerable});return e},Ho=e=>Ds(Cs(Ci(e!=null?xs(Es(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),_s=Bo(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});function t(d){var s=d.getBoundingClientRect();return{width:s.width,height:s.height,top:s.top,right:s.right,bottom:s.bottom,left:s.left,x:s.left,y:s.top}}function r(d){if(d==null)return window;if(d.toString()!=="[object Window]"){var s=d.ownerDocument;return s&&s.defaultView||window}return d}function n(d){var s=r(d),b=s.pageXOffset,_=s.pageYOffset;return{scrollLeft:b,scrollTop:_}}function i(d){var s=r(d).Element;return d instanceof s||d instanceof Element}function o(d){var s=r(d).HTMLElement;return d instanceof s||d instanceof HTMLElement}function a(d){if(typeof ShadowRoot>"u")return!1;var s=r(d).ShadowRoot;return d instanceof s||d instanceof ShadowRoot}function c(d){return{scrollLeft:d.scrollLeft,scrollTop:d.scrollTop}}function f(d){return d===r(d)||!o(d)?n(d):c(d)}function u(d){return d?(d.nodeName||"").toLowerCase():null}function y(d){return((i(d)?d.ownerDocument:d.document)||window.document).documentElement}function m(d){return t(y(d)).left+n(d).scrollLeft}function O(d){return r(d).getComputedStyle(d)}function S(d){var s=O(d),b=s.overflow,_=s.overflowX,T=s.overflowY;return/auto|scroll|overlay|hidden/.test(b+T+_)}function x(d,s,b){b===void 0&&(b=!1);var _=y(s),T=t(d),F=o(s),U={scrollLeft:0,scrollTop:0},H={x:0,y:0};return(F||!F&&!b)&&((u(s)!=="body"||S(_))&&(U=f(s)),o(s)?(H=t(s),H.x+=s.clientLeft,H.y+=s.clientTop):_&&(H.x=m(_))),{x:T.left+U.scrollLeft-H.x,y:T.top+U.scrollTop-H.y,width:T.width,height:T.height}}function M(d){var s=t(d),b=d.offsetWidth,_=d.offsetHeight;return Math.abs(s.width-b)<=1&&(b=s.width),Math.abs(s.height-_)<=1&&(_=s.height),{x:d.offsetLeft,y:d.offsetTop,width:b,height:_}}function I(d){return u(d)==="html"?d:d.assignedSlot||d.parentNode||(a(d)?d.host:null)||y(d)}function $(d){return["html","body","#document"].indexOf(u(d))>=0?d.ownerDocument.body:o(d)&&S(d)?d:$(I(d))}function A(d,s){var b;s===void 0&&(s=[]);var _=$(d),T=_===((b=d.ownerDocument)==null?void 0:b.body),F=r(_),U=T?[F].concat(F.visualViewport||[],S(_)?_:[]):_,H=s.concat(U);return T?H:H.concat(A(I(U)))}function N(d){return["table","td","th"].indexOf(u(d))>=0}function Y(d){return!o(d)||O(d).position==="fixed"?null:d.offsetParent}function ne(d){var s=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,b=navigator.userAgent.indexOf("Trident")!==-1;if(b&&o(d)){var _=O(d);if(_.position==="fixed")return null}for(var T=I(d);o(T)&&["html","body"].indexOf(u(T))<0;){var F=O(T);if(F.transform!=="none"||F.perspective!=="none"||F.contain==="paint"||["transform","perspective"].indexOf(F.willChange)!==-1||s&&F.willChange==="filter"||s&&F.filter&&F.filter!=="none")return T;T=T.parentNode}return null}function J(d){for(var s=r(d),b=Y(d);b&&N(b)&&O(b).position==="static";)b=Y(b);return b&&(u(b)==="html"||u(b)==="body"&&O(b).position==="static")?s:b||ne(d)||s}var V="top",de="bottom",X="right",Q="left",me="auto",l=[V,de,X,Q],h="start",v="end",p="clippingParents",j="viewport",P="popper",R="reference",Z=l.reduce(function(d,s){return d.concat([s+"-"+h,s+"-"+v])},[]),ze=[].concat(l,[me]).reduce(function(d,s){return d.concat([s,s+"-"+h,s+"-"+v])},[]),Rt="beforeRead",Ut="read",Fr="afterRead",kr="beforeMain",Nr="main",Vt="afterMain",nr="beforeWrite",jr="write",rr="afterWrite",It=[Rt,Ut,Fr,kr,Nr,Vt,nr,jr,rr];function Br(d){var s=new Map,b=new Set,_=[];d.forEach(function(F){s.set(F.name,F)});function T(F){b.add(F.name);var U=[].concat(F.requires||[],F.requiresIfExists||[]);U.forEach(function(H){if(!b.has(H)){var G=s.get(H);G&&T(G)}}),_.push(F)}return d.forEach(function(F){b.has(F.name)||T(F)}),_}function mt(d){var s=Br(d);return It.reduce(function(b,_){return b.concat(s.filter(function(T){return T.phase===_}))},[])}function zt(d){var s;return function(){return s||(s=new Promise(function(b){Promise.resolve().then(function(){s=void 0,b(d())})})),s}}function At(d){for(var s=arguments.length,b=new Array(s>1?s-1:0),_=1;_=0,_=b&&o(d)?J(d):d;return i(_)?s.filter(function(T){return i(T)&&Nn(T,_)&&u(T)!=="body"}):[]}function wn(d,s,b){var _=s==="clippingParents"?yn(d):[].concat(s),T=[].concat(_,[b]),F=T[0],U=T.reduce(function(H,G){var oe=sr(d,G);return H.top=gt(oe.top,H.top),H.right=ln(oe.right,H.right),H.bottom=ln(oe.bottom,H.bottom),H.left=gt(oe.left,H.left),H},sr(d,F));return U.width=U.right-U.left,U.height=U.bottom-U.top,U.x=U.left,U.y=U.top,U}function cn(d){return d.split("-")[1]}function dt(d){return["top","bottom"].indexOf(d)>=0?"x":"y"}function lr(d){var s=d.reference,b=d.element,_=d.placement,T=_?ot(_):null,F=_?cn(_):null,U=s.x+s.width/2-b.width/2,H=s.y+s.height/2-b.height/2,G;switch(T){case V:G={x:U,y:s.y-b.height};break;case de:G={x:U,y:s.y+s.height};break;case X:G={x:s.x+s.width,y:H};break;case Q:G={x:s.x-b.width,y:H};break;default:G={x:s.x,y:s.y}}var oe=T?dt(T):null;if(oe!=null){var z=oe==="y"?"height":"width";switch(F){case h:G[oe]=G[oe]-(s[z]/2-b[z]/2);break;case v:G[oe]=G[oe]+(s[z]/2-b[z]/2);break}}return G}function cr(){return{top:0,right:0,bottom:0,left:0}}function fr(d){return Object.assign({},cr(),d)}function ur(d,s){return s.reduce(function(b,_){return b[_]=d,b},{})}function qt(d,s){s===void 0&&(s={});var b=s,_=b.placement,T=_===void 0?d.placement:_,F=b.boundary,U=F===void 0?p:F,H=b.rootBoundary,G=H===void 0?j:H,oe=b.elementContext,z=oe===void 0?P:oe,De=b.altBoundary,Fe=De===void 0?!1:De,Ce=b.padding,xe=Ce===void 0?0:Ce,Me=fr(typeof xe!="number"?xe:ur(xe,l)),Se=z===P?R:P,Be=d.elements.reference,Re=d.rects.popper,He=d.elements[Fe?Se:z],ce=wn(i(He)?He:He.contextElement||y(d.elements.popper),U,G),Pe=t(Be),_e=lr({reference:Pe,element:Re,strategy:"absolute",placement:T}),ke=Xt(Object.assign({},Re,_e)),Le=z===P?ke:Pe,Ye={top:ce.top-Le.top+Me.top,bottom:Le.bottom-ce.bottom+Me.bottom,left:ce.left-Le.left+Me.left,right:Le.right-ce.right+Me.right},$e=d.modifiersData.offset;if(z===P&&$e){var Ue=$e[T];Object.keys(Ye).forEach(function(wt){var et=[X,de].indexOf(wt)>=0?1:-1,Ft=[V,de].indexOf(wt)>=0?"y":"x";Ye[wt]+=Ue[Ft]*et})}return Ye}var dr="Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.",Vr="Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.",xn={placement:"bottom",modifiers:[],strategy:"absolute"};function fn(){for(var d=arguments.length,s=new Array(d),b=0;b100){console.error(Vr);break}if(z.reset===!0){z.reset=!1,Pe=-1;continue}var _e=z.orderedModifiers[Pe],ke=_e.fn,Le=_e.options,Ye=Le===void 0?{}:Le,$e=_e.name;typeof ke=="function"&&(z=ke({state:z,options:Ye,name:$e,instance:Ce})||z)}}},update:zt(function(){return new Promise(function(Se){Ce.forceUpdate(),Se(z)})}),destroy:function(){Me(),Fe=!0}};if(!fn(H,G))return console.error(dr),Ce;Ce.setOptions(oe).then(function(Se){!Fe&&oe.onFirstUpdate&&oe.onFirstUpdate(Se)});function xe(){z.orderedModifiers.forEach(function(Se){var Be=Se.name,Re=Se.options,He=Re===void 0?{}:Re,ce=Se.effect;if(typeof ce=="function"){var Pe=ce({state:z,name:Be,instance:Ce,options:He}),_e=function(){};De.push(Pe||_e)}})}function Me(){De.forEach(function(Se){return Se()}),De=[]}return Ce}}var On={passive:!0};function zr(d){var s=d.state,b=d.instance,_=d.options,T=_.scroll,F=T===void 0?!0:T,U=_.resize,H=U===void 0?!0:U,G=r(s.elements.popper),oe=[].concat(s.scrollParents.reference,s.scrollParents.popper);return F&&oe.forEach(function(z){z.addEventListener("scroll",b.update,On)}),H&&G.addEventListener("resize",b.update,On),function(){F&&oe.forEach(function(z){z.removeEventListener("scroll",b.update,On)}),H&&G.removeEventListener("resize",b.update,On)}}var jn={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:zr,data:{}};function Yr(d){var s=d.state,b=d.name;s.modifiersData[b]=lr({reference:s.rects.reference,element:s.rects.popper,strategy:"absolute",placement:s.placement})}var Bn={name:"popperOffsets",enabled:!0,phase:"read",fn:Yr,data:{}},Xr={top:"auto",right:"auto",bottom:"auto",left:"auto"};function qr(d){var s=d.x,b=d.y,_=window,T=_.devicePixelRatio||1;return{x:Yt(Yt(s*T)/T)||0,y:Yt(Yt(b*T)/T)||0}}function Hn(d){var s,b=d.popper,_=d.popperRect,T=d.placement,F=d.offsets,U=d.position,H=d.gpuAcceleration,G=d.adaptive,oe=d.roundOffsets,z=oe===!0?qr(F):typeof oe=="function"?oe(F):F,De=z.x,Fe=De===void 0?0:De,Ce=z.y,xe=Ce===void 0?0:Ce,Me=F.hasOwnProperty("x"),Se=F.hasOwnProperty("y"),Be=Q,Re=V,He=window;if(G){var ce=J(b),Pe="clientHeight",_e="clientWidth";ce===r(b)&&(ce=y(b),O(ce).position!=="static"&&(Pe="scrollHeight",_e="scrollWidth")),ce=ce,T===V&&(Re=de,xe-=ce[Pe]-_.height,xe*=H?1:-1),T===Q&&(Be=X,Fe-=ce[_e]-_.width,Fe*=H?1:-1)}var ke=Object.assign({position:U},G&&Xr);if(H){var Le;return Object.assign({},ke,(Le={},Le[Re]=Se?"0":"",Le[Be]=Me?"0":"",Le.transform=(He.devicePixelRatio||1)<2?"translate("+Fe+"px, "+xe+"px)":"translate3d("+Fe+"px, "+xe+"px, 0)",Le))}return Object.assign({},ke,(s={},s[Re]=Se?xe+"px":"",s[Be]=Me?Fe+"px":"",s.transform="",s))}function g(d){var s=d.state,b=d.options,_=b.gpuAcceleration,T=_===void 0?!0:_,F=b.adaptive,U=F===void 0?!0:F,H=b.roundOffsets,G=H===void 0?!0:H,oe=O(s.elements.popper).transitionProperty||"";U&&["transform","top","right","bottom","left"].some(function(De){return oe.indexOf(De)>=0})&&console.warn(["Popper: Detected CSS transitions on at least one of the following",'CSS properties: "transform", "top", "right", "bottom", "left".',` `,'Disable the "computeStyles" modifier\'s `adaptive` option to allow',"for smooth transitions, or remove these properties from the CSS","transition declaration on the popper element if only transitioning","opacity or background-color for example.",` `,"We recommend using the popper element as a wrapper around an inner","element that can have any CSS property transitioned for animations."].join(" "));var z={placement:ot(s.placement),popper:s.elements.popper,popperRect:s.rects.popper,gpuAcceleration:T};s.modifiersData.popperOffsets!=null&&(s.styles.popper=Object.assign({},s.styles.popper,Hn(Object.assign({},z,{offsets:s.modifiersData.popperOffsets,position:s.options.strategy,adaptive:U,roundOffsets:G})))),s.modifiersData.arrow!=null&&(s.styles.arrow=Object.assign({},s.styles.arrow,Hn(Object.assign({},z,{offsets:s.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:G})))),s.attributes.popper=Object.assign({},s.attributes.popper,{"data-popper-placement":s.placement})}var w={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:g,data:{}};function C(d){var s=d.state;Object.keys(s.elements).forEach(function(b){var _=s.styles[b]||{},T=s.attributes[b]||{},F=s.elements[b];!o(F)||!u(F)||(Object.assign(F.style,_),Object.keys(T).forEach(function(U){var H=T[U];H===!1?F.removeAttribute(U):F.setAttribute(U,H===!0?"":H)}))})}function L(d){var s=d.state,b={popper:{position:s.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(s.elements.popper.style,b.popper),s.styles=b,s.elements.arrow&&Object.assign(s.elements.arrow.style,b.arrow),function(){Object.keys(s.elements).forEach(function(_){var T=s.elements[_],F=s.attributes[_]||{},U=Object.keys(s.styles.hasOwnProperty(_)?s.styles[_]:b[_]),H=U.reduce(function(G,oe){return G[oe]="",G},{});!o(T)||!u(T)||(Object.assign(T.style,H),Object.keys(F).forEach(function(G){T.removeAttribute(G)}))})}}var q={name:"applyStyles",enabled:!0,phase:"write",fn:C,effect:L,requires:["computeStyles"]};function W(d,s,b){var _=ot(d),T=[Q,V].indexOf(_)>=0?-1:1,F=typeof b=="function"?b(Object.assign({},s,{placement:d})):b,U=F[0],H=F[1];return U=U||0,H=(H||0)*T,[Q,X].indexOf(_)>=0?{x:H,y:U}:{x:U,y:H}}function B(d){var s=d.state,b=d.options,_=d.name,T=b.offset,F=T===void 0?[0,0]:T,U=ze.reduce(function(z,De){return z[De]=W(De,s.rects,F),z},{}),H=U[s.placement],G=H.x,oe=H.y;s.modifiersData.popperOffsets!=null&&(s.modifiersData.popperOffsets.x+=G,s.modifiersData.popperOffsets.y+=oe),s.modifiersData[_]=U}var be={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:B},le={left:"right",right:"left",bottom:"top",top:"bottom"};function pe(d){return d.replace(/left|right|bottom|top/g,function(s){return le[s]})}var ye={start:"end",end:"start"};function Te(d){return d.replace(/start|end/g,function(s){return ye[s]})}function je(d,s){s===void 0&&(s={});var b=s,_=b.placement,T=b.boundary,F=b.rootBoundary,U=b.padding,H=b.flipVariations,G=b.allowedAutoPlacements,oe=G===void 0?ze:G,z=cn(_),De=z?H?Z:Z.filter(function(xe){return cn(xe)===z}):l,Fe=De.filter(function(xe){return oe.indexOf(xe)>=0});Fe.length===0&&(Fe=De,console.error(["Popper: The `allowedAutoPlacements` option did not allow any","placements. Ensure the `placement` option matches the variation","of the allowed placements.",'For example, "auto" cannot be used to allow "bottom-start".','Use "auto-start" instead.'].join(" ")));var Ce=Fe.reduce(function(xe,Me){return xe[Me]=qt(d,{placement:Me,boundary:T,rootBoundary:F,padding:U})[ot(Me)],xe},{});return Object.keys(Ce).sort(function(xe,Me){return Ce[xe]-Ce[Me]})}function Ae(d){if(ot(d)===me)return[];var s=pe(d);return[Te(d),s,Te(s)]}function Ie(d){var s=d.state,b=d.options,_=d.name;if(!s.modifiersData[_]._skip){for(var T=b.mainAxis,F=T===void 0?!0:T,U=b.altAxis,H=U===void 0?!0:U,G=b.fallbackPlacements,oe=b.padding,z=b.boundary,De=b.rootBoundary,Fe=b.altBoundary,Ce=b.flipVariations,xe=Ce===void 0?!0:Ce,Me=b.allowedAutoPlacements,Se=s.options.placement,Be=ot(Se),Re=Be===Se,He=G||(Re||!xe?[pe(Se)]:Ae(Se)),ce=[Se].concat(He).reduce(function(te,ge){return te.concat(ot(ge)===me?je(s,{placement:ge,boundary:z,rootBoundary:De,padding:oe,flipVariations:xe,allowedAutoPlacements:Me}):ge)},[]),Pe=s.rects.reference,_e=s.rects.popper,ke=new Map,Le=!0,Ye=ce[0],$e=0;$e=0,dn=Ft?"width":"height",Qt=qt(s,{placement:Ue,boundary:z,rootBoundary:De,altBoundary:Fe,padding:oe}),kt=Ft?et?X:Q:et?de:V;Pe[dn]>_e[dn]&&(kt=pe(kt));var $n=pe(kt),Zt=[];if(F&&Zt.push(Qt[wt]<=0),H&&Zt.push(Qt[kt]<=0,Qt[$n]<=0),Zt.every(function(te){return te})){Ye=Ue,Le=!1;break}ke.set(Ue,Zt)}if(Le)for(var Sn=xe?3:1,Wn=function(ge){var we=ce.find(function(Ke){var Je=ke.get(Ke);if(Je)return Je.slice(0,ge).every(function(Dt){return Dt})});if(we)return Ye=we,"break"},D=Sn;D>0;D--){var K=Wn(D);if(K==="break")break}s.placement!==Ye&&(s.modifiersData[_]._skip=!0,s.placement=Ye,s.reset=!0)}}var re={name:"flip",enabled:!0,phase:"main",fn:Ie,requiresIfExists:["offset"],data:{_skip:!1}};function he(d){return d==="x"?"y":"x"}function ve(d,s,b){return gt(d,ln(s,b))}function ee(d){var s=d.state,b=d.options,_=d.name,T=b.mainAxis,F=T===void 0?!0:T,U=b.altAxis,H=U===void 0?!1:U,G=b.boundary,oe=b.rootBoundary,z=b.altBoundary,De=b.padding,Fe=b.tether,Ce=Fe===void 0?!0:Fe,xe=b.tetherOffset,Me=xe===void 0?0:xe,Se=qt(s,{boundary:G,rootBoundary:oe,padding:De,altBoundary:z}),Be=ot(s.placement),Re=cn(s.placement),He=!Re,ce=dt(Be),Pe=he(ce),_e=s.modifiersData.popperOffsets,ke=s.rects.reference,Le=s.rects.popper,Ye=typeof Me=="function"?Me(Object.assign({},s.rects,{placement:s.placement})):Me,$e={x:0,y:0};if(_e){if(F||H){var Ue=ce==="y"?V:Q,wt=ce==="y"?de:X,et=ce==="y"?"height":"width",Ft=_e[ce],dn=_e[ce]+Se[Ue],Qt=_e[ce]-Se[wt],kt=Ce?-Le[et]/2:0,$n=Re===h?ke[et]:Le[et],Zt=Re===h?-Le[et]:-ke[et],Sn=s.elements.arrow,Wn=Ce&&Sn?M(Sn):{width:0,height:0},D=s.modifiersData["arrow#persistent"]?s.modifiersData["arrow#persistent"].padding:cr(),K=D[Ue],te=D[wt],ge=ve(0,ke[et],Wn[et]),we=He?ke[et]/2-kt-ge-K-Ye:$n-ge-K-Ye,Ke=He?-ke[et]/2+kt+ge+te+Ye:Zt+ge+te+Ye,Je=s.elements.arrow&&J(s.elements.arrow),Dt=Je?ce==="y"?Je.clientTop||0:Je.clientLeft||0:0,Un=s.modifiersData.offset?s.modifiersData.offset[s.placement][ce]:0,_t=_e[ce]+we-Un-Dt,An=_e[ce]+Ke-Un;if(F){var pn=ve(Ce?ln(dn,_t):dn,Ft,Ce?gt(Qt,An):Qt);_e[ce]=pn,$e[ce]=pn-Ft}if(H){var en=ce==="x"?V:Q,Gr=ce==="x"?de:X,tn=_e[Pe],hn=tn+Se[en],Di=tn-Se[Gr],_i=ve(Ce?ln(hn,_t):hn,tn,Ce?gt(Di,An):Di);_e[Pe]=_i,$e[Pe]=_i-tn}}s.modifiersData[_]=$e}}var ie={name:"preventOverflow",enabled:!0,phase:"main",fn:ee,requiresIfExists:["offset"]},E=function(s,b){return s=typeof s=="function"?s(Object.assign({},b.rects,{placement:b.placement})):s,fr(typeof s!="number"?s:ur(s,l))};function Ge(d){var s,b=d.state,_=d.name,T=d.options,F=b.elements.arrow,U=b.modifiersData.popperOffsets,H=ot(b.placement),G=dt(H),oe=[Q,X].indexOf(H)>=0,z=oe?"height":"width";if(!(!F||!U)){var De=E(T.padding,b),Fe=M(F),Ce=G==="y"?V:Q,xe=G==="y"?de:X,Me=b.rects.reference[z]+b.rects.reference[G]-U[G]-b.rects.popper[z],Se=U[G]-b.rects.reference[G],Be=J(F),Re=Be?G==="y"?Be.clientHeight||0:Be.clientWidth||0:0,He=Me/2-Se/2,ce=De[Ce],Pe=Re-Fe[z]-De[xe],_e=Re/2-Fe[z]/2+He,ke=ve(ce,_e,Pe),Le=G;b.modifiersData[_]=(s={},s[Le]=ke,s.centerOffset=ke-_e,s)}}function fe(d){var s=d.state,b=d.options,_=b.element,T=_===void 0?"[data-popper-arrow]":_;if(T!=null&&!(typeof T=="string"&&(T=s.elements.popper.querySelector(T),!T))){if(o(T)||console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).',"To use an SVG arrow, wrap it in an HTMLElement that will be used as","the arrow."].join(" ")),!Nn(s.elements.popper,T)){console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper',"element."].join(" "));return}s.elements.arrow=T}}var Lt={name:"arrow",enabled:!0,phase:"main",fn:Ge,effect:fe,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function bt(d,s,b){return b===void 0&&(b={x:0,y:0}),{top:d.top-s.height-b.y,right:d.right-s.width+b.x,bottom:d.bottom-s.height+b.y,left:d.left-s.width-b.x}}function Gt(d){return[V,X,de,Q].some(function(s){return d[s]>=0})}function Kt(d){var s=d.state,b=d.name,_=s.rects.reference,T=s.rects.popper,F=s.modifiersData.preventOverflow,U=qt(s,{elementContext:"reference"}),H=qt(s,{altBoundary:!0}),G=bt(U,_),oe=bt(H,T,F),z=Gt(G),De=Gt(oe);s.modifiersData[b]={referenceClippingOffsets:G,popperEscapeOffsets:oe,isReferenceHidden:z,hasPopperEscaped:De},s.attributes.popper=Object.assign({},s.attributes.popper,{"data-popper-reference-hidden":z,"data-popper-escaped":De})}var Jt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Kt},rt=[jn,Bn,w,q],lt=En({defaultModifiers:rt}),yt=[jn,Bn,w,q,be,re,ie,Lt,Jt],un=En({defaultModifiers:yt});e.applyStyles=q,e.arrow=Lt,e.computeStyles=w,e.createPopper=un,e.createPopperLite=lt,e.defaultModifiers=yt,e.detectOverflow=qt,e.eventListeners=jn,e.flip=re,e.hide=Jt,e.offset=be,e.popperGenerator=En,e.popperOffsets=Bn,e.preventOverflow=ie}),$o=Bo(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});var t=_s(),r='',n="tippy-box",i="tippy-content",o="tippy-backdrop",a="tippy-arrow",c="tippy-svg-arrow",f={passive:!0,capture:!0};function u(g,w){return{}.hasOwnProperty.call(g,w)}function y(g,w,C){if(Array.isArray(g)){var L=g[w];return L??(Array.isArray(C)?C[w]:C)}return g}function m(g,w){var C={}.toString.call(g);return C.indexOf("[object")===0&&C.indexOf(w+"]")>-1}function O(g,w){return typeof g=="function"?g.apply(void 0,w):g}function S(g,w){if(w===0)return g;var C;return function(L){clearTimeout(C),C=setTimeout(function(){g(L)},w)}}function x(g,w){var C=Object.assign({},g);return w.forEach(function(L){delete C[L]}),C}function M(g){return g.split(/\s+/).filter(Boolean)}function I(g){return[].concat(g)}function $(g,w){g.indexOf(w)===-1&&g.push(w)}function A(g){return g.filter(function(w,C){return g.indexOf(w)===C})}function N(g){return g.split("-")[0]}function Y(g){return[].slice.call(g)}function ne(g){return Object.keys(g).reduce(function(w,C){return g[C]!==void 0&&(w[C]=g[C]),w},{})}function J(){return document.createElement("div")}function V(g){return["Element","Fragment"].some(function(w){return m(g,w)})}function de(g){return m(g,"NodeList")}function X(g){return m(g,"MouseEvent")}function Q(g){return!!(g&&g._tippy&&g._tippy.reference===g)}function me(g){return V(g)?[g]:de(g)?Y(g):Array.isArray(g)?g:Y(document.querySelectorAll(g))}function l(g,w){g.forEach(function(C){C&&(C.style.transitionDuration=w+"ms")})}function h(g,w){g.forEach(function(C){C&&C.setAttribute("data-state",w)})}function v(g){var w,C=I(g),L=C[0];return!(L==null||(w=L.ownerDocument)==null)&&w.body?L.ownerDocument:document}function p(g,w){var C=w.clientX,L=w.clientY;return g.every(function(q){var W=q.popperRect,B=q.popperState,be=q.props,le=be.interactiveBorder,pe=N(B.placement),ye=B.modifiersData.offset;if(!ye)return!0;var Te=pe==="bottom"?ye.top.y:0,je=pe==="top"?ye.bottom.y:0,Ae=pe==="right"?ye.left.x:0,Ie=pe==="left"?ye.right.x:0,re=W.top-L+Te>le,he=L-W.bottom-je>le,ve=W.left-C+Ae>le,ee=C-W.right-Ie>le;return re||he||ve||ee})}function j(g,w,C){var L=w+"EventListener";["transitionend","webkitTransitionEnd"].forEach(function(q){g[L](q,C)})}var P={isTouch:!1},R=0;function Z(){P.isTouch||(P.isTouch=!0,window.performance&&document.addEventListener("mousemove",ze))}function ze(){var g=performance.now();g-R<20&&(P.isTouch=!1,document.removeEventListener("mousemove",ze)),R=g}function Rt(){var g=document.activeElement;if(Q(g)){var w=g._tippy;g.blur&&!w.state.isVisible&&g.blur()}}function Ut(){document.addEventListener("touchstart",Z,f),window.addEventListener("blur",Rt)}var Fr=typeof window<"u"&&typeof document<"u",kr=Fr?navigator.userAgent:"",Nr=/MSIE |Trident\//.test(kr);function Vt(g){var w=g==="destroy"?"n already-":" ";return[g+"() was called on a"+w+"destroyed instance. This is a no-op but","indicates a potential memory leak."].join(" ")}function nr(g){var w=/[ \t]{2,}/g,C=/^[ \t]*/gm;return g.replace(w," ").replace(C,"").trim()}function jr(g){return nr(` %ctippy.js %c`+nr(g)+` %c\u{1F477}\u200D This is a development-only message. It will be removed in production. `)}function rr(g){return[jr(g),"color: #00C584; font-size: 1.3em; font-weight: bold;","line-height: 1.5","color: #a6a095;"]}var It;Br();function Br(){It=new Set}function mt(g,w){if(g&&!It.has(w)){var C;It.add(w),(C=console).warn.apply(C,rr(w))}}function zt(g,w){if(g&&!It.has(w)){var C;It.add(w),(C=console).error.apply(C,rr(w))}}function At(g){var w=!g,C=Object.prototype.toString.call(g)==="[object Object]"&&!g.addEventListener;zt(w,["tippy() was passed","`"+String(g)+"`","as its targets (first) argument. Valid types are: String, Element,","Element[], or NodeList."].join(" ")),zt(C,["tippy() was passed a plain object which is not supported as an argument","for virtual positioning. Use props.getReferenceClientRect instead."].join(" "))}var Ct={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},Hr={allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999},Ze=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},Ct,{},Hr),$r=Object.keys(Ze),Wr=function(w){gt(w,[]);var C=Object.keys(w);C.forEach(function(L){Ze[L]=w[L]})};function ot(g){var w=g.plugins||[],C=w.reduce(function(L,q){var W=q.name,B=q.defaultValue;return W&&(L[W]=g[W]!==void 0?g[W]:B),L},{});return Object.assign({},g,{},C)}function Ur(g,w){var C=w?Object.keys(ot(Object.assign({},Ze,{plugins:w}))):$r,L=C.reduce(function(q,W){var B=(g.getAttribute("data-tippy-"+W)||"").trim();if(!B)return q;if(W==="content")q[W]=B;else try{q[W]=JSON.parse(B)}catch{q[W]=B}return q},{});return L}function ir(g,w){var C=Object.assign({},w,{content:O(w.content,[g])},w.ignoreAttributes?{}:Ur(g,w.plugins));return C.aria=Object.assign({},Ze.aria,{},C.aria),C.aria={expanded:C.aria.expanded==="auto"?w.interactive:C.aria.expanded,content:C.aria.content==="auto"?w.interactive?null:"describedby":C.aria.content},C}function gt(g,w){g===void 0&&(g={}),w===void 0&&(w=[]);var C=Object.keys(g);C.forEach(function(L){var q=x(Ze,Object.keys(Ct)),W=!u(q,L);W&&(W=w.filter(function(B){return B.name===L}).length===0),mt(W,["`"+L+"`","is not a valid prop. You may have spelled it incorrectly, or if it's","a plugin, forgot to pass it in an array as props.plugins.",` `,`All props: https://atomiks.github.io/tippyjs/v6/all-props/ `,"Plugins: https://atomiks.github.io/tippyjs/v6/plugins/"].join(" "))})}var ln=function(){return"innerHTML"};function Yt(g,w){g[ln()]=w}function or(g){var w=J();return g===!0?w.className=a:(w.className=c,V(g)?w.appendChild(g):Yt(w,g)),w}function Nn(g,w){V(w.content)?(Yt(g,""),g.appendChild(w.content)):typeof w.content!="function"&&(w.allowHTML?Yt(g,w.content):g.textContent=w.content)}function Xt(g){var w=g.firstElementChild,C=Y(w.children);return{box:w,content:C.find(function(L){return L.classList.contains(i)}),arrow:C.find(function(L){return L.classList.contains(a)||L.classList.contains(c)}),backdrop:C.find(function(L){return L.classList.contains(o)})}}function ar(g){var w=J(),C=J();C.className=n,C.setAttribute("data-state","hidden"),C.setAttribute("tabindex","-1");var L=J();L.className=i,L.setAttribute("data-state","hidden"),Nn(L,g.props),w.appendChild(C),C.appendChild(L),q(g.props,g.props);function q(W,B){var be=Xt(w),le=be.box,pe=be.content,ye=be.arrow;B.theme?le.setAttribute("data-theme",B.theme):le.removeAttribute("data-theme"),typeof B.animation=="string"?le.setAttribute("data-animation",B.animation):le.removeAttribute("data-animation"),B.inertia?le.setAttribute("data-inertia",""):le.removeAttribute("data-inertia"),le.style.maxWidth=typeof B.maxWidth=="number"?B.maxWidth+"px":B.maxWidth,B.role?le.setAttribute("role",B.role):le.removeAttribute("role"),(W.content!==B.content||W.allowHTML!==B.allowHTML)&&Nn(pe,g.props),B.arrow?ye?W.arrow!==B.arrow&&(le.removeChild(ye),le.appendChild(or(B.arrow))):le.appendChild(or(B.arrow)):ye&&le.removeChild(ye)}return{popper:w,onUpdate:q}}ar.$$tippy=!0;var sr=1,yn=[],wn=[];function cn(g,w){var C=ir(g,Object.assign({},Ze,{},ot(ne(w)))),L,q,W,B=!1,be=!1,le=!1,pe=!1,ye,Te,je,Ae=[],Ie=S(Re,C.interactiveDebounce),re,he=sr++,ve=null,ee=A(C.plugins),ie={isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},E={id:he,reference:g,popper:J(),popperInstance:ve,props:C,state:ie,plugins:ee,clearDelayTimeouts:Ft,setProps:dn,setContent:Qt,show:kt,hide:$n,hideWithInteractivity:Zt,enable:wt,disable:et,unmount:Sn,destroy:Wn};if(!C.render)return zt(!0,"render() function has not been supplied."),E;var Ge=C.render(E),fe=Ge.popper,Lt=Ge.onUpdate;fe.setAttribute("data-tippy-root",""),fe.id="tippy-"+E.id,E.popper=fe,g._tippy=E,fe._tippy=E;var bt=ee.map(function(D){return D.fn(E)}),Gt=g.hasAttribute("aria-expanded");return Me(),T(),s(),b("onCreate",[E]),C.showOnCreate&&$e(),fe.addEventListener("mouseenter",function(){E.props.interactive&&E.state.isVisible&&E.clearDelayTimeouts()}),fe.addEventListener("mouseleave",function(D){E.props.interactive&&E.props.trigger.indexOf("mouseenter")>=0&&(yt().addEventListener("mousemove",Ie),Ie(D))}),E;function Kt(){var D=E.props.touch;return Array.isArray(D)?D:[D,0]}function Jt(){return Kt()[0]==="hold"}function rt(){var D;return!!((D=E.props.render)!=null&&D.$$tippy)}function lt(){return re||g}function yt(){var D=lt().parentNode;return D?v(D):document}function un(){return Xt(fe)}function d(D){return E.state.isMounted&&!E.state.isVisible||P.isTouch||ye&&ye.type==="focus"?0:y(E.props.delay,D?0:1,Ze.delay)}function s(){fe.style.pointerEvents=E.props.interactive&&E.state.isVisible?"":"none",fe.style.zIndex=""+E.props.zIndex}function b(D,K,te){if(te===void 0&&(te=!0),bt.forEach(function(we){we[D]&&we[D].apply(void 0,K)}),te){var ge;(ge=E.props)[D].apply(ge,K)}}function _(){var D=E.props.aria;if(D.content){var K="aria-"+D.content,te=fe.id,ge=I(E.props.triggerTarget||g);ge.forEach(function(we){var Ke=we.getAttribute(K);if(E.state.isVisible)we.setAttribute(K,Ke?Ke+" "+te:te);else{var Je=Ke&&Ke.replace(te,"").trim();Je?we.setAttribute(K,Je):we.removeAttribute(K)}})}}function T(){if(!(Gt||!E.props.aria.expanded)){var D=I(E.props.triggerTarget||g);D.forEach(function(K){E.props.interactive?K.setAttribute("aria-expanded",E.state.isVisible&&K===lt()?"true":"false"):K.removeAttribute("aria-expanded")})}}function F(){yt().removeEventListener("mousemove",Ie),yn=yn.filter(function(D){return D!==Ie})}function U(D){if(!(P.isTouch&&(le||D.type==="mousedown"))&&!(E.props.interactive&&fe.contains(D.target))){if(lt().contains(D.target)){if(P.isTouch||E.state.isVisible&&E.props.trigger.indexOf("click")>=0)return}else b("onClickOutside",[E,D]);E.props.hideOnClick===!0&&(E.clearDelayTimeouts(),E.hide(),be=!0,setTimeout(function(){be=!1}),E.state.isMounted||z())}}function H(){le=!0}function G(){le=!1}function oe(){var D=yt();D.addEventListener("mousedown",U,!0),D.addEventListener("touchend",U,f),D.addEventListener("touchstart",G,f),D.addEventListener("touchmove",H,f)}function z(){var D=yt();D.removeEventListener("mousedown",U,!0),D.removeEventListener("touchend",U,f),D.removeEventListener("touchstart",G,f),D.removeEventListener("touchmove",H,f)}function De(D,K){Ce(D,function(){!E.state.isVisible&&fe.parentNode&&fe.parentNode.contains(fe)&&K()})}function Fe(D,K){Ce(D,K)}function Ce(D,K){var te=un().box;function ge(we){we.target===te&&(j(te,"remove",ge),K())}if(D===0)return K();j(te,"remove",Te),j(te,"add",ge),Te=ge}function xe(D,K,te){te===void 0&&(te=!1);var ge=I(E.props.triggerTarget||g);ge.forEach(function(we){we.addEventListener(D,K,te),Ae.push({node:we,eventType:D,handler:K,options:te})})}function Me(){Jt()&&(xe("touchstart",Be,{passive:!0}),xe("touchend",He,{passive:!0})),M(E.props.trigger).forEach(function(D){if(D!=="manual")switch(xe(D,Be),D){case"mouseenter":xe("mouseleave",He);break;case"focus":xe(Nr?"focusout":"blur",ce);break;case"focusin":xe("focusout",ce);break}})}function Se(){Ae.forEach(function(D){var K=D.node,te=D.eventType,ge=D.handler,we=D.options;K.removeEventListener(te,ge,we)}),Ae=[]}function Be(D){var K,te=!1;if(!(!E.state.isEnabled||Pe(D)||be)){var ge=((K=ye)==null?void 0:K.type)==="focus";ye=D,re=D.currentTarget,T(),!E.state.isVisible&&X(D)&&yn.forEach(function(we){return we(D)}),D.type==="click"&&(E.props.trigger.indexOf("mouseenter")<0||B)&&E.props.hideOnClick!==!1&&E.state.isVisible?te=!0:$e(D),D.type==="click"&&(B=!te),te&&!ge&&Ue(D)}}function Re(D){var K=D.target,te=lt().contains(K)||fe.contains(K);if(!(D.type==="mousemove"&&te)){var ge=Ye().concat(fe).map(function(we){var Ke,Je=we._tippy,Dt=(Ke=Je.popperInstance)==null?void 0:Ke.state;return Dt?{popperRect:we.getBoundingClientRect(),popperState:Dt,props:C}:null}).filter(Boolean);p(ge,D)&&(F(),Ue(D))}}function He(D){var K=Pe(D)||E.props.trigger.indexOf("click")>=0&&B;if(!K){if(E.props.interactive){E.hideWithInteractivity(D);return}Ue(D)}}function ce(D){E.props.trigger.indexOf("focusin")<0&&D.target!==lt()||E.props.interactive&&D.relatedTarget&&fe.contains(D.relatedTarget)||Ue(D)}function Pe(D){return P.isTouch?Jt()!==D.type.indexOf("touch")>=0:!1}function _e(){ke();var D=E.props,K=D.popperOptions,te=D.placement,ge=D.offset,we=D.getReferenceClientRect,Ke=D.moveTransition,Je=rt()?Xt(fe).arrow:null,Dt=we?{getBoundingClientRect:we,contextElement:we.contextElement||lt()}:g,Un={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(pn){var en=pn.state;if(rt()){var Gr=un(),tn=Gr.box;["placement","reference-hidden","escaped"].forEach(function(hn){hn==="placement"?tn.setAttribute("data-placement",en.placement):en.attributes.popper["data-popper-"+hn]?tn.setAttribute("data-"+hn,""):tn.removeAttribute("data-"+hn)}),en.attributes.popper={}}}},_t=[{name:"offset",options:{offset:ge}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!Ke}},Un];rt()&&Je&&_t.push({name:"arrow",options:{element:Je,padding:3}}),_t.push.apply(_t,K?.modifiers||[]),E.popperInstance=t.createPopper(Dt,fe,Object.assign({},K,{placement:te,onFirstUpdate:je,modifiers:_t}))}function ke(){E.popperInstance&&(E.popperInstance.destroy(),E.popperInstance=null)}function Le(){var D=E.props.appendTo,K,te=lt();E.props.interactive&&D===Ze.appendTo||D==="parent"?K=te.parentNode:K=O(D,[te]),K.contains(fe)||K.appendChild(fe),_e(),mt(E.props.interactive&&D===Ze.appendTo&&te.nextElementSibling!==fe,["Interactive tippy element may not be accessible via keyboard","navigation because it is not directly after the reference element","in the DOM source order.",` `,"Using a wrapper
or tag around the reference element","solves this by creating a new parentNode context.",` `,"Specifying `appendTo: document.body` silences this warning, but it","assumes you are using a focus management solution to handle","keyboard navigation.",` `,"See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity"].join(" "))}function Ye(){return Y(fe.querySelectorAll("[data-tippy-root]"))}function $e(D){E.clearDelayTimeouts(),D&&b("onTrigger",[E,D]),oe();var K=d(!0),te=Kt(),ge=te[0],we=te[1];P.isTouch&&ge==="hold"&&we&&(K=we),K?L=setTimeout(function(){E.show()},K):E.show()}function Ue(D){if(E.clearDelayTimeouts(),b("onUntrigger",[E,D]),!E.state.isVisible){z();return}if(!(E.props.trigger.indexOf("mouseenter")>=0&&E.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(D.type)>=0&&B)){var K=d(!1);K?q=setTimeout(function(){E.state.isVisible&&E.hide()},K):W=requestAnimationFrame(function(){E.hide()})}}function wt(){E.state.isEnabled=!0}function et(){E.hide(),E.state.isEnabled=!1}function Ft(){clearTimeout(L),clearTimeout(q),cancelAnimationFrame(W)}function dn(D){if(mt(E.state.isDestroyed,Vt("setProps")),!E.state.isDestroyed){b("onBeforeUpdate",[E,D]),Se();var K=E.props,te=ir(g,Object.assign({},E.props,{},D,{ignoreAttributes:!0}));E.props=te,Me(),K.interactiveDebounce!==te.interactiveDebounce&&(F(),Ie=S(Re,te.interactiveDebounce)),K.triggerTarget&&!te.triggerTarget?I(K.triggerTarget).forEach(function(ge){ge.removeAttribute("aria-expanded")}):te.triggerTarget&&g.removeAttribute("aria-expanded"),T(),s(),Lt&&Lt(K,te),E.popperInstance&&(_e(),Ye().forEach(function(ge){requestAnimationFrame(ge._tippy.popperInstance.forceUpdate)})),b("onAfterUpdate",[E,D])}}function Qt(D){E.setProps({content:D})}function kt(){mt(E.state.isDestroyed,Vt("show"));var D=E.state.isVisible,K=E.state.isDestroyed,te=!E.state.isEnabled,ge=P.isTouch&&!E.props.touch,we=y(E.props.duration,0,Ze.duration);if(!(D||K||te||ge)&&!lt().hasAttribute("disabled")&&(b("onShow",[E],!1),E.props.onShow(E)!==!1)){if(E.state.isVisible=!0,rt()&&(fe.style.visibility="visible"),s(),oe(),E.state.isMounted||(fe.style.transition="none"),rt()){var Ke=un(),Je=Ke.box,Dt=Ke.content;l([Je,Dt],0)}je=function(){var _t;if(!(!E.state.isVisible||pe)){if(pe=!0,fe.offsetHeight,fe.style.transition=E.props.moveTransition,rt()&&E.props.animation){var An=un(),pn=An.box,en=An.content;l([pn,en],we),h([pn,en],"visible")}_(),T(),$(wn,E),(_t=E.popperInstance)==null||_t.forceUpdate(),E.state.isMounted=!0,b("onMount",[E]),E.props.animation&&rt()&&Fe(we,function(){E.state.isShown=!0,b("onShown",[E])})}},Le()}}function $n(){mt(E.state.isDestroyed,Vt("hide"));var D=!E.state.isVisible,K=E.state.isDestroyed,te=!E.state.isEnabled,ge=y(E.props.duration,1,Ze.duration);if(!(D||K||te)&&(b("onHide",[E],!1),E.props.onHide(E)!==!1)){if(E.state.isVisible=!1,E.state.isShown=!1,pe=!1,B=!1,rt()&&(fe.style.visibility="hidden"),F(),z(),s(),rt()){var we=un(),Ke=we.box,Je=we.content;E.props.animation&&(l([Ke,Je],ge),h([Ke,Je],"hidden"))}_(),T(),E.props.animation?rt()&&De(ge,E.unmount):E.unmount()}}function Zt(D){mt(E.state.isDestroyed,Vt("hideWithInteractivity")),yt().addEventListener("mousemove",Ie),$(yn,Ie),Ie(D)}function Sn(){mt(E.state.isDestroyed,Vt("unmount")),E.state.isVisible&&E.hide(),E.state.isMounted&&(ke(),Ye().forEach(function(D){D._tippy.unmount()}),fe.parentNode&&fe.parentNode.removeChild(fe),wn=wn.filter(function(D){return D!==E}),E.state.isMounted=!1,b("onHidden",[E]))}function Wn(){mt(E.state.isDestroyed,Vt("destroy")),!E.state.isDestroyed&&(E.clearDelayTimeouts(),E.unmount(),Se(),delete g._tippy,E.state.isDestroyed=!0,b("onDestroy",[E]))}}function dt(g,w){w===void 0&&(w={});var C=Ze.plugins.concat(w.plugins||[]);At(g),gt(w,C),Ut();var L=Object.assign({},w,{plugins:C}),q=me(g),W=V(L.content),B=q.length>1;mt(W&&B,["tippy() was passed an Element as the `content` prop, but more than","one tippy instance was created by this invocation. This means the","content element will only be appended to the last tippy instance.",` `,"Instead, pass the .innerHTML of the element, or use a function that","returns a cloned version of the element instead.",` `,`1) content: element.innerHTML `,"2) content: () => element.cloneNode(true)"].join(" "));var be=q.reduce(function(le,pe){var ye=pe&&cn(pe,L);return ye&&le.push(ye),le},[]);return V(g)?be[0]:be}dt.defaultProps=Ze,dt.setDefaultProps=Wr,dt.currentInput=P;var lr=function(w){var C=w===void 0?{}:w,L=C.exclude,q=C.duration;wn.forEach(function(W){var B=!1;if(L&&(B=Q(L)?W.reference===L:W.popper===L.popper),!B){var be=W.props.duration;W.setProps({duration:q}),W.hide(),W.state.isDestroyed||W.setProps({duration:be})}})},cr=Object.assign({},t.applyStyles,{effect:function(w){var C=w.state,L={popper:{position:C.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(C.elements.popper.style,L.popper),C.styles=L,C.elements.arrow&&Object.assign(C.elements.arrow.style,L.arrow)}}),fr=function(w,C){var L;C===void 0&&(C={}),zt(!Array.isArray(w),["The first argument passed to createSingleton() must be an array of","tippy instances. The passed value was",String(w)].join(" "));var q=w,W=[],B,be=C.overrides,le=[],pe=!1;function ye(){W=q.map(function(ee){return ee.reference})}function Te(ee){q.forEach(function(ie){ee?ie.enable():ie.disable()})}function je(ee){return q.map(function(ie){var E=ie.setProps;return ie.setProps=function(Ge){E(Ge),ie.reference===B&&ee.setProps(Ge)},function(){ie.setProps=E}})}function Ae(ee,ie){var E=W.indexOf(ie);if(ie!==B){B=ie;var Ge=(be||[]).concat("content").reduce(function(fe,Lt){return fe[Lt]=q[E].props[Lt],fe},{});ee.setProps(Object.assign({},Ge,{getReferenceClientRect:typeof Ge.getReferenceClientRect=="function"?Ge.getReferenceClientRect:function(){return ie.getBoundingClientRect()}}))}}Te(!1),ye();var Ie={fn:function(){return{onDestroy:function(){Te(!0)},onHidden:function(){B=null},onClickOutside:function(E){E.props.showOnCreate&&!pe&&(pe=!0,B=null)},onShow:function(E){E.props.showOnCreate&&!pe&&(pe=!0,Ae(E,W[0]))},onTrigger:function(E,Ge){Ae(E,Ge.currentTarget)}}}},re=dt(J(),Object.assign({},x(C,["overrides"]),{plugins:[Ie].concat(C.plugins||[]),triggerTarget:W,popperOptions:Object.assign({},C.popperOptions,{modifiers:[].concat(((L=C.popperOptions)==null?void 0:L.modifiers)||[],[cr])})})),he=re.show;re.show=function(ee){if(he(),!B&&ee==null)return Ae(re,W[0]);if(!(B&&ee==null)){if(typeof ee=="number")return W[ee]&&Ae(re,W[ee]);if(q.includes(ee)){var ie=ee.reference;return Ae(re,ie)}if(W.includes(ee))return Ae(re,ee)}},re.showNext=function(){var ee=W[0];if(!B)return re.show(0);var ie=W.indexOf(B);re.show(W[ie+1]||ee)},re.showPrevious=function(){var ee=W[W.length-1];if(!B)return re.show(ee);var ie=W.indexOf(B),E=W[ie-1]||ee;re.show(E)};var ve=re.setProps;return re.setProps=function(ee){be=ee.overrides||be,ve(ee)},re.setInstances=function(ee){Te(!0),le.forEach(function(ie){return ie()}),q=ee,Te(!1),ye(),je(re),re.setProps({triggerTarget:W})},le=je(re),re},ur={mouseover:"mouseenter",focusin:"focus",click:"click"};function qt(g,w){zt(!(w&&w.target),["You must specity a `target` prop indicating a CSS selector string matching","the target elements that should receive a tippy."].join(" "));var C=[],L=[],q=!1,W=w.target,B=x(w,["target"]),be=Object.assign({},B,{trigger:"manual",touch:!1}),le=Object.assign({},B,{showOnCreate:!0}),pe=dt(g,be),ye=I(pe);function Te(he){if(!(!he.target||q)){var ve=he.target.closest(W);if(ve){var ee=ve.getAttribute("data-tippy-trigger")||w.trigger||Ze.trigger;if(!ve._tippy&&!(he.type==="touchstart"&&typeof le.touch=="boolean")&&!(he.type!=="touchstart"&&ee.indexOf(ur[he.type])<0)){var ie=dt(ve,le);ie&&(L=L.concat(ie))}}}}function je(he,ve,ee,ie){ie===void 0&&(ie=!1),he.addEventListener(ve,ee,ie),C.push({node:he,eventType:ve,handler:ee,options:ie})}function Ae(he){var ve=he.reference;je(ve,"touchstart",Te,f),je(ve,"mouseover",Te),je(ve,"focusin",Te),je(ve,"click",Te)}function Ie(){C.forEach(function(he){var ve=he.node,ee=he.eventType,ie=he.handler,E=he.options;ve.removeEventListener(ee,ie,E)}),C=[]}function re(he){var ve=he.destroy,ee=he.enable,ie=he.disable;he.destroy=function(E){E===void 0&&(E=!0),E&&L.forEach(function(Ge){Ge.destroy()}),L=[],Ie(),ve()},he.enable=function(){ee(),L.forEach(function(E){return E.enable()}),q=!1},he.disable=function(){ie(),L.forEach(function(E){return E.disable()}),q=!0},Ae(he)}return ye.forEach(re),pe}var dr={name:"animateFill",defaultValue:!1,fn:function(w){var C;if(!((C=w.props.render)!=null&&C.$$tippy))return zt(w.props.animateFill,"The `animateFill` plugin requires the default render function."),{};var L=Xt(w.popper),q=L.box,W=L.content,B=w.props.animateFill?Vr():null;return{onCreate:function(){B&&(q.insertBefore(B,q.firstElementChild),q.setAttribute("data-animatefill",""),q.style.overflow="hidden",w.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(B){var le=q.style.transitionDuration,pe=Number(le.replace("ms",""));W.style.transitionDelay=Math.round(pe/10)+"ms",B.style.transitionDuration=le,h([B],"visible")}},onShow:function(){B&&(B.style.transitionDuration="0ms")},onHide:function(){B&&h([B],"hidden")}}}};function Vr(){var g=J();return g.className=o,h([g],"hidden"),g}var xn={clientX:0,clientY:0},fn=[];function En(g){var w=g.clientX,C=g.clientY;xn={clientX:w,clientY:C}}function On(g){g.addEventListener("mousemove",En)}function zr(g){g.removeEventListener("mousemove",En)}var jn={name:"followCursor",defaultValue:!1,fn:function(w){var C=w.reference,L=v(w.props.triggerTarget||C),q=!1,W=!1,B=!0,be=w.props;function le(){return w.props.followCursor==="initial"&&w.state.isVisible}function pe(){L.addEventListener("mousemove",je)}function ye(){L.removeEventListener("mousemove",je)}function Te(){q=!0,w.setProps({getReferenceClientRect:null}),q=!1}function je(re){var he=re.target?C.contains(re.target):!0,ve=w.props.followCursor,ee=re.clientX,ie=re.clientY,E=C.getBoundingClientRect(),Ge=ee-E.left,fe=ie-E.top;(he||!w.props.interactive)&&w.setProps({getReferenceClientRect:function(){var bt=C.getBoundingClientRect(),Gt=ee,Kt=ie;ve==="initial"&&(Gt=bt.left+Ge,Kt=bt.top+fe);var Jt=ve==="horizontal"?bt.top:Kt,rt=ve==="vertical"?bt.right:Gt,lt=ve==="horizontal"?bt.bottom:Kt,yt=ve==="vertical"?bt.left:Gt;return{width:rt-yt,height:lt-Jt,top:Jt,right:rt,bottom:lt,left:yt}}})}function Ae(){w.props.followCursor&&(fn.push({instance:w,doc:L}),On(L))}function Ie(){fn=fn.filter(function(re){return re.instance!==w}),fn.filter(function(re){return re.doc===L}).length===0&&zr(L)}return{onCreate:Ae,onDestroy:Ie,onBeforeUpdate:function(){be=w.props},onAfterUpdate:function(he,ve){var ee=ve.followCursor;q||ee!==void 0&&be.followCursor!==ee&&(Ie(),ee?(Ae(),w.state.isMounted&&!W&&!le()&&pe()):(ye(),Te()))},onMount:function(){w.props.followCursor&&!W&&(B&&(je(xn),B=!1),le()||pe())},onTrigger:function(he,ve){X(ve)&&(xn={clientX:ve.clientX,clientY:ve.clientY}),W=ve.type==="focus"},onHidden:function(){w.props.followCursor&&(Te(),ye(),B=!0)}}}};function Yr(g,w){var C;return{popperOptions:Object.assign({},g.popperOptions,{modifiers:[].concat((((C=g.popperOptions)==null?void 0:C.modifiers)||[]).filter(function(L){var q=L.name;return q!==w.name}),[w])})}}var Bn={name:"inlinePositioning",defaultValue:!1,fn:function(w){var C=w.reference;function L(){return!!w.props.inlinePositioning}var q,W=-1,B=!1,be={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(je){var Ae=je.state;L()&&(q!==Ae.placement&&w.setProps({getReferenceClientRect:function(){return le(Ae.placement)}}),q=Ae.placement)}};function le(Te){return Xr(N(Te),C.getBoundingClientRect(),Y(C.getClientRects()),W)}function pe(Te){B=!0,w.setProps(Te),B=!1}function ye(){B||pe(Yr(w.props,be))}return{onCreate:ye,onAfterUpdate:ye,onTrigger:function(je,Ae){if(X(Ae)){var Ie=Y(w.reference.getClientRects()),re=Ie.find(function(he){return he.left-2<=Ae.clientX&&he.right+2>=Ae.clientX&&he.top-2<=Ae.clientY&&he.bottom+2>=Ae.clientY});W=Ie.indexOf(re)}},onUntrigger:function(){W=-1}}}};function Xr(g,w,C,L){if(C.length<2||g===null)return w;if(C.length===2&&L>=0&&C[0].left>C[1].right)return C[L]||w;switch(g){case"top":case"bottom":{var q=C[0],W=C[C.length-1],B=g==="top",be=q.top,le=W.bottom,pe=B?q.left:W.left,ye=B?q.right:W.right,Te=ye-pe,je=le-be;return{top:be,bottom:le,left:pe,right:ye,width:Te,height:je}}case"left":case"right":{var Ae=Math.min.apply(Math,C.map(function(fe){return fe.left})),Ie=Math.max.apply(Math,C.map(function(fe){return fe.right})),re=C.filter(function(fe){return g==="left"?fe.left===Ae:fe.right===Ie}),he=re[0].top,ve=re[re.length-1].bottom,ee=Ae,ie=Ie,E=ie-ee,Ge=ve-he;return{top:he,bottom:ve,left:ee,right:ie,width:E,height:Ge}}default:return w}}var qr={name:"sticky",defaultValue:!1,fn:function(w){var C=w.reference,L=w.popper;function q(){return w.popperInstance?w.popperInstance.state.elements.reference:C}function W(pe){return w.props.sticky===!0||w.props.sticky===pe}var B=null,be=null;function le(){var pe=W("reference")?q().getBoundingClientRect():null,ye=W("popper")?L.getBoundingClientRect():null;(pe&&Hn(B,pe)||ye&&Hn(be,ye))&&w.popperInstance&&w.popperInstance.update(),B=pe,be=ye,w.state.isMounted&&requestAnimationFrame(le)}return{onMount:function(){w.props.sticky&&le()}}}};function Hn(g,w){return g&&w?g.top!==w.top||g.right!==w.right||g.bottom!==w.bottom||g.left!==w.left:!0}dt.setDefaultProps({render:ar}),e.animateFill=dr,e.createSingleton=fr,e.default=dt,e.delegate=qt,e.followCursor=jn,e.hideAll=lr,e.inlinePositioning=Bn,e.roundArrow=r,e.sticky=qr}),Si=Ho($o()),Ts=Ho($o()),Ps=e=>{let t={plugins:[]},r=i=>e[e.indexOf(i)+1];if(e.includes("animation")&&(t.animation=r("animation")),e.includes("duration")&&(t.duration=parseInt(r("duration"))),e.includes("delay")){let i=r("delay");t.delay=i.includes("-")?i.split("-").map(o=>parseInt(o)):parseInt(i)}if(e.includes("cursor")){t.plugins.push(Ts.followCursor);let i=r("cursor");["x","initial"].includes(i)?t.followCursor=i==="x"?"horizontal":"initial":t.followCursor=!0}e.includes("on")&&(t.trigger=r("on")),e.includes("arrowless")&&(t.arrow=!1),e.includes("html")&&(t.allowHTML=!0),e.includes("interactive")&&(t.interactive=!0),e.includes("border")&&t.interactive&&(t.interactiveBorder=parseInt(r("border"))),e.includes("debounce")&&t.interactive&&(t.interactiveDebounce=parseInt(r("debounce"))),e.includes("max-width")&&(t.maxWidth=parseInt(r("max-width"))),e.includes("theme")&&(t.theme=r("theme")),e.includes("placement")&&(t.placement=r("placement"));let n={};return e.includes("no-flip")&&(n.modifiers||(n.modifiers=[]),n.modifiers.push({name:"flip",enabled:!1})),t.popperOptions=n,t};function Ai(e){e.magic("tooltip",t=>(r,n={})=>{let i=n.timeout;delete n.timeout;let o=(0,Si.default)(t,{content:r,trigger:"manual",...n});o.show(),setTimeout(()=>{o.hide(),setTimeout(()=>o.destroy(),n.duration||300)},i||2e3)}),e.directive("tooltip",(t,{modifiers:r,expression:n},{evaluateLater:i,effect:o,cleanup:a})=>{let c=r.length>0?Ps(r):{};t.__x_tippy||(t.__x_tippy=(0,Si.default)(t,c)),a(()=>{t.__x_tippy&&(t.__x_tippy.destroy(),delete t.__x_tippy)});let f=()=>t.__x_tippy.enable(),u=()=>t.__x_tippy.disable(),y=m=>{m?(f(),t.__x_tippy.setContent(m)):u()};if(r.includes("raw"))y(n);else{let m=i(n);o(()=>{m(O=>{typeof O=="object"?(t.__x_tippy.setProps(O),f()):y(O)})})}})}Ai.defaultProps=e=>(Si.default.setDefaultProps(e),Ai);var Ms=Ai,Wo=Ms;var Uo=()=>({toggle(e){this.$refs.panel?.toggle(e)},open(e){this.$refs.panel?.open(e)},close(e){this.$refs.panel?.close(e)}});var Vo=()=>({form:null,isProcessing:!1,processingMessage:null,init(){let e=this.$el.closest("form");e?.addEventListener("form-processing-started",t=>{this.isProcessing=!0,this.processingMessage=t.detail.message}),e?.addEventListener("form-processing-finished",()=>{this.isProcessing=!1})}});var zo=({id:e})=>({isOpen:!1,isWindowVisible:!1,livewire:null,textSelectionClosePreventionMouseDownHandler:null,textSelectionClosePreventionMouseUpHandler:null,textSelectionClosePreventionClickHandler:null,init(){this.$nextTick(()=>{this.isWindowVisible=this.isOpen,this.setUpTextSelectionClosePrevention(),this.$watch("isOpen",()=>this.isWindowVisible=this.isOpen)})},setUpTextSelectionClosePrevention(){let t=".fi-modal-window",r=".fi-modal-close-overlay",i=!1,o=0;this.textSelectionClosePreventionClickHandler=c=>{c.stopPropagation(),c.preventDefault(),document.removeEventListener("click",this.textSelectionClosePreventionClickHandler,!0)};let a=c=>!c.target.closest(t)&&(c.target.closest(r)||c.target.closest("body"));this.textSelectionClosePreventionMouseDownHandler=c=>{o=Date.now(),i=!!c.target.closest(t)},this.textSelectionClosePreventionMouseUpHandler=c=>{let f=Date.now()-o<75;i&&a(c)&&!f?document.addEventListener("click",this.textSelectionClosePreventionClickHandler,!0):document.removeEventListener("click",this.textSelectionClosePreventionClickHandler,!0),i=!1},document.addEventListener("mousedown",this.textSelectionClosePreventionMouseDownHandler,!0),document.addEventListener("mouseup",this.textSelectionClosePreventionMouseUpHandler,!0)},isTopmost(){if(!e)return!0;let t=document.querySelectorAll(".fi-modal-open");return t.length===0?!1:t[t.length-1].id===e},close(){this.closeQuietly(),this.$dispatch("modal-closed",{id:e})},closeQuietly(){this.isOpen=!1},open(){this.$nextTick(()=>{this.isOpen=!0,document.dispatchEvent(new CustomEvent("x-modal-opened",{bubbles:!0,composed:!0,detail:{id:e}}))})},destroy(){this.textSelectionClosePreventionMouseDownHandler&&(document.removeEventListener("mousedown",this.textSelectionClosePreventionMouseDownHandler,!0),this.textSelectionClosePreventionMouseDownHandler=null),this.textSelectionClosePreventionMouseUpHandler&&(document.removeEventListener("mouseup",this.textSelectionClosePreventionMouseUpHandler,!0),this.textSelectionClosePreventionMouseUpHandler=null),this.textSelectionClosePreventionClickHandler&&(document.removeEventListener("click",this.textSelectionClosePreventionClickHandler,!0),this.textSelectionClosePreventionClickHandler=null)}});document.addEventListener("livewire:init",()=>{let e=t=>{let r=Alpine.findClosest(t,n=>n.__livewire);if(!r)throw"Could not find Livewire component in DOM tree.";return r.__livewire};Livewire.interceptMessage(({message:t,onSuccess:r})=>{r(({payload:o})=>{queueMicrotask(()=>{if(!o.effects?.html)for(let[a,c]of Object.entries(o.effects?.partials??{})){let f=Array.from(t.component.el.querySelectorAll(`[wire\\:partial="${a}"]`)).filter(x=>e(x)===t.component);if(!f.length)continue;if(f.length>1)throw`Multiple elements found for partial [${a}].`;let u=f[0],y=u.parentElement?u.parentElement.tagName.toLowerCase():"div",m=document.createElement(y);m.innerHTML=c,m.__livewire=t.component;let O=m.firstElementChild;O.__livewire=t.component;let S={};u.querySelectorAll("[wire\\:id]").forEach(x=>{S[x.getAttribute("wire:id")]=x}),O.querySelectorAll("[wire\\:id]").forEach(x=>{if(x.hasAttribute("wire:snapshot"))return;let M=x.getAttribute("wire:id"),I=S[M];I&&x.replaceWith(I.cloneNode(!0))}),window.Alpine.morph(u,O,{updating:(x,M,I,$)=>{if(!n(x)){if(x.__livewire_replace===!0&&(x.innerHTML=M.innerHTML),x.__livewire_replace_self===!0)return x.outerHTML=M.outerHTML,$();if(x.__livewire_ignore===!0||(x.__livewire_ignore_self===!0&&I(),i(x)&&x.getAttribute("wire:id")!==t.component.id))return $();i(x)&&(M.__livewire=t.component)}},key:x=>{if(!n(x))return x.hasAttribute("wire:key")?x.getAttribute("wire:key"):x.hasAttribute("wire:id")?x.getAttribute("wire:id"):x.id},lookahead:!1})}})});function n(o){return typeof o.hasAttribute!="function"}function i(o){return o.hasAttribute("wire:id")}})});var Yo=(e,t,r)=>{let n=(y,m)=>{for(let O of y){let S=i(O,m);if(S!==null)return S}},i=(y,m)=>{let O=y.match(/^[\{\[]([^\[\]\{\}]*)[\}\]](.*)/s);if(O===null||O.length!==3)return null;let S=O[1],x=O[2];if(S.includes(",")){let[M,I]=S.split(",",2);if(I==="*"&&m>=M)return x;if(M==="*"&&m<=I)return x;if(m>=M&&m<=I)return x}return S==m?x:null},o=y=>y.toString().charAt(0).toUpperCase()+y.toString().slice(1),a=(y,m)=>{if(m.length===0)return y;let O={};for(let[S,x]of Object.entries(m))O[":"+o(S??"")]=o(x??""),O[":"+S.toUpperCase()]=x.toString().toUpperCase(),O[":"+S]=x;return Object.entries(O).forEach(([S,x])=>{y=y.replaceAll(S,x)}),y},c=y=>y.map(m=>m.replace(/^[\{\[]([^\[\]\{\}]*)[\}\]]/,"")),f=e.split("|"),u=n(f,t);return u!=null?a(u.trim(),r):(f=c(f),a(f.length>1&&t>1?f[1]:f[0],r))};document.addEventListener("alpine:init",()=>{window.Alpine.plugin(oo),window.Alpine.plugin(ao),window.Alpine.plugin(fo),window.Alpine.plugin(jo),window.Alpine.plugin(Wo),window.Alpine.data("filamentDropdown",Uo),window.Alpine.data("filamentFormButton",Vo),window.Alpine.data("filamentModal",zo)});window.jsMd5=Xo.md5;window.pluralize=Yo;})(); /*! Bundled license information: js-md5/src/md5.js: (** * [js-md5]{@link https://github.com/emn178/js-md5} * * @namespace md5 * @version 0.8.3 * @author Chen, Yi-Cyuan [emn178@gmail.com] * @copyright Chen, Yi-Cyuan 2014-2023 * @license MIT *) sortablejs/modular/sortable.esm.js: (**! * Sortable 1.15.6 * @author RubaXa * @author owenm * @license MIT *) */ ================================================ FILE: public/js/filament/tables/components/columns/checkbox.js ================================================ function a({name:r,recordKey:s,state:n}){return{error:void 0,isLoading:!1,state:n,unsubscribeLivewireHook:null,init(){this.unsubscribeLivewireHook=Livewire.interceptMessage(({message:e,onSuccess:t})=>{t(()=>{this.$nextTick(()=>{if(this.isLoading||e.component.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let i=this.getServerState();i===void 0||Alpine.raw(this.state)===i||(this.state=i)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||Alpine.raw(this.state)===e)return;this.isLoading=!0;let t=await this.$wire.updateTableColumnState(r,s,this.state);this.error=t?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.state?"1":"0"),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[1,"1"].includes(this.$refs.serverState.value)},destroy(){this.unsubscribeLivewireHook?.()}}}export{a as default}; ================================================ FILE: public/js/filament/tables/components/columns/select.js ================================================ var Ft=Math.min,vt=Math.max,Ht=Math.round;var st=n=>({x:n,y:n}),ji={left:"right",right:"left",bottom:"top",top:"bottom"},qi={start:"end",end:"start"};function De(n,t,e){return vt(n,Ft(t,e))}function Vt(n,t){return typeof n=="function"?n(t):n}function wt(n){return n.split("-")[0]}function Wt(n){return n.split("-")[1]}function Ae(n){return n==="x"?"y":"x"}function Ce(n){return n==="y"?"height":"width"}var Ji=new Set(["top","bottom"]);function ht(n){return Ji.has(wt(n))?"y":"x"}function Le(n){return Ae(ht(n))}function Je(n,t,e){e===void 0&&(e=!1);let i=Wt(n),o=Le(n),s=Ce(o),r=o==="x"?i===(e?"end":"start")?"right":"left":i==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(r=Bt(r)),[r,Bt(r)]}function Qe(n){let t=Bt(n);return[ie(n),t,ie(t)]}function ie(n){return n.replace(/start|end/g,t=>qi[t])}var je=["left","right"],qe=["right","left"],Qi=["top","bottom"],Zi=["bottom","top"];function tn(n,t,e){switch(n){case"top":case"bottom":return e?t?qe:je:t?je:qe;case"left":case"right":return t?Qi:Zi;default:return[]}}function Ze(n,t,e,i){let o=Wt(n),s=tn(wt(n),e==="start",i);return o&&(s=s.map(r=>r+"-"+o),t&&(s=s.concat(s.map(ie)))),s}function Bt(n){return n.replace(/left|right|bottom|top/g,t=>ji[t])}function en(n){return{top:0,right:0,bottom:0,left:0,...n}}function ti(n){return typeof n!="number"?en(n):{top:n,right:n,bottom:n,left:n}}function Ot(n){let{x:t,y:e,width:i,height:o}=n;return{width:i,height:o,top:e,left:t,right:t+i,bottom:e+o,x:t,y:e}}function ei(n,t,e){let{reference:i,floating:o}=n,s=ht(t),r=Le(t),a=Ce(r),l=wt(t),c=s==="y",f=i.x+i.width/2-o.width/2,d=i.y+i.height/2-o.height/2,p=i[a]/2-o[a]/2,u;switch(l){case"top":u={x:f,y:i.y-o.height};break;case"bottom":u={x:f,y:i.y+i.height};break;case"right":u={x:i.x+i.width,y:d};break;case"left":u={x:i.x-o.width,y:d};break;default:u={x:i.x,y:i.y}}switch(Wt(t)){case"start":u[r]-=p*(e&&c?-1:1);break;case"end":u[r]+=p*(e&&c?-1:1);break}return u}var ii=async(n,t,e)=>{let{placement:i="bottom",strategy:o="absolute",middleware:s=[],platform:r}=e,a=s.filter(Boolean),l=await(r.isRTL==null?void 0:r.isRTL(t)),c=await r.getElementRects({reference:n,floating:t,strategy:o}),{x:f,y:d}=ei(c,i,l),p=i,u={},g=0;for(let m=0;mH<=0)){var L,X;let H=(((L=s.flip)==null?void 0:L.index)||0)+1,tt=q[H];if(tt&&(!(d==="alignment"?y!==ht(tt):!1)||W.every(B=>ht(B.placement)===y?B.overflows[0]>0:!0)))return{data:{index:H,overflows:W},reset:{placement:tt}};let z=(X=W.filter(Y=>Y.overflows[0]<=0).sort((Y,B)=>Y.overflows[1]-B.overflows[1])[0])==null?void 0:X.placement;if(!z)switch(u){case"bestFit":{var M;let Y=(M=W.filter(B=>{if(F){let et=ht(B.placement);return et===y||et==="y"}return!0}).map(B=>[B.placement,B.overflows.filter(et=>et>0).reduce((et,ee)=>et+ee,0)]).sort((B,et)=>B[1]-et[1])[0])==null?void 0:M[0];Y&&(z=Y);break}case"initialPlacement":z=a;break}if(o!==z)return{reset:{placement:z}}}return{}}}};var nn=new Set(["left","top"]);async function on(n,t){let{placement:e,platform:i,elements:o}=n,s=await(i.isRTL==null?void 0:i.isRTL(o.floating)),r=wt(e),a=Wt(e),l=ht(e)==="y",c=nn.has(r)?-1:1,f=s&&l?-1:1,d=Vt(t,n),{mainAxis:p,crossAxis:u,alignmentAxis:g}=typeof d=="number"?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return a&&typeof g=="number"&&(u=a==="end"?g*-1:g),l?{x:u*f,y:p*c}:{x:p*c,y:u*f}}var oi=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(t){var e,i;let{x:o,y:s,placement:r,middlewareData:a}=t,l=await on(t,n);return r===((e=a.offset)==null?void 0:e.placement)&&(i=a.arrow)!=null&&i.alignmentOffset?{}:{x:o+l.x,y:s+l.y,data:{...l,placement:r}}}}},si=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(t){let{x:e,y:i,placement:o}=t,{mainAxis:s=!0,crossAxis:r=!1,limiter:a={fn:S=>{let{x:E,y}=S;return{x:E,y}}},...l}=Vt(n,t),c={x:e,y:i},f=await Ie(t,l),d=ht(wt(o)),p=Ae(d),u=c[p],g=c[d];if(s){let S=p==="y"?"top":"left",E=p==="y"?"bottom":"right",y=u+f[S],D=u-f[E];u=De(y,u,D)}if(r){let S=d==="y"?"top":"left",E=d==="y"?"bottom":"right",y=g+f[S],D=g-f[E];g=De(y,g,D)}let m=a.fn({...t,[p]:u,[d]:g});return{...m,data:{x:m.x-e,y:m.y-i,enabled:{[p]:s,[d]:r}}}}}};function oe(){return typeof window<"u"}function Et(n){return ai(n)?(n.nodeName||"").toLowerCase():"#document"}function U(n){var t;return(n==null||(t=n.ownerDocument)==null?void 0:t.defaultView)||window}function ct(n){var t;return(t=(ai(n)?n.ownerDocument:n.document)||window.document)==null?void 0:t.documentElement}function ai(n){return oe()?n instanceof Node||n instanceof U(n).Node:!1}function it(n){return oe()?n instanceof Element||n instanceof U(n).Element:!1}function rt(n){return oe()?n instanceof HTMLElement||n instanceof U(n).HTMLElement:!1}function ri(n){return!oe()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof U(n).ShadowRoot}var sn=new Set(["inline","contents"]);function It(n){let{overflow:t,overflowX:e,overflowY:i,display:o}=nt(n);return/auto|scroll|overlay|hidden|clip/.test(t+i+e)&&!sn.has(o)}var rn=new Set(["table","td","th"]);function li(n){return rn.has(Et(n))}var an=[":popover-open",":modal"];function zt(n){return an.some(t=>{try{return n.matches(t)}catch{return!1}})}var ln=["transform","translate","scale","rotate","perspective"],cn=["transform","translate","scale","rotate","perspective","filter"],dn=["paint","layout","strict","content"];function se(n){let t=re(),e=it(n)?nt(n):n;return ln.some(i=>e[i]?e[i]!=="none":!1)||(e.containerType?e.containerType!=="normal":!1)||!t&&(e.backdropFilter?e.backdropFilter!=="none":!1)||!t&&(e.filter?e.filter!=="none":!1)||cn.some(i=>(e.willChange||"").includes(i))||dn.some(i=>(e.contain||"").includes(i))}function ci(n){let t=ut(n);for(;rt(t)&&!Dt(t);){if(se(t))return t;if(zt(t))return null;t=ut(t)}return null}function re(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var fn=new Set(["html","body","#document"]);function Dt(n){return fn.has(Et(n))}function nt(n){return U(n).getComputedStyle(n)}function $t(n){return it(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function ut(n){if(Et(n)==="html")return n;let t=n.assignedSlot||n.parentNode||ri(n)&&n.host||ct(n);return ri(t)?t.host:t}function di(n){let t=ut(n);return Dt(t)?n.ownerDocument?n.ownerDocument.body:n.body:rt(t)&&It(t)?t:di(t)}function ne(n,t,e){var i;t===void 0&&(t=[]),e===void 0&&(e=!0);let o=di(n),s=o===((i=n.ownerDocument)==null?void 0:i.body),r=U(o);if(s){let a=ae(r);return t.concat(r,r.visualViewport||[],It(o)?o:[],a&&e?ne(a):[])}return t.concat(o,ne(o,[],e))}function ae(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function pi(n){let t=nt(n),e=parseFloat(t.width)||0,i=parseFloat(t.height)||0,o=rt(n),s=o?n.offsetWidth:e,r=o?n.offsetHeight:i,a=Ht(e)!==s||Ht(i)!==r;return a&&(e=s,i=r),{width:e,height:i,$:a}}function gi(n){return it(n)?n:n.contextElement}function Tt(n){let t=gi(n);if(!rt(t))return st(1);let e=t.getBoundingClientRect(),{width:i,height:o,$:s}=pi(t),r=(s?Ht(e.width):e.width)/i,a=(s?Ht(e.height):e.height)/o;return(!r||!Number.isFinite(r))&&(r=1),(!a||!Number.isFinite(a))&&(a=1),{x:r,y:a}}var hn=st(0);function mi(n){let t=U(n);return!re()||!t.visualViewport?hn:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function un(n,t,e){return t===void 0&&(t=!1),!e||t&&e!==U(n)?!1:t}function Xt(n,t,e,i){t===void 0&&(t=!1),e===void 0&&(e=!1);let o=n.getBoundingClientRect(),s=gi(n),r=st(1);t&&(i?it(i)&&(r=Tt(i)):r=Tt(n));let a=un(s,e,i)?mi(s):st(0),l=(o.left+a.x)/r.x,c=(o.top+a.y)/r.y,f=o.width/r.x,d=o.height/r.y;if(s){let p=U(s),u=i&&it(i)?U(i):i,g=p,m=ae(g);for(;m&&i&&u!==g;){let S=Tt(m),E=m.getBoundingClientRect(),y=nt(m),D=E.left+(m.clientLeft+parseFloat(y.paddingLeft))*S.x,A=E.top+(m.clientTop+parseFloat(y.paddingTop))*S.y;l*=S.x,c*=S.y,f*=S.x,d*=S.y,l+=D,c+=A,g=U(m),m=ae(g)}}return Ot({width:f,height:d,x:l,y:c})}function le(n,t){let e=$t(n).scrollLeft;return t?t.left+e:Xt(ct(n)).left+e}function bi(n,t){let e=n.getBoundingClientRect(),i=e.left+t.scrollLeft-le(n,e),o=e.top+t.scrollTop;return{x:i,y:o}}function pn(n){let{elements:t,rect:e,offsetParent:i,strategy:o}=n,s=o==="fixed",r=ct(i),a=t?zt(t.floating):!1;if(i===r||a&&s)return e;let l={scrollLeft:0,scrollTop:0},c=st(1),f=st(0),d=rt(i);if((d||!d&&!s)&&((Et(i)!=="body"||It(r))&&(l=$t(i)),rt(i))){let u=Xt(i);c=Tt(i),f.x=u.x+i.clientLeft,f.y=u.y+i.clientTop}let p=r&&!d&&!s?bi(r,l):st(0);return{width:e.width*c.x,height:e.height*c.y,x:e.x*c.x-l.scrollLeft*c.x+f.x+p.x,y:e.y*c.y-l.scrollTop*c.y+f.y+p.y}}function gn(n){return Array.from(n.getClientRects())}function mn(n){let t=ct(n),e=$t(n),i=n.ownerDocument.body,o=vt(t.scrollWidth,t.clientWidth,i.scrollWidth,i.clientWidth),s=vt(t.scrollHeight,t.clientHeight,i.scrollHeight,i.clientHeight),r=-e.scrollLeft+le(n),a=-e.scrollTop;return nt(i).direction==="rtl"&&(r+=vt(t.clientWidth,i.clientWidth)-o),{width:o,height:s,x:r,y:a}}var fi=25;function bn(n,t){let e=U(n),i=ct(n),o=e.visualViewport,s=i.clientWidth,r=i.clientHeight,a=0,l=0;if(o){s=o.width,r=o.height;let f=re();(!f||f&&t==="fixed")&&(a=o.offsetLeft,l=o.offsetTop)}let c=le(i);if(c<=0){let f=i.ownerDocument,d=f.body,p=getComputedStyle(d),u=f.compatMode==="CSS1Compat"&&parseFloat(p.marginLeft)+parseFloat(p.marginRight)||0,g=Math.abs(i.clientWidth-d.clientWidth-u);g<=fi&&(s-=g)}else c<=fi&&(s+=c);return{width:s,height:r,x:a,y:l}}var vn=new Set(["absolute","fixed"]);function wn(n,t){let e=Xt(n,!0,t==="fixed"),i=e.top+n.clientTop,o=e.left+n.clientLeft,s=rt(n)?Tt(n):st(1),r=n.clientWidth*s.x,a=n.clientHeight*s.y,l=o*s.x,c=i*s.y;return{width:r,height:a,x:l,y:c}}function hi(n,t,e){let i;if(t==="viewport")i=bn(n,e);else if(t==="document")i=mn(ct(n));else if(it(t))i=wn(t,e);else{let o=mi(n);i={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return Ot(i)}function vi(n,t){let e=ut(n);return e===t||!it(e)||Dt(e)?!1:nt(e).position==="fixed"||vi(e,t)}function yn(n,t){let e=t.get(n);if(e)return e;let i=ne(n,[],!1).filter(a=>it(a)&&Et(a)!=="body"),o=null,s=nt(n).position==="fixed",r=s?ut(n):n;for(;it(r)&&!Dt(r);){let a=nt(r),l=se(r);!l&&a.position==="fixed"&&(o=null),(s?!l&&!o:!l&&a.position==="static"&&!!o&&vn.has(o.position)||It(r)&&!l&&vi(n,r))?i=i.filter(f=>f!==r):o=a,r=ut(r)}return t.set(n,i),i}function Sn(n){let{element:t,boundary:e,rootBoundary:i,strategy:o}=n,r=[...e==="clippingAncestors"?zt(t)?[]:yn(t,this._c):[].concat(e),i],a=r[0],l=r.reduce((c,f)=>{let d=hi(t,f,o);return c.top=vt(d.top,c.top),c.right=Ft(d.right,c.right),c.bottom=Ft(d.bottom,c.bottom),c.left=vt(d.left,c.left),c},hi(t,a,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function xn(n){let{width:t,height:e}=pi(n);return{width:t,height:e}}function On(n,t,e){let i=rt(t),o=ct(t),s=e==="fixed",r=Xt(n,!0,s,t),a={scrollLeft:0,scrollTop:0},l=st(0);function c(){l.x=le(o)}if(i||!i&&!s)if((Et(t)!=="body"||It(o))&&(a=$t(t)),i){let u=Xt(t,!0,s,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else o&&c();s&&!i&&o&&c();let f=o&&!i&&!s?bi(o,a):st(0),d=r.left+a.scrollLeft-l.x-f.x,p=r.top+a.scrollTop-l.y-f.y;return{x:d,y:p,width:r.width,height:r.height}}function Te(n){return nt(n).position==="static"}function ui(n,t){if(!rt(n)||nt(n).position==="fixed")return null;if(t)return t(n);let e=n.offsetParent;return ct(n)===e&&(e=e.ownerDocument.body),e}function wi(n,t){let e=U(n);if(zt(n))return e;if(!rt(n)){let o=ut(n);for(;o&&!Dt(o);){if(it(o)&&!Te(o))return o;o=ut(o)}return e}let i=ui(n,t);for(;i&&li(i)&&Te(i);)i=ui(i,t);return i&&Dt(i)&&Te(i)&&!se(i)?e:i||ci(n)||e}var En=async function(n){let t=this.getOffsetParent||wi,e=this.getDimensions,i=await e(n.floating);return{reference:On(n.reference,await t(n.floating),n.strategy),floating:{x:0,y:0,width:i.width,height:i.height}}};function Dn(n){return nt(n).direction==="rtl"}var An={convertOffsetParentRelativeRectToViewportRelativeRect:pn,getDocumentElement:ct,getClippingRect:Sn,getOffsetParent:wi,getElementRects:En,getClientRects:gn,getDimensions:xn,getScale:Tt,isElement:it,isRTL:Dn};var yi=oi;var Si=si,xi=ni;var Oi=(n,t,e)=>{let i=new Map,o={platform:An,...e},s={...o.platform,_c:i};return ii(n,t,{...o,platform:s})};function Ei(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter(function(o){return Object.getOwnPropertyDescriptor(n,o).enumerable})),e.push.apply(e,i)}return e}function ft(n){for(var t=1;t=0)&&(e[o]=n[o]);return e}function In(n,t){if(n==null)return{};var e=Ln(n,t),i,o;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(n);for(o=0;o=0)&&Object.prototype.propertyIsEnumerable.call(n,i)&&(e[i]=n[i])}return e}var Tn="1.15.6";function pt(n){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(n)}var mt=pt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Zt=pt(/Edge/i),Di=pt(/firefox/i),Gt=pt(/safari/i)&&!pt(/chrome/i)&&!pt(/android/i),Xe=pt(/iP(ad|od|hone)/i),Pi=pt(/chrome/i)&&pt(/android/i),Mi={capture:!1,passive:!1};function O(n,t,e){n.addEventListener(t,e,!mt&&Mi)}function x(n,t,e){n.removeEventListener(t,e,!mt&&Mi)}function ve(n,t){if(t){if(t[0]===">"&&(t=t.substring(1)),n)try{if(n.matches)return n.matches(t);if(n.msMatchesSelector)return n.msMatchesSelector(t);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(t)}catch{return!1}return!1}}function Ni(n){return n.host&&n!==document&&n.host.nodeType?n.host:n.parentNode}function lt(n,t,e,i){if(n){e=e||document;do{if(t!=null&&(t[0]===">"?n.parentNode===e&&ve(n,t):ve(n,t))||i&&n===e)return n;if(n===e)break}while(n=Ni(n))}return null}var Ai=/\s+/g;function Q(n,t,e){if(n&&t)if(n.classList)n.classList[e?"add":"remove"](t);else{var i=(" "+n.className+" ").replace(Ai," ").replace(" "+t+" "," ");n.className=(i+(e?" "+t:"")).replace(Ai," ")}}function b(n,t,e){var i=n&&n.style;if(i){if(e===void 0)return document.defaultView&&document.defaultView.getComputedStyle?e=document.defaultView.getComputedStyle(n,""):n.currentStyle&&(e=n.currentStyle),t===void 0?e:e[t];!(t in i)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),i[t]=e+(typeof e=="string"?"":"px")}}function Nt(n,t){var e="";if(typeof n=="string")e=n;else do{var i=b(n,"transform");i&&i!=="none"&&(e=i+" "+e)}while(!t&&(n=n.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(e)}function ki(n,t,e){if(n){var i=n.getElementsByTagName(t),o=0,s=i.length;if(e)for(;o=s:r=o<=s,!r)return i;if(i===dt())break;i=xt(i,!1)}return!1}function kt(n,t,e,i){for(var o=0,s=0,r=n.children;s2&&arguments[2]!==void 0?arguments[2]:{},o=i.evt,s=In(i,Fn);te.pluginEvent.bind(v)(t,e,ft({dragEl:h,parentEl:R,ghostEl:w,rootEl:I,nextEl:Lt,lastDownEl:pe,cloneEl:T,cloneHidden:St,dragStarted:Kt,putSortable:V,activeSortable:v.active,originalEvent:o,oldIndex:Mt,oldDraggableIndex:qt,newIndex:Z,newDraggableIndex:yt,hideGhostForTarget:Xi,unhideGhostForTarget:Ki,cloneNowHidden:function(){St=!0},cloneNowShown:function(){St=!1},dispatchSortableEvent:function(a){K({sortable:e,name:a,originalEvent:o})}},s))};function K(n){Bn(ft({putSortable:V,cloneEl:T,targetEl:h,rootEl:I,oldIndex:Mt,oldDraggableIndex:qt,newIndex:Z,newDraggableIndex:yt},n))}var h,R,w,I,Lt,pe,T,St,Mt,Z,qt,yt,ce,V,Pt=!1,we=!1,ye=[],At,at,Pe,Me,Ii,Ti,Kt,Rt,Jt,Qt=!1,de=!1,ge,$,Ne=[],Ve=!1,Se=[],Oe=typeof document<"u",fe=Xe,_i=Zt||mt?"cssFloat":"float",Hn=Oe&&!Pi&&!Xe&&"draggable"in document.createElement("div"),Wi=(function(){if(Oe){if(mt)return!1;var n=document.createElement("x");return n.style.cssText="pointer-events:auto",n.style.pointerEvents==="auto"}})(),zi=function(t,e){var i=b(t),o=parseInt(i.width)-parseInt(i.paddingLeft)-parseInt(i.paddingRight)-parseInt(i.borderLeftWidth)-parseInt(i.borderRightWidth),s=kt(t,0,e),r=kt(t,1,e),a=s&&b(s),l=r&&b(r),c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+k(s).width,f=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+k(r).width;if(i.display==="flex")return i.flexDirection==="column"||i.flexDirection==="column-reverse"?"vertical":"horizontal";if(i.display==="grid")return i.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(s&&a.float&&a.float!=="none"){var d=a.float==="left"?"left":"right";return r&&(l.clear==="both"||l.clear===d)?"vertical":"horizontal"}return s&&(a.display==="block"||a.display==="flex"||a.display==="table"||a.display==="grid"||c>=o&&i[_i]==="none"||r&&i[_i]==="none"&&c+f>o)?"vertical":"horizontal"},Vn=function(t,e,i){var o=i?t.left:t.top,s=i?t.right:t.bottom,r=i?t.width:t.height,a=i?e.left:e.top,l=i?e.right:e.bottom,c=i?e.width:e.height;return o===a||s===l||o+r/2===a+c/2},Wn=function(t,e){var i;return ye.some(function(o){var s=o[j].options.emptyInsertThreshold;if(!(!s||Ke(o))){var r=k(o),a=t>=r.left-s&&t<=r.right+s,l=e>=r.top-s&&e<=r.bottom+s;if(a&&l)return i=o}}),i},$i=function(t){function e(s,r){return function(a,l,c,f){var d=a.options.group.name&&l.options.group.name&&a.options.group.name===l.options.group.name;if(s==null&&(r||d))return!0;if(s==null||s===!1)return!1;if(r&&s==="clone")return s;if(typeof s=="function")return e(s(a,l,c,f),r)(a,l,c,f);var p=(r?a:l).options.group.name;return s===!0||typeof s=="string"&&s===p||s.join&&s.indexOf(p)>-1}}var i={},o=t.group;(!o||ue(o)!="object")&&(o={name:o}),i.name=o.name,i.checkPull=e(o.pull,!0),i.checkPut=e(o.put),i.revertClone=o.revertClone,t.group=i},Xi=function(){!Wi&&w&&b(w,"display","none")},Ki=function(){!Wi&&w&&b(w,"display","")};Oe&&!Pi&&document.addEventListener("click",function(n){if(we)return n.preventDefault(),n.stopPropagation&&n.stopPropagation(),n.stopImmediatePropagation&&n.stopImmediatePropagation(),we=!1,!1},!0);var Ct=function(t){if(h){t=t.touches?t.touches[0]:t;var e=Wn(t.clientX,t.clientY);if(e){var i={};for(var o in t)t.hasOwnProperty(o)&&(i[o]=t[o]);i.target=i.rootEl=e,i.preventDefault=void 0,i.stopPropagation=void 0,e[j]._onDragOver(i)}}},zn=function(t){h&&h.parentNode[j]._isOutsideThisEl(t.target)};function v(n,t){if(!(n&&n.nodeType&&n.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(n));this.el=n,this.options=t=gt({},t),n[j]=this;var e={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(n.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return zi(n,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(r,a){r.setData("Text",a.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:v.supportPointer!==!1&&"PointerEvent"in window&&(!Gt||Xe),emptyInsertThreshold:5};te.initializePlugins(this,n,e);for(var i in e)!(i in t)&&(t[i]=e[i]);$i(t);for(var o in this)o.charAt(0)==="_"&&typeof this[o]=="function"&&(this[o]=this[o].bind(this));this.nativeDraggable=t.forceFallback?!1:Hn,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?O(n,"pointerdown",this._onTapStart):(O(n,"mousedown",this._onTapStart),O(n,"touchstart",this._onTapStart)),this.nativeDraggable&&(O(n,"dragover",this),O(n,"dragenter",this)),ye.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),gt(this,Mn())}v.prototype={constructor:v,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Rt=null)},_getDirection:function(t,e){return typeof this.options.direction=="function"?this.options.direction.call(this,t,e,h):this.options.direction},_onTapStart:function(t){if(t.cancelable){var e=this,i=this.el,o=this.options,s=o.preventOnFilter,r=t.type,a=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,l=(a||t).target,c=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||l,f=o.filter;if(qn(i),!h&&!(/mousedown|pointerdown/.test(r)&&t.button!==0||o.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&Gt&&l&&l.tagName.toUpperCase()==="SELECT")&&(l=lt(l,o.draggable,i,!1),!(l&&l.animated)&&pe!==l)){if(Mt=ot(l),qt=ot(l,o.draggable),typeof f=="function"){if(f.call(this,t,l,this)){K({sortable:e,rootEl:c,name:"filter",targetEl:l,toEl:i,fromEl:i}),G("filter",e,{evt:t}),s&&t.preventDefault();return}}else if(f&&(f=f.split(",").some(function(d){if(d=lt(c,d.trim(),i,!1),d)return K({sortable:e,rootEl:d,name:"filter",targetEl:l,fromEl:i,toEl:i}),G("filter",e,{evt:t}),!0}),f)){s&&t.preventDefault();return}o.handle&&!lt(c,o.handle,i,!1)||this._prepareDragStart(t,a,l)}}},_prepareDragStart:function(t,e,i){var o=this,s=o.el,r=o.options,a=s.ownerDocument,l;if(i&&!h&&i.parentNode===s){var c=k(i);if(I=s,h=i,R=h.parentNode,Lt=h.nextSibling,pe=i,ce=r.group,v.dragged=h,At={target:h,clientX:(e||t).clientX,clientY:(e||t).clientY},Ii=At.clientX-c.left,Ti=At.clientY-c.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,h.style["will-change"]="all",l=function(){if(G("delayEnded",o,{evt:t}),v.eventCanceled){o._onDrop();return}o._disableDelayedDragEvents(),!Di&&o.nativeDraggable&&(h.draggable=!0),o._triggerDragStart(t,e),K({sortable:o,name:"choose",originalEvent:t}),Q(h,r.chosenClass,!0)},r.ignore.split(",").forEach(function(f){ki(h,f.trim(),ke)}),O(a,"dragover",Ct),O(a,"mousemove",Ct),O(a,"touchmove",Ct),r.supportPointer?(O(a,"pointerup",o._onDrop),!this.nativeDraggable&&O(a,"pointercancel",o._onDrop)):(O(a,"mouseup",o._onDrop),O(a,"touchend",o._onDrop),O(a,"touchcancel",o._onDrop)),Di&&this.nativeDraggable&&(this.options.touchStartThreshold=4,h.draggable=!0),G("delayStart",this,{evt:t}),r.delay&&(!r.delayOnTouchOnly||e)&&(!this.nativeDraggable||!(Zt||mt))){if(v.eventCanceled){this._onDrop();return}r.supportPointer?(O(a,"pointerup",o._disableDelayedDrag),O(a,"pointercancel",o._disableDelayedDrag)):(O(a,"mouseup",o._disableDelayedDrag),O(a,"touchend",o._disableDelayedDrag),O(a,"touchcancel",o._disableDelayedDrag)),O(a,"mousemove",o._delayedDragTouchMoveHandler),O(a,"touchmove",o._delayedDragTouchMoveHandler),r.supportPointer&&O(a,"pointermove",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(l,r.delay)}else l()}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){h&&ke(h),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;x(t,"mouseup",this._disableDelayedDrag),x(t,"touchend",this._disableDelayedDrag),x(t,"touchcancel",this._disableDelayedDrag),x(t,"pointerup",this._disableDelayedDrag),x(t,"pointercancel",this._disableDelayedDrag),x(t,"mousemove",this._delayedDragTouchMoveHandler),x(t,"touchmove",this._delayedDragTouchMoveHandler),x(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||t.pointerType=="touch"&&t,!this.nativeDraggable||e?this.options.supportPointer?O(document,"pointermove",this._onTouchMove):e?O(document,"touchmove",this._onTouchMove):O(document,"mousemove",this._onTouchMove):(O(h,"dragend",this),O(I,"dragstart",this._onDragStart));try{document.selection?me(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,e){if(Pt=!1,I&&h){G("dragStarted",this,{evt:e}),this.nativeDraggable&&O(document,"dragover",zn);var i=this.options;!t&&Q(h,i.dragClass,!1),Q(h,i.ghostClass,!0),v.active=this,t&&this._appendGhost(),K({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Xi();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY),t!==e);)e=t;if(h.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){var i=void 0;if(i=e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e}),i&&!this.options.dragoverBubble)break}t=e}while(e=Ni(e));Ki()}},_onTouchMove:function(t){if(At){var e=this.options,i=e.fallbackTolerance,o=e.fallbackOffset,s=t.touches?t.touches[0]:t,r=w&&Nt(w,!0),a=w&&r&&r.a,l=w&&r&&r.d,c=fe&&$&&Li($),f=(s.clientX-At.clientX+o.x)/(a||1)+(c?c[0]-Ne[0]:0)/(a||1),d=(s.clientY-At.clientY+o.y)/(l||1)+(c?c[1]-Ne[1]:0)/(l||1);if(!v.active&&!Pt){if(i&&Math.max(Math.abs(s.clientX-this._lastX),Math.abs(s.clientY-this._lastY))=0&&(K({rootEl:R,name:"add",toEl:R,fromEl:I,originalEvent:t}),K({sortable:this,name:"remove",toEl:R,originalEvent:t}),K({rootEl:R,name:"sort",toEl:R,fromEl:I,originalEvent:t}),K({sortable:this,name:"sort",toEl:R,originalEvent:t})),V&&V.save()):Z!==Mt&&Z>=0&&(K({sortable:this,name:"update",toEl:R,originalEvent:t}),K({sortable:this,name:"sort",toEl:R,originalEvent:t})),v.active&&((Z==null||Z===-1)&&(Z=Mt,yt=qt),K({sortable:this,name:"end",toEl:R,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){G("nulling",this),I=h=R=w=Lt=T=pe=St=At=at=Kt=Z=yt=Mt=qt=Rt=Jt=V=ce=v.dragged=v.ghost=v.clone=v.active=null,Se.forEach(function(t){t.checked=!0}),Se.length=Pe=Me=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":h&&(this._onDragOver(t),$n(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],e,i=this.el.children,o=0,s=i.length,r=this.options;oo.right+s||n.clientY>i.bottom&&n.clientX>i.left:n.clientY>o.bottom+s||n.clientX>i.right&&n.clientY>i.top}function Un(n,t,e,i,o,s,r,a){var l=i?n.clientY:n.clientX,c=i?e.height:e.width,f=i?e.top:e.left,d=i?e.bottom:e.right,p=!1;if(!r){if(a&&gef+c*s/2:ld-ge)return-Jt}else if(l>f+c*(1-o)/2&&ld-c*s/2)?l>f+c/2?1:-1:0}function Gn(n){return ot(h){},options:L,optionsLimit:X=null,placeholder:M,position:H=null,searchableOptionFields:tt=["label"],searchDebounce:z=1e3,searchingMessage:Y="Searching...",searchPrompt:B="Search...",state:et,statePath:ee=null}){this.canOptionLabelsWrap=t,this.canSelectPlaceholder=e,this.element=i,this.getOptionLabelUsing=o,this.getOptionLabelsUsing=s,this.getOptionsUsing=r,this.getSearchResultsUsing=a,this.hasDynamicOptions=l,this.hasDynamicSearchResults=c,this.hasInitialNoOptionsMessage=f,this.initialOptionLabel=d,this.initialOptionLabels=p,this.initialState=u,this.isAutofocused=g,this.isDisabled=m,this.isHtmlAllowed=S,this.isMultiple=E,this.isReorderable=y,this.isSearchable=D,this.livewireId=A,this.loadingMessage=C,this.maxItems=F,this.maxItemsMessage=q,this.noOptionsMessage=J,this.noSearchResultsMessage=_,this.onStateChange=W,this.options=L,this.optionsLimit=X,this.originalOptions=JSON.parse(JSON.stringify(L)),this.placeholder=M,this.position=H,this.searchableOptionFields=Array.isArray(tt)?tt:["label"],this.searchDebounce=z,this.searchingMessage=Y,this.searchPrompt=B,this.state=et,this.statePath=ee,this.activeSearchId=0,this.labelRepository={},this.isOpen=!1,this.selectedIndex=-1,this.searchQuery="",this.searchTimeout=null,this.isSearching=!1,this.selectedDisplayVersion=0,this.render(),this.setUpEventListeners(),this.isAutofocused&&this.selectButton.focus()}populateLabelRepositoryFromOptions(t){if(!(!t||!Array.isArray(t)))for(let e of t)e.options&&Array.isArray(e.options)?this.populateLabelRepositoryFromOptions(e.options):e.value!==void 0&&e.label!==void 0&&(this.labelRepository[e.value]=e.label)}render(){this.populateLabelRepositoryFromOptions(this.options),this.container=document.createElement("div"),this.container.className="fi-select-input-ctn",this.canOptionLabelsWrap||this.container.classList.add("fi-select-input-ctn-option-labels-not-wrapped"),this.container.setAttribute("aria-haspopup","listbox"),this.selectButton=document.createElement("button"),this.selectButton.className="fi-select-input-btn",this.selectButton.type="button",this.selectButton.setAttribute("aria-expanded","false"),this.selectedDisplay=document.createElement("div"),this.selectedDisplay.className="fi-select-input-value-ctn",this.updateSelectedDisplay(),this.selectButton.appendChild(this.selectedDisplay),this.dropdown=document.createElement("div"),this.dropdown.className="fi-dropdown-panel fi-scrollable",this.dropdown.setAttribute("role","listbox"),this.dropdown.setAttribute("tabindex","-1"),this.dropdown.style.display="none",this.dropdownId=`fi-select-input-dropdown-${Math.random().toString(36).substring(2,11)}`,this.dropdown.id=this.dropdownId,this.isMultiple&&this.dropdown.setAttribute("aria-multiselectable","true"),this.isSearchable&&(this.searchContainer=document.createElement("div"),this.searchContainer.className="fi-select-input-search-ctn",this.searchInput=document.createElement("input"),this.searchInput.className="fi-input",this.searchInput.type="text",this.searchInput.placeholder=this.searchPrompt,this.searchInput.setAttribute("aria-label","Search"),this.searchContainer.appendChild(this.searchInput),this.dropdown.appendChild(this.searchContainer),this.searchInput.addEventListener("input",t=>{this.isDisabled||this.handleSearch(t)}),this.searchInput.addEventListener("keydown",t=>{if(!this.isDisabled){if(t.key==="Tab"){t.preventDefault();let e=this.getVisibleOptions();if(e.length===0)return;t.shiftKey?this.selectedIndex=e.length-1:this.selectedIndex=0,e.forEach(i=>{i.classList.remove("fi-selected")}),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus()}else if(t.key==="ArrowDown"){if(t.preventDefault(),t.stopPropagation(),this.getVisibleOptions().length===0)return;this.selectedIndex=-1,this.searchInput.blur(),this.focusNextOption()}else if(t.key==="ArrowUp"){t.preventDefault(),t.stopPropagation();let e=this.getVisibleOptions();if(e.length===0)return;this.selectedIndex=e.length-1,this.searchInput.blur(),e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus(),e[this.selectedIndex].id&&this.dropdown.setAttribute("aria-activedescendant",e[this.selectedIndex].id),this.scrollOptionIntoView(e[this.selectedIndex])}else if(t.key==="Enter"){if(t.preventDefault(),t.stopPropagation(),this.isSearching)return;let e=this.getVisibleOptions();if(e.length===0)return;let i=e.find(s=>{let r=s.getAttribute("aria-disabled")==="true",a=s.classList.contains("fi-disabled"),l=s.offsetParent===null;return!(r||a||l)});if(!i)return;let o=i.getAttribute("data-value");if(o===null)return;this.selectOption(o)}}})),this.optionsList=document.createElement("ul"),this.renderOptions(),this.container.appendChild(this.selectButton),this.container.appendChild(this.dropdown),this.element.appendChild(this.container),this.applyDisabledState()}renderOptions(){this.optionsList.innerHTML="";let t=0,e=this.options,i=0,o=!1;this.options.forEach(a=>{a.options&&Array.isArray(a.options)?(i+=a.options.length,o=!0):i++}),o?this.optionsList.className="fi-select-input-options-ctn":i>0&&(this.optionsList.className="fi-dropdown-list");let s=o?null:this.optionsList,r=0;for(let a of e){if(this.optionsLimit>0&&r>=this.optionsLimit)break;if(a.options&&Array.isArray(a.options)){let l=a.options;if(this.isMultiple&&Array.isArray(this.state)&&this.state.length>0&&(l=a.options.filter(c=>!this.state.includes(c.value))),l.length>0){if(this.optionsLimit>0){let c=this.optionsLimit-r;c{let a=this.createOptionElement(r.value,r);s.appendChild(a)}),i.appendChild(o),i.appendChild(s),this.optionsList.appendChild(i)}createOptionElement(t,e){let i=t,o=e,s=!1;typeof e=="object"&&e!==null&&"label"in e&&"value"in e&&(i=e.value,o=e.label,s=e.isDisabled||!1);let r=document.createElement("li");r.className="fi-dropdown-list-item fi-select-input-option",s&&r.classList.add("fi-disabled");let a=`fi-select-input-option-${Math.random().toString(36).substring(2,11)}`;if(r.id=a,r.setAttribute("role","option"),r.setAttribute("data-value",i),r.setAttribute("tabindex","0"),s&&r.setAttribute("aria-disabled","true"),this.isHtmlAllowed&&typeof o=="string"){let f=document.createElement("div");f.innerHTML=o;let d=f.textContent||f.innerText||o;r.setAttribute("aria-label",d)}let l=this.isMultiple?Array.isArray(this.state)&&this.state.includes(i):this.state===i;r.setAttribute("aria-selected",l?"true":"false"),l&&r.classList.add("fi-selected");let c=document.createElement("span");return this.isHtmlAllowed?c.innerHTML=o:c.textContent=o,r.appendChild(c),s||r.addEventListener("click",f=>{f.preventDefault(),f.stopPropagation(),this.selectOption(i),this.isMultiple&&(this.isSearchable&&this.searchInput?setTimeout(()=>{this.searchInput.focus()},0):setTimeout(()=>{r.focus()},0))}),r}async updateSelectedDisplay(){this.selectedDisplayVersion=this.selectedDisplayVersion+1;let t=this.selectedDisplayVersion,e=document.createDocumentFragment();if(this.isMultiple){if(!Array.isArray(this.state)||this.state.length===0){let o=document.createElement("span");o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o)}else{let o=await this.getLabelsForMultipleSelection();if(t!==this.selectedDisplayVersion)return;this.addBadgesForSelectedOptions(o,e)}t===this.selectedDisplayVersion&&(this.selectedDisplay.replaceChildren(e),this.isOpen&&this.deferPositionDropdown());return}if(this.state===null||this.state===""){let o=document.createElement("span");if(o.textContent=this.placeholder,o.classList.add("fi-select-input-placeholder"),e.appendChild(o),t===this.selectedDisplayVersion){this.selectedDisplay.replaceChildren(e);let s=this.container.querySelector(".fi-select-input-value-remove-btn");s&&s.remove(),this.container.classList.remove("fi-select-input-ctn-clearable")}return}let i=await this.getLabelForSingleSelection();t===this.selectedDisplayVersion&&(this.addSingleSelectionDisplay(i,e),t===this.selectedDisplayVersion&&this.selectedDisplay.replaceChildren(e))}async getLabelsForMultipleSelection(){let t=this.getSelectedOptionLabels(),e=[];if(Array.isArray(this.state)){for(let o of this.state)if(!P(this.labelRepository[o])){if(P(t[o])){this.labelRepository[o]=t[o];continue}e.push(o.toString())}}if(e.length>0&&P(this.initialOptionLabels)&&JSON.stringify(this.state)===JSON.stringify(this.initialState)){if(Array.isArray(this.initialOptionLabels))for(let o of this.initialOptionLabels)P(o)&&o.value!==void 0&&o.label!==void 0&&e.includes(o.value)&&(this.labelRepository[o.value]=o.label)}else if(e.length>0&&this.getOptionLabelsUsing)try{let o=await this.getOptionLabelsUsing();for(let s of o)P(s)&&s.value!==void 0&&s.label!==void 0&&(this.labelRepository[s.value]=s.label)}catch(o){console.error("Error fetching option labels:",o)}let i=[];if(Array.isArray(this.state))for(let o of this.state)P(this.labelRepository[o])?i.push(this.labelRepository[o]):P(t[o])?i.push(t[o]):i.push(o);return i}createBadgeElement(t,e){let i=document.createElement("span");i.className="fi-badge fi-size-md fi-color fi-color-primary fi-text-color-600 dark:fi-text-color-200",P(t)&&i.setAttribute("data-value",t);let o=document.createElement("span");o.className="fi-badge-label-ctn";let s=document.createElement("span");s.className="fi-badge-label",this.canOptionLabelsWrap&&s.classList.add("fi-wrapped"),this.isHtmlAllowed?s.innerHTML=e:s.textContent=e,o.appendChild(s),i.appendChild(o);let r=this.createRemoveButton(t,e);return i.appendChild(r),i}createRemoveButton(t,e){let i=document.createElement("button");return i.type="button",i.className="fi-badge-delete-btn",i.innerHTML='',i.setAttribute("aria-label","Remove "+(this.isHtmlAllowed?e.replace(/<[^>]*>/g,""):e)),i.addEventListener("click",o=>{o.stopPropagation(),P(t)&&this.selectOption(t)}),i.addEventListener("keydown",o=>{(o.key===" "||o.key==="Enter")&&(o.preventDefault(),o.stopPropagation(),P(t)&&this.selectOption(t))}),i}addBadgesForSelectedOptions(t,e=this.selectedDisplay){let i=document.createElement("div");i.className="fi-select-input-value-badges-ctn",t.forEach((o,s)=>{let r=Array.isArray(this.state)?this.state[s]:null,a=this.createBadgeElement(r,o);i.appendChild(a)}),e.appendChild(i),this.isReorderable&&(i.addEventListener("click",o=>{o.stopPropagation()}),i.addEventListener("mousedown",o=>{o.stopPropagation()}),new Ui(i,{animation:150,onEnd:()=>{let o=[];i.querySelectorAll("[data-value]").forEach(s=>{o.push(s.getAttribute("data-value"))}),this.state=o,this.onStateChange(this.state)}}))}async getLabelForSingleSelection(){let t=this.labelRepository[this.state];if(bt(t)&&(t=this.getSelectedOptionLabel(this.state)),bt(t)&&P(this.initialOptionLabel)&&this.state===this.initialState)t=this.initialOptionLabel,P(this.state)&&(this.labelRepository[this.state]=t);else if(bt(t)&&this.getOptionLabelUsing)try{t=await this.getOptionLabelUsing(),P(t)&&P(this.state)&&(this.labelRepository[this.state]=t)}catch(e){console.error("Error fetching option label:",e),t=this.state}else bt(t)&&(t=this.state);return t}addSingleSelectionDisplay(t,e=this.selectedDisplay){let i=document.createElement("span");if(i.className="fi-select-input-value-label",this.isHtmlAllowed?i.innerHTML=t:i.textContent=t,e.appendChild(i),!this.canSelectPlaceholder||this.container.querySelector(".fi-select-input-value-remove-btn"))return;let o=document.createElement("button");o.type="button",o.className="fi-select-input-value-remove-btn",o.innerHTML='',o.setAttribute("aria-label","Clear selection"),o.addEventListener("click",s=>{s.stopPropagation(),this.selectOption("")}),o.addEventListener("keydown",s=>{(s.key===" "||s.key==="Enter")&&(s.preventDefault(),s.stopPropagation(),this.selectOption(""))}),this.container.appendChild(o),this.container.classList.add("fi-select-input-ctn-clearable")}getSelectedOptionLabel(t){if(P(this.labelRepository[t]))return this.labelRepository[t];let e="";for(let i of this.options)if(i.options&&Array.isArray(i.options)){for(let o of i.options)if(o.value===t){e=o.label,this.labelRepository[t]=e;break}}else if(i.value===t){e=i.label,this.labelRepository[t]=e;break}return e}setUpEventListeners(){this.buttonClickListener=()=>{this.toggleDropdown()},this.documentClickListener=t=>{!this.container.contains(t.target)&&this.isOpen&&this.closeDropdown()},this.buttonKeydownListener=t=>{this.isDisabled||this.handleSelectButtonKeydown(t)},this.dropdownKeydownListener=t=>{this.isDisabled||this.isSearchable&&document.activeElement===this.searchInput&&!["Tab","Escape"].includes(t.key)||this.handleDropdownKeydown(t)},this.selectButton.addEventListener("click",this.buttonClickListener),document.addEventListener("click",this.documentClickListener),this.selectButton.addEventListener("keydown",this.buttonKeydownListener),this.dropdown.addEventListener("keydown",this.dropdownKeydownListener),!this.isMultiple&&this.livewireId&&this.statePath&&this.getOptionLabelUsing&&(this.refreshOptionLabelListener=async t=>{if(t.detail.livewireId===this.livewireId&&t.detail.statePath===this.statePath&&P(this.state))try{delete this.labelRepository[this.state];let e=await this.getOptionLabelUsing();P(e)&&(this.labelRepository[this.state]=e);let i=this.selectedDisplay.querySelector(".fi-select-input-value-label");P(i)&&(this.isHtmlAllowed?i.innerHTML=e:i.textContent=e),this.updateOptionLabelInList(this.state,e)}catch(e){console.error("Error refreshing option label:",e)}},window.addEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener))}updateOptionLabelInList(t,e){this.labelRepository[t]=e;let i=this.getVisibleOptions();for(let o of i)if(o.getAttribute("data-value")===String(t)){if(o.innerHTML="",this.isHtmlAllowed){let s=document.createElement("span");s.innerHTML=e,o.appendChild(s)}else o.appendChild(document.createTextNode(e));break}for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}for(let o of this.originalOptions)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===t){s.label=e;break}}else if(o.value===t){o.label=e;break}}handleSelectButtonKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusNextOption():this.openDropdown();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.isOpen?this.focusPreviousOption():this.openDropdown();break;case" ":if(t.preventDefault(),this.isOpen){if(this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}}else this.openDropdown();break;case"Enter":break;case"Escape":this.isOpen&&(t.preventDefault(),this.closeDropdown());break;case"Tab":this.isOpen&&this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.isOpen||this.openDropdown(),this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}handleDropdownKeydown(t){switch(t.key){case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.focusNextOption();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.focusPreviousOption();break;case" ":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}break;case"Enter":if(t.preventDefault(),this.selectedIndex>=0){let e=this.getVisibleOptions()[this.selectedIndex];e&&e.click()}else{let e=this.element.closest("form");e&&e.submit()}break;case"Escape":t.preventDefault(),this.closeDropdown(),this.selectButton.focus();break;case"Tab":this.closeDropdown();break;default:if(this.isSearchable&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&typeof t.key=="string"&&t.key.length===1){t.preventDefault();let e=t.key;this.searchInput&&(this.searchInput.focus(),this.searchInput.value=(this.searchInput.value||"")+e,this.searchInput.dispatchEvent(new Event("input",{bubbles:!0})))}break}}toggleDropdown(){if(!this.isDisabled){if(this.isOpen){this.closeDropdown();return}this.isMultiple&&!this.isSearchable&&!this.hasAvailableOptions()||this.openDropdown()}}hasAvailableOptions(){for(let t of this.options)if(t.options&&Array.isArray(t.options)){for(let e of t.options)if(!Array.isArray(this.state)||!this.state.includes(e.value))return!0}else if(!Array.isArray(this.state)||!this.state.includes(t.value))return!0;return!1}async openDropdown(){this.dropdown.style.display="block",this.dropdown.style.opacity="0";let t=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;if(this.dropdown.style.position=t?"fixed":"absolute",this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.selectButton.setAttribute("aria-expanded","true"),this.isOpen=!0,this.positionDropdown(),this.resizeListener||(this.resizeListener=()=>{this.dropdown.style.width=`${this.selectButton.offsetWidth}px`,this.positionDropdown()},window.addEventListener("resize",this.resizeListener)),this.scrollListener||(this.scrollListener=()=>this.positionDropdown(),window.addEventListener("scroll",this.scrollListener,!0)),this.dropdown.style.opacity="1",this.isSearchable&&this.searchInput&&(this.searchInput.value="",this.searchQuery="",this.hasDynamicOptions||(this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())),this.hasDynamicOptions&&this.getOptionsUsing){this.showLoadingState(!1);try{let e=await this.getOptionsUsing(),i=Array.isArray(e)?e:e&&Array.isArray(e.options)?e.options:[];if(this.options=i,this.originalOptions=JSON.parse(JSON.stringify(i)),this.populateLabelRepositoryFromOptions(i),this.isSearchable&&this.searchInput&&(this.searchInput.value&&this.searchInput.value.trim()!==""||this.searchQuery&&this.searchQuery.trim()!=="")){let o=(this.searchInput.value||this.searchQuery||"").trim().toLowerCase();this.hideLoadingState(),this.filterOptions(o)}else this.renderOptions()}catch(e){console.error("Error fetching options:",e),this.hideLoadingState()}}else(!this.hasInitialNoOptionsMessage||this.searchQuery)&&this.hideLoadingState();if(this.isSearchable&&this.searchInput)this.searchInput.focus();else{this.selectedIndex=-1;let e=this.getVisibleOptions();if(this.isMultiple){if(Array.isArray(this.state)&&this.state.length>0){for(let i=0;i0&&(this.selectedIndex=0),this.selectedIndex>=0&&(e[this.selectedIndex].classList.add("fi-selected"),e[this.selectedIndex].focus())}}positionDropdown(){let t=this.position==="top"?"top-start":"bottom-start",e=[yi(4),Si({padding:5})];this.position!=="top"&&this.position!=="bottom"&&e.push(xi());let i=this.selectButton.closest(".fi-fixed-positioning-context")!==null&&this.selectButton.closest(".fi-absolute-positioning-context")===null;Oi(this.selectButton,this.dropdown,{placement:t,middleware:e,strategy:i?"fixed":"absolute"}).then(({x:o,y:s})=>{Object.assign(this.dropdown.style,{left:`${o}px`,top:`${s}px`})})}deferPositionDropdown(){this.isOpen&&(this.positioningRequestAnimationFrame&&(cancelAnimationFrame(this.positioningRequestAnimationFrame),this.positioningRequestAnimationFrame=null),this.positioningRequestAnimationFrame=requestAnimationFrame(()=>{this.positionDropdown(),this.positioningRequestAnimationFrame=null}))}closeDropdown(){this.dropdown.style.display="none",this.selectButton.setAttribute("aria-expanded","false"),this.isOpen=!1,this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.activeSearchId++,this.isSearching=!1,this.hideLoadingState(),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.getVisibleOptions().forEach(e=>{e.classList.remove("fi-selected")}),this.dropdown.removeAttribute("aria-activedescendant")}focusNextOption(){let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex>=0&&this.selectedIndex=0&&this.selectedIndexe.bottom?this.dropdown.scrollTop+=i.bottom-e.bottom:i.top li[role="option"]')):t=Array.from(this.optionsList.querySelectorAll(':scope > ul.fi-dropdown-list > li[role="option"]'));let e=Array.from(this.optionsList.querySelectorAll('li.fi-select-input-option-group > ul > li[role="option"]'));return[...t,...e]}getSelectedOptionLabels(){if(!Array.isArray(this.state)||this.state.length===0)return{};let t={};for(let e of this.state){let i=!1;for(let o of this.options)if(o.options&&Array.isArray(o.options)){for(let s of o.options)if(s.value===e){t[e]=s.label,i=!0;break}if(i)break}else if(o.value===e){t[e]=o.label,i=!0;break}}return t}handleSearch(t){let e=t.target.value.trim();if(this.searchQuery=e,this.searchTimeout&&clearTimeout(this.searchTimeout),e===""){this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions();return}if(!this.getSearchResultsUsing||typeof this.getSearchResultsUsing!="function"||!this.hasDynamicSearchResults){this.filterOptions(e);return}this.searchTimeout=setTimeout(async()=>{this.searchTimeout=null;let i=++this.activeSearchId;this.isSearching=!0;try{this.showLoadingState(!0);let o=await this.getSearchResultsUsing(e);if(i!==this.activeSearchId||!this.isOpen)return;let s=Array.isArray(o)?o:o&&Array.isArray(o.options)?o.options:[];this.options=s,this.populateLabelRepositoryFromOptions(s),this.hideLoadingState(),this.renderOptions(),this.isOpen&&this.deferPositionDropdown(),this.options.length===0&&this.showNoResultsMessage()}catch(o){i===this.activeSearchId&&(console.error("Error fetching search results:",o),this.hideLoadingState(),this.options=JSON.parse(JSON.stringify(this.originalOptions)),this.renderOptions())}finally{i===this.activeSearchId&&(this.isSearching=!1)}},this.searchDebounce)}showLoadingState(t=!1){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let e=document.createElement("div");e.className="fi-select-input-message",e.textContent=t?this.searchingMessage:this.loadingMessage,this.dropdown.appendChild(e),this.isOpen&&this.deferPositionDropdown()}hideLoadingState(){let t=this.dropdown.querySelector(".fi-select-input-message");t&&t.remove()}showNoOptionsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noOptionsMessage,this.dropdown.appendChild(t),this.isOpen&&this.deferPositionDropdown()}showNoResultsMessage(){this.optionsList.parentNode===this.dropdown&&this.dropdown.removeChild(this.optionsList),this.hideLoadingState();let t=document.createElement("div");t.className="fi-select-input-message",t.textContent=this.noSearchResultsMessage,this.dropdown.appendChild(t),this.isOpen&&this.deferPositionDropdown()}filterOptions(t){let e=this.searchableOptionFields.includes("label"),i=this.searchableOptionFields.includes("value");t=t.toLowerCase();let o=[];for(let s of this.originalOptions)if(s.options&&Array.isArray(s.options)){let r=s.options.filter(a=>e&&a.label.toLowerCase().includes(t)||i&&String(a.value).toLowerCase().includes(t));r.length>0&&o.push({label:s.label,options:r})}else(e&&s.label.toLowerCase().includes(t)||i&&String(s.value).toLowerCase().includes(t))&&o.push(s);this.options=o,this.renderOptions(),this.options.length===0&&this.showNoResultsMessage(),this.isOpen&&this.positionDropdown()}selectOption(t){if(this.isDisabled)return;if(!this.isMultiple){this.state=t,this.updateSelectedDisplay(),this.renderOptions(),this.closeDropdown(),this.selectButton.focus(),this.onStateChange(this.state);return}let e=Array.isArray(this.state)?[...this.state]:[];if(e.includes(t)){let o=this.selectedDisplay.querySelector(`[data-value="${t}"]`);if(P(o)){let s=o.parentElement;P(s)&&s.children.length===1?(e=e.filter(r=>r!==t),this.state=e,this.updateSelectedDisplay()):(o.remove(),e=e.filter(r=>r!==t),this.state=e)}else e=e.filter(s=>s!==t),this.state=e,this.updateSelectedDisplay();this.renderOptions(),this.isOpen&&this.deferPositionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state);return}if(this.maxItems&&e.length>=this.maxItems){this.maxItemsMessage&&alert(this.maxItemsMessage);return}e.push(t),this.state=e;let i=this.selectedDisplay.querySelector(".fi-select-input-value-badges-ctn");bt(i)?this.updateSelectedDisplay():this.addSingleBadge(t,i),this.renderOptions(),this.isOpen&&this.deferPositionDropdown(),this.maintainFocusInMultipleMode(),this.onStateChange(this.state)}async addSingleBadge(t,e){let i=this.labelRepository[t];if(bt(i)&&(i=this.getSelectedOptionLabel(t),P(i)&&(this.labelRepository[t]=i)),bt(i)&&this.getOptionLabelsUsing)try{let s=await this.getOptionLabelsUsing();for(let r of s)if(P(r)&&r.value===t&&r.label!==void 0){i=r.label,this.labelRepository[t]=i;break}}catch(s){console.error("Error fetching option label:",s)}bt(i)&&(i=t);let o=this.createBadgeElement(t,i);e.appendChild(o)}maintainFocusInMultipleMode(){if(this.isSearchable&&this.searchInput){this.searchInput.focus();return}let t=this.getVisibleOptions();if(t.length!==0){if(this.selectedIndex=-1,Array.isArray(this.state)&&this.state.length>0){for(let e=0;e{e.setAttribute("disabled","disabled"),e.classList.add("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.setAttribute("disabled","disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.setAttribute("disabled","disabled"),this.searchInput.classList.add("fi-disabled"))}else{if(this.selectButton.removeAttribute("disabled"),this.selectButton.removeAttribute("aria-disabled"),this.selectButton.classList.remove("fi-disabled"),this.isMultiple&&this.container.querySelectorAll(".fi-select-input-badge-remove").forEach(e=>{e.removeAttribute("disabled"),e.classList.remove("fi-disabled")}),!this.isMultiple&&this.canSelectPlaceholder){let t=this.container.querySelector(".fi-select-input-value-remove-btn");t&&(t.removeAttribute("disabled"),t.classList.add("fi-disabled"))}this.isSearchable&&this.searchInput&&(this.searchInput.removeAttribute("disabled"),this.searchInput.classList.remove("fi-disabled"))}}destroy(){this.selectButton&&this.buttonClickListener&&this.selectButton.removeEventListener("click",this.buttonClickListener),this.documentClickListener&&document.removeEventListener("click",this.documentClickListener),this.selectButton&&this.buttonKeydownListener&&this.selectButton.removeEventListener("keydown",this.buttonKeydownListener),this.dropdown&&this.dropdownKeydownListener&&this.dropdown.removeEventListener("keydown",this.dropdownKeydownListener),this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null),this.scrollListener&&(window.removeEventListener("scroll",this.scrollListener,!0),this.scrollListener=null),this.refreshOptionLabelListener&&window.removeEventListener("filament-forms::select.refreshSelectedOptionLabel",this.refreshOptionLabelListener),this.isOpen&&this.closeDropdown(),this.searchTimeout&&(clearTimeout(this.searchTimeout),this.searchTimeout=null),this.container&&this.container.remove()}};function Qn({canOptionLabelsWrap:n,canSelectPlaceholder:t,getOptionLabelUsing:e,getOptionsUsing:i,getSearchResultsUsing:o,hasDynamicOptions:s,hasDynamicSearchResults:r,hasInitialNoOptionsMessage:a,initialOptionLabel:l,isDisabled:c,isHtmlAllowed:f,isNative:d,isSearchable:p,loadingMessage:u,name:g,noOptionsMessage:m,noSearchResultsMessage:S,options:E,optionsLimit:y,placeholder:D,position:A,recordKey:C,searchableOptionFields:F,searchDebounce:q,searchingMessage:J,searchPrompt:_,state:W}){return{error:void 0,isLoading:!1,select:null,state:W,unsubscribeLivewireHook:null,init(){d||(this.select=new Ee({canOptionLabelsWrap:n,canSelectPlaceholder:t,element:this.$refs.select,getOptionLabelUsing:e,getOptionsUsing:i,getSearchResultsUsing:o,hasDynamicOptions:s,hasDynamicSearchResults:r,hasInitialNoOptionsMessage:a,initialOptionLabel:l,isDisabled:c,isHtmlAllowed:f,isSearchable:p,loadingMessage:u,noOptionsMessage:m,noSearchResultsMessage:S,onStateChange:L=>{this.state=L},options:E,optionsLimit:y,placeholder:D,position:A,searchableOptionFields:F,searchDebounce:q,searchingMessage:J,searchPrompt:_,state:this.state})),this.unsubscribeLivewireHook=Livewire.interceptMessage(({message:L,onSuccess:X})=>{X(()=>{this.$nextTick(()=>{if(this.isLoading||L.component.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let M=this.getServerState();M===void 0||this.getNormalizedState()===M||(this.state=M)})})}),this.$watch("state",async L=>{!d&&this.select&&this.select.state!==L&&(this.select.state=L,this.select.updateSelectedDisplay(),this.select.renderOptions());let X=this.getServerState();if(X===void 0||this.getNormalizedState()===X)return;this.isLoading=!0;let M=await this.$wire.updateTableColumnState(g,C,this.state);this.error=M?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.getNormalizedState()),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[null,void 0].includes(this.$refs.serverState.value)?"":this.$refs.serverState.value.replaceAll('\\"','"')},getNormalizedState(){let L=Alpine.raw(this.state);return[null,void 0].includes(L)?"":L},destroy(){this.unsubscribeLivewireHook?.(),this.select&&(this.select.destroy(),this.select=null)}}}export{Qn as default}; /*! Bundled license information: sortablejs/modular/sortable.esm.js: (**! * Sortable 1.15.6 * @author RubaXa * @author owenm * @license MIT *) */ ================================================ FILE: public/js/filament/tables/components/columns/text-input.js ================================================ function a({name:i,recordKey:s,state:n}){return{error:void 0,isLoading:!1,state:n,unsubscribeLivewireHook:null,init(){this.unsubscribeLivewireHook=Livewire.interceptMessage(({message:e,onSuccess:t})=>{t(()=>{this.$nextTick(()=>{if(this.isLoading||e.component.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let r=this.getServerState();r===void 0||this.getNormalizedState()===r||(this.state=r)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||this.getNormalizedState()===e)return;this.isLoading=!0;let t=await this.$wire.updateTableColumnState(i,s,this.state);this.error=t?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.getNormalizedState()),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[null,void 0].includes(this.$refs.serverState.value)?"":this.$refs.serverState.value.replaceAll('\\"','"')},getNormalizedState(){let e=Alpine.raw(this.state);return[null,void 0].includes(e)?"":e},destroy(){this.unsubscribeLivewireHook?.()}}}export{a as default}; ================================================ FILE: public/js/filament/tables/components/columns/toggle.js ================================================ function a({name:r,recordKey:s,state:n}){return{error:void 0,isLoading:!1,state:n,unsubscribeLivewireHook:null,init(){this.unsubscribeLivewireHook=Livewire.interceptMessage(({message:e,onSuccess:t})=>{t(()=>{this.$nextTick(()=>{if(this.isLoading||e.component.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let i=this.getServerState();i===void 0||Alpine.raw(this.state)===i||(this.state=i)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||Alpine.raw(this.state)===e)return;this.isLoading=!0;let t=await this.$wire.updateTableColumnState(r,s,this.state);this.error=t?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.state?"1":"0"),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[1,"1"].includes(this.$refs.serverState.value)},destroy(){this.unsubscribeLivewireHook?.()}}}export{a as default}; ================================================ FILE: public/js/filament/tables/components/table.js ================================================ function d(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(e,t=null){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableAction(e,t)},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){this.isLoading=!0;let t=await this.$wire.getGroupedSelectableTableRecordKeys(e);this.areRecordsSelected(this.getRecordsInGroupOnPage(e))?this.deselectRecords(t):this.selectRecords(t),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)this.isRecordSelected(t)||this.selectedRecords.push(t)},deselectRecords:function(e){for(let t of e){let s=this.selectedRecords.indexOf(t);s!==-1&&this.selectedRecords.splice(s,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let l=s.indexOf(this.lastChecked),r=s.indexOf(t),o=[l,r].sort((c,n)=>c-n),i=[];for(let c=o[0];c<=o[1];c++)s[c].checked=t.checked,i.push(s[c].value);t.checked?this.selectRecords(i):this.deselectRecords(i)}this.lastChecked=t}}}export{d as default}; ================================================ FILE: public/js/filament/tables/tables.js ================================================ (()=>{var M=Math.min,L=Math.max,B=Math.round,H=Math.floor,S=e=>({x:e,y:e});function q(e,t,i){return L(e,M(t,i))}function j(e,t){return typeof e=="function"?e(t):e}function W(e){return e.split("-")[0]}function Q(e){return e.split("-")[1]}function Z(e){return e==="x"?"y":"x"}function oe(e){return e==="y"?"height":"width"}var Pe=new Set(["top","bottom"]);function z(e){return Pe.has(W(e))?"y":"x"}function se(e){return Z(z(e))}function De(e){return{top:0,right:0,bottom:0,left:0,...e}}function re(e){return typeof e!="number"?De(e):{top:e,right:e,bottom:e,left:e}}function E(e){let{x:t,y:i,width:n,height:s}=e;return{width:n,height:s,top:i,left:t,right:t+n,bottom:i+s,x:t,y:i}}function le(e,t,i){let{reference:n,floating:s}=e,l=z(t),o=se(t),r=oe(o),c=W(t),a=l==="y",f=n.x+n.width/2-s.width/2,d=n.y+n.height/2-s.height/2,h=n[r]/2-s[r]/2,u;switch(c){case"top":u={x:f,y:n.y-s.height};break;case"bottom":u={x:f,y:n.y+n.height};break;case"right":u={x:n.x+n.width,y:d};break;case"left":u={x:n.x-s.width,y:d};break;default:u={x:n.x,y:n.y}}switch(Q(t)){case"start":u[o]-=h*(i&&a?-1:1);break;case"end":u[o]+=h*(i&&a?-1:1);break}return u}var ce=async(e,t,i)=>{let{placement:n="bottom",strategy:s="absolute",middleware:l=[],platform:o}=i,r=l.filter(Boolean),c=await(o.isRTL==null?void 0:o.isRTL(t)),a=await o.getElementRects({reference:e,floating:t,strategy:s}),{x:f,y:d}=le(a,n,c),h=n,u={},m=0;for(let p=0;p{let{x:g,y:x}=w;return{x:g,y:x}}},...c}=j(e,t),a={x:i,y:n},f=await ae(t,c),d=z(W(s)),h=Z(d),u=a[h],m=a[d];if(l){let w=h==="y"?"top":"left",g=h==="y"?"bottom":"right",x=u+f[w],y=u-f[g];u=q(x,u,y)}if(o){let w=d==="y"?"top":"left",g=d==="y"?"bottom":"right",x=m+f[w],y=m-f[g];m=q(x,m,y)}let p=r.fn({...t,[h]:u,[d]:m});return{...p,data:{x:p.x-i,y:p.y-n,enabled:{[h]:l,[d]:o}}}}}};function X(){return typeof window<"u"}function P(e){return he(e)?(e.nodeName||"").toLowerCase():"#document"}function v(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function O(e){var t;return(t=(he(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function he(e){return X()?e instanceof Node||e instanceof v(e).Node:!1}function R(e){return X()?e instanceof Element||e instanceof v(e).Element:!1}function T(e){return X()?e instanceof HTMLElement||e instanceof v(e).HTMLElement:!1}function ue(e){return!X()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof v(e).ShadowRoot}var $e=new Set(["inline","contents"]);function N(e){let{overflow:t,overflowX:i,overflowY:n,display:s}=C(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+i)&&!$e.has(s)}var Ne=new Set(["table","td","th"]);function me(e){return Ne.has(P(e))}var Ve=[":popover-open",":modal"];function _(e){return Ve.some(t=>{try{return e.matches(t)}catch{return!1}})}var Be=["transform","translate","scale","rotate","perspective"],He=["transform","translate","scale","rotate","perspective","filter"],We=["paint","layout","strict","content"];function Y(e){let t=G(),i=R(e)?C(e):e;return Be.some(n=>i[n]?i[n]!=="none":!1)||(i.containerType?i.containerType!=="normal":!1)||!t&&(i.backdropFilter?i.backdropFilter!=="none":!1)||!t&&(i.filter?i.filter!=="none":!1)||He.some(n=>(i.willChange||"").includes(n))||We.some(n=>(i.contain||"").includes(n))}function ge(e){let t=k(e);for(;T(t)&&!D(t);){if(Y(t))return t;if(_(t))return null;t=k(t)}return null}function G(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}var ze=new Set(["html","body","#document"]);function D(e){return ze.has(P(e))}function C(e){return v(e).getComputedStyle(e)}function I(e){return R(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function k(e){if(P(e)==="html")return e;let t=e.assignedSlot||e.parentNode||ue(e)&&e.host||O(e);return ue(t)?t.host:t}function pe(e){let t=k(e);return D(t)?e.ownerDocument?e.ownerDocument.body:e.body:T(t)&&N(t)?t:pe(t)}function $(e,t,i){var n;t===void 0&&(t=[]),i===void 0&&(i=!0);let s=pe(e),l=s===((n=e.ownerDocument)==null?void 0:n.body),o=v(s);if(l){let r=J(o);return t.concat(o,o.visualViewport||[],N(s)?s:[],r&&i?$(r):[])}return t.concat(s,$(s,[],i))}function J(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function be(e){let t=C(e),i=parseFloat(t.width)||0,n=parseFloat(t.height)||0,s=T(e),l=s?e.offsetWidth:i,o=s?e.offsetHeight:n,r=B(i)!==l||B(n)!==o;return r&&(i=l,n=o),{width:i,height:n,$:r}}function te(e){return R(e)?e:e.contextElement}function V(e){let t=te(e);if(!T(t))return S(1);let i=t.getBoundingClientRect(),{width:n,height:s,$:l}=be(t),o=(l?B(i.width):i.width)/n,r=(l?B(i.height):i.height)/s;return(!o||!Number.isFinite(o))&&(o=1),(!r||!Number.isFinite(r))&&(r=1),{x:o,y:r}}var _e=S(0);function ve(e){let t=v(e);return!G()||!t.visualViewport?_e:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Ie(e,t,i){return t===void 0&&(t=!1),!i||t&&i!==v(e)?!1:t}function F(e,t,i,n){t===void 0&&(t=!1),i===void 0&&(i=!1);let s=e.getBoundingClientRect(),l=te(e),o=S(1);t&&(n?R(n)&&(o=V(n)):o=V(e));let r=Ie(l,i,n)?ve(l):S(0),c=(s.left+r.x)/o.x,a=(s.top+r.y)/o.y,f=s.width/o.x,d=s.height/o.y;if(l){let h=v(l),u=n&&R(n)?v(n):n,m=h,p=J(m);for(;p&&n&&u!==m;){let w=V(p),g=p.getBoundingClientRect(),x=C(p),y=g.left+(p.clientLeft+parseFloat(x.paddingLeft))*w.x,A=g.top+(p.clientTop+parseFloat(x.paddingTop))*w.y;c*=w.x,a*=w.y,f*=w.x,d*=w.y,c+=y,a+=A,m=v(p),p=J(m)}}return E({width:f,height:d,x:c,y:a})}function K(e,t){let i=I(e).scrollLeft;return t?t.left+i:F(O(e)).left+i}function Re(e,t){let i=e.getBoundingClientRect(),n=i.left+t.scrollLeft-K(e,i),s=i.top+t.scrollTop;return{x:n,y:s}}function Ue(e){let{elements:t,rect:i,offsetParent:n,strategy:s}=e,l=s==="fixed",o=O(n),r=t?_(t.floating):!1;if(n===o||r&&l)return i;let c={scrollLeft:0,scrollTop:0},a=S(1),f=S(0),d=T(n);if((d||!d&&!l)&&((P(n)!=="body"||N(o))&&(c=I(n)),T(n))){let u=F(n);a=V(n),f.x=u.x+n.clientLeft,f.y=u.y+n.clientTop}let h=o&&!d&&!l?Re(o,c):S(0);return{width:i.width*a.x,height:i.height*a.y,x:i.x*a.x-c.scrollLeft*a.x+f.x+h.x,y:i.y*a.y-c.scrollTop*a.y+f.y+h.y}}function je(e){return Array.from(e.getClientRects())}function Xe(e){let t=O(e),i=I(e),n=e.ownerDocument.body,s=L(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),l=L(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight),o=-i.scrollLeft+K(e),r=-i.scrollTop;return C(n).direction==="rtl"&&(o+=L(t.clientWidth,n.clientWidth)-s),{width:s,height:l,x:o,y:r}}var we=25;function Ye(e,t){let i=v(e),n=O(e),s=i.visualViewport,l=n.clientWidth,o=n.clientHeight,r=0,c=0;if(s){l=s.width,o=s.height;let f=G();(!f||f&&t==="fixed")&&(r=s.offsetLeft,c=s.offsetTop)}let a=K(n);if(a<=0){let f=n.ownerDocument,d=f.body,h=getComputedStyle(d),u=f.compatMode==="CSS1Compat"&&parseFloat(h.marginLeft)+parseFloat(h.marginRight)||0,m=Math.abs(n.clientWidth-d.clientWidth-u);m<=we&&(l-=m)}else a<=we&&(l+=a);return{width:l,height:o,x:r,y:c}}var Ge=new Set(["absolute","fixed"]);function Je(e,t){let i=F(e,!0,t==="fixed"),n=i.top+e.clientTop,s=i.left+e.clientLeft,l=T(e)?V(e):S(1),o=e.clientWidth*l.x,r=e.clientHeight*l.y,c=s*l.x,a=n*l.y;return{width:o,height:r,x:c,y:a}}function xe(e,t,i){let n;if(t==="viewport")n=Ye(e,i);else if(t==="document")n=Xe(O(e));else if(R(t))n=Je(t,i);else{let s=ve(e);n={x:t.x-s.x,y:t.y-s.y,width:t.width,height:t.height}}return E(n)}function Ce(e,t){let i=k(e);return i===t||!R(i)||D(i)?!1:C(i).position==="fixed"||Ce(i,t)}function Ke(e,t){let i=t.get(e);if(i)return i;let n=$(e,[],!1).filter(r=>R(r)&&P(r)!=="body"),s=null,l=C(e).position==="fixed",o=l?k(e):e;for(;R(o)&&!D(o);){let r=C(o),c=Y(o);!c&&r.position==="fixed"&&(s=null),(l?!c&&!s:!c&&r.position==="static"&&!!s&&Ge.has(s.position)||N(o)&&!c&&Ce(e,o))?n=n.filter(f=>f!==o):s=r,o=k(o)}return t.set(e,n),n}function qe(e){let{element:t,boundary:i,rootBoundary:n,strategy:s}=e,o=[...i==="clippingAncestors"?_(t)?[]:Ke(t,this._c):[].concat(i),n],r=o[0],c=o.reduce((a,f)=>{let d=xe(t,f,s);return a.top=L(d.top,a.top),a.right=M(d.right,a.right),a.bottom=M(d.bottom,a.bottom),a.left=L(d.left,a.left),a},xe(t,r,s));return{width:c.right-c.left,height:c.bottom-c.top,x:c.left,y:c.top}}function Qe(e){let{width:t,height:i}=be(e);return{width:t,height:i}}function Ze(e,t,i){let n=T(t),s=O(t),l=i==="fixed",o=F(e,!0,l,t),r={scrollLeft:0,scrollTop:0},c=S(0);function a(){c.x=K(s)}if(n||!n&&!l)if((P(t)!=="body"||N(s))&&(r=I(t)),n){let u=F(t,!0,l,t);c.x=u.x+t.clientLeft,c.y=u.y+t.clientTop}else s&&a();l&&!n&&s&&a();let f=s&&!n&&!l?Re(s,r):S(0),d=o.left+r.scrollLeft-c.x-f.x,h=o.top+r.scrollTop-c.y-f.y;return{x:d,y:h,width:o.width,height:o.height}}function ee(e){return C(e).position==="static"}function ye(e,t){if(!T(e)||C(e).position==="fixed")return null;if(t)return t(e);let i=e.offsetParent;return O(e)===i&&(i=i.ownerDocument.body),i}function Ae(e,t){let i=v(e);if(_(e))return i;if(!T(e)){let s=k(e);for(;s&&!D(s);){if(R(s)&&!ee(s))return s;s=k(s)}return i}let n=ye(e,t);for(;n&&me(n)&&ee(n);)n=ye(n,t);return n&&D(n)&&ee(n)&&!Y(n)?i:n||ge(e)||i}var et=async function(e){let t=this.getOffsetParent||Ae,i=this.getDimensions,n=await i(e.floating);return{reference:Ze(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function tt(e){return C(e).direction==="rtl"}var nt={convertOffsetParentRelativeRectToViewportRelativeRect:Ue,getDocumentElement:O,getClippingRect:qe,getOffsetParent:Ae,getElementRects:et,getClientRects:je,getDimensions:Qe,getScale:V,isElement:R,isRTL:tt};function Se(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function it(e,t){let i=null,n,s=O(e);function l(){var r;clearTimeout(n),(r=i)==null||r.disconnect(),i=null}function o(r,c){r===void 0&&(r=!1),c===void 0&&(c=1),l();let a=e.getBoundingClientRect(),{left:f,top:d,width:h,height:u}=a;if(r||t(),!h||!u)return;let m=H(d),p=H(s.clientWidth-(f+h)),w=H(s.clientHeight-(d+u)),g=H(f),y={rootMargin:-m+"px "+-p+"px "+-w+"px "+-g+"px",threshold:L(0,M(1,c))||1},A=!0;function b(ie){let U=ie[0].intersectionRatio;if(U!==c){if(!A)return o();U?o(!1,U):n=setTimeout(()=>{o(!1,1e-7)},1e3)}U===1&&!Se(a,e.getBoundingClientRect())&&o(),A=!1}try{i=new IntersectionObserver(b,{...y,root:s.ownerDocument})}catch{i=new IntersectionObserver(b,y)}i.observe(e)}return o(!0),l}function Oe(e,t,i,n){n===void 0&&(n={});let{ancestorScroll:s=!0,ancestorResize:l=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:c=!1}=n,a=te(e),f=s||l?[...a?$(a):[],...$(t)]:[];f.forEach(g=>{s&&g.addEventListener("scroll",i,{passive:!0}),l&&g.addEventListener("resize",i)});let d=a&&r?it(a,i):null,h=-1,u=null;o&&(u=new ResizeObserver(g=>{let[x]=g;x&&x.target===a&&u&&(u.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame(()=>{var y;(y=u)==null||y.observe(t)})),i()}),a&&!c&&u.observe(a),u.observe(t));let m,p=c?F(e):null;c&&w();function w(){let g=F(e);p&&!Se(p,g)&&i(),p=g,m=requestAnimationFrame(w)}return i(),()=>{var g;f.forEach(x=>{s&&x.removeEventListener("scroll",i),l&&x.removeEventListener("resize",i)}),d?.(),(g=u)==null||g.disconnect(),u=null,c&&cancelAnimationFrame(m)}}var Te=fe;var Le=de;var ke=(e,t,i)=>{let n=new Map,s={platform:nt,...i},l={...s.platform,_c:n};return ce(e,t,{...s,platform:l})};var Ee=({areGroupsCollapsedByDefault:e,canTrackDeselectedRecords:t,currentSelectionLivewireProperty:i,maxSelectableRecords:n,selectsCurrentPageOnly:s,$wire:l})=>({areFiltersOpen:!1,checkboxClickController:null,groupVisibility:[],isLoading:!1,selectedRecords:new Set,deselectedRecords:new Set,isTrackingDeselectedRecords:!1,shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,entangledSelectedRecords:i?l.$entangle(i):null,cleanUpFiltersDropdown:null,unsubscribeLivewireHook:null,init(){this.livewireId=this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value,l.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),l.$on("scrollToTopOfTable",()=>this.$root.scrollIntoView({block:"start",inline:"nearest"})),i&&(n!==1?this.selectedRecords=new Set(this.entangledSelectedRecords):this.selectedRecords=new Set(this.entangledSelectedRecords?[this.entangledSelectedRecords]:[])),this.$nextTick(()=>this.watchForCheckboxClicks()),this.unsubscribeLivewireHook=Livewire.hook("element.init",({component:o})=>{o.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction(...o){l.set("isTrackingDeselectedTableRecords",this.isTrackingDeselectedRecords,!1),l.set("selectedTableRecords",[...this.selectedRecords],!1),l.set("deselectedTableRecords",[...this.deselectedRecords],!1),l.mountAction(...o)},toggleSelectRecordsOnPage(){let o=this.getRecordsOnPage();if(this.areRecordsSelected(o)){this.deselectRecords(o);return}this.selectRecords(o)},toggleSelectRecords(o){this.areRecordsSelected(o)?this.deselectRecords(o):this.selectRecords(o)},getSelectedRecordsCount(){return this.isTrackingDeselectedRecords?(this.$refs.allSelectableRecordsCount?.value??this.deselectedRecords.size)-this.deselectedRecords.size:this.selectedRecords.size},getRecordsOnPage(){let o=[];for(let r of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])o.push(r.value);return o},selectRecords(o){n===1&&(this.deselectAllRecords(),o=o.slice(0,1));for(let r of o)if(!this.isRecordSelected(r)){if(this.isTrackingDeselectedRecords){this.deselectedRecords.delete(r);continue}this.selectedRecords.add(r)}this.updatedSelectedRecords()},deselectRecords(o){for(let r of o){if(this.isTrackingDeselectedRecords){this.deselectedRecords.add(r);continue}this.selectedRecords.delete(r)}this.updatedSelectedRecords()},updatedSelectedRecords(){if(n!==1){this.entangledSelectedRecords=[...this.selectedRecords];return}this.entangledSelectedRecords=[...this.selectedRecords][0]??null},toggleSelectedRecord(o){if(this.isRecordSelected(o)){this.deselectRecords([o]);return}this.selectRecords([o])},async selectAllRecords(){if(!t||s){this.isLoading=!0,this.selectedRecords=new Set(await l.getAllSelectableTableRecordKeys()),this.updatedSelectedRecords(),this.isLoading=!1;return}this.isTrackingDeselectedRecords=!0,this.selectedRecords=new Set,this.deselectedRecords=new Set,this.updatedSelectedRecords()},canSelectAllRecords(){if(s){let c=this.getRecordsOnPage();return!this.areRecordsSelected(c)&&this.areRecordsToggleable(c)}let o=parseInt(this.$refs.allSelectableRecordsCount?.value);if(!o)return!1;let r=this.getSelectedRecordsCount();return o===r?!1:n===null||o<=n},deselectAllRecords(){this.isTrackingDeselectedRecords=!1,this.selectedRecords=new Set,this.deselectedRecords=new Set,this.updatedSelectedRecords()},isRecordSelected(o){return this.isTrackingDeselectedRecords?!this.deselectedRecords.has(o):this.selectedRecords.has(o)},areRecordsSelected(o){return o.every(r=>this.isRecordSelected(r))},areRecordsToggleable(o){if(n===null||n===1)return!0;let r=o.filter(c=>this.isRecordSelected(c));return r.length===o.length?!0:this.getSelectedRecordsCount()+(o.length-r.length)<=n},toggleCollapseGroup(o){this.isGroupCollapsed(o)?e?this.groupVisibility.push(o):this.groupVisibility.splice(this.groupVisibility.indexOf(o),1):e?this.groupVisibility.splice(this.groupVisibility.indexOf(o),1):this.groupVisibility.push(o)},isGroupCollapsed(o){return e?!this.groupVisibility.includes(o):this.groupVisibility.includes(o)},resetCollapsedGroups(){this.groupVisibility=[]},watchForCheckboxClicks(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:o}=this.checkboxClickController;this.$root?.addEventListener("click",r=>r.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(r,r.target),{signal:o})},handleCheckboxClick(o,r){if(!this.lastChecked){this.lastChecked=r;return}if(o.shiftKey){let c=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!c.includes(this.lastChecked)){this.lastChecked=r;return}let a=c.indexOf(this.lastChecked),f=c.indexOf(r),d=[a,f].sort((u,m)=>u-m),h=[];for(let u=d[0];u<=d[1];u++)h.push(c[u].value);if(r.checked){if(!this.areRecordsToggleable(h)){r.checked=!1,this.deselectRecords([r.value]);return}this.selectRecords(h)}else this.deselectRecords(h)}this.lastChecked=r},toggleFiltersDropdown(){if(this.areFiltersOpen=!this.areFiltersOpen,this.areFiltersOpen){let o=Oe(this.$refs.filtersTriggerActionContainer,this.$refs.filtersContentContainer,async()=>{let{x:a,y:f}=await ke(this.$refs.filtersTriggerActionContainer,this.$refs.filtersContentContainer,{placement:"bottom-end",middleware:[Te(8),Le({padding:8})]});Object.assign(this.$refs.filtersContentContainer.style,{left:`${a}px`,top:`${f}px`})}),r=a=>{let f=this.$refs.filtersTriggerActionContainer,d=this.$refs.filtersContentContainer;d&&d.contains(a.target)||f&&f.contains(a.target)||(this.areFiltersOpen=!1,this.cleanUpFiltersDropdown&&(this.cleanUpFiltersDropdown(),this.cleanUpFiltersDropdown=null))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r,{passive:!0});let c=a=>{a.key==="Escape"&&r(a)};document.addEventListener("keydown",c),this.cleanUpFiltersDropdown=()=>{o(),document.removeEventListener("mousedown",r),document.removeEventListener("touchstart",r,{passive:!0}),document.removeEventListener("keydown",c)}}else this.cleanUpFiltersDropdown&&(this.cleanUpFiltersDropdown(),this.cleanUpFiltersDropdown=null)},destroy(){this.unsubscribeLivewireHook?.()}});function ne({columns:e,isLive:t}){return{error:void 0,isLoading:!1,deferredColumns:[],columns:e,isLive:t,hasReordered:!1,init(){if(!this.columns||this.columns.length===0){this.columns=[];return}this.deferredColumns=JSON.parse(JSON.stringify(this.columns)),this.$watch("columns",()=>{this.resetDeferredColumns()})},get groupedColumns(){let i={};return this.deferredColumns.filter(n=>n.type==="group").forEach(n=>{i[n.name]=this.calculateGroupedColumns(n)}),i},calculateGroupedColumns(i){if((i?.columns?.filter(r=>!r.isHidden)??[]).length===0)return{hidden:!0,checked:!1,disabled:!1,indeterminate:!1};let s=i.columns.filter(r=>!r.isHidden&&r.isToggleable!==!1);if(s.length===0)return{checked:!0,disabled:!0,indeterminate:!1};let l=s.filter(r=>r.isToggled).length,o=i.columns.filter(r=>!r.isHidden&&r.isToggleable===!1);return l===0&&o.length>0?{checked:!0,disabled:!1,indeterminate:!0}:l===0?{checked:!1,disabled:!1,indeterminate:!1}:l===s.length?{checked:!0,disabled:!1,indeterminate:!1}:{checked:!0,disabled:!1,indeterminate:!0}},getColumn(i,n=null){return n?this.deferredColumns.find(l=>l.type==="group"&&l.name===n)?.columns?.find(l=>l.name===i):this.deferredColumns.find(s=>s.name===i)},toggleGroup(i){let n=this.deferredColumns.find(c=>c.type==="group"&&c.name===i);if(!n?.columns)return;let s=this.calculateGroupedColumns(n);if(s.disabled)return;let o=n.columns.filter(c=>c.isToggleable!==!1).some(c=>c.isToggled),r=s.indeterminate?!0:!o;n.columns.filter(c=>c.isToggleable!==!1).forEach(c=>{c.isToggled=r}),this.deferredColumns=[...this.deferredColumns],this.isLive&&this.applyTableColumnManager()},toggleColumn(i,n=null){let s=this.getColumn(i,n);!s||s.isToggleable===!1||(s.isToggled=!s.isToggled,this.deferredColumns=[...this.deferredColumns],this.isLive&&this.applyTableColumnManager())},reorderColumns(i){let n=i.map(s=>s.split("::"));this.reorderTopLevel(n),this.hasReordered=!0,this.isLive&&this.applyTableColumnManager()},reorderGroupColumns(i,n){let s=this.deferredColumns.find(r=>r.type==="group"&&r.name===n);if(!s)return;let l=i.map(r=>r.split("::")),o=[];l.forEach(([r,c])=>{let a=s.columns.find(f=>f.name===c);a&&o.push(a)}),s.columns=o,this.deferredColumns=[...this.deferredColumns],this.hasReordered=!0,this.isLive&&this.applyTableColumnManager()},reorderTopLevel(i){let n=this.deferredColumns,s=[];i.forEach(([l,o])=>{let r=n.find(c=>l==="group"?c.type==="group"&&c.name===o:l==="column"?c.type!=="group"&&c.name===o:!1);r&&s.push(r)}),this.deferredColumns=s},async applyTableColumnManager(){this.isLoading=!0;try{this.columns=JSON.parse(JSON.stringify(this.deferredColumns)),await this.$wire.call("applyTableColumnManager",this.columns,this.hasReordered),this.hasReordered=!1,this.error=void 0}catch(i){this.error="Failed to update column visibility",console.error("Table toggle columns error:",i)}finally{this.isLoading=!1}},resetDeferredColumns(){this.deferredColumns=JSON.parse(JSON.stringify(this.columns)),this.hasReordered=!1}}}document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentTable",Ee),window.Alpine.data("filamentTableColumnManager",ne)});})(); ================================================ FILE: public/js/filament/widgets/components/chart.js ================================================ var Sc=Object.defineProperty;var Mc=(s,t,e)=>t in s?Sc(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e;var v=(s,t,e)=>Mc(s,typeof t!="symbol"?t+"":t,e);function us(s){return s+.5|0}var Zt=(s,t,e)=>Math.max(Math.min(s,e),t);function cs(s){return Zt(us(s*2.55),0,255)}function qt(s){return Zt(us(s*255),0,255)}function Nt(s){return Zt(us(s/2.55)/100,0,1)}function No(s){return Zt(us(s*100),0,100)}var pt={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Zi=[..."0123456789ABCDEF"],Oc=s=>Zi[s&15],Tc=s=>Zi[(s&240)>>4]+Zi[s&15],Us=s=>(s&240)>>4===(s&15),Dc=s=>Us(s.r)&&Us(s.g)&&Us(s.b)&&Us(s.a);function Cc(s){var t=s.length,e;return s[0]==="#"&&(t===4||t===5?e={r:255&pt[s[1]]*17,g:255&pt[s[2]]*17,b:255&pt[s[3]]*17,a:t===5?pt[s[4]]*17:255}:(t===7||t===9)&&(e={r:pt[s[1]]<<4|pt[s[2]],g:pt[s[3]]<<4|pt[s[4]],b:pt[s[5]]<<4|pt[s[6]],a:t===9?pt[s[7]]<<4|pt[s[8]]:255})),e}var Pc=(s,t)=>s<255?t(s):"";function Ac(s){var t=Dc(s)?Oc:Tc;return s?"#"+t(s.r)+t(s.g)+t(s.b)+Pc(s.a,t):void 0}var Ic=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Bo(s,t,e){let i=t*Math.min(e,1-e),n=(o,r=(o+s/30)%12)=>e-i*Math.max(Math.min(r-3,9-r,1),-1);return[n(0),n(8),n(4)]}function Ec(s,t,e){let i=(n,o=(n+s/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[i(5),i(3),i(1)]}function Lc(s,t,e){let i=Bo(s,1,.5),n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)i[n]*=1-t-e,i[n]+=t;return i}function Fc(s,t,e,i,n){return s===n?(t-e)/i+(t.5?h/(2-o-r):h/(o+r),l=Fc(e,i,n,h,o),l=l*60+.5),[l|0,c||0,a]}function Gi(s,t,e,i){return(Array.isArray(t)?s(t[0],t[1],t[2]):s(t,e,i)).map(qt)}function Xi(s,t,e){return Gi(Bo,s,t,e)}function Rc(s,t,e){return Gi(Lc,s,t,e)}function Nc(s,t,e){return Gi(Ec,s,t,e)}function Ho(s){return(s%360+360)%360}function zc(s){let t=Ic.exec(s),e=255,i;if(!t)return;t[5]!==i&&(e=t[6]?cs(+t[5]):qt(+t[5]));let n=Ho(+t[2]),o=+t[3]/100,r=+t[4]/100;return t[1]==="hwb"?i=Rc(n,o,r):t[1]==="hsv"?i=Nc(n,o,r):i=Xi(n,o,r),{r:i[0],g:i[1],b:i[2],a:e}}function Vc(s,t){var e=qi(s);e[0]=Ho(e[0]+t),e=Xi(e),s.r=e[0],s.g=e[1],s.b=e[2]}function Wc(s){if(!s)return;let t=qi(s),e=t[0],i=No(t[1]),n=No(t[2]);return s.a<255?`hsla(${e}, ${i}%, ${n}%, ${Nt(s.a)})`:`hsl(${e}, ${i}%, ${n}%)`}var zo={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Vo={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function Bc(){let s={},t=Object.keys(Vo),e=Object.keys(zo),i,n,o,r,a;for(i=0;i>16&255,o>>8&255,o&255]}return s}var Ys;function Hc(s){Ys||(Ys=Bc(),Ys.transparent=[0,0,0,0]);let t=Ys[s.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var $c=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function jc(s){let t=$c.exec(s),e=255,i,n,o;if(t){if(t[7]!==i){let r=+t[7];e=t[8]?cs(r):Zt(r*255,0,255)}return i=+t[1],n=+t[3],o=+t[5],i=255&(t[2]?cs(i):Zt(i,0,255)),n=255&(t[4]?cs(n):Zt(n,0,255)),o=255&(t[6]?cs(o):Zt(o,0,255)),{r:i,g:n,b:o,a:e}}}function Uc(s){return s&&(s.a<255?`rgba(${s.r}, ${s.g}, ${s.b}, ${Nt(s.a)})`:`rgb(${s.r}, ${s.g}, ${s.b})`)}var Yi=s=>s<=.0031308?s*12.92:Math.pow(s,1/2.4)*1.055-.055,De=s=>s<=.04045?s/12.92:Math.pow((s+.055)/1.055,2.4);function Yc(s,t,e){let i=De(Nt(s.r)),n=De(Nt(s.g)),o=De(Nt(s.b));return{r:qt(Yi(i+e*(De(Nt(t.r))-i))),g:qt(Yi(n+e*(De(Nt(t.g))-n))),b:qt(Yi(o+e*(De(Nt(t.b))-o))),a:s.a+e*(t.a-s.a)}}function Zs(s,t,e){if(s){let i=qi(s);i[t]=Math.max(0,Math.min(i[t]+i[t]*e,t===0?360:1)),i=Xi(i),s.r=i[0],s.g=i[1],s.b=i[2]}}function $o(s,t){return s&&Object.assign(t||{},s)}function Wo(s){var t={r:0,g:0,b:0,a:255};return Array.isArray(s)?s.length>=3&&(t={r:s[0],g:s[1],b:s[2],a:255},s.length>3&&(t.a=qt(s[3]))):(t=$o(s,{r:0,g:0,b:0,a:1}),t.a=qt(t.a)),t}function Zc(s){return s.charAt(0)==="r"?jc(s):zc(s)}var hs=class s{constructor(t){if(t instanceof s)return t;let e=typeof t,i;e==="object"?i=Wo(t):e==="string"&&(i=Cc(t)||Hc(t)||Zc(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=$o(this._rgb);return t&&(t.a=Nt(t.a)),t}set rgb(t){this._rgb=Wo(t)}rgbString(){return this._valid?Uc(this._rgb):void 0}hexString(){return this._valid?Ac(this._rgb):void 0}hslString(){return this._valid?Wc(this._rgb):void 0}mix(t,e){if(t){let i=this.rgb,n=t.rgb,o,r=e===o?.5:e,a=2*r-1,l=i.a-n.a,c=((a*l===-1?a:(a+l)/(1+a*l))+1)/2;o=1-c,i.r=255&c*i.r+o*n.r+.5,i.g=255&c*i.g+o*n.g+.5,i.b=255&c*i.b+o*n.b+.5,i.a=r*i.a+(1-r)*n.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=Yc(this._rgb,t._rgb,e)),this}clone(){return new s(this.rgb)}alpha(t){return this._rgb.a=qt(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=us(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Zs(this._rgb,2,t),this}darken(t){return Zs(this._rgb,2,-t),this}saturate(t){return Zs(this._rgb,1,t),this}desaturate(t){return Zs(this._rgb,1,-t),this}rotate(t){return Vc(this._rgb,t),this}};function At(){}var tr=(()=>{let s=0;return()=>s++})();function I(s){return s==null}function H(s){if(Array.isArray&&Array.isArray(s))return!0;let t=Object.prototype.toString.call(s);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function E(s){return s!==null&&Object.prototype.toString.call(s)==="[object Object]"}function Z(s){return(typeof s=="number"||s instanceof Number)&&isFinite(+s)}function at(s,t){return Z(s)?s:t}function P(s,t){return typeof s>"u"?t:s}var er=(s,t)=>typeof s=="string"&&s.endsWith("%")?parseFloat(s)/100:+s/t,tn=(s,t)=>typeof s=="string"&&s.endsWith("%")?parseFloat(s)/100*t:+s;function W(s,t,e){if(s&&typeof s.call=="function")return s.apply(e,t)}function z(s,t,e,i){let n,o,r;if(H(s))if(o=s.length,i)for(n=o-1;n>=0;n--)t.call(e,s[n],n);else for(n=0;ns,x:s=>s.x,y:s=>s.y};function Xc(s){let t=s.split("."),e=[],i="";for(let n of t)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(e.push(i),i="");return e}function Jc(s){let t=Xc(s);return e=>{for(let i of t){if(i==="")break;e=e&&e[i]}return e}}function Wt(s,t){return(jo[t]||(jo[t]=Jc(t)))(s)}function ei(s){return s.charAt(0).toUpperCase()+s.slice(1)}var Ee=s=>typeof s<"u",zt=s=>typeof s=="function",en=(s,t)=>{if(s.size!==t.size)return!1;for(let e of s)if(!t.has(e))return!1;return!0};function ir(s){return s.type==="mouseup"||s.type==="click"||s.type==="contextmenu"}var F=Math.PI,$=2*F,Kc=$+F,Ks=Number.POSITIVE_INFINITY,Qc=F/180,q=F/2,he=F/4,Uo=F*2/3,Vt=Math.log10,St=Math.sign;function Le(s,t,e){return Math.abs(s-t)n-o).pop(),t}function th(s){return typeof s=="symbol"||typeof s=="object"&&s!==null&&!(Symbol.toPrimitive in s||"toString"in s||"valueOf"in s)}function fe(s){return!th(s)&&!isNaN(parseFloat(s))&&isFinite(s)}function or(s,t){let e=Math.round(s);return e-t<=s&&e+t>=s}function nn(s,t,e){let i,n,o;for(i=0,n=s.length;il&&c=Math.min(t,e)-i&&s<=Math.max(t,e)+i}function ii(s,t,e){e=e||(r=>s[r]1;)o=n+i>>1,e(o)?n=o:i=o;return{lo:n,hi:i}}var Ct=(s,t,e,i)=>ii(s,e,i?n=>{let o=s[n][t];return os[n][t]ii(s,e,i=>s[i][t]>=e);function lr(s,t,e){let i=0,n=s.length;for(;ii&&s[n-1]>e;)n--;return i>0||n{let i="_onData"+ei(e),n=s[e];Object.defineProperty(s,e,{configurable:!0,enumerable:!1,value(...o){let r=n.apply(this,o);return s._chartjs.listeners.forEach(a=>{typeof a[i]=="function"&&a[i](...o)}),r}})})}function an(s,t){let e=s._chartjs;if(!e)return;let i=e.listeners,n=i.indexOf(t);n!==-1&&i.splice(n,1),!(i.length>0)&&(cr.forEach(o=>{delete s[o]}),delete s._chartjs)}function ln(s){let t=new Set(s);return t.size===s.length?s:Array.from(t)}var cn=(function(){return typeof window>"u"?function(s){return s()}:window.requestAnimationFrame})();function hn(s,t){let e=[],i=!1;return function(...n){e=n,i||(i=!0,cn.call(window,()=>{i=!1,s.apply(t,e)}))}}function ur(s,t){let e;return function(...i){return t?(clearTimeout(e),e=setTimeout(s,t,i)):s.apply(this,i),t}}var ni=s=>s==="start"?"left":s==="end"?"right":"center",it=(s,t,e)=>s==="start"?t:s==="end"?e:(t+e)/2,dr=(s,t,e,i)=>s===(i?"left":"right")?e:s==="center"?(t+e)/2:t;function un(s,t,e){let i=t.length,n=0,o=i;if(s._sorted){let{iScale:r,vScale:a,_parsed:l}=s,c=s.dataset&&s.dataset.options?s.dataset.options.spanGaps:null,h=r.axis,{min:u,max:d,minDefined:f,maxDefined:g}=r.getUserBounds();if(f){if(n=Math.min(Ct(l,h,u).lo,e?i:Ct(t,h,r.getPixelForValue(u)).lo),c){let m=l.slice(0,n+1).reverse().findIndex(p=>!I(p[a.axis]));n-=Math.max(0,m)}n=K(n,0,i-1)}if(g){let m=Math.max(Ct(l,r.axis,d,!0).hi+1,e?0:Ct(t,h,r.getPixelForValue(d),!0).hi+1);if(c){let p=l.slice(m-1).findIndex(b=>!I(b[a.axis]));m+=Math.max(0,p)}o=K(m,n,i)-n}else o=i-n}return{start:n,count:o}}function dn(s){let{xScale:t,yScale:e,_scaleRanges:i}=s,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!i)return s._scaleRanges=n,!0;let o=i.xmin!==t.min||i.xmax!==t.max||i.ymin!==e.min||i.ymax!==e.max;return Object.assign(i,n),o}var qs=s=>s===0||s===1,Yo=(s,t,e)=>-(Math.pow(2,10*(s-=1))*Math.sin((s-t)*$/e)),Zo=(s,t,e)=>Math.pow(2,-10*s)*Math.sin((s-t)*$/e)+1,Ce={linear:s=>s,easeInQuad:s=>s*s,easeOutQuad:s=>-s*(s-2),easeInOutQuad:s=>(s/=.5)<1?.5*s*s:-.5*(--s*(s-2)-1),easeInCubic:s=>s*s*s,easeOutCubic:s=>(s-=1)*s*s+1,easeInOutCubic:s=>(s/=.5)<1?.5*s*s*s:.5*((s-=2)*s*s+2),easeInQuart:s=>s*s*s*s,easeOutQuart:s=>-((s-=1)*s*s*s-1),easeInOutQuart:s=>(s/=.5)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2),easeInQuint:s=>s*s*s*s*s,easeOutQuint:s=>(s-=1)*s*s*s*s+1,easeInOutQuint:s=>(s/=.5)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2),easeInSine:s=>-Math.cos(s*q)+1,easeOutSine:s=>Math.sin(s*q),easeInOutSine:s=>-.5*(Math.cos(F*s)-1),easeInExpo:s=>s===0?0:Math.pow(2,10*(s-1)),easeOutExpo:s=>s===1?1:-Math.pow(2,-10*s)+1,easeInOutExpo:s=>qs(s)?s:s<.5?.5*Math.pow(2,10*(s*2-1)):.5*(-Math.pow(2,-10*(s*2-1))+2),easeInCirc:s=>s>=1?s:-(Math.sqrt(1-s*s)-1),easeOutCirc:s=>Math.sqrt(1-(s-=1)*s),easeInOutCirc:s=>(s/=.5)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1),easeInElastic:s=>qs(s)?s:Yo(s,.075,.3),easeOutElastic:s=>qs(s)?s:Zo(s,.075,.3),easeInOutElastic(s){return qs(s)?s:s<.5?.5*Yo(s*2,.1125,.45):.5+.5*Zo(s*2-1,.1125,.45)},easeInBack(s){return s*s*((1.70158+1)*s-1.70158)},easeOutBack(s){return(s-=1)*s*((1.70158+1)*s+1.70158)+1},easeInOutBack(s){let t=1.70158;return(s/=.5)<1?.5*(s*s*(((t*=1.525)+1)*s-t)):.5*((s-=2)*s*(((t*=1.525)+1)*s+t)+2)},easeInBounce:s=>1-Ce.easeOutBounce(1-s),easeOutBounce(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},easeInOutBounce:s=>s<.5?Ce.easeInBounce(s*2)*.5:Ce.easeOutBounce(s*2-1)*.5+.5};function fn(s){if(s&&typeof s=="object"){let t=s.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function gn(s){return fn(s)?s:new hs(s)}function Ji(s){return fn(s)?s:new hs(s).saturate(.5).darken(.1).hexString()}var sh=["x","y","borderWidth","radius","tension"],ih=["color","borderColor","backgroundColor"];function nh(s){s.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),s.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>t!=="onProgress"&&t!=="onComplete"&&t!=="fn"}),s.set("animations",{colors:{type:"color",properties:ih},numbers:{type:"number",properties:sh}}),s.describe("animations",{_fallback:"animation"}),s.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>t|0}}}})}function oh(s){s.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var qo=new Map;function rh(s,t){t=t||{};let e=s+JSON.stringify(t),i=qo.get(e);return i||(i=new Intl.NumberFormat(s,t),qo.set(e,i)),i}function Re(s,t,e){return rh(t,e).format(s)}var fr={values(s){return H(s)?s:""+s},numeric(s,t,e){if(s===0)return"0";let i=this.chart.options.locale,n,o=s;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),o=ah(s,e)}let r=Vt(Math.abs(o)),a=isNaN(r)?1:Math.max(Math.min(-1*Math.floor(r),20),0),l={notation:n,minimumFractionDigits:a,maximumFractionDigits:a};return Object.assign(l,this.options.ticks.format),Re(s,i,l)},logarithmic(s,t,e){if(s===0)return"0";let i=e[t].significand||s/Math.pow(10,Math.floor(Vt(s)));return[1,2,3,5,10,15].includes(i)||t>.8*e.length?fr.numeric.call(this,s,t,e):""}};function ah(s,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&s!==Math.floor(s)&&(e=s-Math.floor(s)),e}var ms={formatters:fr};function lh(s){s.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ms.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),s.route("scale.ticks","color","","color"),s.route("scale.grid","color","","borderColor"),s.route("scale.border","color","","borderColor"),s.route("scale.title","color","","color"),s.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&t!=="callback"&&t!=="parser",_indexable:t=>t!=="borderDash"&&t!=="tickBorderDash"&&t!=="dash"}),s.describe("scales",{_fallback:"scale"}),s.describe("scale.ticks",{_scriptable:t=>t!=="backdropPadding"&&t!=="callback",_indexable:t=>t!=="backdropPadding"})}var Jt=Object.create(null),oi=Object.create(null);function ds(s,t){if(!t)return s;let e=t.split(".");for(let i=0,n=e.length;ii.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(i,n)=>Ji(n.backgroundColor),this.hoverBorderColor=(i,n)=>Ji(n.borderColor),this.hoverColor=(i,n)=>Ji(n.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Ki(this,t,e)}get(t){return ds(this,t)}describe(t,e){return Ki(oi,t,e)}override(t,e){return Ki(Jt,t,e)}route(t,e,i,n){let o=ds(this,t),r=ds(this,i),a="_"+e;Object.defineProperties(o,{[a]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[a],c=r[n];return E(l)?Object.assign({},c,l):P(l,c)},set(l){this[a]=l}}})}apply(t){t.forEach(e=>e(this))}},j=new Qi({_scriptable:s=>!s.startsWith("on"),_indexable:s=>s!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[nh,oh,lh]);function ch(s){return!s||I(s.size)||I(s.family)?null:(s.style?s.style+" ":"")+(s.weight?s.weight+" ":"")+s.size+"px "+s.family}function fs(s,t,e,i,n){let o=t[n];return o||(o=t[n]=s.measureText(n).width,e.push(n)),o>i&&(i=o),i}function gr(s,t,e,i){i=i||{};let n=i.data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==t&&(n=i.data={},o=i.garbageCollect=[],i.font=t),s.save(),s.font=t;let r=0,a=e.length,l,c,h,u,d;for(l=0;le.length){for(l=0;l0&&s.stroke()}}function Pt(s,t,e){return e=e||.5,!t||s&&s.x>t.left-e&&s.xt.top-e&&s.y0&&o.strokeColor!=="",l,c;for(s.save(),s.font=n.string,hh(s,o),l=0;l+s||0;function ai(s,t){let e={},i=E(t),n=i?Object.keys(t):t,o=E(s)?i?r=>P(s[r],s[t[r]]):r=>s[r]:()=>s;for(let r of n)e[r]=ph(o(r));return e}function bn(s){return ai(s,{top:"y",right:"x",bottom:"y",left:"x"})}function te(s){return ai(s,["topLeft","topRight","bottomLeft","bottomRight"])}function nt(s){let t=bn(s);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function X(s,t){s=s||{},t=t||j.font;let e=P(s.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let i=P(s.style,t.style);i&&!(""+i).match(gh)&&(console.warn('Invalid font style specified: "'+i+'"'),i=void 0);let n={family:P(s.family,t.family),lineHeight:mh(P(s.lineHeight,t.lineHeight),e),size:e,style:i,weight:P(s.weight,t.weight),string:""};return n.string=ch(n),n}function ze(s,t,e,i){let n=!0,o,r,a;for(o=0,r=s.length;oe&&a===0?0:a+l;return{min:r(i,-Math.abs(o)),max:r(n,o)}}function Bt(s,t){return Object.assign(Object.create(s),t)}function li(s,t=[""],e,i,n=()=>s[0]){let o=e||s;typeof i>"u"&&(i=_r("_fallback",s));let r={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:s,_rootScopes:o,_fallback:i,_getTarget:n,override:a=>li([a,...s],t,o,i)};return new Proxy(r,{deleteProperty(a,l){return delete a[l],delete a._keys,delete s[0][l],!0},get(a,l){return yr(a,l,()=>Sh(l,t,s,a))},getOwnPropertyDescriptor(a,l){return Reflect.getOwnPropertyDescriptor(a._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(s[0])},has(a,l){return Xo(a).includes(l)},ownKeys(a){return Xo(a)},set(a,l,c){let h=a._storage||(a._storage=n());return a[l]=h[l]=c,delete a._keys,!0}})}function de(s,t,e,i){let n={_cacheable:!1,_proxy:s,_context:t,_subProxy:e,_stack:new Set,_descriptors:yn(s,i),setContext:o=>de(s,o,e,i),override:o=>de(s.override(o),t,e,i)};return new Proxy(n,{deleteProperty(o,r){return delete o[r],delete s[r],!0},get(o,r,a){return yr(o,r,()=>yh(o,r,a))},getOwnPropertyDescriptor(o,r){return o._descriptors.allKeys?Reflect.has(s,r)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(s,r)},getPrototypeOf(){return Reflect.getPrototypeOf(s)},has(o,r){return Reflect.has(s,r)},ownKeys(){return Reflect.ownKeys(s)},set(o,r,a){return s[r]=a,delete o[r],!0}})}function yn(s,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:i=t.indexable,_allKeys:n=t.allKeys}=s;return{allKeys:n,scriptable:e,indexable:i,isScriptable:zt(e)?e:()=>e,isIndexable:zt(i)?i:()=>i}}var bh=(s,t)=>s?s+ei(t):t,xn=(s,t)=>E(t)&&s!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function yr(s,t,e){if(Object.prototype.hasOwnProperty.call(s,t)||t==="constructor")return s[t];let i=e();return s[t]=i,i}function yh(s,t,e){let{_proxy:i,_context:n,_subProxy:o,_descriptors:r}=s,a=i[t];return zt(a)&&r.isScriptable(t)&&(a=xh(t,a,s,e)),H(a)&&a.length&&(a=_h(t,a,s,r.isIndexable)),xn(t,a)&&(a=de(a,n,o&&o[t],r)),a}function xh(s,t,e,i){let{_proxy:n,_context:o,_subProxy:r,_stack:a}=e;if(a.has(s))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+s);a.add(s);let l=t(o,r||i);return a.delete(s),xn(s,l)&&(l=_n(n._scopes,n,s,l)),l}function _h(s,t,e,i){let{_proxy:n,_context:o,_subProxy:r,_descriptors:a}=e;if(typeof o.index<"u"&&i(s))return t[o.index%t.length];if(E(t[0])){let l=t,c=n._scopes.filter(h=>h!==l);t=[];for(let h of l){let u=_n(c,n,s,h);t.push(de(u,o,r&&r[s],a))}}return t}function xr(s,t,e){return zt(s)?s(t,e):s}var wh=(s,t)=>s===!0?t:typeof s=="string"?Wt(t,s):void 0;function kh(s,t,e,i,n){for(let o of t){let r=wh(e,o);if(r){s.add(r);let a=xr(r._fallback,e,n);if(typeof a<"u"&&a!==e&&a!==i)return a}else if(r===!1&&typeof i<"u"&&e!==i)return null}return!1}function _n(s,t,e,i){let n=t._rootScopes,o=xr(t._fallback,e,i),r=[...s,...n],a=new Set;a.add(i);let l=Go(a,r,e,o||e,i);return l===null||typeof o<"u"&&o!==e&&(l=Go(a,r,o,l,i),l===null)?!1:li(Array.from(a),[""],n,o,()=>vh(t,e,i))}function Go(s,t,e,i,n){for(;e;)e=kh(s,t,e,i,n);return e}function vh(s,t,e){let i=s._getTarget();t in i||(i[t]={});let n=i[t];return H(n)&&E(e)?e:n||{}}function Sh(s,t,e,i){let n;for(let o of t)if(n=_r(bh(o,s),e),typeof n<"u")return xn(s,n)?_n(e,i,s,n):n}function _r(s,t){for(let e of t){if(!e)continue;let i=e[s];if(typeof i<"u")return i}}function Xo(s){let t=s._keys;return t||(t=s._keys=Mh(s._scopes)),t}function Mh(s){let t=new Set;for(let e of s)for(let i of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(i);return Array.from(t)}function wn(s,t,e,i){let{iScale:n}=s,{key:o="r"}=this._parsing,r=new Array(i),a,l,c,h;for(a=0,l=i;ats==="x"?"y":"x";function Th(s,t,e,i){let n=s.skip?t:s,o=t,r=e.skip?t:e,a=Qs(o,n),l=Qs(r,o),c=a/(a+l),h=l/(a+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let u=i*c,d=i*h;return{previous:{x:o.x-u*(r.x-n.x),y:o.y-u*(r.y-n.y)},next:{x:o.x+d*(r.x-n.x),y:o.y+d*(r.y-n.y)}}}function Dh(s,t,e){let i=s.length,n,o,r,a,l,c=Ae(s,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")Ph(s,n);else{let c=i?s[s.length-1]:s[0];for(o=0,r=s.length;os.ownerDocument.defaultView.getComputedStyle(s,null);function Ih(s,t){return ui(s).getPropertyValue(t)}var Eh=["top","right","bottom","left"];function ue(s,t,e){let i={};e=e?"-"+e:"";for(let n=0;n<4;n++){let o=Eh[n];i[o]=parseFloat(s[t+"-"+o+e])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}var Lh=(s,t,e)=>(s>0||t>0)&&(!e||!e.shadowRoot);function Fh(s,t){let e=s.touches,i=e&&e.length?e[0]:s,{offsetX:n,offsetY:o}=i,r=!1,a,l;if(Lh(n,o,s.target))a=n,l=o;else{let c=t.getBoundingClientRect();a=i.clientX-c.left,l=i.clientY-c.top,r=!0}return{x:a,y:l,box:r}}function ee(s,t){if("native"in s)return s;let{canvas:e,currentDevicePixelRatio:i}=t,n=ui(e),o=n.boxSizing==="border-box",r=ue(n,"padding"),a=ue(n,"border","width"),{x:l,y:c,box:h}=Fh(s,e),u=r.left+(h&&a.left),d=r.top+(h&&a.top),{width:f,height:g}=t;return o&&(f-=r.width+a.width,g-=r.height+a.height),{x:Math.round((l-u)/f*e.width/i),y:Math.round((c-d)/g*e.height/i)}}function Rh(s,t,e){let i,n;if(t===void 0||e===void 0){let o=s&&hi(s);if(!o)t=s.clientWidth,e=s.clientHeight;else{let r=o.getBoundingClientRect(),a=ui(o),l=ue(a,"border","width"),c=ue(a,"padding");t=r.width-c.width-l.width,e=r.height-c.height-l.height,i=ti(a.maxWidth,o,"clientWidth"),n=ti(a.maxHeight,o,"clientHeight")}}return{width:t,height:e,maxWidth:i||Ks,maxHeight:n||Ks}}var Xt=s=>Math.round(s*10)/10;function vr(s,t,e,i){let n=ui(s),o=ue(n,"margin"),r=ti(n.maxWidth,s,"clientWidth")||Ks,a=ti(n.maxHeight,s,"clientHeight")||Ks,l=Rh(s,t,e),{width:c,height:h}=l;if(n.boxSizing==="content-box"){let d=ue(n,"border","width"),f=ue(n,"padding");c-=f.width+d.width,h-=f.height+d.height}return c=Math.max(0,c-o.width),h=Math.max(0,i?c/i:h-o.height),c=Xt(Math.min(c,r,l.maxWidth)),h=Xt(Math.min(h,a,l.maxHeight)),c&&!h&&(h=Xt(c/2)),(t!==void 0||e!==void 0)&&i&&l.height&&h>l.height&&(h=l.height,c=Xt(Math.floor(h*i))),{width:c,height:h}}function kn(s,t,e){let i=t||1,n=Xt(s.height*i),o=Xt(s.width*i);s.height=Xt(s.height),s.width=Xt(s.width);let r=s.canvas;return r.style&&(e||!r.style.height&&!r.style.width)&&(r.style.height=`${s.height}px`,r.style.width=`${s.width}px`),s.currentDevicePixelRatio!==i||r.height!==n||r.width!==o?(s.currentDevicePixelRatio=i,r.height=n,r.width=o,s.ctx.setTransform(i,0,0,i,0,0),!0):!1}var Sr=(function(){let s=!1;try{let t={get passive(){return s=!0,!1}};ci()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch{}return s})();function vn(s,t){let e=Ih(s,t),i=e&&e.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function Gt(s,t,e,i){return{x:s.x+e*(t.x-s.x),y:s.y+e*(t.y-s.y)}}function Mr(s,t,e,i){return{x:s.x+e*(t.x-s.x),y:i==="middle"?e<.5?s.y:t.y:i==="after"?e<1?s.y:t.y:e>0?t.y:s.y}}function Or(s,t,e,i){let n={x:s.cp2x,y:s.cp2y},o={x:t.cp1x,y:t.cp1y},r=Gt(s,n,e),a=Gt(n,o,e),l=Gt(o,t,e),c=Gt(r,a,e),h=Gt(a,l,e);return Gt(c,h,e)}var Nh=function(s,t){return{x(e){return s+s+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,i){return e-i},leftForLtr(e,i){return e-i}}},zh=function(){return{x(s){return s},setWidth(s){},textAlign(s){return s},xPlus(s,t){return s+t},leftForLtr(s,t){return s}}};function ge(s,t,e){return s?Nh(t,e):zh()}function Sn(s,t){let e,i;(t==="ltr"||t==="rtl")&&(e=s.canvas.style,i=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),s.prevTextDirection=i)}function Mn(s,t){t!==void 0&&(delete s.prevTextDirection,s.canvas.style.setProperty("direction",t[0],t[1]))}function Tr(s){return s==="angle"?{between:Fe,compare:eh,normalize:st}:{between:It,compare:(t,e)=>t-e,normalize:t=>t}}function Jo({start:s,end:t,count:e,loop:i,style:n}){return{start:s%e,end:t%e,loop:i&&(t-s+1)%e===0,style:n}}function Vh(s,t,e){let{property:i,start:n,end:o}=e,{between:r,normalize:a}=Tr(i),l=t.length,{start:c,end:h,loop:u}=s,d,f;if(u){for(c+=l,h+=l,d=0,f=l;dl(n,_,b)&&a(n,_)!==0,x=()=>a(o,b)===0||l(o,_,b),k=()=>m||w(),S=()=>!m||x();for(let M=h,T=h;M<=u;++M)y=t[M%r],!y.skip&&(b=c(y[i]),b!==_&&(m=l(b,n,o),p===null&&k()&&(p=a(b,n)===0?M:T),p!==null&&S()&&(g.push(Jo({start:p,end:M,loop:d,count:r,style:f})),p=null),T=M,_=b));return p!==null&&g.push(Jo({start:p,end:u,loop:d,count:r,style:f})),g}function Tn(s,t){let e=[],i=s.segments;for(let n=0;nn&&s[o%t].skip;)o--;return o%=t,{start:n,end:o}}function Bh(s,t,e,i){let n=s.length,o=[],r=t,a=s[t],l;for(l=t+1;l<=e;++l){let c=s[l%n];c.skip||c.stop?a.skip||(i=!1,o.push({start:t%n,end:(l-1)%n,loop:i}),t=r=c.stop?l:null):(r=l,a.skip&&(t=l)),a=c}return r!==null&&o.push({start:t%n,end:r%n,loop:i}),o}function Dr(s,t){let e=s.points,i=s.options.spanGaps,n=e.length;if(!n)return[];let o=!!s._loop,{start:r,end:a}=Wh(e,n,o,i);if(i===!0)return Ko(s,[{start:r,end:a,loop:o}],e,t);let l=aa({chart:t,initial:e.initial,numSteps:r,currentStep:Math.min(i-e.start,r)}))}_refresh(){this._request||(this._running=!0,this._request=cn.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((i,n)=>{if(!i.running||!i.items.length)return;let o=i.items,r=o.length-1,a=!1,l;for(;r>=0;--r)l=o[r],l._active?(l._total>i.duration&&(i.duration=l._total),l.tick(t),a=!0):(o[r]=o[o.length-1],o.pop());a&&(n.draw(),this._notify(n,i,t,"progress")),o.length||(i.running=!1,this._notify(n,i,t,"complete"),i.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((i,n)=>Math.max(i,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let i=e.items,n=i.length-1;for(;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},Ht=new Wn,Cr="transparent",Uh={boolean(s,t,e){return e>.5?t:s},color(s,t,e){let i=gn(s||Cr),n=i.valid&&gn(t||Cr);return n&&n.valid?n.mix(i,e).hexString():t},number(s,t,e){return s+(t-s)*e}},Bn=class{constructor(t,e,i,n){let o=e[i];n=ze([t.to,n,o,t.from]);let r=ze([t.from,o,n]);this._active=!0,this._fn=t.fn||Uh[t.type||typeof r],this._easing=Ce[t.easing]||Ce.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=r,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);let n=this._target[this._prop],o=i-this._start,r=this._duration-o;this._start=i,this._duration=Math.floor(Math.max(r,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=ze([t.to,e,n,t.from]),this._from=ze([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,i=this._duration,n=this._prop,o=this._from,r=this._loop,a=this._to,l;if(this._active=o!==a&&(r||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,a,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,i)=>{t.push({res:e,rej:i})})}_notify(t){let e=t?"res":"rej",i=this._promises||[];for(let n=0;n{let o=t[n];if(!E(o))return;let r={};for(let a of e)r[a]=o[a];(H(o.properties)&&o.properties||[n]).forEach(a=>{(a===n||!i.has(a))&&i.set(a,r)})})}_animateOptions(t,e){let i=e.options,n=Zh(t,i);if(!n)return[];let o=this._createAnimations(n,i);return i.$shared&&Yh(t.options.$animations,i).then(()=>{t.options=i},()=>{}),o}_createAnimations(t,e){let i=this._properties,n=[],o=t.$animations||(t.$animations={}),r=Object.keys(e),a=Date.now(),l;for(l=r.length-1;l>=0;--l){let c=r[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}let h=e[c],u=o[c],d=i.get(c);if(u)if(d&&u.active()){u.update(d,h,a);continue}else u.cancel();if(!d||!d.duration){t[c]=h;continue}o[c]=u=new Bn(d,t,c,h),n.push(u)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let i=this._createAnimations(t,e);if(i.length)return Ht.add(this._chart,i),!0}};function Yh(s,t){let e=[],i=Object.keys(t);for(let n=0;n0||!e&&o<0)return n.index}return null}function Er(s,t){let{chart:e,_cachedMeta:i}=s,n=e._stacks||(e._stacks={}),{iScale:o,vScale:r,index:a}=i,l=o.axis,c=r.axis,h=Jh(o,r,i),u=t.length,d;for(let f=0;fe[i].axis===t).shift()}function tu(s,t){return Bt(s,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function eu(s,t,e){return Bt(s,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function ys(s,t){let e=s.controller.index,i=s.vScale&&s.vScale.axis;if(i){t=t||s._parsed;for(let n of t){let o=n._stacks;if(!o||o[i]===void 0||o[i][e]===void 0)return;delete o[i][e],o[i]._visualValues!==void 0&&o[i]._visualValues[e]!==void 0&&delete o[i]._visualValues[e]}}}var An=s=>s==="reset"||s==="none",Lr=(s,t)=>t?s:Object.assign({},s),su=(s,t,e)=>s&&!t.hidden&&t._stacked&&{keys:Da(e,!0),values:null},ut=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Cn(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&ys(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,i=this.getDataset(),n=(u,d,f,g)=>u==="x"?d:u==="r"?g:f,o=e.xAxisID=P(i.xAxisID,Pn(t,"x")),r=e.yAxisID=P(i.yAxisID,Pn(t,"y")),a=e.rAxisID=P(i.rAxisID,Pn(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,o,r,a),h=e.vAxisID=n(l,r,o,a);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(r),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&an(this._data,this),t._stacked&&ys(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(E(e)){let n=this._cachedMeta;this._data=Xh(e,n)}else if(i!==e){if(i){an(i,this);let n=this._cachedMeta;ys(n),n._parsed=[]}e&&Object.isExtensible(e)&&hr(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,i=this.getDataset(),n=!1;this._dataCheck();let o=e._stacked;e._stacked=Cn(e.vScale,e),e.stack!==i.stack&&(n=!0,ys(e),e.stack=i.stack),this._resyncElements(t),(n||o!==e._stacked)&&(Er(this,e._parsed),e._stacked=Cn(e.vScale,e))}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:i,_data:n}=this,{iScale:o,_stacked:r}=i,a=o.axis,l=t===0&&e===n.length?!0:i._sorted,c=t>0&&i._parsed[t-1],h,u,d;if(this._parsing===!1)i._parsed=n,i._sorted=!0,d=n;else{H(n[t])?d=this.parseArrayData(i,n,t,e):E(n[t])?d=this.parseObjectData(i,n,t,e):d=this.parsePrimitiveData(i,n,t,e);let f=()=>u[a]===null||c&&u[a]m||u=0;--d)if(!g()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,i=[],n,o,r;for(n=0,o=e.length;n=0&&tthis.getContext(i,n,e),m=c.resolveNamedOptions(d,f,g,u);return m.$shared&&(m.$shared=l,o[r]=Object.freeze(Lr(m,l))),m}_resolveAnimations(t,e,i){let n=this.chart,o=this._cachedDataOpts,r=`animation-${e}`,a=o[r];if(a)return a;let l;if(n.options.animation!==!1){let h=this.chart.config,u=h.datasetAnimationScopeKeys(this._type,e),d=h.getOptionScopes(this.getDataset(),u);l=h.createResolver(d,this.getContext(t,i,e))}let c=new _i(n,l&&l.animations);return l&&l._cacheable&&(o[r]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||An(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(i),r=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,i),{sharedOptions:o,includeOptions:r}}updateElement(t,e,i,n){An(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}updateSharedOptions(t,e,i){t&&!An(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,n){t.active=n;let o=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,i=this._cachedMeta.data;for(let[a,l,c]of this._syncList)this[a](l,c);this._syncList=[];let n=i.length,o=e.length,r=Math.min(o,n);r&&this.parse(0,r),o>n?this._insertElements(n,o-n,t):o{for(c.length+=e,a=c.length-1;a>=r;a--)c[a]=c[a-e]};for(l(o),a=t;an-o))}return s._cache.$bar}function nu(s){let t=s.iScale,e=iu(t,s.type),i=t._length,n,o,r,a,l=()=>{r===32767||r===-32768||(Ee(a)&&(i=Math.min(i,Math.abs(r-a)||i)),a=r)};for(n=0,o=e.length;n0?n[s-1]:null,a=sMath.abs(a)&&(l=a,c=r),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:o,min:r,max:a}}function Ca(s,t,e,i){return H(s)?au(s,t,e,i):t[e.axis]=e.parse(s,i),t}function Fr(s,t,e,i){let n=s.iScale,o=s.vScale,r=n.getLabels(),a=n===o,l=[],c,h,u,d;for(c=e,h=e+i;c=e?1:-1)}function cu(s){let t,e,i,n,o;return s.horizontal?(t=s.base>s.x,e="left",i="right"):(t=s.baseh.controller.options.grouped),o=i.options.stacked,r=[],a=this._cachedMeta.controller.getParsed(e),l=a&&a[i.axis],c=h=>{let u=h._parsed.find(f=>f[i.axis]===l),d=u&&u[h.vScale.axis];if(I(d)||isNaN(d))return!0};for(let h of n)if(!(e!==void 0&&c(h))&&((o===!1||r.indexOf(h.stack)===-1||o===void 0&&h.stack===void 0)&&r.push(h.stack),h.index===t))break;return r.length||r.push(void 0),r}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(i=>t[i].axis===e).shift()}_getAxis(){let t={},e=this.getFirstScaleIdForIndexAxis();for(let i of this.chart.data.datasets)t[P(this.chart.options.indexAxis==="x"?i.xAxisID:i.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,i){let n=this._getStacks(t,i),o=e!==void 0?n.indexOf(e):-1;return o===-1?n.length-1:o}_getRuler(){let t=this.options,e=this._cachedMeta,i=e.iScale,n=[],o,r;for(o=0,r=e.data.length;o=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:n,yScale:o}=e,r=this.getParsed(t),a=n.getLabelForValue(r.x),l=o.getLabelForValue(r.y),c=r._custom;return{label:i[t]||"",value:"("+a+", "+l+(c?", "+c:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,n){let o=n==="reset",{iScale:r,vScale:a}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=r.axis,u=a.axis;for(let d=e;dFe(_,a,l,!0)?1:Math.max(w,w*e,x,x*e),g=(_,w,x)=>Fe(_,a,l,!0)?-1:Math.min(w,w*e,x,x*e),m=f(0,c,u),p=f(q,h,d),b=g(F,c,u),y=g(F+q,h,d);i=(m-b)/2,n=(p-y)/2,o=-(m+b)/2,r=-(p+y)/2}return{ratioX:i,ratioY:n,offsetX:o,offsetY:r}}var jt=class extends ut{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let i=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=i;else{let o=l=>+i[l];if(E(i[t])){let{key:l="value"}=this._parsing;o=c=>+Wt(i[c],l)}let r,a;for(r=t,a=t+e;r0&&!isNaN(t)?$*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Re(e._parsed[t],i.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){let e=0,i=this.chart,n,o,r,a,l;if(!t){for(n=0,o=i.data.datasets.length;nt!=="spacing",_indexable:t=>t!=="spacing"&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),v(jt,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data,{labels:{pointStyle:i,textAlign:n,color:o,useBorderRadius:r,borderRadius:a}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((l,c)=>{let u=t.getDatasetMeta(0).controller.getStyle(c);return{text:l,fillStyle:u.backgroundColor,fontColor:o,hidden:!t.getDataVisibility(c),lineDash:u.borderDash,lineDashOffset:u.borderDashOffset,lineJoin:u.borderJoinStyle,lineWidth:u.borderWidth,strokeStyle:u.borderColor,textAlign:n,pointStyle:i,borderRadius:r&&(a||u.borderRadius),index:c}}):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}});var He=class extends ut{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:i,data:n=[],_dataset:o}=e,r=this.chart._animationsDisabled,{start:a,count:l}=un(e,n,r);this._drawStart=a,this._drawCount=l,dn(e)&&(a=0,l=n.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!o._decimated,i.points=n;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(i,void 0,{animated:!r,options:c},t),this.updateElements(n,a,l,t)}updateElements(t,e,i,n){let o=n==="reset",{iScale:r,vScale:a,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:u}=this._getSharedOptions(e,n),d=r.axis,f=a.axis,{spanGaps:g,segment:m}=this.options,p=fe(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||n==="none",y=e+i,_=t.length,w=e>0&&this.getParsed(e-1);for(let x=0;x<_;++x){let k=t[x],S=b?k:{};if(x=y){S.skip=!0;continue}let M=this.getParsed(x),T=I(M[f]),C=S[d]=r.getPixelForValue(M[d],x),A=S[f]=o||T?a.getBasePixel():a.getPixelForValue(l?this.applyStack(a,M,l):M[f],x);S.skip=isNaN(C)||isNaN(A)||T,S.stop=x>0&&Math.abs(M[d]-w[d])>p,m&&(S.parsed=M,S.raw=c.data[x]),u&&(S.options=h||this.resolveDataElementOptions(x,k.active?"active":n)),b||this.updateElement(k,x,S,n),w=M}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;let o=n[0].size(this.resolveDataElementOptions(0)),r=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,o,r)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};v(He,"id","line"),v(He,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),v(He,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});var xe=class extends ut{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,i=this.chart,n=i.data.labels||[],o=Re(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:o}}parseObjectData(t,e,i,n){return wn.bind(this)(t,e,i,n)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((i,n)=>{let o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(oe.max&&(e.max=o))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),r=Math.max(i.cutoutPercentage?o/100*i.cutoutPercentage:1,0),a=(o-r)/t.getVisibleDatasetCount();this.outerRadius=o-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,e,i,n){let o=n==="reset",r=this.chart,l=r.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,u=c.yCenter,d=c.getIndexAngle(0)-.5*F,f=d,g,m=360/this.countVisibleElements();for(g=0;g{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?bt(this.resolveDataElementOptions(t,e).angle||i):0}};v(xe,"id","polarArea"),v(xe,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),v(xe,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data;if(e.labels.length&&e.datasets.length){let{labels:{pointStyle:i,color:n}}=t.legend.options;return e.labels.map((o,r)=>{let l=t.getDatasetMeta(0).controller.getStyle(r);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:n,lineWidth:l.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(r),index:r}})}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var vs=class extends jt{};v(vs,"id","pie"),v(vs,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});var $e=class extends ut{getLabelAndValue(t){let e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,n){return wn.bind(this)(t,e,i,n)}update(t){let e=this._cachedMeta,i=e.dataset,n=e.data||[],o=e.iScale.getLabels();if(i.points=n,t!=="resize"){let r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0);let a={_loop:!0,_fullLoop:o.length===n.length,options:r};this.updateElement(i,void 0,a,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,i,n){let o=this._cachedMeta.rScale,r=n==="reset";for(let a=e;a0&&this.getParsed(e-1);for(let w=e;w0&&Math.abs(k[f]-_[f])>b,p&&(S.parsed=k,S.raw=c.data[w]),d&&(S.options=u||this.resolveDataElementOptions(w,x.active?"active":n)),y||this.updateElement(x,w,S,n),_=k}this.updateSharedOptions(u,n,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let a=0;for(let l=e.length-1;l>=0;--l)a=Math.max(a,e[l].size(this.resolveDataElementOptions(l))/2);return a>0&&a}let i=t.dataset,n=i.options&&i.options.borderWidth||0;if(!e.length)return n;let o=e[0].size(this.resolveDataElementOptions(0)),r=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,o,r)/2}};v(je,"id","scatter"),v(je,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),v(je,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});var gu=Object.freeze({__proto__:null,BarController:We,BubbleController:Be,DoughnutController:jt,LineController:He,PieController:vs,PolarAreaController:xe,RadarController:$e,ScatterController:je});function me(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var Hn=class s{constructor(t){v(this,"options");this.options=t||{}}static override(t){Object.assign(s.prototype,t)}init(){}formats(){return me()}parse(){return me()}format(){return me()}add(){return me()}diff(){return me()}startOf(){return me()}endOf(){return me()}},to={_date:Hn};function mu(s,t,e,i){let{controller:n,data:o,_sorted:r}=s,a=n._cachedMeta.iScale,l=s.dataset&&s.dataset.options?s.dataset.options.spanGaps:null;if(a&&t===a.axis&&t!=="r"&&r&&o.length){let c=a._reversePixels?ar:Ct;if(i){if(n._sharedOptions){let h=o[0],u=typeof h.getRange=="function"&&h.getRange(t);if(u){let d=c(o,t,e-u),f=c(o,t,e+u);return{lo:d.lo,hi:f.hi}}}}else{let h=c(o,t,e);if(l){let{vScale:u}=n._cachedMeta,{_parsed:d}=s,f=d.slice(0,h.lo+1).reverse().findIndex(m=>!I(m[u.axis]));h.lo-=Math.max(0,f);let g=d.slice(h.hi).findIndex(m=>!I(m[u.axis]));h.hi+=Math.max(0,g)}return h}}return{lo:0,hi:o.length-1}}function Ls(s,t,e,i,n){let o=s.getSortedVisibleDatasetMetas(),r=e[t];for(let a=0,l=o.length;a{l[r]&&l[r](t[e],n)&&(o.push({element:l,datasetIndex:c,index:h}),a=a||l.inRange(t.x,t.y,n))}),i&&!a?[]:o}var xu={evaluateInteractionItems:Ls,modes:{index(s,t,e,i){let n=ee(t,s),o=e.axis||"x",r=e.includeInvisible||!1,a=e.intersect?En(s,n,o,i,r):Ln(s,n,o,!1,i,r),l=[];return a.length?(s.getSortedVisibleDatasetMetas().forEach(c=>{let h=a[0].index,u=c.data[h];u&&!u.skip&&l.push({element:u,datasetIndex:c.index,index:h})}),l):[]},dataset(s,t,e,i){let n=ee(t,s),o=e.axis||"xy",r=e.includeInvisible||!1,a=e.intersect?En(s,n,o,i,r):Ln(s,n,o,!1,i,r);if(a.length>0){let l=a[0].datasetIndex,c=s.getDatasetMeta(l).data;a=[];for(let h=0;he.pos===t)}function Vr(s,t){return s.filter(e=>Pa.indexOf(e.pos)===-1&&e.box.axis===t)}function _s(s,t){return s.sort((e,i)=>{let n=t?i:e,o=t?e:i;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function _u(s){let t=[],e,i,n,o,r,a;for(e=0,i=(s||[]).length;ec.box.fullSize),!0),i=_s(xs(t,"left"),!0),n=_s(xs(t,"right")),o=_s(xs(t,"top"),!0),r=_s(xs(t,"bottom")),a=Vr(t,"x"),l=Vr(t,"y");return{fullSize:e,leftAndTop:i.concat(o),rightAndBottom:n.concat(l).concat(r).concat(a),chartArea:xs(t,"chartArea"),vertical:i.concat(n).concat(l),horizontal:o.concat(r).concat(a)}}function Wr(s,t,e,i){return Math.max(s[e],t[e])+Math.max(s[i],t[i])}function Aa(s,t){s.top=Math.max(s.top,t.top),s.left=Math.max(s.left,t.left),s.bottom=Math.max(s.bottom,t.bottom),s.right=Math.max(s.right,t.right)}function Su(s,t,e,i){let{pos:n,box:o}=e,r=s.maxPadding;if(!E(n)){e.size&&(s[n]-=e.size);let u=i[e.stack]||{size:0,count:1};u.size=Math.max(u.size,e.horizontal?o.height:o.width),e.size=u.size/u.count,s[n]+=e.size}o.getPadding&&Aa(r,o.getPadding());let a=Math.max(0,t.outerWidth-Wr(r,s,"left","right")),l=Math.max(0,t.outerHeight-Wr(r,s,"top","bottom")),c=a!==s.w,h=l!==s.h;return s.w=a,s.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Mu(s){let t=s.maxPadding;function e(i){let n=Math.max(t[i]-s[i],0);return s[i]+=n,n}s.y+=e("top"),s.x+=e("left"),e("right"),e("bottom")}function Ou(s,t){let e=t.maxPadding;function i(n){let o={left:0,top:0,right:0,bottom:0};return n.forEach(r=>{o[r]=Math.max(t[r],e[r])}),o}return i(s?["left","right"]:["top","bottom"])}function Ss(s,t,e,i){let n=[],o,r,a,l,c,h;for(o=0,r=s.length,c=0;o{typeof m.beforeLayout=="function"&&m.beforeLayout()});let h=l.reduce((m,p)=>p.box.options&&p.box.options.display===!1?m:m+1,0)||1,u=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:r,vBoxMaxWidth:o/2/h,hBoxMaxHeight:r/2}),d=Object.assign({},n);Aa(d,nt(i));let f=Object.assign({maxPadding:d,w:o,h:r,x:n.left,y:n.top},n),g=ku(l.concat(c),u);Ss(a.fullSize,f,u,g),Ss(l,f,u,g),Ss(c,f,u,g)&&Ss(l,f,u,g),Mu(f),Br(a.leftAndTop,f,u,g),f.x+=f.w,f.y+=f.h,Br(a.rightAndBottom,f,u,g),s.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},z(a.chartArea,m=>{let p=m.box;Object.assign(p,s.chartArea),p.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}},wi=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,n){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):i)}}isAttached(t){return!0}updateConfig(t){}},$n=class extends wi{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},yi="$chartjs",Tu={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Hr=s=>s===null||s==="";function Du(s,t){let e=s.style,i=s.getAttribute("height"),n=s.getAttribute("width");if(s[yi]={initial:{height:i,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",Hr(n)){let o=vn(s,"width");o!==void 0&&(s.width=o)}if(Hr(i))if(s.style.height==="")s.height=s.width/(t||2);else{let o=vn(s,"height");o!==void 0&&(s.height=o)}return s}var Ia=Sr?{passive:!0}:!1;function Cu(s,t,e){s&&s.addEventListener(t,e,Ia)}function Pu(s,t,e){s&&s.canvas&&s.canvas.removeEventListener(t,e,Ia)}function Au(s,t){let e=Tu[s.type]||s.type,{x:i,y:n}=ee(s,t);return{type:e,chart:t,native:s,x:i!==void 0?i:null,y:n!==void 0?n:null}}function ki(s,t){for(let e of s)if(e===t||e.contains(t))return!0}function Iu(s,t,e){let i=s.canvas,n=new MutationObserver(o=>{let r=!1;for(let a of o)r=r||ki(a.addedNodes,i),r=r&&!ki(a.removedNodes,i);r&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function Eu(s,t,e){let i=s.canvas,n=new MutationObserver(o=>{let r=!1;for(let a of o)r=r||ki(a.removedNodes,i),r=r&&!ki(a.addedNodes,i);r&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}var As=new Map,$r=0;function Ea(){let s=window.devicePixelRatio;s!==$r&&($r=s,As.forEach((t,e)=>{e.currentDevicePixelRatio!==s&&t()}))}function Lu(s,t){As.size||window.addEventListener("resize",Ea),As.set(s,t)}function Fu(s){As.delete(s),As.size||window.removeEventListener("resize",Ea)}function Ru(s,t,e){let i=s.canvas,n=i&&hi(i);if(!n)return;let o=hn((a,l)=>{let c=n.clientWidth;e(a,l),c{let l=a[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||o(c,h)});return r.observe(n),Lu(s,o),r}function Fn(s,t,e){e&&e.disconnect(),t==="resize"&&Fu(s)}function Nu(s,t,e){let i=s.canvas,n=hn(o=>{s.ctx!==null&&e(Au(o,s))},s);return Cu(i,t,n),n}var jn=class extends wi{acquireContext(t,e){let i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(Du(t,e),i):null}releaseContext(t){let e=t.canvas;if(!e[yi])return!1;let i=e[yi].initial;["height","width"].forEach(o=>{let r=i[o];I(r)?e.removeAttribute(o):e.setAttribute(o,r)});let n=i.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[yi],!0}addEventListener(t,e,i){this.removeEventListener(t,e);let n=t.$proxies||(t.$proxies={}),r={attach:Iu,detach:Eu,resize:Ru}[e]||Nu;n[e]=r(t,e,i)}removeEventListener(t,e){let i=t.$proxies||(t.$proxies={}),n=i[e];if(!n)return;({attach:Fn,detach:Fn,resize:Fn}[e]||Pu)(t,e,n),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,n){return vr(t,e,i,n)}isAttached(t){let e=t&&hi(t);return!!(e&&e.isConnected)}};function zu(s){return!ci()||typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas?$n:jn}var dt=class{constructor(){v(this,"x");v(this,"y");v(this,"active",!1);v(this,"options");v(this,"$animations")}tooltipPosition(t){let{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return fe(this.x)&&fe(this.y)}getProps(t,e){let i=this.$animations;if(!e||!i)return this;let n={};return t.forEach(o=>{n[o]=i[o]&&i[o].active()?i[o]._to:this[o]}),n}};v(dt,"defaults",{}),v(dt,"defaultRoutes");function Vu(s,t){let e=s.options.ticks,i=Wu(s),n=Math.min(e.maxTicksLimit||i,i),o=e.major.enabled?Hu(t):[],r=o.length,a=o[0],l=o[r-1],c=[];if(r>n)return $u(t,c,o,r/n),c;let h=Bu(o,t,n);if(r>0){let u,d,f=r>1?Math.round((l-a)/(r-1)):null;for(fi(t,c,h,I(f)?0:a-f,a),u=0,d=r-1;un)return l}return Math.max(n,1)}function Hu(s){let t=[],e,i;for(e=0,i=s.length;es==="left"?"right":s==="right"?"left":s,jr=(s,t,e)=>t==="top"||t==="left"?s[t]+e:s[t]-e,Ur=(s,t)=>Math.min(t||s,s);function Yr(s,t){let e=[],i=s.length/t,n=s.length,o=0;for(;or+a)))return l}function Zu(s,t){z(s,e=>{let i=e.gc,n=i.length/2,o;if(n>t){for(o=0;oi?i:e,i=n&&e>i?e:i,{min:at(e,at(i,e)),max:at(i,at(e,i))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){W(this.options.beforeUpdate,[this])}update(t,e,i){let{beginAtZero:n,grace:o,ticks:r}=this.options,a=r.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=br(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=a=o||i<=1||!this.isHorizontal()){this.labelRotation=n;return}let h=this._getLabelSizes(),u=h.widest.width,d=h.highest.height,f=K(this.chart.width-u,0,this.maxWidth);a=t.offset?this.maxWidth/i:f/(i-1),u+6>a&&(a=f/(i-(t.offset?.5:1)),l=this.maxHeight-ws(t.grid)-e.padding-Zr(t.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),r=si(Math.min(Math.asin(K((h.highest.height+6)/a,-1,1)),Math.asin(K(l/c,-1,1))-Math.asin(K(d/c,-1,1)))),r=Math.max(n,Math.min(o,r))),this.labelRotation=r}afterCalculateLabelRotation(){W(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){W(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:i,title:n,grid:o}}=this,r=this._isVisible(),a=this.isHorizontal();if(r){let l=Zr(n,e.options.font);if(a?(t.width=this.maxWidth,t.height=ws(o)+l):(t.height=this.maxHeight,t.width=ws(o)+l),i.display&&this.ticks.length){let{first:c,last:h,widest:u,highest:d}=this._getLabelSizes(),f=i.padding*2,g=bt(this.labelRotation),m=Math.cos(g),p=Math.sin(g);if(a){let b=i.mirror?0:p*u.width+m*d.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{let b=i.mirror?0:m*u.width+p*d.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,h,p,m)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,n){let{ticks:{align:o,padding:r},position:a}=this.options,l=this.labelRotation!==0,c=a!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,u=this.right-this.getPixelForTick(this.ticks.length-1),d=0,f=0;l?c?(d=n*t.width,f=i*e.height):(d=i*t.height,f=n*e.width):o==="start"?f=e.width:o==="end"?d=t.width:o!=="inner"&&(d=t.width/2,f=e.width/2),this.paddingLeft=Math.max((d-h+r)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-u+r)*this.width/(this.width-u),0)}else{let h=e.height/2,u=t.height/2;o==="start"?(h=0,u=t.height):o==="end"&&(h=e.height,u=0),this.paddingTop=h+r,this.paddingBottom=u+r}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){W(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,i;for(e=0,i=t.length;e({width:r[T]||0,height:a[T]||0});return{first:M(0),last:M(e-1),widest:M(k),highest:M(S),widths:r,heights:a}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return rr(this._alignToPixels?Kt(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&ta*n?a/i:l/n:l*n0}_computeGridLineItems(t){let e=this.axis,i=this.chart,n=this.options,{grid:o,position:r,border:a}=n,l=o.offset,c=this.isHorizontal(),u=this.ticks.length+(l?1:0),d=ws(o),f=[],g=a.setContext(this.getContext()),m=g.display?g.width:0,p=m/2,b=function(U){return Kt(i,U,m)},y,_,w,x,k,S,M,T,C,A,L,et;if(r==="top")y=b(this.bottom),S=this.bottom-d,T=y-p,A=b(t.top)+p,et=t.bottom;else if(r==="bottom")y=b(this.top),A=t.top,et=b(t.bottom)-p,S=y+p,T=this.top+d;else if(r==="left")y=b(this.right),k=this.right-d,M=y-p,C=b(t.left)+p,L=t.right;else if(r==="right")y=b(this.left),C=t.left,L=b(t.right)-p,k=y+p,M=this.left+d;else if(e==="x"){if(r==="center")y=b((t.top+t.bottom)/2+.5);else if(E(r)){let U=Object.keys(r)[0],G=r[U];y=b(this.chart.scales[U].getPixelForValue(G))}A=t.top,et=t.bottom,S=y+p,T=S+d}else if(e==="y"){if(r==="center")y=b((t.left+t.right)/2);else if(E(r)){let U=Object.keys(r)[0],G=r[U];y=b(this.chart.scales[U].getPixelForValue(G))}k=y-p,M=k-d,C=t.left,L=t.right}let ht=P(n.ticks.maxTicksLimit,u),V=Math.max(1,Math.ceil(u/ht));for(_=0;_0&&(ce-=le/2);break}js={left:ce,top:ls,width:le+Te.width,height:as+Te.height,color:V.backdropColor}}p.push({label:w,font:T,textOffset:L,options:{rotation:m,color:G,strokeColor:vt,strokeWidth:ot,textAlign:Oe,textBaseline:et,translation:[x,k],backdrop:js}})}return p}_getXAxisLabelAlignment(){let{position:t,ticks:e}=this.options;if(-bt(this.labelRotation))return t==="top"?"left":"right";let n="center";return e.align==="start"?n="left":e.align==="end"?n="right":e.align==="inner"&&(n="inner"),n}_getYAxisLabelAlignment(t){let{position:e,ticks:{crossAlign:i,mirror:n,padding:o}}=this.options,r=this._getLabelSizes(),a=t+o,l=r.widest.width,c,h;return e==="left"?n?(h=this.right+o,i==="near"?c="left":i==="center"?(c="center",h+=l/2):(c="right",h+=l)):(h=this.right-a,i==="near"?c="right":i==="center"?(c="center",h-=l/2):(c="left",h=this.left)):e==="right"?n?(h=this.left+o,i==="near"?c="right":i==="center"?(c="center",h-=l/2):(c="left",h-=l)):(h=this.left+a,i==="near"?c="left":i==="center"?(c="center",h+=l/2):(c="right",h=this.right)):c="right",{textAlign:c,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;let t=this.chart,e=this.options.position;if(e==="left"||e==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(e==="top"||e==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){let{ctx:t,options:{backgroundColor:e},left:i,top:n,width:o,height:r}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,n,o,r),t.restore())}getLineWidthForValue(t){let e=this.options.grid;if(!this._isVisible()||!e.display)return 0;let n=this.ticks.findIndex(o=>o.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){let e=this.options.grid,i=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o,r,a=(l,c,h)=>{!h.width||!h.color||(i.save(),i.lineWidth=h.width,i.strokeStyle=h.color,i.setLineDash(h.borderDash||[]),i.lineDashOffset=h.borderDashOffset,i.beginPath(),i.moveTo(l.x,l.y),i.lineTo(c.x,c.y),i.stroke(),i.restore())};if(e.display)for(o=0,r=n.length;o{this.draw(o)}}]:[{z:i,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",n=[],o,r;for(o=0,r=e.length;o{let i=e.split("."),n=i.pop(),o=[s].concat(i).join("."),r=t[e].split("."),a=r.pop(),l=r.join(".");j.route(o,n,l,a)})}function td(s){return"id"in s&&"defaults"in s}var Un=class{constructor(){this.controllers=new Ze(ut,"datasets",!0),this.elements=new Ze(dt,"elements"),this.plugins=new Ze(Object,"plugins"),this.scales=new Ze(we,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(n=>{let o=i||this._getRegistryForType(n);i||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):z(n,r=>{let a=i||this._getRegistryForType(r);this._exec(t,a,r)})})}_exec(t,e,i){let n=ei(t);W(i["before"+n],[],i),e[t](i),W(i["after"+n],[],i)}_getRegistryForType(t){for(let e=0;eo.filter(a=>!r.some(l=>a.plugin.id===l.plugin.id));this._notify(n(e,i),t,"stop"),this._notify(n(i,e),t,"start")}};function ed(s){let t={},e=[],i=Object.keys(Lt.plugins.items);for(let o=0;o1&&qr(s[0].toLowerCase());if(i)return i}throw new Error(`Cannot determine type of '${s}' axis. Please provide 'axis' or 'position' option.`)}function Gr(s,t,e){if(e[t+"AxisID"]===s)return{axis:t}}function ld(s,t){if(t.data&&t.data.datasets){let e=t.data.datasets.filter(i=>i.xAxisID===s||i.yAxisID===s);if(e.length)return Gr(s,"x",e[0])||Gr(s,"y",e[0])}return{}}function cd(s,t){let e=Jt[s.type]||{scales:{}},i=t.scales||{},n=Zn(s.type,t),o=Object.create(null);return Object.keys(i).forEach(r=>{let a=i[r];if(!E(a))return console.error(`Invalid scale configuration for scale: ${r}`);if(a._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${r}`);let l=qn(r,a,ld(r,s),j.scales[a.type]),c=rd(l,n),h=e.scales||{};o[r]=Ie(Object.create(null),[{axis:l},a,h[l],h[c]])}),s.data.datasets.forEach(r=>{let a=r.type||s.type,l=r.indexAxis||Zn(a,t),h=(Jt[a]||{}).scales||{};Object.keys(h).forEach(u=>{let d=od(u,l),f=r[d+"AxisID"]||d;o[f]=o[f]||Object.create(null),Ie(o[f],[{axis:d},i[f],h[u]])})}),Object.keys(o).forEach(r=>{let a=o[r];Ie(a,[j.scales[a.type],j.scale])}),o}function La(s){let t=s.options||(s.options={});t.plugins=P(t.plugins,{}),t.scales=cd(s,t)}function Fa(s){return s=s||{},s.datasets=s.datasets||[],s.labels=s.labels||[],s}function hd(s){return s=s||{},s.data=Fa(s.data),La(s),s}var Xr=new Map,Ra=new Set;function gi(s,t){let e=Xr.get(s);return e||(e=t(),Xr.set(s,e),Ra.add(e)),e}var ks=(s,t,e)=>{let i=Wt(t,e);i!==void 0&&s.add(i)},Gn=class{constructor(t){this._config=hd(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Fa(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),La(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return gi(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return gi(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return gi(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,i=this.type;return gi(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let i=this._scopeCache,n=i.get(t);return(!n||e)&&(n=new Map,i.set(t,n)),n}getOptionScopes(t,e,i){let{options:n,type:o}=this,r=this._cachedScopes(t,i),a=r.get(e);if(a)return a;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(u=>ks(l,t,u))),h.forEach(u=>ks(l,n,u)),h.forEach(u=>ks(l,Jt[o]||{},u)),h.forEach(u=>ks(l,j,u)),h.forEach(u=>ks(l,oi,u))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),Ra.has(e)&&r.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,Jt[e]||{},j.datasets[e]||{},{type:e},j,oi]}resolveNamedOptions(t,e,i,n=[""]){let o={$shared:!0},{resolver:r,subPrefixes:a}=Jr(this._resolverCache,t,n),l=r;if(dd(r,e)){o.$shared=!1,i=zt(i)?i():i;let c=this.createResolver(t,i,a);l=de(r,i,c)}for(let c of e)o[c]=l[c];return o}createResolver(t,e,i=[""],n){let{resolver:o}=Jr(this._resolverCache,t,i);return E(e)?de(o,e,void 0,n):o}};function Jr(s,t,e){let i=s.get(t);i||(i=new Map,s.set(t,i));let n=e.join(),o=i.get(n);return o||(o={resolver:li(t,e),subPrefixes:e.filter(a=>!a.toLowerCase().includes("hover"))},i.set(n,o)),o}var ud=s=>E(s)&&Object.getOwnPropertyNames(s).some(t=>zt(s[t]));function dd(s,t){let{isScriptable:e,isIndexable:i}=yn(s);for(let n of t){let o=e(n),r=i(n),a=(r||o)&&s[n];if(o&&(zt(a)||ud(a))||r&&H(a))return!0}return!1}var fd="4.5.1",gd=["top","bottom","left","right","chartArea"];function Kr(s,t){return s==="top"||s==="bottom"||gd.indexOf(s)===-1&&t==="x"}function Qr(s,t){return function(e,i){return e[s]===i[s]?e[t]-i[t]:e[s]-i[s]}}function ta(s){let t=s.chart,e=t.options.animation;t.notifyPlugins("afterRender"),W(e&&e.onComplete,[s],t)}function md(s){let t=s.chart,e=t.options.animation;W(e&&e.onProgress,[s],t)}function Na(s){return ci()&&typeof s=="string"?s=document.getElementById(s):s&&s.length&&(s=s[0]),s&&s.canvas&&(s=s.canvas),s}var xi={},ea=s=>{let t=Na(s);return Object.values(xi).filter(e=>e.canvas===t).pop()};function pd(s,t,e){let i=Object.keys(s);for(let n of i){let o=+n;if(o>=t){let r=s[n];delete s[n],(e>0||o>t)&&(s[o+e]=r)}}}function bd(s,t,e,i){return!e||s.type==="mouseout"?null:i?t:s}var yt=class{static register(...t){Lt.add(...t),sa()}static unregister(...t){Lt.remove(...t),sa()}constructor(t,e){let i=this.config=new Gn(e),n=Na(t),o=ea(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");let r=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||zu(n)),this.platform.updateConfig(i);let a=this.platform.acquireContext(n,r.aspectRatio),l=a&&a.canvas,c=l&&l.height,h=l&&l.width;if(this.id=tr(),this.ctx=a,this.canvas=l,this.width=h,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Yn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ur(u=>this.update(u),r.resizeDelay||0),this._dataChanges=[],xi[this.id]=this,!a||!l){console.error("Failed to create chart: can't acquire context from the given item");return}Ht.listen(this,"complete",ta),Ht.listen(this,"progress",md),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return I(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Lt}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():kn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return mn(this.canvas,this.ctx),this}stop(){return Ht.stop(this),this}resize(t,e){Ht.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let i=this.options,n=this.canvas,o=i.maintainAspectRatio&&this.aspectRatio,r=this.platform.getMaximumSize(n,t,e,o),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=r.width,this.height=r.height,this._aspectRatio=this.aspectRatio,kn(this,a,!0)&&(this.notifyPlugins("resize",{size:r}),W(i.onResize,[this,r],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};z(e,(i,n)=>{i.id=n})}buildOrUpdateScales(){let t=this.options,e=t.scales,i=this.scales,n=Object.keys(i).reduce((r,a)=>(r[a]=!1,r),{}),o=[];e&&(o=o.concat(Object.keys(e).map(r=>{let a=e[r],l=qn(r,a),c=l==="r",h=l==="x";return{options:a,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),z(o,r=>{let a=r.options,l=a.id,c=qn(l,a),h=P(a.type,r.dtype);(a.position===void 0||Kr(a.position,c)!==Kr(r.dposition))&&(a.position=r.dposition),n[l]=!0;let u=null;if(l in i&&i[l].type===h)u=i[l];else{let d=Lt.getScale(h);u=new d({id:l,type:h,ctx:this.ctx,chart:this}),i[u.id]=u}u.init(a,t)}),z(n,(r,a)=>{r||delete i[a]}),z(i,r=>{rt.configure(this,r,r.options),rt.addBox(this,r)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((n,o)=>n.index-o.index),i>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((i,n)=>{e.filter(o=>o===i._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,i,n;for(this._removeUnreferencedMetasets(),i=0,n=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let r=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Qr("z","_idx"));let{_active:a,_lastEvent:l}=this;l?this._eventHandler(l,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){z(this.scales,t=>{rt.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);(!en(e,i)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:i,start:n,count:o}of e){let r=i==="_removeElements"?-o:o;pd(t,n,r)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,i=o=>new Set(t.filter(r=>r[0]===o).map((r,a)=>a+","+r.splice(1).join(","))),n=i(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;rt.update(this,this.width,this.height,t);let e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],z(this.boxes,n=>{i&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,i=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,i={meta:t,index:t.index,cancelable:!0},n=Dn(this,t);this.notifyPlugins("beforeDatasetDraw",i)!==!1&&(n&&ps(e,n),t.controller.draw(),n&&bs(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Pt(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,n){let o=xu.modes[e];return typeof o=="function"?o(this,t,i,n):[]}getDatasetMeta(t){let e=this.data.datasets[t],i=this._metasets,n=i.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}getContext(){return this.$context||(this.$context=Bt(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let i=this.getDatasetMeta(t);return typeof i.hidden=="boolean"?!i.hidden:!e.hidden}setDatasetVisibility(t,e){let i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){let n=i?"show":"hide",o=this.getDatasetMeta(t),r=o.controller._resolveAnimations(void 0,n);Ee(e)?(o.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),r.update(o,{visible:i}),this.update(a=>a.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),Ht.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,o,r),t[o]=r},n=(o,r,a)=>{o.offsetX=r,o.offsetY=a,this._eventHandler(o)};z(this.options.events,o=>i(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,i=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)},r,a=()=>{n("attach",a),this.attached=!0,this.resize(),i("resize",o),i("detach",r)};r=()=>{this.attached=!1,n("resize",o),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():r()}unbindEvents(){z(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},z(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){let n=i?"set":"remove",o,r,a,l;for(e==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),a=0,l=t.length;a{let a=this.getDatasetMeta(o);if(!a)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:a.data[r],index:r}});!gs(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,i){let n=this.options.hover,o=(l,c)=>l.filter(h=>!c.some(u=>h.datasetIndex===u.datasetIndex&&h.index===u.index)),r=o(e,t),a=i?t:o(t,e);r.length&&this.updateHoverStyle(r,n.mode,!1),a.length&&n.mode&&this.updateHoverStyle(a,n.mode,!0)}_eventHandler(t,e){let i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=r=>(r.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",i,n)===!1)return;let o=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,n),(o||i.changed)&&this.render(),this}_handleEvent(t,e,i){let{_active:n=[],options:o}=this,r=e,a=this._getActiveElements(t,n,i,r),l=ir(t),c=bd(t,this._lastEvent,i,l);i&&(this._lastEvent=null,W(o.onHover,[t,a,this],this),l&&W(o.onClick,[t,a,this],this));let h=!gs(a,n);return(h||e)&&(this._active=a,this._updateHoverStyles(a,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,i,n){if(t.type==="mouseout")return[];if(!i)return e;let o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}};v(yt,"defaults",j),v(yt,"instances",xi),v(yt,"overrides",Jt),v(yt,"registry",Lt),v(yt,"version",fd),v(yt,"getChart",ea);function sa(){return z(yt.instances,s=>s._plugins.invalidate())}function yd(s,t,e){let{startAngle:i,x:n,y:o,outerRadius:r,innerRadius:a,options:l}=t,{borderWidth:c,borderJoinStyle:h}=l,u=Math.min(c/r,st(i-e));if(s.beginPath(),s.arc(n,o,r-c/2,i+u/2,e-u/2),a>0){let d=Math.min(c/a,st(i-e));s.arc(n,o,a+c/2,e-d/2,i+d/2,!0)}else{let d=Math.min(c/2,r*st(i-e));if(h==="round")s.arc(n,o,d,e-F/2,i+F/2,!0);else if(h==="bevel"){let f=2*d*d,g=-f*Math.cos(e+F/2)+n,m=-f*Math.sin(e+F/2)+o,p=f*Math.cos(i+F/2)+n,b=f*Math.sin(i+F/2)+o;s.lineTo(g,m),s.lineTo(p,b)}}s.closePath(),s.moveTo(0,0),s.rect(0,0,s.canvas.width,s.canvas.height),s.clip("evenodd")}function xd(s,t,e){let{startAngle:i,pixelMargin:n,x:o,y:r,outerRadius:a,innerRadius:l}=t,c=n/a;s.beginPath(),s.arc(o,r,a,i-c,e+c),l>n?(c=n/l,s.arc(o,r,l,e+c,i-c,!0)):s.arc(o,r,n,e+q,i-q),s.closePath(),s.clip()}function _d(s){return ai(s,["outerStart","outerEnd","innerStart","innerEnd"])}function wd(s,t,e,i){let n=_d(s.options.borderRadius),o=(e-t)/2,r=Math.min(o,i*t/2),a=l=>{let c=(e-Math.min(o,l))*i/2;return K(l,0,Math.min(o,c))};return{outerStart:a(n.outerStart),outerEnd:a(n.outerEnd),innerStart:K(n.innerStart,0,r),innerEnd:K(n.innerEnd,0,r)}}function Ve(s,t,e,i){return{x:e+s*Math.cos(t),y:i+s*Math.sin(t)}}function vi(s,t,e,i,n,o){let{x:r,y:a,startAngle:l,pixelMargin:c,innerRadius:h}=t,u=Math.max(t.outerRadius+i+e-c,0),d=h>0?h+i+e+c:0,f=0,g=n-l;if(i){let V=h>0?h-i:0,U=u>0?u-i:0,G=(V+U)/2,vt=G!==0?g*G/(G+i):g;f=(g-vt)/2}let m=Math.max(.001,g*u-e/F)/u,p=(g-m)/2,b=l+p+f,y=n-p-f,{outerStart:_,outerEnd:w,innerStart:x,innerEnd:k}=wd(t,d,u,y-b),S=u-_,M=u-w,T=b+_/S,C=y-w/M,A=d+x,L=d+k,et=b+x/A,ht=y-k/L;if(s.beginPath(),o){let V=(T+C)/2;if(s.arc(r,a,u,T,V),s.arc(r,a,u,V,C),w>0){let ot=Ve(M,C,r,a);s.arc(ot.x,ot.y,w,C,y+q)}let U=Ve(L,y,r,a);if(s.lineTo(U.x,U.y),k>0){let ot=Ve(L,ht,r,a);s.arc(ot.x,ot.y,k,y+q,ht+Math.PI)}let G=(y-k/d+(b+x/d))/2;if(s.arc(r,a,d,y-k/d,G,!0),s.arc(r,a,d,G,b+x/d,!0),x>0){let ot=Ve(A,et,r,a);s.arc(ot.x,ot.y,x,et+Math.PI,b-q)}let vt=Ve(S,b,r,a);if(s.lineTo(vt.x,vt.y),_>0){let ot=Ve(S,T,r,a);s.arc(ot.x,ot.y,_,b-q,T)}}else{s.moveTo(r,a);let V=Math.cos(T)*u+r,U=Math.sin(T)*u+a;s.lineTo(V,U);let G=Math.cos(C)*u+r,vt=Math.sin(C)*u+a;s.lineTo(G,vt)}s.closePath()}function kd(s,t,e,i,n){let{fullCircles:o,startAngle:r,circumference:a}=t,l=t.endAngle;if(o){vi(s,t,e,i,l,n);for(let c=0;c=F&&f===0&&h!=="miter"&&yd(s,t,m),o||(vi(s,t,e,i,m,n),s.stroke())}var be=class extends dt{constructor(e){super();v(this,"circumference");v(this,"endAngle");v(this,"fullCircles");v(this,"innerRadius");v(this,"outerRadius");v(this,"pixelMargin");v(this,"startAngle");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,i,n){let o=this.getProps(["x","y"],n),{angle:r,distance:a}=rn(o,{x:e,y:i}),{startAngle:l,endAngle:c,innerRadius:h,outerRadius:u,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),f=(this.options.spacing+this.options.borderWidth)/2,g=P(d,c-l),m=Fe(r,l,c)&&l!==c,p=g>=$||m,b=It(a,h+f,u+f);return p&&b}getCenterPoint(e){let{x:i,y:n,startAngle:o,endAngle:r,innerRadius:a,outerRadius:l}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:c,spacing:h}=this.options,u=(o+r)/2,d=(a+l+h+c)/2;return{x:i+Math.cos(u)*d,y:n+Math.sin(u)*d}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:i,circumference:n}=this,o=(i.offset||0)/4,r=(i.spacing||0)/2,a=i.circular;if(this.pixelMargin=i.borderAlign==="inner"?.33:0,this.fullCircles=n>$?Math.floor(n/$):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let l=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(l)*o,Math.sin(l)*o);let c=1-Math.sin(Math.min(F,n||0)),h=o*c;e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,kd(e,this,h,r,a),vd(e,this,h,r,a),e.restore()}};v(be,"id","arc"),v(be,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),v(be,"defaultRoutes",{backgroundColor:"backgroundColor"}),v(be,"descriptors",{_scriptable:!0,_indexable:e=>e!=="borderDash"});function za(s,t,e=t){s.lineCap=P(e.borderCapStyle,t.borderCapStyle),s.setLineDash(P(e.borderDash,t.borderDash)),s.lineDashOffset=P(e.borderDashOffset,t.borderDashOffset),s.lineJoin=P(e.borderJoinStyle,t.borderJoinStyle),s.lineWidth=P(e.borderWidth,t.borderWidth),s.strokeStyle=P(e.borderColor,t.borderColor)}function Sd(s,t,e){s.lineTo(e.x,e.y)}function Md(s){return s.stepped?mr:s.tension||s.cubicInterpolationMode==="monotone"?pr:Sd}function Va(s,t,e={}){let i=s.length,{start:n=0,end:o=i-1}=e,{start:r,end:a}=t,l=Math.max(n,r),c=Math.min(o,a),h=na&&o>a;return{count:i,start:l,loop:t.loop,ilen:c(r+(c?a-w:w))%o,_=()=>{m!==p&&(s.lineTo(h,p),s.lineTo(h,m),s.lineTo(h,b))};for(l&&(f=n[y(0)],s.moveTo(f.x,f.y)),d=0;d<=a;++d){if(f=n[y(d)],f.skip)continue;let w=f.x,x=f.y,k=w|0;k===g?(xp&&(p=x),h=(u*h+w)/++u):(_(),s.lineTo(w,x),g=k,u=0,m=p=x),b=x}_()}function Xn(s){let t=s.options,e=t.borderDash&&t.borderDash.length;return!s._decimated&&!s._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?Td:Od}function Dd(s){return s.stepped?Mr:s.tension||s.cubicInterpolationMode==="monotone"?Or:Gt}function Cd(s,t,e,i){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,i)&&n.closePath()),za(s,t.options),s.stroke(n)}function Pd(s,t,e,i){let{segments:n,options:o}=t,r=Xn(t);for(let a of n)za(s,o,a.style),s.beginPath(),r(s,t,a,{start:e,end:e+i-1})&&s.closePath(),s.stroke()}var Ad=typeof Path2D=="function";function Id(s,t,e,i){Ad&&!t.options.segment?Cd(s,t,e,i):Pd(s,t,e,i)}var Ft=class extends dt{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let i=this.options;if((i.tension||i.cubicInterpolationMode==="monotone")&&!i.stepped&&!this._pointsUpdated){let n=i.spanGaps?this._loop:this._fullLoop;kr(this._points,i,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Dr(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){let i=this.options,n=t[e],o=this.points,r=Tn(this,{property:e,start:n,end:n});if(!r.length)return;let a=[],l=Dd(i),c,h;for(c=0,h=r.length;ct!=="borderDash"&&t!=="fill"});function ia(s,t,e,i){let n=s.options,{[e]:o}=s.getProps([e],i);return Math.abs(t-o)s.replace("rgb(","rgba(").replace(")",", 0.5)"));function Ba(s){return Jn[s%Jn.length]}function Ha(s){return na[s%na.length]}function Vd(s,t){return s.borderColor=Ba(t),s.backgroundColor=Ha(t),++t}function Wd(s,t){return s.backgroundColor=s.data.map(()=>Ba(t++)),t}function Bd(s,t){return s.backgroundColor=s.data.map(()=>Ha(t++)),t}function Hd(s){let t=0;return(e,i)=>{let n=s.getDatasetMeta(i).controller;n instanceof jt?t=Wd(e,t):n instanceof xe?t=Bd(e,t):n&&(t=Vd(e,t))}}function oa(s){let t;for(t in s)if(s[t].borderColor||s[t].backgroundColor)return!0;return!1}function $d(s){return s&&(s.borderColor||s.backgroundColor)}function jd(){return j.borderColor!=="rgba(0,0,0,0.1)"||j.backgroundColor!=="rgba(0,0,0,0.1)"}var Ud={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(s,t,e){if(!e.enabled)return;let{data:{datasets:i},options:n}=s.config,{elements:o}=n,r=oa(i)||$d(n)||o&&oa(o)||jd();if(!e.forceOverride&&r)return;let a=Hd(s);i.forEach(a)}};function Yd(s,t,e,i,n){let o=n.samples||i;if(o>=e)return s.slice(t,t+e);let r=[],a=(e-2)/(o-2),l=0,c=t+e-1,h=t,u,d,f,g,m;for(r[l++]=s[h],u=0;uf&&(f=g,d=s[y],m=y);r[l++]=d,h=m}return r[l++]=s[c],r}function Zd(s,t,e,i){let n=0,o=0,r,a,l,c,h,u,d,f,g,m,p=[],b=t+e-1,y=s[t].x,w=s[b].x-y;for(r=t;rm&&(m=c,d=r),n=(o*n+a.x)/++o;else{let k=r-1;if(!I(u)&&!I(d)){let S=Math.min(u,d),M=Math.max(u,d);S!==f&&S!==k&&p.push({...s[S],x:n}),M!==f&&M!==k&&p.push({...s[M],x:n})}r>0&&k!==f&&p.push(s[k]),p.push(a),h=x,o=0,g=m=c,u=d=f=r}}return p}function $a(s){if(s._decimated){let t=s._data;delete s._decimated,delete s._data,Object.defineProperty(s,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function ra(s){s.data.datasets.forEach(t=>{$a(t)})}function qd(s,t){let e=t.length,i=0,n,{iScale:o}=s,{min:r,max:a,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(i=K(Ct(t,o.axis,r).lo,0,e-1)),c?n=K(Ct(t,o.axis,a).hi+1,i,e)-i:n=e-i,{start:i,count:n}}var Gd={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(s,t,e)=>{if(!e.enabled){ra(s);return}let i=s.width;s.data.datasets.forEach((n,o)=>{let{_data:r,indexAxis:a}=n,l=s.getDatasetMeta(o),c=r||n.data;if(ze([a,s.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=s.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||s.options.parsing)return;let{start:u,count:d}=qd(l,c),f=e.threshold||4*i;if(d<=f){$a(n);return}I(r)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(m){this._data=m}}));let g;switch(e.algorithm){case"lttb":g=Yd(c,u,d,i,e);break;case"min-max":g=Zd(c,u,d,i);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=g})},destroy(s){ra(s)}};function Xd(s,t,e){let i=s.segments,n=s.points,o=t.points,r=[];for(let a of i){let{start:l,end:c}=a;c=Oi(l,c,n);let h=Kn(e,n[l],n[c],a.loop);if(!t.segments){r.push({source:a,target:h,start:n[l],end:n[c]});continue}let u=Tn(t,h);for(let d of u){let f=Kn(e,o[d.start],o[d.end],d.loop),g=On(a,n,f);for(let m of g)r.push({source:m,target:d,start:{[e]:aa(h,f,"start",Math.max)},end:{[e]:aa(h,f,"end",Math.min)}})}}return r}function Kn(s,t,e,i){if(i)return;let n=t[s],o=e[s];return s==="angle"&&(n=st(n),o=st(o)),{property:s,start:n,end:o}}function Jd(s,t){let{x:e=null,y:i=null}=s||{},n=t.points,o=[];return t.segments.forEach(({start:r,end:a})=>{a=Oi(r,a,n);let l=n[r],c=n[a];i!==null?(o.push({x:l.x,y:i}),o.push({x:c.x,y:i})):e!==null&&(o.push({x:e,y:l.y}),o.push({x:e,y:c.y}))}),o}function Oi(s,t,e){for(;t>s;t--){let i=e[t];if(!isNaN(i.x)&&!isNaN(i.y))break}return t}function aa(s,t,e,i){return s&&t?i(s[e],t[e]):s?s[e]:t?t[e]:0}function ja(s,t){let e=[],i=!1;return H(s)?(i=!0,e=s):e=Jd(s,t),e.length?new Ft({points:e,options:{tension:0},_loop:i,_fullLoop:i}):null}function la(s){return s&&s.fill!==!1}function Kd(s,t,e){let n=s[t].fill,o=[t],r;if(!e)return n;for(;n!==!1&&o.indexOf(n)===-1;){if(!Z(n))return n;if(r=s[n],!r)return!1;if(r.visible)return n;o.push(n),n=r.fill}return!1}function Qd(s,t,e){let i=nf(s);if(E(i))return isNaN(i.value)?!1:i;let n=parseFloat(i);return Z(n)&&Math.floor(n)===n?tf(i[0],t,n,e):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function tf(s,t,e,i){return(s==="-"||s==="+")&&(e=t+e),e===t||e<0||e>=i?!1:e}function ef(s,t){let e=null;return s==="start"?e=t.bottom:s==="end"?e=t.top:E(s)?e=t.getPixelForValue(s.value):t.getBasePixel&&(e=t.getBasePixel()),e}function sf(s,t,e){let i;return s==="start"?i=e:s==="end"?i=t.options.reverse?t.min:t.max:E(s)?i=s.value:i=t.getBaseValue(),i}function nf(s){let t=s.options,e=t.fill,i=P(e&&e.target,e);return i===void 0&&(i=!!t.backgroundColor),i===!1||i===null?!1:i===!0?"origin":i}function of(s){let{scale:t,index:e,line:i}=s,n=[],o=i.segments,r=i.points,a=rf(t,e);a.push(ja({x:null,y:t.bottom},i));for(let l=0;l=0;--r){let a=n[r].$filler;a&&(a.line.updateControlPoints(o,a.axis),i&&a.fill&&zn(s.ctx,a,o))}},beforeDatasetsDraw(s,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let i=s.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){let o=i[n].$filler;la(o)&&zn(s.ctx,o,s.chartArea)}},beforeDatasetDraw(s,t,e){let i=t.meta.$filler;!la(i)||e.drawTime!=="beforeDatasetDraw"||zn(s.ctx,i,s.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},da=(s,t)=>{let{boxHeight:e=t,boxWidth:i=t}=s;return s.usePointStyle&&(e=Math.min(e,t),i=s.pointStyleWidth||Math.min(i,t)),{boxWidth:i,boxHeight:e,itemHeight:Math.max(t,e)}},bf=(s,t)=>s!==null&&t!==null&&s.datasetIndex===t.datasetIndex&&s.index===t.index,Mi=class extends dt{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=W(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(i=>t.filter(i,this.chart.data))),t.sort&&(e=e.sort((i,n)=>t.sort(i,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let i=t.labels,n=X(i.font),o=n.size,r=this._computeTitleHeight(),{boxWidth:a,itemHeight:l}=da(i,o),c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(r,o,a,l)+10):(h=this.maxHeight,c=this._fitCols(r,n,a,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,n){let{ctx:o,maxWidth:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+a,u=t;o.textAlign="left",o.textBaseline="middle";let d=-1,f=-h;return this.legendItems.forEach((g,m)=>{let p=i+e/2+o.measureText(g.text).width;(m===0||c[c.length-1]+p+2*a>r)&&(u+=h,c[c.length-(m>0?0:1)]=0,f+=h,d++),l[m]={left:0,top:f,row:d,width:p,height:n},c[c.length-1]+=p+a}),u}_fitCols(t,e,i,n){let{ctx:o,maxHeight:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=r-t,u=a,d=0,f=0,g=0,m=0;return this.legendItems.forEach((p,b)=>{let{itemWidth:y,itemHeight:_}=yf(i,e,o,p,n);b>0&&f+_+2*a>h&&(u+=d+a,c.push({width:d,height:f}),g+=d+a,m++,d=f=0),l[b]={left:g,top:f,col:m,width:y,height:_},d=Math.max(d,y),f+=_+a}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:n},rtl:o}}=this,r=ge(o,this.left,this.width);if(this.isHorizontal()){let a=0,l=it(i,this.left+n,this.right-this.lineWidths[a]);for(let c of e)a!==c.row&&(a=c.row,l=it(i,this.left+n,this.right-this.lineWidths[a])),c.top+=this.top+t+n,c.left=r.leftForLtr(r.x(l),c.width),l+=c.width+n}else{let a=0,l=it(i,this.top+t+n,this.bottom-this.columnSizes[a].height);for(let c of e)c.col!==a&&(a=c.col,l=it(i,this.top+t+n,this.bottom-this.columnSizes[a].height)),c.top=l,c.left+=this.left+n,c.left=r.leftForLtr(r.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;ps(t,this),this._draw(),bs(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:i,ctx:n}=this,{align:o,labels:r}=t,a=j.color,l=ge(t.rtl,this.left,this.width),c=X(r.font),{padding:h}=r,u=c.size,d=u/2,f;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;let{boxWidth:g,boxHeight:m,itemHeight:p}=da(r,u),b=function(k,S,M){if(isNaN(g)||g<=0||isNaN(m)||m<0)return;n.save();let T=P(M.lineWidth,1);if(n.fillStyle=P(M.fillStyle,a),n.lineCap=P(M.lineCap,"butt"),n.lineDashOffset=P(M.lineDashOffset,0),n.lineJoin=P(M.lineJoin,"miter"),n.lineWidth=T,n.strokeStyle=P(M.strokeStyle,a),n.setLineDash(P(M.lineDash,[])),r.usePointStyle){let C={radius:m*Math.SQRT2/2,pointStyle:M.pointStyle,rotation:M.rotation,borderWidth:T},A=l.xPlus(k,g/2),L=S+d;pn(n,C,A,L,r.pointStyleWidth&&g)}else{let C=S+Math.max((u-m)/2,0),A=l.leftForLtr(k,g),L=te(M.borderRadius);n.beginPath(),Object.values(L).some(et=>et!==0)?Ne(n,{x:A,y:C,w:g,h:m,radius:L}):n.rect(A,C,g,m),n.fill(),T!==0&&n.stroke()}n.restore()},y=function(k,S,M){Qt(n,M.text,k,S+p/2,c,{strikethrough:M.hidden,textAlign:l.textAlign(M.textAlign)})},_=this.isHorizontal(),w=this._computeTitleHeight();_?f={x:it(o,this.left+h,this.right-i[0]),y:this.top+h+w,line:0}:f={x:this.left+h,y:it(o,this.top+w+h,this.bottom-e[0].height),line:0},Sn(this.ctx,t.textDirection);let x=p+h;this.legendItems.forEach((k,S)=>{n.strokeStyle=k.fontColor,n.fillStyle=k.fontColor;let M=n.measureText(k.text).width,T=l.textAlign(k.textAlign||(k.textAlign=r.textAlign)),C=g+d+M,A=f.x,L=f.y;l.setWidth(this.width),_?S>0&&A+C+h>this.right&&(L=f.y+=x,f.line++,A=f.x=it(o,this.left+h,this.right-i[f.line])):S>0&&L+x>this.bottom&&(A=f.x=A+e[f.line].width+h,f.line++,L=f.y=it(o,this.top+w+h,this.bottom-e[f.line].height));let et=l.x(A);if(b(et,L,k),A=dr(T,A+g+d,_?A+C:this.right,t.rtl),y(l.x(A),L,k),_)f.x+=C+h;else if(typeof k.text!="string"){let ht=c.lineHeight;f.y+=Ua(k,ht)+h}else f.y+=x}),Mn(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,i=X(e.font),n=nt(e.padding);if(!e.display)return;let o=ge(t.rtl,this.left,this.width),r=this.ctx,a=e.position,l=i.size/2,c=n.top+l,h,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+c,u=it(t.align,u,this.right-d);else{let g=this.columnSizes.reduce((m,p)=>Math.max(m,p.height),0);h=c+it(t.align,this.top,this.bottom-g-t.labels.padding-this._computeTitleHeight())}let f=it(a,u,u+d);r.textAlign=o.textAlign(ni(a)),r.textBaseline="middle",r.strokeStyle=e.color,r.fillStyle=e.color,r.font=i.string,Qt(r,e.text,f,h,i)}_computeTitleHeight(){let t=this.options.title,e=X(t.font),i=nt(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,n,o;if(It(t,this.left,this.right)&&It(e,this.top,this.bottom)){for(o=this.legendHitBoxes,i=0;io.length>r.length?o:r)),t+e.size/2+i.measureText(n).width}function _f(s,t,e){let i=s;return typeof t.text!="string"&&(i=Ua(t,e)),i}function Ua(s,t){let e=s.text?s.text.length:0;return t*e}function wf(s,t){return!!((s==="mousemove"||s==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(s==="click"||s==="mouseup"))}var kf={id:"legend",_element:Mi,start(s,t,e){let i=s.legend=new Mi({ctx:s.ctx,options:e,chart:s});rt.configure(s,i,e),rt.addBox(s,i)},stop(s){rt.removeBox(s,s.legend),delete s.legend},beforeUpdate(s,t,e){let i=s.legend;rt.configure(s,i,e),i.options=e},afterUpdate(s){let t=s.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(s,t){t.replay||s.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(s,t,e){let i=t.datasetIndex,n=e.chart;n.isDatasetVisible(i)?(n.hide(i),t.hidden=!0):(n.show(i),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:s=>s.chart.options.color,boxWidth:40,padding:10,generateLabels(s){let t=s.data.datasets,{labels:{usePointStyle:e,pointStyle:i,textAlign:n,color:o,useBorderRadius:r,borderRadius:a}}=s.legend.options;return s._getSortedDatasetMetas().map(l=>{let c=l.controller.getStyle(e?0:void 0),h=nt(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:c.borderColor,pointStyle:i||c.pointStyle,rotation:c.rotation,textAlign:n||c.textAlign,borderRadius:r&&(a||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:s=>s.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:s=>!s.startsWith("on"),labels:{_scriptable:s=>!["generateLabels","filter","sort"].includes(s)}}},Is=class extends dt{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let i=this.options;if(this.left=0,this.top=0,!i.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let n=H(i.text)?i.text.length:1;this._padding=nt(i.padding);let o=n*X(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:i,bottom:n,right:o,options:r}=this,a=r.align,l=0,c,h,u;return this.isHorizontal()?(h=it(a,i,o),u=e+t,c=o-i):(r.position==="left"?(h=i+t,u=it(a,n,e),l=F*-.5):(h=o-t,u=it(a,e,n),l=F*.5),c=n-e),{titleX:h,titleY:u,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let i=X(e.font),o=i.lineHeight/2+this._padding.top,{titleX:r,titleY:a,maxWidth:l,rotation:c}=this._drawArgs(o);Qt(t,e.text,0,0,i,{color:e.color,maxWidth:l,rotation:c,textAlign:ni(e.align),textBaseline:"middle",translation:[r,a]})}};function vf(s,t){let e=new Is({ctx:s.ctx,options:t,chart:s});rt.configure(s,e,t),rt.addBox(s,e),s.titleBlock=e}var Sf={id:"title",_element:Is,start(s,t,e){vf(s,e)},stop(s){let t=s.titleBlock;rt.removeBox(s,t),delete s.titleBlock},beforeUpdate(s,t,e){let i=s.titleBlock;rt.configure(s,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},mi=new WeakMap,Mf={id:"subtitle",start(s,t,e){let i=new Is({ctx:s.ctx,options:e,chart:s});rt.configure(s,i,e),rt.addBox(s,i),mi.set(s,i)},stop(s){rt.removeBox(s,mi.get(s)),mi.delete(s)},beforeUpdate(s,t,e){let i=mi.get(s);rt.configure(s,i,e),i.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Ms={average(s){if(!s.length)return!1;let t,e,i=new Set,n=0,o=0;for(t=0,e=s.length;ta+l)/i.size,y:n/o}},nearest(s,t){if(!s.length)return!1;let e=t.x,i=t.y,n=Number.POSITIVE_INFINITY,o,r,a;for(o=0,r=s.length;o-1?s.split(` `):s}function Of(s,t){let{element:e,datasetIndex:i,index:n}=t,o=s.getDatasetMeta(i).controller,{label:r,value:a}=o.getLabelAndValue(n);return{chart:s,label:r,parsed:o.getParsed(n),raw:s.data.datasets[i].data[n],formattedValue:a,dataset:o.getDataset(),dataIndex:n,datasetIndex:i,element:e}}function fa(s,t){let e=s.chart.ctx,{body:i,footer:n,title:o}=s,{boxWidth:r,boxHeight:a}=t,l=X(t.bodyFont),c=X(t.titleFont),h=X(t.footerFont),u=o.length,d=n.length,f=i.length,g=nt(t.padding),m=g.height,p=0,b=i.reduce((w,x)=>w+x.before.length+x.lines.length+x.after.length,0);if(b+=s.beforeBody.length+s.afterBody.length,u&&(m+=u*c.lineHeight+(u-1)*t.titleSpacing+t.titleMarginBottom),b){let w=t.displayColors?Math.max(a,l.lineHeight):l.lineHeight;m+=f*w+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}d&&(m+=t.footerMarginTop+d*h.lineHeight+(d-1)*t.footerSpacing);let y=0,_=function(w){p=Math.max(p,e.measureText(w).width+y)};return e.save(),e.font=c.string,z(s.title,_),e.font=l.string,z(s.beforeBody.concat(s.afterBody),_),y=t.displayColors?r+2+t.boxPadding:0,z(i,w=>{z(w.before,_),z(w.lines,_),z(w.after,_)}),y=0,e.font=h.string,z(s.footer,_),e.restore(),p+=g.width,{width:p,height:m}}function Tf(s,t){let{y:e,height:i}=t;return es.height-i/2?"bottom":"center"}function Df(s,t,e,i){let{x:n,width:o}=i,r=e.caretSize+e.caretPadding;if(s==="left"&&n+o+r>t.width||s==="right"&&n-o-r<0)return!0}function Cf(s,t,e,i){let{x:n,width:o}=e,{width:r,chartArea:{left:a,right:l}}=s,c="center";return i==="center"?c=n<=(a+l)/2?"left":"right":n<=o/2?c="left":n>=r-o/2&&(c="right"),Df(c,s,t,e)&&(c="center"),c}function ga(s,t,e){let i=e.yAlign||t.yAlign||Tf(s,e);return{xAlign:e.xAlign||t.xAlign||Cf(s,t,e,i),yAlign:i}}function Pf(s,t){let{x:e,width:i}=s;return t==="right"?e-=i:t==="center"&&(e-=i/2),e}function Af(s,t,e){let{y:i,height:n}=s;return t==="top"?i+=e:t==="bottom"?i-=n+e:i-=n/2,i}function ma(s,t,e,i){let{caretSize:n,caretPadding:o,cornerRadius:r}=s,{xAlign:a,yAlign:l}=e,c=n+o,{topLeft:h,topRight:u,bottomLeft:d,bottomRight:f}=te(r),g=Pf(t,a),m=Af(t,l,c);return l==="center"?a==="left"?g+=c:a==="right"&&(g-=c):a==="left"?g-=Math.max(h,d)+n:a==="right"&&(g+=Math.max(u,f)+n),{x:K(g,0,i.width-t.width),y:K(m,0,i.height-t.height)}}function pi(s,t,e){let i=nt(e.padding);return t==="center"?s.x+s.width/2:t==="right"?s.x+s.width-i.right:s.x+i.left}function pa(s){return Et([],$t(s))}function If(s,t,e){return Bt(s,{tooltip:t,tooltipItems:e,type:"tooltip"})}function ba(s,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?s.override(e):s}var Ya={beforeTitle:At,title(s){if(s.length>0){let t=s[0],e=t.chart.data.labels,i=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(i>0&&t.dataIndex"u"?Ya[t].call(e,i):n}var Ps=class extends dt{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,i=this.options.setContext(this.getContext()),n=i.enabled&&e.options.animation&&i.animations,o=new _i(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=If(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:i}=e,n=lt(i,"beforeTitle",this,t),o=lt(i,"title",this,t),r=lt(i,"afterTitle",this,t),a=[];return a=Et(a,$t(n)),a=Et(a,$t(o)),a=Et(a,$t(r)),a}getBeforeBody(t,e){return pa(lt(e.callbacks,"beforeBody",this,t))}getBody(t,e){let{callbacks:i}=e,n=[];return z(t,o=>{let r={before:[],lines:[],after:[]},a=ba(i,o);Et(r.before,$t(lt(a,"beforeLabel",this,o))),Et(r.lines,lt(a,"label",this,o)),Et(r.after,$t(lt(a,"afterLabel",this,o))),n.push(r)}),n}getAfterBody(t,e){return pa(lt(e.callbacks,"afterBody",this,t))}getFooter(t,e){let{callbacks:i}=e,n=lt(i,"beforeFooter",this,t),o=lt(i,"footer",this,t),r=lt(i,"afterFooter",this,t),a=[];return a=Et(a,$t(n)),a=Et(a,$t(o)),a=Et(a,$t(r)),a}_createItems(t){let e=this._active,i=this.chart.data,n=[],o=[],r=[],a=[],l,c;for(l=0,c=e.length;lt.filter(h,u,d,i))),t.itemSort&&(a=a.sort((h,u)=>t.itemSort(h,u,i))),z(a,h=>{let u=ba(t.callbacks,h);n.push(lt(u,"labelColor",this,h)),o.push(lt(u,"labelPointStyle",this,h)),r.push(lt(u,"labelTextColor",this,h))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=r,this.dataPoints=a,a}update(t,e){let i=this.options.setContext(this.getContext()),n=this._active,o,r=[];if(!n.length)this.opacity!==0&&(o={opacity:0});else{let a=Ms[i.position].call(this,n,this._eventPosition);r=this._createItems(i),this.title=this.getTitle(r,i),this.beforeBody=this.getBeforeBody(r,i),this.body=this.getBody(r,i),this.afterBody=this.getAfterBody(r,i),this.footer=this.getFooter(r,i);let l=this._size=fa(this,i),c=Object.assign({},a,l),h=ga(this.chart,i,c),u=ma(i,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,o={opacity:1,x:u.x,y:u.y,width:l.width,height:l.height,caretX:a.x,caretY:a.y}}this._tooltipItems=r,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,n){let o=this.getCaretPosition(t,i,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,i){let{xAlign:n,yAlign:o}=this,{caretSize:r,cornerRadius:a}=i,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:u}=te(a),{x:d,y:f}=t,{width:g,height:m}=e,p,b,y,_,w,x;return o==="center"?(w=f+m/2,n==="left"?(p=d,b=p-r,_=w+r,x=w-r):(p=d+g,b=p+r,_=w-r,x=w+r),y=p):(n==="left"?b=d+Math.max(l,h)+r:n==="right"?b=d+g-Math.max(c,u)-r:b=this.caretX,o==="top"?(_=f,w=_-r,p=b-r,y=b+r):(_=f+m,w=_+r,p=b+r,y=b-r),x=_),{x1:p,x2:b,x3:y,y1:_,y2:w,y3:x}}drawTitle(t,e,i){let n=this.title,o=n.length,r,a,l;if(o){let c=ge(i.rtl,this.x,this.width);for(t.x=pi(this,i.titleAlign,i),e.textAlign=c.textAlign(i.titleAlign),e.textBaseline="middle",r=X(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=r.string,l=0;ly!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,Ne(t,{x:m,y:g,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=r.backgroundColor,t.beginPath(),Ne(t,{x:p,y:g+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(m,g,c,l),t.strokeRect(m,g,c,l),t.fillStyle=r.backgroundColor,t.fillRect(p,g+1,c-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){let{body:n}=this,{bodySpacing:o,bodyAlign:r,displayColors:a,boxHeight:l,boxWidth:c,boxPadding:h}=i,u=X(i.bodyFont),d=u.lineHeight,f=0,g=ge(i.rtl,this.x,this.width),m=function(M){e.fillText(M,g.x(t.x+f),t.y+d/2),t.y+=d+o},p=g.textAlign(r),b,y,_,w,x,k,S;for(e.textAlign=r,e.textBaseline="middle",e.font=u.string,t.x=pi(this,p,i),e.fillStyle=i.bodyColor,z(this.beforeBody,m),f=a&&p!=="right"?r==="center"?c/2+h:c+2+h:0,w=0,k=n.length;w0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,i=this.$animations,n=i&&i.x,o=i&&i.y;if(n||o){let r=Ms[t.position].call(this,this._active,this._eventPosition);if(!r)return;let a=this._size=fa(this,t),l=Object.assign({},r,this._size),c=ga(e,t,l),h=ma(t,l,c,e);(n._to!==h.x||o._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=a.width,this.height=a.height,this.caretX=r.x,this.caretY=r.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),i=this.opacity;if(!i)return;this._updateAnimationTarget(e);let n={width:this.width,height:this.height},o={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;let r=nt(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(o,t,n,e),Sn(t,e.textDirection),o.y+=r.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),Mn(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let i=this._active,n=t.map(({datasetIndex:a,index:l})=>{let c=this.chart.getDatasetMeta(a);if(!c)throw new Error("Cannot find a dataset at index "+a);return{datasetIndex:a,element:c.data[l],index:l}}),o=!gs(i,n),r=this._positionChanged(n,e);(o||r)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let n=this.options,o=this._active||[],r=this._getActiveElements(t,o,e,i),a=this._positionChanged(r,t),l=e||!gs(r,o)||a;return l&&(this._active=r,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,i,n){let o=this.options;if(t.type==="mouseout")return[];if(!n)return e.filter(a=>this.chart.data.datasets[a.datasetIndex]&&this.chart.getDatasetMeta(a.datasetIndex).controller.getParsed(a.index)!==void 0);let r=this.chart.getElementsAtEventForMode(t,o.mode,o,i);return o.reverse&&r.reverse(),r}_positionChanged(t,e){let{caretX:i,caretY:n,options:o}=this,r=Ms[o.position].call(this,t,e);return r!==!1&&(i!==r.x||n!==r.y)}};v(Ps,"positioners",Ms);var Ef={id:"tooltip",_element:Ps,positioners:Ms,afterInit(s,t,e){e&&(s.tooltip=new Ps({chart:s,options:e}))},beforeUpdate(s,t,e){s.tooltip&&s.tooltip.initialize(e)},reset(s,t,e){s.tooltip&&s.tooltip.initialize(e)},afterDraw(s){let t=s.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(s.notifyPlugins("beforeTooltipDraw",{...e,cancelable:!0})===!1)return;t.draw(s.ctx),s.notifyPlugins("afterTooltipDraw",e)}},afterEvent(s,t){if(s.tooltip){let e=t.replay;s.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(s,t)=>t.bodyFont.size,boxWidth:(s,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Ya},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:s=>s!=="filter"&&s!=="itemSort"&&s!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Lf=Object.freeze({__proto__:null,Colors:Ud,Decimation:Gd,Filler:pf,Legend:kf,SubTitle:Mf,Title:Sf,Tooltip:Ef}),Ff=(s,t,e,i)=>(typeof t=="string"?(e=s.push(t)-1,i.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function Rf(s,t,e,i){let n=s.indexOf(t);if(n===-1)return Ff(s,t,e,i);let o=s.lastIndexOf(t);return n!==o?e:n}var Nf=(s,t)=>s===null?null:K(Math.round(s),0,t);function ya(s){let t=this.getLabels();return s>=0&&se.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};v(Os,"id","category"),v(Os,"defaults",{ticks:{callback:ya}});function zf(s,t){let e=[],{bounds:n,step:o,min:r,max:a,precision:l,count:c,maxTicks:h,maxDigits:u,includeBounds:d}=s,f=o||1,g=h-1,{min:m,max:p}=t,b=!I(r),y=!I(a),_=!I(c),w=(p-m)/(u+1),x=sn((p-m)/g/f)*f,k,S,M,T;if(x<1e-14&&!b&&!y)return[{value:m},{value:p}];T=Math.ceil(p/x)-Math.floor(m/x),T>g&&(x=sn(T*x/g/f)*f),I(l)||(k=Math.pow(10,l),x=Math.ceil(x*k)/k),n==="ticks"?(S=Math.floor(m/x)*x,M=Math.ceil(p/x)*x):(S=m,M=p),b&&y&&o&&or((a-r)/o,x/1e3)?(T=Math.round(Math.min((a-r)/x,h)),x=(a-r)/T,S=r,M=a):_?(S=b?r:S,M=y?a:M,T=c-1,x=(M-S)/T):(T=(M-S)/x,Le(T,Math.round(T),x/1e3)?T=Math.round(T):T=Math.ceil(T));let C=Math.max(on(x),on(S));k=Math.pow(10,I(l)?C:l),S=Math.round(S*k)/k,M=Math.round(M*k)/k;let A=0;for(b&&(d&&S!==r?(e.push({value:r}),Sa)break;e.push({value:L})}return y&&d&&M!==a?e.length&&Le(e[e.length-1].value,a,xa(a,w,s))?e[e.length-1].value=a:e.push({value:a}):(!y||M===a)&&e.push({value:M}),e}function xa(s,t,{horizontal:e,minRotation:i}){let n=bt(i),o=(e?Math.sin(n):Math.cos(n))||.001,r=.75*t*(""+s).length;return Math.min(t/o,r)}var qe=class extends we{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return I(t)||(typeof t=="number"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){let{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds(),{min:n,max:o}=this,r=l=>n=e?n:l,a=l=>o=i?o:l;if(t){let l=St(n),c=St(o);l<0&&c<0?a(0):l>0&&c>0&&r(0)}if(n===o){let l=o===0?1:Math.abs(o*.05);a(o+l),t||r(n-l)}this.min=n,this.max=o}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:i}=t,n;return i?(n=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,i=this.getTickLimit();i=Math.max(2,i);let n={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},o=this._range||this,r=zf(n,o);return t.bounds==="ticks"&&nn(r,this,"value"),t.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let t=this.ticks,e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){let n=(i-e)/Math.max(t.length-1,1)/2;e-=n,i+=n}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return Re(t,this.chart.options.locale,this.options.ticks.format)}},Ts=class extends qe{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=Z(t)?t:0,this.max=Z(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,i=bt(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};v(Ts,"id","linear"),v(Ts,"defaults",{ticks:{callback:ms.formatters.numeric}});var Es=s=>Math.floor(Vt(s)),pe=(s,t)=>Math.pow(10,Es(s)+t);function _a(s){return s/Math.pow(10,Es(s))===1}function wa(s,t,e){let i=Math.pow(10,e),n=Math.floor(s/i);return Math.ceil(t/i)-n}function Vf(s,t){let e=t-s,i=Es(e);for(;wa(s,t,i)>10;)i++;for(;wa(s,t,i)<10;)i--;return Math.min(i,Es(s))}function Wf(s,{min:t,max:e}){t=at(s.min,t);let i=[],n=Es(t),o=Vf(t,e),r=o<0?Math.pow(10,Math.abs(o)):1,a=Math.pow(10,o),l=n>o?Math.pow(10,n):0,c=Math.round((t-l)*r)/r,h=Math.floor((t-l)/a/10)*a*10,u=Math.floor((c-h)/Math.pow(10,o)),d=at(s.min,Math.round((l+h+u*Math.pow(10,o))*r)/r);for(;d=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,r=o>=0?1:r),d=Math.round((l+h+u*Math.pow(10,o))*r)/r;let f=at(s.max,d);return i.push({value:f,major:_a(f),significand:u}),i}var Ds=class extends we{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){let i=qe.prototype.parse.apply(this,[t,e]);if(i===0){this._zero=!0;return}return Z(i)&&i>0?i:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=Z(t)?Math.max(0,t):null,this.max=Z(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Z(this._userMin)&&(this.min=t===pe(this.min,0)?pe(this.min,-1):pe(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),i=this.min,n=this.max,o=a=>i=t?i:a,r=a=>n=e?n:a;i===n&&(i<=0?(o(1),r(10)):(o(pe(i,-1)),r(pe(n,1)))),i<=0&&o(pe(n,-1)),n<=0&&r(pe(i,1)),this.min=i,this.max=n}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},i=Wf(e,this);return t.bounds==="ticks"&&nn(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return t===void 0?"0":Re(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=Vt(t),this._valueRange=Vt(this.max)-Vt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(Vt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};v(Ds,"id","logarithmic"),v(Ds,"defaults",{ticks:{callback:ms.formatters.logarithmic,major:{enabled:!0}}});function Qn(s){let t=s.ticks;if(t.display&&s.display){let e=nt(t.backdropPadding);return P(t.font&&t.font.size,j.font.size)+e.height}return 0}function Bf(s,t,e){return e=H(e)?e:[e],{w:gr(s,t.string,e),h:e.length*t.lineHeight}}function ka(s,t,e,i,n){return s===i||s===n?{start:t-e/2,end:t+e/2}:sn?{start:t-e,end:t}:{start:t,end:t+e}}function Hf(s){let t={l:s.left+s._padding.left,r:s.right-s._padding.right,t:s.top+s._padding.top,b:s.bottom-s._padding.bottom},e=Object.assign({},t),i=[],n=[],o=s._pointLabels.length,r=s.options.pointLabels,a=r.centerPointLabels?F/o:0;for(let l=0;lt.r&&(a=(i.end-t.r)/o,s.r=Math.max(s.r,t.r+a)),n.startt.b&&(l=(n.end-t.b)/r,s.b=Math.max(s.b,t.b+l))}function jf(s,t,e){let i=s.drawingArea,{extra:n,additionalAngle:o,padding:r,size:a}=e,l=s.getPointPosition(t,i+n+r,o),c=Math.round(si(st(l.angle+q))),h=Gf(l.y,a.h,c),u=Zf(c),d=qf(l.x,a.w,u);return{visible:!0,x:l.x,y:h,textAlign:u,left:d,top:h,right:d+a.w,bottom:h+a.h}}function Uf(s,t){if(!t)return!0;let{left:e,top:i,right:n,bottom:o}=s;return!(Pt({x:e,y:i},t)||Pt({x:e,y:o},t)||Pt({x:n,y:i},t)||Pt({x:n,y:o},t))}function Yf(s,t,e){let i=[],n=s._pointLabels.length,o=s.options,{centerPointLabels:r,display:a}=o.pointLabels,l={extra:Qn(o)/2,additionalAngle:r?F/n:0},c;for(let h=0;h270||e<90)&&(s-=t),s}function Xf(s,t,e){let{left:i,top:n,right:o,bottom:r}=e,{backdropColor:a}=t;if(!I(a)){let l=te(t.borderRadius),c=nt(t.backdropPadding);s.fillStyle=a;let h=i-c.left,u=n-c.top,d=o-i+c.width,f=r-n+c.height;Object.values(l).some(g=>g!==0)?(s.beginPath(),Ne(s,{x:h,y:u,w:d,h:f,radius:l}),s.fill()):s.fillRect(h,u,d,f)}}function Jf(s,t){let{ctx:e,options:{pointLabels:i}}=s;for(let n=t-1;n>=0;n--){let o=s._pointLabelItems[n];if(!o.visible)continue;let r=i.setContext(s.getPointLabelContext(n));Xf(e,r,o);let a=X(r.font),{x:l,y:c,textAlign:h}=o;Qt(e,s._pointLabels[n],l,c+a.lineHeight/2,a,{color:r.color,textAlign:h,textBaseline:"middle"})}}function Za(s,t,e,i){let{ctx:n}=s;if(e)n.arc(s.xCenter,s.yCenter,t,0,$);else{let o=s.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let r=1;r{let n=W(this.options.pointLabels.callback,[e,i],this);return n||n===0?n:""}).filter((e,i)=>this.chart.getDataVisibility(i))}fit(){let t=this.options;t.display&&t.pointLabels.display?Hf(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,n))}getIndexAngle(t){let e=$/(this._pointLabels.length||1),i=this.options.startAngle||0;return st(t*e+bt(i))}getDistanceFromCenterForValue(t){if(I(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(I(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(u!==0||u===0&&this.min<0){l=this.getDistanceFromCenterForValue(h.value);let d=this.getContext(u),f=n.setContext(d),g=o.setContext(d);Kf(this,f,l,r,g)}}),i.display){for(t.save(),a=r-1;a>=0;a--){let h=i.setContext(this.getPointLabelContext(a)),{color:u,lineWidth:d}=h;!d||!u||(t.lineWidth=d,t.strokeStyle=u,t.setLineDash(h.borderDash),t.lineDashOffset=h.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),c=this.getPointPosition(a,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(c.x,c.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;let n=this.getIndexAngle(0),o,r;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((a,l)=>{if(l===0&&this.min>=0&&!e.reverse)return;let c=i.setContext(this.getContext(l)),h=X(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,r=t.measureText(a.label).width,t.fillStyle=c.backdropColor;let u=nt(c.backdropPadding);t.fillRect(-r/2-u.left,-o-h.size/2-u.top,r+u.width,h.size+u.height)}Qt(t,a.label,0,-o,h,{color:c.color,strokeColor:c.textStrokeColor,strokeWidth:c.textStrokeWidth})}),t.restore()}drawTitle(){}};v(ye,"id","radialLinear"),v(ye,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ms.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),v(ye,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),v(ye,"descriptors",{angleLines:{_fallback:"grid"}});var Ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ct=Object.keys(Ti);function va(s,t){return s-t}function Sa(s,t){if(I(t))return null;let e=s._adapter,{parser:i,round:n,isoWeekday:o}=s._parseOpts,r=t;return typeof i=="function"&&(r=i(r)),Z(r)||(r=typeof i=="string"?e.parse(r,i):e.parse(r)),r===null?null:(n&&(r=n==="week"&&(fe(o)||o===!0)?e.startOf(r,"isoWeek",o):e.startOf(r,n)),+r)}function Ma(s,t,e,i){let n=ct.length;for(let o=ct.indexOf(s);o=ct.indexOf(e);o--){let r=ct[o];if(Ti[r].common&&s._adapter.diff(n,i,r)>=t-1)return r}return ct[e?ct.indexOf(e):0]}function eg(s){for(let t=ct.indexOf(s)+1,e=ct.length;t=t?e[i]:e[n];s[o]=!0}}function sg(s,t,e,i){let n=s._adapter,o=+n.startOf(t[0].value,i),r=t[t.length-1].value,a,l;for(a=o;a<=r;a=+n.add(a,1,i))l=e[a],l>=0&&(t[l].major=!0);return t}function Ta(s,t,e){let i=[],n={},o=t.length,r,a;for(r=0;r+t.value))}initOffsets(t=[]){let e=0,i=0,n,o;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?i=o:i=(o-this.getDecimalForValue(t[t.length-2]))/2);let r=t.length<3?.5:.25;e=K(e,0,r),i=K(i,0,r),this._offsets={start:e,end:i,factor:1/(e+1+i)}}_generate(){let t=this._adapter,e=this.min,i=this.max,n=this.options,o=n.time,r=o.unit||Ma(o.minUnit,e,i,this._getLabelCapacity(e)),a=P(n.ticks.stepSize,1),l=r==="week"?o.isoWeekday:!1,c=fe(l)||l===!0,h={},u=e,d,f;if(c&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,c?"day":r),t.diff(i,e,r)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+r);let g=n.ticks.source==="data"&&this.getDataTimestamps();for(d=u,f=0;d+m)}getLabelForValue(t){let e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){let n=this.options.time.displayFormats,o=this._unit,r=e||n[o];return this._adapter.format(t,r)}_tickFormatFunction(t,e,i,n){let o=this.options,r=o.ticks.callback;if(r)return W(r,[t,e,i],this);let a=o.time.displayFormats,l=this._unit,c=this._majorUnit,h=l&&a[l],u=c&&a[c],d=i[e],f=c&&u&&d&&d.major;return this._adapter.format(t,n||(f?u:h))}generateTickLabels(t){let e,i,n;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t=this._cache.data||[],e,i;if(t.length)return t;let n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,i=n.length;e=s[i].pos&&t<=s[n].pos&&({lo:i,hi:n}=Ct(s,"pos",t)),{pos:o,time:a}=s[i],{pos:r,time:l}=s[n]):(t>=s[i].time&&t<=s[n].time&&({lo:i,hi:n}=Ct(s,"time",t)),{time:o,pos:a}=s[i],{time:r,pos:l}=s[n]);let c=r-o;return c?a+(l-a)*(t-o)/c:a}var Cs=class extends _e{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=bi(e,this.min),this._tableRange=bi(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:i}=this,n=[],o=[],r,a,l,c,h;for(r=0,a=t.length;r=e&&c<=i&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(r=0,a=n.length;rn-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;let e=this.getDataTimestamps(),i=this.getLabelTimestamps();return e.length&&i.length?t=this.normalize(e.concat(i)):t=e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(bi(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){let e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return bi(this._table,i*this._tableRange+this._minPos,!0)}};v(Cs,"id","timeseries"),v(Cs,"defaults",_e.defaults);var ig=Object.freeze({__proto__:null,CategoryScale:Os,LinearScale:Ts,LogarithmicScale:Ds,RadialLinearScale:ye,TimeScale:_e,TimeSeriesScale:Cs}),qa=[gu,zd,Lf,ig];yt.register(...qa);var Mt=yt;var Yt=class extends Error{},ho=class extends Yt{constructor(t){super(`Invalid DateTime: ${t.toMessage()}`)}},uo=class extends Yt{constructor(t){super(`Invalid Interval: ${t.toMessage()}`)}},fo=class extends Yt{constructor(t){super(`Invalid Duration: ${t.toMessage()}`)}},oe=class extends Yt{},Fi=class extends Yt{constructor(t){super(`Invalid unit ${t}`)}},Q=class extends Yt{},Rt=class extends Yt{constructor(){super("Zone is an abstract class")}},O="numeric",Dt="short",mt="long",Ri={year:O,month:O,day:O},Ml={year:O,month:Dt,day:O},ng={year:O,month:Dt,day:O,weekday:Dt},Ol={year:O,month:mt,day:O},Tl={year:O,month:mt,day:O,weekday:mt},Dl={hour:O,minute:O},Cl={hour:O,minute:O,second:O},Pl={hour:O,minute:O,second:O,timeZoneName:Dt},Al={hour:O,minute:O,second:O,timeZoneName:mt},Il={hour:O,minute:O,hourCycle:"h23"},El={hour:O,minute:O,second:O,hourCycle:"h23"},Ll={hour:O,minute:O,second:O,hourCycle:"h23",timeZoneName:Dt},Fl={hour:O,minute:O,second:O,hourCycle:"h23",timeZoneName:mt},Rl={year:O,month:O,day:O,hour:O,minute:O},Nl={year:O,month:O,day:O,hour:O,minute:O,second:O},zl={year:O,month:Dt,day:O,hour:O,minute:O},Vl={year:O,month:Dt,day:O,hour:O,minute:O,second:O},og={year:O,month:Dt,day:O,weekday:Dt,hour:O,minute:O},Wl={year:O,month:mt,day:O,hour:O,minute:O,timeZoneName:Dt},Bl={year:O,month:mt,day:O,hour:O,minute:O,second:O,timeZoneName:Dt},Hl={year:O,month:mt,day:O,weekday:mt,hour:O,minute:O,timeZoneName:mt},$l={year:O,month:mt,day:O,weekday:mt,hour:O,minute:O,second:O,timeZoneName:mt},Me=class{get type(){throw new Rt}get name(){throw new Rt}get ianaName(){return this.name}get isUniversal(){throw new Rt}offsetName(t,e){throw new Rt}formatOffset(t,e){throw new Rt}offset(t){throw new Rt}equals(t){throw new Rt}get isValid(){throw new Rt}},eo=null,Ni=class s extends Me{static get instance(){return eo===null&&(eo=new s),eo}get type(){return"system"}get name(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(t,{format:e,locale:i}){return tc(t,e,i)}formatOffset(t,e){return Vs(this.offset(t),e)}offset(t){return-new Date(t).getTimezoneOffset()}equals(t){return t.type==="system"}get isValid(){return!0}},go=new Map;function rg(s){let t=go.get(s);return t===void 0&&(t=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:s,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),go.set(s,t)),t}var ag={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function lg(s,t){let e=s.format(t).replace(/\u200E/g,""),i=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(e),[,n,o,r,a,l,c,h]=i;return[r,n,o,a,l,c,h]}function cg(s,t){let e=s.formatToParts(t),i=[];for(let n=0;n=0?g:1e3+g,(d-f)/(60*1e3)}equals(t){return t.type==="iana"&&t.name===this.name}get isValid(){return this.valid}},Ga={};function hg(s,t={}){let e=JSON.stringify([s,t]),i=Ga[e];return i||(i=new Intl.ListFormat(s,t),Ga[e]=i),i}var mo=new Map;function po(s,t={}){let e=JSON.stringify([s,t]),i=mo.get(e);return i===void 0&&(i=new Intl.DateTimeFormat(s,t),mo.set(e,i)),i}var bo=new Map;function ug(s,t={}){let e=JSON.stringify([s,t]),i=bo.get(e);return i===void 0&&(i=new Intl.NumberFormat(s,t),bo.set(e,i)),i}var yo=new Map;function dg(s,t={}){let{base:e,...i}=t,n=JSON.stringify([s,i]),o=yo.get(n);return o===void 0&&(o=new Intl.RelativeTimeFormat(s,t),yo.set(n,o)),o}var Rs=null;function fg(){return Rs||(Rs=new Intl.DateTimeFormat().resolvedOptions().locale,Rs)}var xo=new Map;function jl(s){let t=xo.get(s);return t===void 0&&(t=new Intl.DateTimeFormat(s).resolvedOptions(),xo.set(s,t)),t}var _o=new Map;function gg(s){let t=_o.get(s);if(!t){let e=new Intl.Locale(s);t="getWeekInfo"in e?e.getWeekInfo():e.weekInfo,"minimalDays"in t||(t={...Ul,...t}),_o.set(s,t)}return t}function mg(s){let t=s.indexOf("-x-");t!==-1&&(s=s.substring(0,t));let e=s.indexOf("-u-");if(e===-1)return[s];{let i,n;try{i=po(s).resolvedOptions(),n=s}catch{let l=s.substring(0,e);i=po(l).resolvedOptions(),n=l}let{numberingSystem:o,calendar:r}=i;return[n,o,r]}}function pg(s,t,e){return(e||t)&&(s.includes("-u-")||(s+="-u"),e&&(s+=`-ca-${e}`),t&&(s+=`-nu-${t}`)),s}function bg(s){let t=[];for(let e=1;e<=12;e++){let i=R.utc(2009,e,1);t.push(s(i))}return t}function yg(s){let t=[];for(let e=1;e<=7;e++){let i=R.utc(2016,11,13+e);t.push(s(i))}return t}function Di(s,t,e,i){let n=s.listingMode();return n==="error"?null:n==="en"?e(t):i(t)}function xg(s){return s.numberingSystem&&s.numberingSystem!=="latn"?!1:s.numberingSystem==="latn"||!s.locale||s.locale.startsWith("en")||jl(s.locale).numberingSystem==="latn"}var wo=class{constructor(t,e,i){this.padTo=i.padTo||0,this.floor=i.floor||!1;let{padTo:n,floor:o,...r}=i;if(!e||Object.keys(r).length>0){let a={useGrouping:!1,...i};i.padTo>0&&(a.minimumIntegerDigits=i.padTo),this.inf=ug(t,a)}}format(t){if(this.inf){let e=this.floor?Math.floor(t):t;return this.inf.format(e)}else{let e=this.floor?Math.floor(t):Eo(t,3);return J(e,this.padTo)}}},ko=class{constructor(t,e,i){this.opts=i,this.originalZone=void 0;let n;if(this.opts.timeZone)this.dt=t;else if(t.zone.type==="fixed"){let r=-1*(t.offset/60),a=r>=0?`Etc/GMT+${r}`:`Etc/GMT${r}`;t.offset!==0&&ae.create(a).valid?(n=a,this.dt=t):(n="UTC",this.dt=t.offset===0?t:t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone)}else t.zone.type==="system"?this.dt=t:t.zone.type==="iana"?(this.dt=t,n=t.zone.name):(n="UTC",this.dt=t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone);let o={...this.opts};o.timeZone=o.timeZone||n,this.dtf=po(e,o)}format(){return this.originalZone?this.formatToParts().map(({value:t})=>t).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){let t=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?t.map(e=>{if(e.type==="timeZoneName"){let i=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...e,value:i}}else return e}):t}resolvedOptions(){return this.dtf.resolvedOptions()}},vo=class{constructor(t,e,i){this.opts={style:"long",...i},!e&&Kl()&&(this.rtf=dg(t,i))}format(t,e){return this.rtf?this.rtf.format(t,e):Wg(e,t,this.opts.numeric,this.opts.style!=="long")}formatToParts(t,e){return this.rtf?this.rtf.formatToParts(t,e):[]}},Ul={firstDay:1,minimalDays:4,weekend:[6,7]},B=class s{static fromOpts(t){return s.create(t.locale,t.numberingSystem,t.outputCalendar,t.weekSettings,t.defaultToEN)}static create(t,e,i,n,o=!1){let r=t||Y.defaultLocale,a=r||(o?"en-US":fg()),l=e||Y.defaultNumberingSystem,c=i||Y.defaultOutputCalendar,h=Oo(n)||Y.defaultWeekSettings;return new s(a,l,c,h,r)}static resetCache(){Rs=null,mo.clear(),bo.clear(),yo.clear(),xo.clear(),_o.clear()}static fromObject({locale:t,numberingSystem:e,outputCalendar:i,weekSettings:n}={}){return s.create(t,e,i,n)}constructor(t,e,i,n,o){let[r,a,l]=mg(t);this.locale=r,this.numberingSystem=e||a||null,this.outputCalendar=i||l||null,this.weekSettings=n,this.intl=pg(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=o,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached==null&&(this.fastNumbersCached=xg(this)),this.fastNumbersCached}listingMode(){let t=this.isEnglish(),e=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return t&&e?"en":"intl"}clone(t){return!t||Object.getOwnPropertyNames(t).length===0?this:s.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,Oo(t.weekSettings)||this.weekSettings,t.defaultToEN||!1)}redefaultToEN(t={}){return this.clone({...t,defaultToEN:!0})}redefaultToSystem(t={}){return this.clone({...t,defaultToEN:!1})}months(t,e=!1){return Di(this,t,ic,()=>{let i=this.intl==="ja"||this.intl.startsWith("ja-");e&=!i;let n=e?{month:t,day:"numeric"}:{month:t},o=e?"format":"standalone";if(!this.monthsCache[o][t]){let r=i?a=>this.dtFormatter(a,n).format():a=>this.extract(a,n,"month");this.monthsCache[o][t]=bg(r)}return this.monthsCache[o][t]})}weekdays(t,e=!1){return Di(this,t,rc,()=>{let i=e?{weekday:t,year:"numeric",month:"long",day:"numeric"}:{weekday:t},n=e?"format":"standalone";return this.weekdaysCache[n][t]||(this.weekdaysCache[n][t]=yg(o=>this.extract(o,i,"weekday"))),this.weekdaysCache[n][t]})}meridiems(){return Di(this,void 0,()=>ac,()=>{if(!this.meridiemCache){let t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[R.utc(2016,11,13,9),R.utc(2016,11,13,19)].map(e=>this.extract(e,t,"dayperiod"))}return this.meridiemCache})}eras(t){return Di(this,t,lc,()=>{let e={era:t};return this.eraCache[t]||(this.eraCache[t]=[R.utc(-40,1,1),R.utc(2017,1,1)].map(i=>this.extract(i,e,"era"))),this.eraCache[t]})}extract(t,e,i){let n=this.dtFormatter(t,e),o=n.formatToParts(),r=o.find(a=>a.type.toLowerCase()===i);return r?r.value:null}numberFormatter(t={}){return new wo(this.intl,t.forceSimple||this.fastNumbers,t)}dtFormatter(t,e={}){return new ko(t,this.intl,e)}relFormatter(t={}){return new vo(this.intl,this.isEnglish(),t)}listFormatter(t={}){return hg(this.intl,t)}isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||jl(this.intl).locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:Ql()?gg(this.locale):Ul}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(t){return this.locale===t.locale&&this.numberingSystem===t.numberingSystem&&this.outputCalendar===t.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}},io=null,kt=class s extends Me{static get utcInstance(){return io===null&&(io=new s(0)),io}static instance(t){return t===0?s.utcInstance:new s(t)}static parseSpecifier(t){if(t){let e=t.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(e)return new s(ji(e[1],e[2]))}return null}constructor(t){super(),this.fixed=t}get type(){return"fixed"}get name(){return this.fixed===0?"UTC":`UTC${Vs(this.fixed,"narrow")}`}get ianaName(){return this.fixed===0?"Etc/UTC":`Etc/GMT${Vs(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(t,e){return Vs(this.fixed,e)}get isUniversal(){return!0}offset(){return this.fixed}equals(t){return t.type==="fixed"&&t.fixed===this.fixed}get isValid(){return!0}},So=class extends Me{constructor(t){super(),this.zoneName=t}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}};function ne(s,t){if(D(s)||s===null)return t;if(s instanceof Me)return s;if(Mg(s)){let e=s.toLowerCase();return e==="default"?t:e==="local"||e==="system"?Ni.instance:e==="utc"||e==="gmt"?kt.utcInstance:kt.parseSpecifier(e)||ae.create(s)}else return re(s)?kt.instance(s):typeof s=="object"&&"offset"in s&&typeof s.offset=="function"?s:new So(s)}var Co={arab:"[\u0660-\u0669]",arabext:"[\u06F0-\u06F9]",bali:"[\u1B50-\u1B59]",beng:"[\u09E6-\u09EF]",deva:"[\u0966-\u096F]",fullwide:"[\uFF10-\uFF19]",gujr:"[\u0AE6-\u0AEF]",hanidec:"[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]",khmr:"[\u17E0-\u17E9]",knda:"[\u0CE6-\u0CEF]",laoo:"[\u0ED0-\u0ED9]",limb:"[\u1946-\u194F]",mlym:"[\u0D66-\u0D6F]",mong:"[\u1810-\u1819]",mymr:"[\u1040-\u1049]",orya:"[\u0B66-\u0B6F]",tamldec:"[\u0BE6-\u0BEF]",telu:"[\u0C66-\u0C6F]",thai:"[\u0E50-\u0E59]",tibt:"[\u0F20-\u0F29]",latn:"\\d"},Xa={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},_g=Co.hanidec.replace(/[\[|\]]/g,"").split("");function wg(s){let t=parseInt(s,10);if(isNaN(t)){t="";for(let e=0;e=o&&i<=r&&(t+=i-o)}}return parseInt(t,10)}else return t}var Mo=new Map;function kg(){Mo.clear()}function Ot({numberingSystem:s},t=""){let e=s||"latn",i=Mo.get(e);i===void 0&&(i=new Map,Mo.set(e,i));let n=i.get(t);return n===void 0&&(n=new RegExp(`${Co[e]}${t}`),i.set(t,n)),n}var Ja=()=>Date.now(),Ka="system",Qa=null,tl=null,el=null,sl=60,il,nl=null,Y=class{static get now(){return Ja}static set now(t){Ja=t}static set defaultZone(t){Ka=t}static get defaultZone(){return ne(Ka,Ni.instance)}static get defaultLocale(){return Qa}static set defaultLocale(t){Qa=t}static get defaultNumberingSystem(){return tl}static set defaultNumberingSystem(t){tl=t}static get defaultOutputCalendar(){return el}static set defaultOutputCalendar(t){el=t}static get defaultWeekSettings(){return nl}static set defaultWeekSettings(t){nl=Oo(t)}static get twoDigitCutoffYear(){return sl}static set twoDigitCutoffYear(t){sl=t%100}static get throwOnInvalid(){return il}static set throwOnInvalid(t){il=t}static resetCaches(){B.resetCache(),ae.resetCache(),R.resetCache(),kg()}},gt=class{constructor(t,e){this.reason=t,this.explanation=e}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}},Yl=[0,31,59,90,120,151,181,212,243,273,304,334],Zl=[0,31,60,91,121,152,182,213,244,274,305,335];function _t(s,t){return new gt("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${s}, which is invalid`)}function Po(s,t,e){let i=new Date(Date.UTC(s,t-1,e));s<100&&s>=0&&i.setUTCFullYear(i.getUTCFullYear()-1900);let n=i.getUTCDay();return n===0?7:n}function ql(s,t,e){return e+(Bs(s)?Zl:Yl)[t-1]}function Gl(s,t){let e=Bs(s)?Zl:Yl,i=e.findIndex(o=>oWs(i,t,e)?(c=i+1,l=1):c=i,{weekYear:c,weekNumber:l,weekday:a,...Ui(s)}}function ol(s,t=4,e=1){let{weekYear:i,weekNumber:n,weekday:o}=s,r=Ao(Po(i,1,t),e),a=Qe(i),l=n*7+o-r-7+t,c;l<1?(c=i-1,l+=Qe(c)):l>a?(c=i+1,l-=Qe(i)):c=i;let{month:h,day:u}=Gl(c,l);return{year:c,month:h,day:u,...Ui(s)}}function no(s){let{year:t,month:e,day:i}=s,n=ql(t,e,i);return{year:t,ordinal:n,...Ui(s)}}function rl(s){let{year:t,ordinal:e}=s,{month:i,day:n}=Gl(t,e);return{year:t,month:i,day:n,...Ui(s)}}function al(s,t){if(!D(s.localWeekday)||!D(s.localWeekNumber)||!D(s.localWeekYear)){if(!D(s.weekday)||!D(s.weekNumber)||!D(s.weekYear))throw new oe("Cannot mix locale-based week fields with ISO-based week fields");return D(s.localWeekday)||(s.weekday=s.localWeekday),D(s.localWeekNumber)||(s.weekNumber=s.localWeekNumber),D(s.localWeekYear)||(s.weekYear=s.localWeekYear),delete s.localWeekday,delete s.localWeekNumber,delete s.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function vg(s,t=4,e=1){let i=Hi(s.weekYear),n=wt(s.weekNumber,1,Ws(s.weekYear,t,e)),o=wt(s.weekday,1,7);return i?n?o?!1:_t("weekday",s.weekday):_t("week",s.weekNumber):_t("weekYear",s.weekYear)}function Sg(s){let t=Hi(s.year),e=wt(s.ordinal,1,Qe(s.year));return t?e?!1:_t("ordinal",s.ordinal):_t("year",s.year)}function Xl(s){let t=Hi(s.year),e=wt(s.month,1,12),i=wt(s.day,1,Vi(s.year,s.month));return t?e?i?!1:_t("day",s.day):_t("month",s.month):_t("year",s.year)}function Jl(s){let{hour:t,minute:e,second:i,millisecond:n}=s,o=wt(t,0,23)||t===24&&e===0&&i===0&&n===0,r=wt(e,0,59),a=wt(i,0,59),l=wt(n,0,999);return o?r?a?l?!1:_t("millisecond",n):_t("second",i):_t("minute",e):_t("hour",t)}function D(s){return typeof s>"u"}function re(s){return typeof s=="number"}function Hi(s){return typeof s=="number"&&s%1===0}function Mg(s){return typeof s=="string"}function Og(s){return Object.prototype.toString.call(s)==="[object Date]"}function Kl(){try{return typeof Intl<"u"&&!!Intl.RelativeTimeFormat}catch{return!1}}function Ql(){try{return typeof Intl<"u"&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch{return!1}}function Tg(s){return Array.isArray(s)?s:[s]}function ll(s,t,e){if(s.length!==0)return s.reduce((i,n)=>{let o=[t(n),n];return i&&e(i[0],o[0])===i[0]?i:o},null)[1]}function Dg(s,t){return t.reduce((e,i)=>(e[i]=s[i],e),{})}function ss(s,t){return Object.prototype.hasOwnProperty.call(s,t)}function Oo(s){if(s==null)return null;if(typeof s!="object")throw new Q("Week settings must be an object");if(!wt(s.firstDay,1,7)||!wt(s.minimalDays,1,7)||!Array.isArray(s.weekend)||s.weekend.some(t=>!wt(t,1,7)))throw new Q("Invalid week settings");return{firstDay:s.firstDay,minimalDays:s.minimalDays,weekend:Array.from(s.weekend)}}function wt(s,t,e){return Hi(s)&&s>=t&&s<=e}function Cg(s,t){return s-t*Math.floor(s/t)}function J(s,t=2){let e=s<0,i;return e?i="-"+(""+-s).padStart(t,"0"):i=(""+s).padStart(t,"0"),i}function ie(s){if(!(D(s)||s===null||s===""))return parseInt(s,10)}function ke(s){if(!(D(s)||s===null||s===""))return parseFloat(s)}function Io(s){if(!(D(s)||s===null||s==="")){let t=parseFloat("0."+s)*1e3;return Math.floor(t)}}function Eo(s,t,e="round"){let i=10**t;switch(e){case"expand":return s>0?Math.ceil(s*i)/i:Math.floor(s*i)/i;case"trunc":return Math.trunc(s*i)/i;case"round":return Math.round(s*i)/i;case"floor":return Math.floor(s*i)/i;case"ceil":return Math.ceil(s*i)/i;default:throw new RangeError(`Value rounding ${e} is out of range`)}}function Bs(s){return s%4===0&&(s%100!==0||s%400===0)}function Qe(s){return Bs(s)?366:365}function Vi(s,t){let e=Cg(t-1,12)+1,i=s+(t-e)/12;return e===2?Bs(i)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][e-1]}function $i(s){let t=Date.UTC(s.year,s.month-1,s.day,s.hour,s.minute,s.second,s.millisecond);return s.year<100&&s.year>=0&&(t=new Date(t),t.setUTCFullYear(s.year,s.month-1,s.day)),+t}function cl(s,t,e){return-Ao(Po(s,1,t),e)+t-1}function Ws(s,t=4,e=1){let i=cl(s,t,e),n=cl(s+1,t,e);return(Qe(s)-i+n)/7}function To(s){return s>99?s:s>Y.twoDigitCutoffYear?1900+s:2e3+s}function tc(s,t,e,i=null){let n=new Date(s),o={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};i&&(o.timeZone=i);let r={timeZoneName:t,...o},a=new Intl.DateTimeFormat(e,r).formatToParts(n).find(l=>l.type.toLowerCase()==="timezonename");return a?a.value:null}function ji(s,t){let e=parseInt(s,10);Number.isNaN(e)&&(e=0);let i=parseInt(t,10)||0,n=e<0||Object.is(e,-0)?-i:i;return e*60+n}function ec(s){let t=Number(s);if(typeof s=="boolean"||s===""||!Number.isFinite(t))throw new Q(`Invalid unit value ${s}`);return t}function Wi(s,t){let e={};for(let i in s)if(ss(s,i)){let n=s[i];if(n==null)continue;e[t(i)]=ec(n)}return e}function Vs(s,t){let e=Math.trunc(Math.abs(s/60)),i=Math.trunc(Math.abs(s%60)),n=s>=0?"+":"-";switch(t){case"short":return`${n}${J(e,2)}:${J(i,2)}`;case"narrow":return`${n}${e}${i>0?`:${i}`:""}`;case"techie":return`${n}${J(e,2)}${J(i,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function Ui(s){return Dg(s,["hour","minute","second","millisecond"])}var Pg=["January","February","March","April","May","June","July","August","September","October","November","December"],sc=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Ag=["J","F","M","A","M","J","J","A","S","O","N","D"];function ic(s){switch(s){case"narrow":return[...Ag];case"short":return[...sc];case"long":return[...Pg];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}var nc=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],oc=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],Ig=["M","T","W","T","F","S","S"];function rc(s){switch(s){case"narrow":return[...Ig];case"short":return[...oc];case"long":return[...nc];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}var ac=["AM","PM"],Eg=["Before Christ","Anno Domini"],Lg=["BC","AD"],Fg=["B","A"];function lc(s){switch(s){case"narrow":return[...Fg];case"short":return[...Lg];case"long":return[...Eg];default:return null}}function Rg(s){return ac[s.hour<12?0:1]}function Ng(s,t){return rc(t)[s.weekday-1]}function zg(s,t){return ic(t)[s.month-1]}function Vg(s,t){return lc(t)[s.year<0?0:1]}function Wg(s,t,e="always",i=!1){let n={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},o=["hours","minutes","seconds"].indexOf(s)===-1;if(e==="auto"&&o){let u=s==="days";switch(t){case 1:return u?"tomorrow":`next ${n[s][0]}`;case-1:return u?"yesterday":`last ${n[s][0]}`;case 0:return u?"today":`this ${n[s][0]}`}}let r=Object.is(t,-0)||t<0,a=Math.abs(t),l=a===1,c=n[s],h=i?l?c[1]:c[2]||c[1]:l?n[s][0]:s;return r?`${a} ${h} ago`:`in ${a} ${h}`}function hl(s,t){let e="";for(let i of s)i.literal?e+=i.val:e+=t(i.val);return e}var Bg={D:Ri,DD:Ml,DDD:Ol,DDDD:Tl,t:Dl,tt:Cl,ttt:Pl,tttt:Al,T:Il,TT:El,TTT:Ll,TTTT:Fl,f:Rl,ff:zl,fff:Wl,ffff:Hl,F:Nl,FF:Vl,FFF:Bl,FFFF:$l},ft=class s{static create(t,e={}){return new s(t,e)}static parseFormat(t){let e=null,i="",n=!1,o=[];for(let r=0;r0||n)&&o.push({literal:n||/^\s+$/.test(i),val:i===""?"'":i}),e=null,i="",n=!n):n||a===e?i+=a:(i.length>0&&o.push({literal:/^\s+$/.test(i),val:i}),i=a,e=a)}return i.length>0&&o.push({literal:n||/^\s+$/.test(i),val:i}),o}static macroTokenToFormatOpts(t){return Bg[t]}constructor(t,e){this.opts=e,this.loc=t,this.systemLoc=null}formatWithSystemDefault(t,e){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(t,{...this.opts,...e}).format()}dtFormatter(t,e={}){return this.loc.dtFormatter(t,{...this.opts,...e})}formatDateTime(t,e){return this.dtFormatter(t,e).format()}formatDateTimeParts(t,e){return this.dtFormatter(t,e).formatToParts()}formatInterval(t,e){return this.dtFormatter(t.start,e).dtf.formatRange(t.start.toJSDate(),t.end.toJSDate())}resolvedOptions(t,e){return this.dtFormatter(t,e).resolvedOptions()}num(t,e=0,i=void 0){if(this.opts.forceSimple)return J(t,e);let n={...this.opts};return e>0&&(n.padTo=e),i&&(n.signDisplay=i),this.loc.numberFormatter(n).format(t)}formatDateTimeFromString(t,e){let i=this.loc.listingMode()==="en",n=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",o=(f,g)=>this.loc.extract(t,f,g),r=f=>t.isOffsetFixed&&t.offset===0&&f.allowZ?"Z":t.isValid?t.zone.formatOffset(t.ts,f.format):"",a=()=>i?Rg(t):o({hour:"numeric",hourCycle:"h12"},"dayperiod"),l=(f,g)=>i?zg(t,f):o(g?{month:f}:{month:f,day:"numeric"},"month"),c=(f,g)=>i?Ng(t,f):o(g?{weekday:f}:{weekday:f,month:"long",day:"numeric"},"weekday"),h=f=>{let g=s.macroTokenToFormatOpts(f);return g?this.formatWithSystemDefault(t,g):f},u=f=>i?Vg(t,f):o({era:f},"era"),d=f=>{switch(f){case"S":return this.num(t.millisecond);case"u":case"SSS":return this.num(t.millisecond,3);case"s":return this.num(t.second);case"ss":return this.num(t.second,2);case"uu":return this.num(Math.floor(t.millisecond/10),2);case"uuu":return this.num(Math.floor(t.millisecond/100));case"m":return this.num(t.minute);case"mm":return this.num(t.minute,2);case"h":return this.num(t.hour%12===0?12:t.hour%12);case"hh":return this.num(t.hour%12===0?12:t.hour%12,2);case"H":return this.num(t.hour);case"HH":return this.num(t.hour,2);case"Z":return r({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return r({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return r({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return t.zone.offsetName(t.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return t.zone.offsetName(t.ts,{format:"long",locale:this.loc.locale});case"z":return t.zoneName;case"a":return a();case"d":return n?o({day:"numeric"},"day"):this.num(t.day);case"dd":return n?o({day:"2-digit"},"day"):this.num(t.day,2);case"c":return this.num(t.weekday);case"ccc":return c("short",!0);case"cccc":return c("long",!0);case"ccccc":return c("narrow",!0);case"E":return this.num(t.weekday);case"EEE":return c("short",!1);case"EEEE":return c("long",!1);case"EEEEE":return c("narrow",!1);case"L":return n?o({month:"numeric",day:"numeric"},"month"):this.num(t.month);case"LL":return n?o({month:"2-digit",day:"numeric"},"month"):this.num(t.month,2);case"LLL":return l("short",!0);case"LLLL":return l("long",!0);case"LLLLL":return l("narrow",!0);case"M":return n?o({month:"numeric"},"month"):this.num(t.month);case"MM":return n?o({month:"2-digit"},"month"):this.num(t.month,2);case"MMM":return l("short",!1);case"MMMM":return l("long",!1);case"MMMMM":return l("narrow",!1);case"y":return n?o({year:"numeric"},"year"):this.num(t.year);case"yy":return n?o({year:"2-digit"},"year"):this.num(t.year.toString().slice(-2),2);case"yyyy":return n?o({year:"numeric"},"year"):this.num(t.year,4);case"yyyyyy":return n?o({year:"numeric"},"year"):this.num(t.year,6);case"G":return u("short");case"GG":return u("long");case"GGGGG":return u("narrow");case"kk":return this.num(t.weekYear.toString().slice(-2),2);case"kkkk":return this.num(t.weekYear,4);case"W":return this.num(t.weekNumber);case"WW":return this.num(t.weekNumber,2);case"n":return this.num(t.localWeekNumber);case"nn":return this.num(t.localWeekNumber,2);case"ii":return this.num(t.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(t.localWeekYear,4);case"o":return this.num(t.ordinal);case"ooo":return this.num(t.ordinal,3);case"q":return this.num(t.quarter);case"qq":return this.num(t.quarter,2);case"X":return this.num(Math.floor(t.ts/1e3));case"x":return this.num(t.ts);default:return h(f)}};return hl(s.parseFormat(e),d)}formatDurationFromString(t,e){let i=this.opts.signMode==="negativeLargestOnly"?-1:1,n=h=>{switch(h[0]){case"S":return"milliseconds";case"s":return"seconds";case"m":return"minutes";case"h":return"hours";case"d":return"days";case"w":return"weeks";case"M":return"months";case"y":return"years";default:return null}},o=(h,u)=>d=>{let f=n(d);if(f){let g=u.isNegativeDuration&&f!==u.largestUnit?i:1,m;return this.opts.signMode==="negativeLargestOnly"&&f!==u.largestUnit?m="never":this.opts.signMode==="all"?m="always":m="auto",this.num(h.get(f)*g,d.length,m)}else return d},r=s.parseFormat(e),a=r.reduce((h,{literal:u,val:d})=>u?h:h.concat(d),[]),l=t.shiftTo(...a.map(n).filter(h=>h)),c={isNegativeDuration:l<0,largestUnit:Object.keys(l.values)[0]};return hl(r,o(l,c))}},cc=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function is(...s){let t=s.reduce((e,i)=>e+i.source,"");return RegExp(`^${t}$`)}function ns(...s){return t=>s.reduce(([e,i,n],o)=>{let[r,a,l]=o(t,n);return[{...e,...r},a||i,l]},[{},null,1]).slice(0,2)}function os(s,...t){if(s==null)return[null,null];for(let[e,i]of t){let n=e.exec(s);if(n)return i(n)}return[null,null]}function hc(...s){return(t,e)=>{let i={},n;for(n=0;nf!==void 0&&(g||f&&h)?-f:f;return[{years:d(ke(e)),months:d(ke(i)),weeks:d(ke(n)),days:d(ke(o)),hours:d(ke(r)),minutes:d(ke(a)),seconds:d(ke(l),l==="-0"),milliseconds:d(Io(c),u)}]}var tm={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Ro(s,t,e,i,n,o,r){let a={year:t.length===2?To(ie(t)):ie(t),month:sc.indexOf(e)+1,day:ie(i),hour:ie(n),minute:ie(o)};return r&&(a.second=ie(r)),s&&(a.weekday=s.length>3?nc.indexOf(s)+1:oc.indexOf(s)+1),a}var em=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function sm(s){let[,t,e,i,n,o,r,a,l,c,h,u]=s,d=Ro(t,n,i,e,o,r,a),f;return l?f=tm[l]:c?f=0:f=ji(h,u),[d,new kt(f)]}function im(s){return s.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}var nm=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,om=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,rm=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function ul(s){let[,t,e,i,n,o,r,a]=s;return[Ro(t,n,i,e,o,r,a),kt.utcInstance]}function am(s){let[,t,e,i,n,o,r,a]=s;return[Ro(t,a,e,i,n,o,r),kt.utcInstance]}var lm=is($g,Fo),cm=is(jg,Fo),hm=is(Ug,Fo),um=is(dc),gc=ns(Xg,rs,Hs,$s),dm=ns(Yg,rs,Hs,$s),fm=ns(Zg,rs,Hs,$s),gm=ns(rs,Hs,$s);function mm(s){return os(s,[lm,gc],[cm,dm],[hm,fm],[um,gm])}function pm(s){return os(im(s),[em,sm])}function bm(s){return os(s,[nm,ul],[om,ul],[rm,am])}function ym(s){return os(s,[Kg,Qg])}var xm=ns(rs);function _m(s){return os(s,[Jg,xm])}var wm=is(qg,Gg),km=is(fc),vm=ns(rs,Hs,$s);function Sm(s){return os(s,[wm,gc],[km,vm])}var dl="Invalid Duration",mc={weeks:{days:7,hours:168,minutes:10080,seconds:10080*60,milliseconds:10080*60*1e3},days:{hours:24,minutes:1440,seconds:1440*60,milliseconds:1440*60*1e3},hours:{minutes:60,seconds:3600,milliseconds:3600*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},Mm={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:2184,minutes:2184*60,seconds:2184*60*60,milliseconds:2184*60*60*1e3},months:{weeks:4,days:30,hours:720,minutes:720*60,seconds:720*60*60,milliseconds:720*60*60*1e3},...mc},xt=146097/400,Ge=146097/4800,Om={years:{quarters:4,months:12,weeks:xt/7,days:xt,hours:xt*24,minutes:xt*24*60,seconds:xt*24*60*60,milliseconds:xt*24*60*60*1e3},quarters:{months:3,weeks:xt/28,days:xt/4,hours:xt*24/4,minutes:xt*24*60/4,seconds:xt*24*60*60/4,milliseconds:xt*24*60*60*1e3/4},months:{weeks:Ge/7,days:Ge,hours:Ge*24,minutes:Ge*24*60,seconds:Ge*24*60*60,milliseconds:Ge*24*60*60*1e3},...mc},Se=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],Tm=Se.slice(0).reverse();function Ut(s,t,e=!1){let i={values:e?t.values:{...s.values,...t.values||{}},loc:s.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||s.conversionAccuracy,matrix:t.matrix||s.matrix};return new tt(i)}function pc(s,t){let e=t.milliseconds??0;for(let i of Tm.slice(1))t[i]&&(e+=t[i]*s[i].milliseconds);return e}function fl(s,t){let e=pc(s,t)<0?-1:1;Se.reduceRight((i,n)=>{if(D(t[n]))return i;if(i){let o=t[i]*e,r=s[n][i],a=Math.floor(o/r);t[n]+=a*e,t[i]-=a*r*e}return n},null),Se.reduce((i,n)=>{if(D(t[n]))return i;if(i){let o=t[i]%1;t[i]-=o,t[n]+=o*s[i][n]}return n},null)}function gl(s){let t={};for(let[e,i]of Object.entries(s))i!==0&&(t[e]=i);return t}var tt=class s{constructor(t){let e=t.conversionAccuracy==="longterm"||!1,i=e?Om:Mm;t.matrix&&(i=t.matrix),this.values=t.values,this.loc=t.loc||B.create(),this.conversionAccuracy=e?"longterm":"casual",this.invalid=t.invalid||null,this.matrix=i,this.isLuxonDuration=!0}static fromMillis(t,e){return s.fromObject({milliseconds:t},e)}static fromObject(t,e={}){if(t==null||typeof t!="object")throw new Q(`Duration.fromObject: argument expected to be an object, got ${t===null?"null":typeof t}`);return new s({values:Wi(t,s.normalizeUnit),loc:B.fromObject(e),conversionAccuracy:e.conversionAccuracy,matrix:e.matrix})}static fromDurationLike(t){if(re(t))return s.fromMillis(t);if(s.isDuration(t))return t;if(typeof t=="object")return s.fromObject(t);throw new Q(`Unknown duration argument ${t} of type ${typeof t}`)}static fromISO(t,e){let[i]=ym(t);return i?s.fromObject(i,e):s.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static fromISOTime(t,e){let[i]=_m(t);return i?s.fromObject(i,e):s.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static invalid(t,e=null){if(!t)throw new Q("need to specify a reason the Duration is invalid");let i=t instanceof gt?t:new gt(t,e);if(Y.throwOnInvalid)throw new fo(i);return new s({invalid:i})}static normalizeUnit(t){let e={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[t&&t.toLowerCase()];if(!e)throw new Fi(t);return e}static isDuration(t){return t&&t.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(t,e={}){let i={...e,floor:e.round!==!1&&e.floor!==!1};return this.isValid?ft.create(this.loc,i).formatDurationFromString(this,t):dl}toHuman(t={}){if(!this.isValid)return dl;let e=t.showZeros!==!1,i=Se.map(n=>{let o=this.values[n];return D(o)||o===0&&!e?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...t,unit:n.slice(0,-1)}).format(o)}).filter(n=>n);return this.loc.listFormatter({type:"conjunction",style:t.listStyle||"narrow",...t}).format(i)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let t="P";return this.years!==0&&(t+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(t+=this.months+this.quarters*3+"M"),this.weeks!==0&&(t+=this.weeks+"W"),this.days!==0&&(t+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(t+="T"),this.hours!==0&&(t+=this.hours+"H"),this.minutes!==0&&(t+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(t+=Eo(this.seconds+this.milliseconds/1e3,3)+"S"),t==="P"&&(t+="T0S"),t}toISOTime(t={}){if(!this.isValid)return null;let e=this.toMillis();return e<0||e>=864e5?null:(t={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...t,includeOffset:!1},R.fromMillis(e,{zone:"UTC"}).toISOTime(t))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?pc(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(t){if(!this.isValid)return this;let e=s.fromDurationLike(t),i={};for(let n of Se)(ss(e.values,n)||ss(this.values,n))&&(i[n]=e.get(n)+this.get(n));return Ut(this,{values:i},!0)}minus(t){if(!this.isValid)return this;let e=s.fromDurationLike(t);return this.plus(e.negate())}mapUnits(t){if(!this.isValid)return this;let e={};for(let i of Object.keys(this.values))e[i]=ec(t(this.values[i],i));return Ut(this,{values:e},!0)}get(t){return this[s.normalizeUnit(t)]}set(t){if(!this.isValid)return this;let e={...this.values,...Wi(t,s.normalizeUnit)};return Ut(this,{values:e})}reconfigure({locale:t,numberingSystem:e,conversionAccuracy:i,matrix:n}={}){let r={loc:this.loc.clone({locale:t,numberingSystem:e}),matrix:n,conversionAccuracy:i};return Ut(this,r)}as(t){return this.isValid?this.shiftTo(t).get(t):NaN}normalize(){if(!this.isValid)return this;let t=this.toObject();return fl(this.matrix,t),Ut(this,{values:t},!0)}rescale(){if(!this.isValid)return this;let t=gl(this.normalize().shiftToAll().toObject());return Ut(this,{values:t},!0)}shiftTo(...t){if(!this.isValid)return this;if(t.length===0)return this;t=t.map(r=>s.normalizeUnit(r));let e={},i={},n=this.toObject(),o;for(let r of Se)if(t.indexOf(r)>=0){o=r;let a=0;for(let c in i)a+=this.matrix[c][r]*i[c],i[c]=0;re(n[r])&&(a+=n[r]);let l=Math.trunc(a);e[r]=l,i[r]=(a*1e3-l*1e3)/1e3}else re(n[r])&&(i[r]=n[r]);for(let r in i)i[r]!==0&&(e[o]+=r===o?i[r]:i[r]/this.matrix[o][r]);return fl(this.matrix,e),Ut(this,{values:e},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;let t={};for(let e of Object.keys(this.values))t[e]=this.values[e]===0?0:-this.values[e];return Ut(this,{values:t},!0)}removeZeros(){if(!this.isValid)return this;let t=gl(this.values);return Ut(this,{values:t},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(t){if(!this.isValid||!t.isValid||!this.loc.equals(t.loc))return!1;function e(i,n){return i===void 0||i===0?n===void 0||n===0:i===n}for(let i of Se)if(!e(this.values[i],t.values[i]))return!1;return!0}},Xe="Invalid Interval";function Dm(s,t){return!s||!s.isValid?es.invalid("missing or invalid start"):!t||!t.isValid?es.invalid("missing or invalid end"):tt:!1}isBefore(t){return this.isValid?this.e<=t:!1}contains(t){return this.isValid?this.s<=t&&this.e>t:!1}set({start:t,end:e}={}){return this.isValid?s.fromDateTimes(t||this.s,e||this.e):this}splitAt(...t){if(!this.isValid)return[];let e=t.map(Fs).filter(r=>this.contains(r)).sort((r,a)=>r.toMillis()-a.toMillis()),i=[],{s:n}=this,o=0;for(;n+this.e?this.e:r;i.push(s.fromDateTimes(n,a)),n=a,o+=1}return i}splitBy(t){let e=tt.fromDurationLike(t);if(!this.isValid||!e.isValid||e.as("milliseconds")===0)return[];let{s:i}=this,n=1,o,r=[];for(;il*n));o=+a>+this.e?this.e:a,r.push(s.fromDateTimes(i,o)),i=o,n+=1}return r}divideEqually(t){return this.isValid?this.splitBy(this.length()/t).slice(0,t):[]}overlaps(t){return this.e>t.s&&this.s=t.e:!1}equals(t){return!this.isValid||!t.isValid?!1:this.s.equals(t.s)&&this.e.equals(t.e)}intersection(t){if(!this.isValid)return this;let e=this.s>t.s?this.s:t.s,i=this.e=i?null:s.fromDateTimes(e,i)}union(t){if(!this.isValid)return this;let e=this.st.e?this.e:t.e;return s.fromDateTimes(e,i)}static merge(t){let[e,i]=t.sort((n,o)=>n.s-o.s).reduce(([n,o],r)=>o?o.overlaps(r)||o.abutsStart(r)?[n,o.union(r)]:[n.concat([o]),r]:[n,r],[[],null]);return i&&e.push(i),e}static xor(t){let e=null,i=0,n=[],o=t.map(l=>[{time:l.s,type:"s"},{time:l.e,type:"e"}]),r=Array.prototype.concat(...o),a=r.sort((l,c)=>l.time-c.time);for(let l of a)i+=l.type==="s"?1:-1,i===1?e=l.time:(e&&+e!=+l.time&&n.push(s.fromDateTimes(e,l.time)),e=null);return s.merge(n)}difference(...t){return s.xor([this].concat(t)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} \u2013 ${this.e.toISO()})`:Xe}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(t=Ri,e={}){return this.isValid?ft.create(this.s.loc.clone(e),t).formatInterval(this):Xe}toISO(t){return this.isValid?`${this.s.toISO(t)}/${this.e.toISO(t)}`:Xe}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:Xe}toISOTime(t){return this.isValid?`${this.s.toISOTime(t)}/${this.e.toISOTime(t)}`:Xe}toFormat(t,{separator:e=" \u2013 "}={}){return this.isValid?`${this.s.toFormat(t)}${e}${this.e.toFormat(t)}`:Xe}toDuration(t,e){return this.isValid?this.e.diff(this.s,t,e):tt.invalid(this.invalidReason)}mapEndpoints(t){return s.fromDateTimes(t(this.s),t(this.e))}},Ke=class{static hasDST(t=Y.defaultZone){let e=R.now().setZone(t).set({month:12});return!t.isUniversal&&e.offset!==e.set({month:6}).offset}static isValidIANAZone(t){return ae.isValidZone(t)}static normalizeZone(t){return ne(t,Y.defaultZone)}static getStartOfWeek({locale:t=null,locObj:e=null}={}){return(e||B.create(t)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:t=null,locObj:e=null}={}){return(e||B.create(t)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:t=null,locObj:e=null}={}){return(e||B.create(t)).getWeekendDays().slice()}static months(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null,outputCalendar:o="gregory"}={}){return(n||B.create(e,i,o)).months(t)}static monthsFormat(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null,outputCalendar:o="gregory"}={}){return(n||B.create(e,i,o)).months(t,!0)}static weekdays(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null}={}){return(n||B.create(e,i,null)).weekdays(t)}static weekdaysFormat(t="long",{locale:e=null,numberingSystem:i=null,locObj:n=null}={}){return(n||B.create(e,i,null)).weekdays(t,!0)}static meridiems({locale:t=null}={}){return B.create(t).meridiems()}static eras(t="short",{locale:e=null}={}){return B.create(e,null,"gregory").eras(t)}static features(){return{relative:Kl(),localeWeek:Ql()}}};function ml(s,t){let e=n=>n.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),i=e(t)-e(s);return Math.floor(tt.fromMillis(i).as("days"))}function Cm(s,t,e){let i=[["years",(l,c)=>c.year-l.year],["quarters",(l,c)=>c.quarter-l.quarter+(c.year-l.year)*4],["months",(l,c)=>c.month-l.month+(c.year-l.year)*12],["weeks",(l,c)=>{let h=ml(l,c);return(h-h%7)/7}],["days",ml]],n={},o=s,r,a;for(let[l,c]of i)e.indexOf(l)>=0&&(r=l,n[l]=c(s,t),a=o.plus(n),a>t?(n[l]--,s=o.plus(n),s>t&&(a=s,n[l]--,s=o.plus(n))):s=a);return[s,n,a,r]}function Pm(s,t,e,i){let[n,o,r,a]=Cm(s,t,e),l=t-n,c=e.filter(u=>["hours","minutes","seconds","milliseconds"].indexOf(u)>=0);c.length===0&&(r0?tt.fromMillis(l,i).shiftTo(...c).plus(h):h}var Am="missing Intl.DateTimeFormat.formatToParts support";function N(s,t=e=>e){return{regex:s,deser:([e])=>t(wg(e))}}var Im="\xA0",bc=`[ ${Im}]`,yc=new RegExp(bc,"g");function Em(s){return s.replace(/\./g,"\\.?").replace(yc,bc)}function pl(s){return s.replace(/\./g,"").replace(yc," ").toLowerCase()}function Tt(s,t){return s===null?null:{regex:RegExp(s.map(Em).join("|")),deser:([e])=>s.findIndex(i=>pl(e)===pl(i))+t}}function bl(s,t){return{regex:s,deser:([,e,i])=>ji(e,i),groups:t}}function Ci(s){return{regex:s,deser:([t])=>t}}function Lm(s){return s.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function Fm(s,t){let e=Ot(t),i=Ot(t,"{2}"),n=Ot(t,"{3}"),o=Ot(t,"{4}"),r=Ot(t,"{6}"),a=Ot(t,"{1,2}"),l=Ot(t,"{1,3}"),c=Ot(t,"{1,6}"),h=Ot(t,"{1,9}"),u=Ot(t,"{2,4}"),d=Ot(t,"{4,6}"),f=p=>({regex:RegExp(Lm(p.val)),deser:([b])=>b,literal:!0}),m=(p=>{if(s.literal)return f(p);switch(p.val){case"G":return Tt(t.eras("short"),0);case"GG":return Tt(t.eras("long"),0);case"y":return N(c);case"yy":return N(u,To);case"yyyy":return N(o);case"yyyyy":return N(d);case"yyyyyy":return N(r);case"M":return N(a);case"MM":return N(i);case"MMM":return Tt(t.months("short",!0),1);case"MMMM":return Tt(t.months("long",!0),1);case"L":return N(a);case"LL":return N(i);case"LLL":return Tt(t.months("short",!1),1);case"LLLL":return Tt(t.months("long",!1),1);case"d":return N(a);case"dd":return N(i);case"o":return N(l);case"ooo":return N(n);case"HH":return N(i);case"H":return N(a);case"hh":return N(i);case"h":return N(a);case"mm":return N(i);case"m":return N(a);case"q":return N(a);case"qq":return N(i);case"s":return N(a);case"ss":return N(i);case"S":return N(l);case"SSS":return N(n);case"u":return Ci(h);case"uu":return Ci(a);case"uuu":return N(e);case"a":return Tt(t.meridiems(),0);case"kkkk":return N(o);case"kk":return N(u,To);case"W":return N(a);case"WW":return N(i);case"E":case"c":return N(e);case"EEE":return Tt(t.weekdays("short",!1),1);case"EEEE":return Tt(t.weekdays("long",!1),1);case"ccc":return Tt(t.weekdays("short",!0),1);case"cccc":return Tt(t.weekdays("long",!0),1);case"Z":case"ZZ":return bl(new RegExp(`([+-]${a.source})(?::(${i.source}))?`),2);case"ZZZ":return bl(new RegExp(`([+-]${a.source})(${i.source})?`),2);case"z":return Ci(/[a-z_+-/]{1,256}?/i);case" ":return Ci(/[^\S\n\r]/);default:return f(p)}})(s)||{invalidReason:Am};return m.token=s,m}var Rm={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};function Nm(s,t,e){let{type:i,value:n}=s;if(i==="literal"){let l=/^\s+$/.test(n);return{literal:!l,val:l?" ":n}}let o=t[i],r=i;i==="hour"&&(t.hour12!=null?r=t.hour12?"hour12":"hour24":t.hourCycle!=null?t.hourCycle==="h11"||t.hourCycle==="h12"?r="hour12":r="hour24":r=e.hour12?"hour12":"hour24");let a=Rm[r];if(typeof a=="object"&&(a=a[o]),a)return{literal:!1,val:a}}function zm(s){return[`^${s.map(e=>e.regex).reduce((e,i)=>`${e}(${i.source})`,"")}$`,s]}function Vm(s,t,e){let i=s.match(t);if(i){let n={},o=1;for(let r in e)if(ss(e,r)){let a=e[r],l=a.groups?a.groups+1:1;!a.literal&&a.token&&(n[a.token.val[0]]=a.deser(i.slice(o,o+l))),o+=l}return[i,n]}else return[i,{}]}function Wm(s){let t=o=>{switch(o){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}},e=null,i;return D(s.z)||(e=ae.create(s.z)),D(s.Z)||(e||(e=new kt(s.Z)),i=s.Z),D(s.q)||(s.M=(s.q-1)*3+1),D(s.h)||(s.h<12&&s.a===1?s.h+=12:s.h===12&&s.a===0&&(s.h=0)),s.G===0&&s.y&&(s.y=-s.y),D(s.u)||(s.S=Io(s.u)),[Object.keys(s).reduce((o,r)=>{let a=t(r);return a&&(o[a]=s[r]),o},{}),e,i]}var oo=null;function Bm(){return oo||(oo=R.fromMillis(1555555555555)),oo}function Hm(s,t){if(s.literal)return s;let e=ft.macroTokenToFormatOpts(s.val),i=wc(e,t);return i==null||i.includes(void 0)?s:i}function xc(s,t){return Array.prototype.concat(...s.map(e=>Hm(e,t)))}var Bi=class{constructor(t,e){if(this.locale=t,this.format=e,this.tokens=xc(ft.parseFormat(e),t),this.units=this.tokens.map(i=>Fm(i,t)),this.disqualifyingUnit=this.units.find(i=>i.invalidReason),!this.disqualifyingUnit){let[i,n]=zm(this.units);this.regex=RegExp(i,"i"),this.handlers=n}}explainFromTokens(t){if(this.isValid){let[e,i]=Vm(t,this.regex,this.handlers),[n,o,r]=i?Wm(i):[null,null,void 0];if(ss(i,"a")&&ss(i,"H"))throw new oe("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:this.tokens,regex:this.regex,rawMatches:e,matches:i,result:n,zone:o,specificOffset:r}}else return{input:t,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}};function _c(s,t,e){return new Bi(s,e).explainFromTokens(t)}function $m(s,t,e){let{result:i,zone:n,specificOffset:o,invalidReason:r}=_c(s,t,e);return[i,n,o,r]}function wc(s,t){if(!s)return null;let i=ft.create(t,s).dtFormatter(Bm()),n=i.formatToParts(),o=i.resolvedOptions();return n.map(r=>Nm(r,s,o))}var ro="Invalid DateTime",yl=864e13;function Ns(s){return new gt("unsupported zone",`the zone "${s.name}" is not supported`)}function ao(s){return s.weekData===null&&(s.weekData=zi(s.c)),s.weekData}function lo(s){return s.localWeekData===null&&(s.localWeekData=zi(s.c,s.loc.getMinDaysInFirstWeek(),s.loc.getStartOfWeek())),s.localWeekData}function ve(s,t){let e={ts:s.ts,zone:s.zone,c:s.c,o:s.o,loc:s.loc,invalid:s.invalid};return new R({...e,...t,old:e})}function kc(s,t,e){let i=s-t*60*1e3,n=e.offset(i);if(t===n)return[i,t];i-=(n-t)*60*1e3;let o=e.offset(i);return n===o?[i,n]:[s-Math.min(n,o)*60*1e3,Math.max(n,o)]}function Pi(s,t){s+=t*60*1e3;let e=new Date(s);return{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate(),hour:e.getUTCHours(),minute:e.getUTCMinutes(),second:e.getUTCSeconds(),millisecond:e.getUTCMilliseconds()}}function Ii(s,t,e){return kc($i(s),t,e)}function xl(s,t){let e=s.o,i=s.c.year+Math.trunc(t.years),n=s.c.month+Math.trunc(t.months)+Math.trunc(t.quarters)*3,o={...s.c,year:i,month:n,day:Math.min(s.c.day,Vi(i,n))+Math.trunc(t.days)+Math.trunc(t.weeks)*7},r=tt.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),a=$i(o),[l,c]=kc(a,e,s.zone);return r!==0&&(l+=r,c=s.zone.offset(l)),{ts:l,o:c}}function Je(s,t,e,i,n,o){let{setZone:r,zone:a}=e;if(s&&Object.keys(s).length!==0||t){let l=t||a,c=R.fromObject(s,{...e,zone:l,specificOffset:o});return r?c:c.setZone(a)}else return R.invalid(new gt("unparsable",`the input "${n}" can't be parsed as ${i}`))}function Ai(s,t,e=!0){return s.isValid?ft.create(B.create("en-US"),{allowZ:e,forceSimple:!0}).formatDateTimeFromString(s,t):null}function co(s,t,e){let i=s.c.year>9999||s.c.year<0,n="";if(i&&s.c.year>=0&&(n+="+"),n+=J(s.c.year,i?6:4),e==="year")return n;if(t){if(n+="-",n+=J(s.c.month),e==="month")return n;n+="-"}else if(n+=J(s.c.month),e==="month")return n;return n+=J(s.c.day),n}function _l(s,t,e,i,n,o,r){let a=!e||s.c.millisecond!==0||s.c.second!==0,l="";switch(r){case"day":case"month":case"year":break;default:if(l+=J(s.c.hour),r==="hour")break;if(t){if(l+=":",l+=J(s.c.minute),r==="minute")break;a&&(l+=":",l+=J(s.c.second))}else{if(l+=J(s.c.minute),r==="minute")break;a&&(l+=J(s.c.second))}if(r==="second")break;a&&(!i||s.c.millisecond!==0)&&(l+=".",l+=J(s.c.millisecond,3))}return n&&(s.isOffsetFixed&&s.offset===0&&!o?l+="Z":s.o<0?(l+="-",l+=J(Math.trunc(-s.o/60)),l+=":",l+=J(Math.trunc(-s.o%60))):(l+="+",l+=J(Math.trunc(s.o/60)),l+=":",l+=J(Math.trunc(s.o%60)))),o&&(l+="["+s.zone.ianaName+"]"),l}var vc={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},jm={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},Um={ordinal:1,hour:0,minute:0,second:0,millisecond:0},Ei=["year","month","day","hour","minute","second","millisecond"],Ym=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],Zm=["year","ordinal","hour","minute","second","millisecond"];function Li(s){let t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[s.toLowerCase()];if(!t)throw new Fi(s);return t}function wl(s){switch(s.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return Li(s)}}function qm(s){if(zs===void 0&&(zs=Y.now()),s.type!=="iana")return s.offset(zs);let t=s.name,e=Do.get(t);return e===void 0&&(e=s.offset(zs),Do.set(t,e)),e}function kl(s,t){let e=ne(t.zone,Y.defaultZone);if(!e.isValid)return R.invalid(Ns(e));let i=B.fromObject(t),n,o;if(D(s.year))n=Y.now();else{for(let l of Ei)D(s[l])&&(s[l]=vc[l]);let r=Xl(s)||Jl(s);if(r)return R.invalid(r);let a=qm(e);[n,o]=Ii(s,a,e)}return new R({ts:n,zone:e,loc:i,o})}function vl(s,t,e){let i=D(e.round)?!0:e.round,n=D(e.rounding)?"trunc":e.rounding,o=(a,l)=>(a=Eo(a,i||e.calendary?0:2,e.calendary?"round":n),t.loc.clone(e).relFormatter(e).format(a,l)),r=a=>e.calendary?t.hasSame(s,a)?0:t.startOf(a).diff(s.startOf(a),a).get(a):t.diff(s,a).get(a);if(e.unit)return o(r(e.unit),e.unit);for(let a of e.units){let l=r(a);if(Math.abs(l)>=1)return o(l,a)}return o(s>t?-0:0,e.units[e.units.length-1])}function Sl(s){let t={},e;return s.length>0&&typeof s[s.length-1]=="object"?(t=s[s.length-1],e=Array.from(s).slice(0,s.length-1)):e=Array.from(s),[t,e]}var zs,Do=new Map,R=class s{constructor(t){let e=t.zone||Y.defaultZone,i=t.invalid||(Number.isNaN(t.ts)?new gt("invalid input"):null)||(e.isValid?null:Ns(e));this.ts=D(t.ts)?Y.now():t.ts;let n=null,o=null;if(!i)if(t.old&&t.old.ts===this.ts&&t.old.zone.equals(e))[n,o]=[t.old.c,t.old.o];else{let a=re(t.o)&&!t.old?t.o:e.offset(this.ts);n=Pi(this.ts,a),i=Number.isNaN(n.year)?new gt("invalid input"):null,n=i?null:n,o=i?null:a}this._zone=e,this.loc=t.loc||B.create(),this.invalid=i,this.weekData=null,this.localWeekData=null,this.c=n,this.o=o,this.isLuxonDateTime=!0}static now(){return new s({})}static local(){let[t,e]=Sl(arguments),[i,n,o,r,a,l,c]=e;return kl({year:i,month:n,day:o,hour:r,minute:a,second:l,millisecond:c},t)}static utc(){let[t,e]=Sl(arguments),[i,n,o,r,a,l,c]=e;return t.zone=kt.utcInstance,kl({year:i,month:n,day:o,hour:r,minute:a,second:l,millisecond:c},t)}static fromJSDate(t,e={}){let i=Og(t)?t.valueOf():NaN;if(Number.isNaN(i))return s.invalid("invalid input");let n=ne(e.zone,Y.defaultZone);return n.isValid?new s({ts:i,zone:n,loc:B.fromObject(e)}):s.invalid(Ns(n))}static fromMillis(t,e={}){if(re(t))return t<-yl||t>yl?s.invalid("Timestamp out of range"):new s({ts:t,zone:ne(e.zone,Y.defaultZone),loc:B.fromObject(e)});throw new Q(`fromMillis requires a numerical input, but received a ${typeof t} with value ${t}`)}static fromSeconds(t,e={}){if(re(t))return new s({ts:t*1e3,zone:ne(e.zone,Y.defaultZone),loc:B.fromObject(e)});throw new Q("fromSeconds requires a numerical input")}static fromObject(t,e={}){t=t||{};let i=ne(e.zone,Y.defaultZone);if(!i.isValid)return s.invalid(Ns(i));let n=B.fromObject(e),o=Wi(t,wl),{minDaysInFirstWeek:r,startOfWeek:a}=al(o,n),l=Y.now(),c=D(e.specificOffset)?i.offset(l):e.specificOffset,h=!D(o.ordinal),u=!D(o.year),d=!D(o.month)||!D(o.day),f=u||d,g=o.weekYear||o.weekNumber;if((f||h)&&g)throw new oe("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(d&&h)throw new oe("Can't mix ordinal dates with month/day");let m=g||o.weekday&&!f,p,b,y=Pi(l,c);m?(p=Ym,b=jm,y=zi(y,r,a)):h?(p=Zm,b=Um,y=no(y)):(p=Ei,b=vc);let _=!1;for(let C of p){let A=o[C];D(A)?_?o[C]=b[C]:o[C]=y[C]:_=!0}let w=m?vg(o,r,a):h?Sg(o):Xl(o),x=w||Jl(o);if(x)return s.invalid(x);let k=m?ol(o,r,a):h?rl(o):o,[S,M]=Ii(k,c,i),T=new s({ts:S,zone:i,o:M,loc:n});return o.weekday&&f&&t.weekday!==T.weekday?s.invalid("mismatched weekday",`you can't specify both a weekday of ${o.weekday} and a date of ${T.toISO()}`):T.isValid?T:s.invalid(T.invalid)}static fromISO(t,e={}){let[i,n]=mm(t);return Je(i,n,e,"ISO 8601",t)}static fromRFC2822(t,e={}){let[i,n]=pm(t);return Je(i,n,e,"RFC 2822",t)}static fromHTTP(t,e={}){let[i,n]=bm(t);return Je(i,n,e,"HTTP",e)}static fromFormat(t,e,i={}){if(D(t)||D(e))throw new Q("fromFormat requires an input string and a format");let{locale:n=null,numberingSystem:o=null}=i,r=B.fromOpts({locale:n,numberingSystem:o,defaultToEN:!0}),[a,l,c,h]=$m(r,t,e);return h?s.invalid(h):Je(a,l,i,`format ${e}`,t,c)}static fromString(t,e,i={}){return s.fromFormat(t,e,i)}static fromSQL(t,e={}){let[i,n]=Sm(t);return Je(i,n,e,"SQL",t)}static invalid(t,e=null){if(!t)throw new Q("need to specify a reason the DateTime is invalid");let i=t instanceof gt?t:new gt(t,e);if(Y.throwOnInvalid)throw new ho(i);return new s({invalid:i})}static isDateTime(t){return t&&t.isLuxonDateTime||!1}static parseFormatForOpts(t,e={}){let i=wc(t,B.fromObject(e));return i?i.map(n=>n?n.val:null).join(""):null}static expandFormat(t,e={}){return xc(ft.parseFormat(t),B.fromObject(e)).map(n=>n.val).join("")}static resetCache(){zs=void 0,Do.clear()}get(t){return this[t]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?ao(this).weekYear:NaN}get weekNumber(){return this.isValid?ao(this).weekNumber:NaN}get weekday(){return this.isValid?ao(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?lo(this).weekday:NaN}get localWeekNumber(){return this.isValid?lo(this).weekNumber:NaN}get localWeekYear(){return this.isValid?lo(this).weekYear:NaN}get ordinal(){return this.isValid?no(this.c).ordinal:NaN}get monthShort(){return this.isValid?Ke.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Ke.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Ke.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Ke.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];let t=864e5,e=6e4,i=$i(this.c),n=this.zone.offset(i-t),o=this.zone.offset(i+t),r=this.zone.offset(i-n*e),a=this.zone.offset(i-o*e);if(r===a)return[this];let l=i-r*e,c=i-a*e,h=Pi(l,r),u=Pi(c,a);return h.hour===u.hour&&h.minute===u.minute&&h.second===u.second&&h.millisecond===u.millisecond?[ve(this,{ts:l}),ve(this,{ts:c})]:[this]}get isInLeapYear(){return Bs(this.year)}get daysInMonth(){return Vi(this.year,this.month)}get daysInYear(){return this.isValid?Qe(this.year):NaN}get weeksInWeekYear(){return this.isValid?Ws(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?Ws(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(t={}){let{locale:e,numberingSystem:i,calendar:n}=ft.create(this.loc.clone(t),t).resolvedOptions(this);return{locale:e,numberingSystem:i,outputCalendar:n}}toUTC(t=0,e={}){return this.setZone(kt.instance(t),e)}toLocal(){return this.setZone(Y.defaultZone)}setZone(t,{keepLocalTime:e=!1,keepCalendarTime:i=!1}={}){if(t=ne(t,Y.defaultZone),t.equals(this.zone))return this;if(t.isValid){let n=this.ts;if(e||i){let o=t.offset(this.ts),r=this.toObject();[n]=Ii(r,o,t)}return ve(this,{ts:n,zone:t})}else return s.invalid(Ns(t))}reconfigure({locale:t,numberingSystem:e,outputCalendar:i}={}){let n=this.loc.clone({locale:t,numberingSystem:e,outputCalendar:i});return ve(this,{loc:n})}setLocale(t){return this.reconfigure({locale:t})}set(t){if(!this.isValid)return this;let e=Wi(t,wl),{minDaysInFirstWeek:i,startOfWeek:n}=al(e,this.loc),o=!D(e.weekYear)||!D(e.weekNumber)||!D(e.weekday),r=!D(e.ordinal),a=!D(e.year),l=!D(e.month)||!D(e.day),c=a||l,h=e.weekYear||e.weekNumber;if((c||r)&&h)throw new oe("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(l&&r)throw new oe("Can't mix ordinal dates with month/day");let u;o?u=ol({...zi(this.c,i,n),...e},i,n):D(e.ordinal)?(u={...this.toObject(),...e},D(e.day)&&(u.day=Math.min(Vi(u.year,u.month),u.day))):u=rl({...no(this.c),...e});let[d,f]=Ii(u,this.o,this.zone);return ve(this,{ts:d,o:f})}plus(t){if(!this.isValid)return this;let e=tt.fromDurationLike(t);return ve(this,xl(this,e))}minus(t){if(!this.isValid)return this;let e=tt.fromDurationLike(t).negate();return ve(this,xl(this,e))}startOf(t,{useLocaleWeeks:e=!1}={}){if(!this.isValid)return this;let i={},n=tt.normalizeUnit(t);switch(n){case"years":i.month=1;case"quarters":case"months":i.day=1;case"weeks":case"days":i.hour=0;case"hours":i.minute=0;case"minutes":i.second=0;case"seconds":i.millisecond=0;break}if(n==="weeks")if(e){let o=this.loc.getStartOfWeek(),{weekday:r}=this;r=3&&(l+="T"),l+=_l(this,a,e,i,n,o,r),l}toISODate({format:t="extended",precision:e="day"}={}){return this.isValid?co(this,t==="extended",Li(e)):null}toISOWeekDate(){return Ai(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:t=!1,suppressSeconds:e=!1,includeOffset:i=!0,includePrefix:n=!1,extendedZone:o=!1,format:r="extended",precision:a="milliseconds"}={}){return this.isValid?(a=Li(a),(n&&Ei.indexOf(a)>=3?"T":"")+_l(this,r==="extended",e,t,i,o,a)):null}toRFC2822(){return Ai(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return Ai(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?co(this,!0):null}toSQLTime({includeOffset:t=!0,includeZone:e=!1,includeOffsetSpace:i=!0}={}){let n="HH:mm:ss.SSS";return(e||t)&&(i&&(n+=" "),e?n+="z":t&&(n+="ZZ")),Ai(this,n,!0)}toSQL(t={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(t)}`:null}toString(){return this.isValid?this.toISO():ro}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(t={}){if(!this.isValid)return{};let e={...this.c};return t.includeConfig&&(e.outputCalendar=this.outputCalendar,e.numberingSystem=this.loc.numberingSystem,e.locale=this.loc.locale),e}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(t,e="milliseconds",i={}){if(!this.isValid||!t.isValid)return tt.invalid("created by diffing an invalid DateTime");let n={locale:this.locale,numberingSystem:this.numberingSystem,...i},o=Tg(e).map(tt.normalizeUnit),r=t.valueOf()>this.valueOf(),a=r?this:t,l=r?t:this,c=Pm(a,l,o,n);return r?c.negate():c}diffNow(t="milliseconds",e={}){return this.diff(s.now(),t,e)}until(t){return this.isValid?es.fromDateTimes(this,t):this}hasSame(t,e,i){if(!this.isValid)return!1;let n=t.valueOf(),o=this.setZone(t.zone,{keepLocalTime:!0});return o.startOf(e,i)<=n&&n<=o.endOf(e,i)}equals(t){return this.isValid&&t.isValid&&this.valueOf()===t.valueOf()&&this.zone.equals(t.zone)&&this.loc.equals(t.loc)}toRelative(t={}){if(!this.isValid)return null;let e=t.base||s.fromObject({},{zone:this.zone}),i=t.padding?thise.valueOf(),Math.min)}static max(...t){if(!t.every(s.isDateTime))throw new Q("max requires all arguments be DateTimes");return ll(t,e=>e.valueOf(),Math.max)}static fromFormatExplain(t,e,i={}){let{locale:n=null,numberingSystem:o=null}=i,r=B.fromOpts({locale:n,numberingSystem:o,defaultToEN:!0});return _c(r,t,e)}static fromStringExplain(t,e,i={}){return s.fromFormatExplain(t,e,i)}static buildFormatParser(t,e={}){let{locale:i=null,numberingSystem:n=null}=e,o=B.fromOpts({locale:i,numberingSystem:n,defaultToEN:!0});return new Bi(o,t)}static fromFormatParser(t,e,i={}){if(D(t)||D(e))throw new Q("fromFormatParser requires an input string and a format parser");let{locale:n=null,numberingSystem:o=null}=i,r=B.fromOpts({locale:n,numberingSystem:o,defaultToEN:!0});if(!r.equals(e.locale))throw new Q(`fromFormatParser called with a locale of ${r}, but the format parser was created for ${e.locale}`);let{result:a,zone:l,specificOffset:c,invalidReason:h}=e.explainFromTokens(t);return h?s.invalid(h):Je(a,l,i,`format ${e.format}`,t,c)}static get DATE_SHORT(){return Ri}static get DATE_MED(){return Ml}static get DATE_MED_WITH_WEEKDAY(){return ng}static get DATE_FULL(){return Ol}static get DATE_HUGE(){return Tl}static get TIME_SIMPLE(){return Dl}static get TIME_WITH_SECONDS(){return Cl}static get TIME_WITH_SHORT_OFFSET(){return Pl}static get TIME_WITH_LONG_OFFSET(){return Al}static get TIME_24_SIMPLE(){return Il}static get TIME_24_WITH_SECONDS(){return El}static get TIME_24_WITH_SHORT_OFFSET(){return Ll}static get TIME_24_WITH_LONG_OFFSET(){return Fl}static get DATETIME_SHORT(){return Rl}static get DATETIME_SHORT_WITH_SECONDS(){return Nl}static get DATETIME_MED(){return zl}static get DATETIME_MED_WITH_SECONDS(){return Vl}static get DATETIME_MED_WITH_WEEKDAY(){return og}static get DATETIME_FULL(){return Wl}static get DATETIME_FULL_WITH_SECONDS(){return Bl}static get DATETIME_HUGE(){return Hl}static get DATETIME_HUGE_WITH_SECONDS(){return $l}};function Fs(s){if(R.isDateTime(s))return s;if(s&&s.valueOf&&re(s.valueOf()))return R.fromJSDate(s);if(s&&typeof s=="object")return R.fromObject(s);throw new Q(`Unknown datetime argument: ${s}, of type ${typeof s}`)}var Gm={datetime:R.DATETIME_MED_WITH_SECONDS,millisecond:"h:mm:ss.SSS a",second:R.TIME_WITH_SECONDS,minute:R.TIME_SIMPLE,hour:{hour:"numeric"},day:{day:"numeric",month:"short"},week:"DD",month:{month:"short",year:"numeric"},quarter:"'Q'q - yyyy",year:{year:"numeric"}};to._date.override({_id:"luxon",_create:function(s){return R.fromMillis(s,this.options)},init(s){this.options.locale||(this.options.locale=s.locale)},formats:function(){return Gm},parse:function(s,t){let e=this.options,i=typeof s;return s===null||i==="undefined"?null:(i==="number"?s=this._create(s):i==="string"?typeof t=="string"?s=R.fromFormat(s,t,e):s=R.fromISO(s,e):s instanceof Date?s=R.fromJSDate(s,e):i==="object"&&!(s instanceof R)&&(s=R.fromObject(s,e)),s.isValid?s.valueOf():null)},format:function(s,t){let e=this._create(s);return typeof t=="string"?e.toFormat(t):e.toLocaleString(t)},add:function(s,t,e){let i={};return i[e]=t,this._create(s).plus(i).valueOf()},diff:function(s,t,e){return this._create(s).diff(this._create(t)).as(e).valueOf()},startOf:function(s,t,e){if(t==="isoWeek"){e=Math.trunc(Math.min(Math.max(0,e),6));let i=this._create(s);return i.minus({days:(i.weekday-e+7)%7}).startOf("day").valueOf()}return t?this._create(s).startOf(t).valueOf():s},endOf:function(s,t){return this._create(s).endOf(t).valueOf()}});window.filamentChartJsGlobalPlugins&&Array.isArray(window.filamentChartJsGlobalPlugins)&&window.filamentChartJsGlobalPlugins.length>0&&Mt.register(...window.filamentChartJsGlobalPlugins);function Xm({cachedData:s,maxHeight:t,options:e,type:i}){return{userPointBackgroundColor:e?.pointBackgroundColor,userXGridColor:e?.scales?.x?.grid?.color,userYGridColor:e?.scales?.y?.grid?.color,userRadialGridColor:e?.scales?.r?.grid?.color,userRadialTicksColor:e?.scales?.r?.ticks?.color,init(){this.initChart(),this.$wire.$on("updateChartData",({data:n})=>{let o=this.getChart();o&&(s=n,o.data=n,o.update("resize"))}),Alpine.effect(()=>{Alpine.store("theme"),this.$nextTick(()=>{let n=this.getChart();n&&(n.destroy(),this.initChart())})}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Alpine.store("theme")==="system"&&this.$nextTick(()=>{let n=this.getChart();n&&(n.destroy(),this.initChart())})}),this.resizeObserver=new ResizeObserver(Alpine.debounce(()=>{let n=this.getChart();n&&(n.destroy(),this.initChart())},250)),this.resizeObserver.observe(this.$el)},initChart(n=null){var a,l,c,h,u,d,f,g,m,p,b,y,_,w,x,k;if(!this.$refs.canvas||!this.$refs.backgroundColorElement||!this.$refs.borderColorElement||!this.$refs.textColorElement||!this.$refs.gridColorElement)return;Mt.defaults.animation.duration=0,Mt.defaults.backgroundColor=getComputedStyle(this.$refs.backgroundColorElement).color;let o=getComputedStyle(this.$refs.borderColorElement).color;Mt.defaults.borderColor=o,Mt.defaults.color=getComputedStyle(this.$refs.textColorElement).color,Mt.defaults.font.family=getComputedStyle(this.$el).fontFamily,Mt.defaults.plugins.legend.labels.boxWidth=12,Mt.defaults.plugins.legend.position="bottom";let r=getComputedStyle(this.$refs.gridColorElement).color;if(e??(e={}),e.borderWidth??(e.borderWidth=2),e.maintainAspectRatio??(e.maintainAspectRatio=!!t),e.pointBackgroundColor=this.userPointBackgroundColor??o,e.pointHitRadius??(e.pointHitRadius=4),e.pointRadius??(e.pointRadius=2),e.scales??(e.scales={}),(a=e.scales).x??(a.x={}),(l=e.scales.x).border??(l.border={}),(c=e.scales.x.border).display??(c.display=!1),(h=e.scales.x).grid??(h.grid={}),e.scales.x.grid.color=this.userXGridColor??r,(u=e.scales.x.grid).display??(u.display=!1),(d=e.scales).y??(d.y={}),(f=e.scales.y).border??(f.border={}),(g=e.scales.y.border).display??(g.display=!1),(m=e.scales.y).grid??(m.grid={}),e.scales.y.grid.color=this.userYGridColor??r,["doughnut","pie","polarArea"].includes(i)&&((p=e.scales.x).display??(p.display=!1),(b=e.scales.y).display??(b.display=!1),(y=e.scales.y.grid).display??(y.display=!1)),i==="polarArea"){let S=getComputedStyle(this.$refs.textColorElement).color;(_=e.scales).r??(_.r={}),(w=e.scales.r).grid??(w.grid={}),e.scales.r.grid.color=this.userRadialGridColor??r,(x=e.scales.r).ticks??(x.ticks={}),e.scales.r.ticks.color=this.userRadialTicksColor??S,(k=e.scales.r.ticks).backdropColor??(k.backdropColor="transparent")}return new Mt(this.$refs.canvas,{type:i,data:n??s,options:e,plugins:window.filamentChartJsPlugins??[]})},getChart(){return this.$refs.canvas?Mt.getChart(this.$refs.canvas):null},destroy(){this.resizeObserver&&this.resizeObserver.disconnect(),this.getChart()?.destroy()}}}export{Xm as default}; /*! Bundled license information: @kurkle/color/dist/color.esm.js: (*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme * (c) 2024 Jukka Kurkela * Released under the MIT License *) chart.js/dist/chunks/helpers.dataset.js: chart.js/dist/chart.js: (*! * Chart.js v4.5.1 * https://www.chartjs.org * (c) 2025 Chart.js Contributors * Released under the MIT License *) chartjs-adapter-luxon/dist/chartjs-adapter-luxon.esm.js: (*! * chartjs-adapter-luxon v1.3.1 * https://www.chartjs.org * (c) 2023 chartjs-adapter-luxon Contributors * Released under the MIT license *) */ ================================================ FILE: public/js/filament/widgets/components/stats-overview/stat/chart.js ================================================ var Jo=Object.defineProperty;var Zo=(i,t,e)=>t in i?Jo(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var M=(i,t,e)=>Zo(i,typeof t!="symbol"?t+"":t,e);function ve(i){return i+.5|0}var wt=(i,t,e)=>Math.max(Math.min(i,e),t);function _e(i){return wt(ve(i*2.55),0,255)}function St(i){return wt(ve(i*255),0,255)}function mt(i){return wt(ve(i/2.55)/100,0,1)}function zs(i){return wt(ve(i*100),0,100)}var nt={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ai=[..."0123456789ABCDEF"],Qo=i=>Ai[i&15],ta=i=>Ai[(i&240)>>4]+Ai[i&15],Ue=i=>(i&240)>>4===(i&15),ea=i=>Ue(i.r)&&Ue(i.g)&&Ue(i.b)&&Ue(i.a);function ia(i){var t=i.length,e;return i[0]==="#"&&(t===4||t===5?e={r:255&nt[i[1]]*17,g:255&nt[i[2]]*17,b:255&nt[i[3]]*17,a:t===5?nt[i[4]]*17:255}:(t===7||t===9)&&(e={r:nt[i[1]]<<4|nt[i[2]],g:nt[i[3]]<<4|nt[i[4]],b:nt[i[5]]<<4|nt[i[6]],a:t===9?nt[i[7]]<<4|nt[i[8]]:255})),e}var sa=(i,t)=>i<255?t(i):"";function na(i){var t=ea(i)?Qo:ta;return i?"#"+t(i.r)+t(i.g)+t(i.b)+sa(i.a,t):void 0}var oa=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Ns(i,t,e){let s=t*Math.min(e,1-e),n=(o,a=(o+i/30)%12)=>e-s*Math.max(Math.min(a-3,9-a,1),-1);return[n(0),n(8),n(4)]}function aa(i,t,e){let s=(n,o=(n+i/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[s(5),s(3),s(1)]}function ra(i,t,e){let s=Ns(i,1,.5),n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)s[n]*=1-t-e,s[n]+=t;return s}function la(i,t,e,s,n){return i===n?(t-e)/s+(t.5?h/(2-o-a):h/(o+a),l=la(e,s,n,h,o),l=l*60+.5),[l|0,c||0,r]}function Li(i,t,e,s){return(Array.isArray(t)?i(t[0],t[1],t[2]):i(t,e,s)).map(St)}function Ri(i,t,e){return Li(Ns,i,t,e)}function ca(i,t,e){return Li(ra,i,t,e)}function ha(i,t,e){return Li(aa,i,t,e)}function Hs(i){return(i%360+360)%360}function da(i){let t=oa.exec(i),e=255,s;if(!t)return;t[5]!==s&&(e=t[6]?_e(+t[5]):St(+t[5]));let n=Hs(+t[2]),o=+t[3]/100,a=+t[4]/100;return t[1]==="hwb"?s=ca(n,o,a):t[1]==="hsv"?s=ha(n,o,a):s=Ri(n,o,a),{r:s[0],g:s[1],b:s[2],a:e}}function ua(i,t){var e=Ti(i);e[0]=Hs(e[0]+t),e=Ri(e),i.r=e[0],i.g=e[1],i.b=e[2]}function fa(i){if(!i)return;let t=Ti(i),e=t[0],s=zs(t[1]),n=zs(t[2]);return i.a<255?`hsla(${e}, ${s}%, ${n}%, ${mt(i.a)})`:`hsl(${e}, ${s}%, ${n}%)`}var Bs={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Vs={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function ga(){let i={},t=Object.keys(Vs),e=Object.keys(Bs),s,n,o,a,r;for(s=0;s>16&255,o>>8&255,o&255]}return i}var Xe;function pa(i){Xe||(Xe=ga(),Xe.transparent=[0,0,0,0]);let t=Xe[i.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ma=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function ba(i){let t=ma.exec(i),e=255,s,n,o;if(t){if(t[7]!==s){let a=+t[7];e=t[8]?_e(a):wt(a*255,0,255)}return s=+t[1],n=+t[3],o=+t[5],s=255&(t[2]?_e(s):wt(s,0,255)),n=255&(t[4]?_e(n):wt(n,0,255)),o=255&(t[6]?_e(o):wt(o,0,255)),{r:s,g:n,b:o,a:e}}}function xa(i){return i&&(i.a<255?`rgba(${i.r}, ${i.g}, ${i.b}, ${mt(i.a)})`:`rgb(${i.r}, ${i.g}, ${i.b})`)}var Ci=i=>i<=.0031308?i*12.92:Math.pow(i,1/2.4)*1.055-.055,Gt=i=>i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4);function _a(i,t,e){let s=Gt(mt(i.r)),n=Gt(mt(i.g)),o=Gt(mt(i.b));return{r:St(Ci(s+e*(Gt(mt(t.r))-s))),g:St(Ci(n+e*(Gt(mt(t.g))-n))),b:St(Ci(o+e*(Gt(mt(t.b))-o))),a:i.a+e*(t.a-i.a)}}function Ke(i,t,e){if(i){let s=Ti(i);s[t]=Math.max(0,Math.min(s[t]+s[t]*e,t===0?360:1)),s=Ri(s),i.r=s[0],i.g=s[1],i.b=s[2]}}function js(i,t){return i&&Object.assign(t||{},i)}function Ws(i){var t={r:0,g:0,b:0,a:255};return Array.isArray(i)?i.length>=3&&(t={r:i[0],g:i[1],b:i[2],a:255},i.length>3&&(t.a=St(i[3]))):(t=js(i,{r:0,g:0,b:0,a:1}),t.a=St(t.a)),t}function ya(i){return i.charAt(0)==="r"?ba(i):da(i)}var ye=class i{constructor(t){if(t instanceof i)return t;let e=typeof t,s;e==="object"?s=Ws(t):e==="string"&&(s=ia(t)||pa(t)||ya(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=js(this._rgb);return t&&(t.a=mt(t.a)),t}set rgb(t){this._rgb=Ws(t)}rgbString(){return this._valid?xa(this._rgb):void 0}hexString(){return this._valid?na(this._rgb):void 0}hslString(){return this._valid?fa(this._rgb):void 0}mix(t,e){if(t){let s=this.rgb,n=t.rgb,o,a=e===o?.5:e,r=2*a-1,l=s.a-n.a,c=((r*l===-1?r:(r+l)/(1+r*l))+1)/2;o=1-c,s.r=255&c*s.r+o*n.r+.5,s.g=255&c*s.g+o*n.g+.5,s.b=255&c*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=_a(this._rgb,t._rgb,e)),this}clone(){return new i(this.rgb)}alpha(t){return this._rgb.a=St(t),this}clearer(t){let e=this._rgb;return e.a*=1-t,this}greyscale(){let t=this._rgb,e=ve(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){let e=this._rgb;return e.a*=1+t,this}negate(){let t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Ke(this._rgb,2,t),this}darken(t){return Ke(this._rgb,2,-t),this}saturate(t){return Ke(this._rgb,1,t),this}desaturate(t){return Ke(this._rgb,1,-t),this}rotate(t){return ua(this._rgb,t),this}};function dt(){}var tn=(()=>{let i=0;return()=>i++})();function A(i){return i==null}function z(i){if(Array.isArray&&Array.isArray(i))return!0;let t=Object.prototype.toString.call(i);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function T(i){return i!==null&&Object.prototype.toString.call(i)==="[object Object]"}function N(i){return(typeof i=="number"||i instanceof Number)&&isFinite(+i)}function Z(i,t){return N(i)?i:t}function D(i,t){return typeof i>"u"?t:i}var en=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100:+i/t,zi=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100*t:+i;function F(i,t,e){if(i&&typeof i.call=="function")return i.apply(e,t)}function E(i,t,e,s){let n,o,a;if(z(i))if(o=i.length,s)for(n=o-1;n>=0;n--)t.call(e,i[n],n);else for(n=0;ni,x:i=>i.x,y:i=>i.y};function ka(i){let t=i.split("."),e=[],s="";for(let n of t)s+=n,s.endsWith("\\")?s=s.slice(0,-1)+".":(e.push(s),s="");return e}function wa(i){let t=ka(i);return e=>{for(let s of t){if(s==="")break;e=e&&e[s]}return e}}function _t(i,t){return($s[t]||($s[t]=wa(t)))(i)}function ii(i){return i.charAt(0).toUpperCase()+i.slice(1)}var ee=i=>typeof i<"u",bt=i=>typeof i=="function",Bi=(i,t)=>{if(i.size!==t.size)return!1;for(let e of i)if(!t.has(e))return!1;return!0};function nn(i){return i.type==="mouseup"||i.type==="click"||i.type==="contextmenu"}var R=Math.PI,B=2*R,Sa=B+R,Qe=Number.POSITIVE_INFINITY,Pa=R/180,H=R/2,Ft=R/4,Ys=R*2/3,xt=Math.log10,lt=Math.sign;function ie(i,t,e){return Math.abs(i-t)n-o).pop(),t}function Da(i){return typeof i=="symbol"||typeof i=="object"&&i!==null&&!(Symbol.toPrimitive in i||"toString"in i||"valueOf"in i)}function Vt(i){return!Da(i)&&!isNaN(parseFloat(i))&&isFinite(i)}function an(i,t){let e=Math.round(i);return e-t<=i&&e+t>=i}function Wi(i,t,e){let s,n,o;for(s=0,n=i.length;sl&&c=Math.min(t,e)-s&&i<=Math.max(t,e)+s}function ni(i,t,e){e=e||(a=>i[a]1;)o=n+s>>1,e(o)?n=o:s=o;return{lo:n,hi:s}}var ct=(i,t,e,s)=>ni(i,e,s?n=>{let o=i[n][t];return oi[n][t]ni(i,e,s=>i[s][t]>=e);function cn(i,t,e){let s=0,n=i.length;for(;ss&&i[n-1]>e;)n--;return s>0||n{let s="_onData"+ii(e),n=i[e];Object.defineProperty(i,e,{configurable:!0,enumerable:!1,value(...o){let a=n.apply(this,o);return i._chartjs.listeners.forEach(r=>{typeof r[s]=="function"&&r[s](...o)}),a}})})}function ji(i,t){let e=i._chartjs;if(!e)return;let s=e.listeners,n=s.indexOf(t);n!==-1&&s.splice(n,1),!(s.length>0)&&(hn.forEach(o=>{delete i[o]}),delete i._chartjs)}function $i(i){let t=new Set(i);return t.size===i.length?i:Array.from(t)}var Yi=(function(){return typeof window>"u"?function(i){return i()}:window.requestAnimationFrame})();function Ui(i,t){let e=[],s=!1;return function(...n){e=n,s||(s=!0,Yi.call(window,()=>{s=!1,i.apply(t,e)}))}}function un(i,t){let e;return function(...s){return t?(clearTimeout(e),e=setTimeout(i,t,s)):i.apply(this,s),t}}var oi=i=>i==="start"?"left":i==="end"?"right":"center",K=(i,t,e)=>i==="start"?t:i==="end"?e:(t+e)/2,fn=(i,t,e,s)=>i===(s?"left":"right")?e:i==="center"?(t+e)/2:t;function Xi(i,t,e){let s=t.length,n=0,o=s;if(i._sorted){let{iScale:a,vScale:r,_parsed:l}=i,c=i.dataset&&i.dataset.options?i.dataset.options.spanGaps:null,h=a.axis,{min:d,max:u,minDefined:f,maxDefined:g}=a.getUserBounds();if(f){if(n=Math.min(ct(l,h,d).lo,e?s:ct(t,h,a.getPixelForValue(d)).lo),c){let p=l.slice(0,n+1).reverse().findIndex(m=>!A(m[r.axis]));n-=Math.max(0,p)}n=Y(n,0,s-1)}if(g){let p=Math.max(ct(l,a.axis,u,!0).hi+1,e?0:ct(t,h,a.getPixelForValue(u),!0).hi+1);if(c){let m=l.slice(p-1).findIndex(b=>!A(b[r.axis]));p+=Math.max(0,m)}o=Y(p,n,s)-n}else o=s-n}return{start:n,count:o}}function Ki(i){let{xScale:t,yScale:e,_scaleRanges:s}=i,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!s)return i._scaleRanges=n,!0;let o=s.xmin!==t.min||s.xmax!==t.max||s.ymin!==e.min||s.ymax!==e.max;return Object.assign(s,n),o}var qe=i=>i===0||i===1,Us=(i,t,e)=>-(Math.pow(2,10*(i-=1))*Math.sin((i-t)*B/e)),Xs=(i,t,e)=>Math.pow(2,-10*i)*Math.sin((i-t)*B/e)+1,Jt={linear:i=>i,easeInQuad:i=>i*i,easeOutQuad:i=>-i*(i-2),easeInOutQuad:i=>(i/=.5)<1?.5*i*i:-.5*(--i*(i-2)-1),easeInCubic:i=>i*i*i,easeOutCubic:i=>(i-=1)*i*i+1,easeInOutCubic:i=>(i/=.5)<1?.5*i*i*i:.5*((i-=2)*i*i+2),easeInQuart:i=>i*i*i*i,easeOutQuart:i=>-((i-=1)*i*i*i-1),easeInOutQuart:i=>(i/=.5)<1?.5*i*i*i*i:-.5*((i-=2)*i*i*i-2),easeInQuint:i=>i*i*i*i*i,easeOutQuint:i=>(i-=1)*i*i*i*i+1,easeInOutQuint:i=>(i/=.5)<1?.5*i*i*i*i*i:.5*((i-=2)*i*i*i*i+2),easeInSine:i=>-Math.cos(i*H)+1,easeOutSine:i=>Math.sin(i*H),easeInOutSine:i=>-.5*(Math.cos(R*i)-1),easeInExpo:i=>i===0?0:Math.pow(2,10*(i-1)),easeOutExpo:i=>i===1?1:-Math.pow(2,-10*i)+1,easeInOutExpo:i=>qe(i)?i:i<.5?.5*Math.pow(2,10*(i*2-1)):.5*(-Math.pow(2,-10*(i*2-1))+2),easeInCirc:i=>i>=1?i:-(Math.sqrt(1-i*i)-1),easeOutCirc:i=>Math.sqrt(1-(i-=1)*i),easeInOutCirc:i=>(i/=.5)<1?-.5*(Math.sqrt(1-i*i)-1):.5*(Math.sqrt(1-(i-=2)*i)+1),easeInElastic:i=>qe(i)?i:Us(i,.075,.3),easeOutElastic:i=>qe(i)?i:Xs(i,.075,.3),easeInOutElastic(i){return qe(i)?i:i<.5?.5*Us(i*2,.1125,.45):.5+.5*Xs(i*2-1,.1125,.45)},easeInBack(i){return i*i*((1.70158+1)*i-1.70158)},easeOutBack(i){return(i-=1)*i*((1.70158+1)*i+1.70158)+1},easeInOutBack(i){let t=1.70158;return(i/=.5)<1?.5*(i*i*(((t*=1.525)+1)*i-t)):.5*((i-=2)*i*(((t*=1.525)+1)*i+t)+2)},easeInBounce:i=>1-Jt.easeOutBounce(1-i),easeOutBounce(i){return i<1/2.75?7.5625*i*i:i<2/2.75?7.5625*(i-=1.5/2.75)*i+.75:i<2.5/2.75?7.5625*(i-=2.25/2.75)*i+.9375:7.5625*(i-=2.625/2.75)*i+.984375},easeInOutBounce:i=>i<.5?Jt.easeInBounce(i*2)*.5:Jt.easeOutBounce(i*2-1)*.5+.5};function qi(i){if(i&&typeof i=="object"){let t=i.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function Gi(i){return qi(i)?i:new ye(i)}function Ei(i){return qi(i)?i:new ye(i).saturate(.5).darken(.1).hexString()}var Ca=["x","y","borderWidth","radius","tension"],Aa=["color","borderColor","backgroundColor"];function Ta(i){i.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),i.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>t!=="onProgress"&&t!=="onComplete"&&t!=="fn"}),i.set("animations",{colors:{type:"color",properties:Aa},numbers:{type:"number",properties:Ca}}),i.describe("animations",{_fallback:"animation"}),i.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>t|0}}}})}function La(i){i.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Ks=new Map;function Ra(i,t){t=t||{};let e=i+JSON.stringify(t),s=Ks.get(e);return s||(s=new Intl.NumberFormat(i,t),Ks.set(e,s)),s}function ne(i,t,e){return Ra(t,e).format(i)}var gn={values(i){return z(i)?i:""+i},numeric(i,t,e){if(i===0)return"0";let s=this.chart.options.locale,n,o=i;if(e.length>1){let c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),o=Ea(i,e)}let a=xt(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(i,s,l)},logarithmic(i,t,e){if(i===0)return"0";let s=e[t].significand||i/Math.pow(10,Math.floor(xt(i)));return[1,2,3,5,10,15].includes(s)||t>.8*e.length?gn.numeric.call(this,i,t,e):""}};function Ea(i,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&i!==Math.floor(i)&&(e=i-Math.floor(i)),e}var Se={formatters:gn};function Ia(i){i.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Se.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),i.route("scale.ticks","color","","color"),i.route("scale.grid","color","","borderColor"),i.route("scale.border","color","","borderColor"),i.route("scale.title","color","","color"),i.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&t!=="callback"&&t!=="parser",_indexable:t=>t!=="borderDash"&&t!=="tickBorderDash"&&t!=="dash"}),i.describe("scales",{_fallback:"scale"}),i.describe("scale.ticks",{_scriptable:t=>t!=="backdropPadding"&&t!=="callback",_indexable:t=>t!=="backdropPadding"})}var Ot=Object.create(null),ai=Object.create(null);function Me(i,t){if(!t)return i;let e=t.split(".");for(let s=0,n=e.length;ss.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(s,n)=>Ei(n.backgroundColor),this.hoverBorderColor=(s,n)=>Ei(n.borderColor),this.hoverColor=(s,n)=>Ei(n.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Ii(this,t,e)}get(t){return Me(this,t)}describe(t,e){return Ii(ai,t,e)}override(t,e){return Ii(Ot,t,e)}route(t,e,s,n){let o=Me(this,t),a=Me(this,s),r="_"+e;Object.defineProperties(o,{[r]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){let l=this[r],c=a[n];return T(l)?Object.assign({},c,l):D(l,c)},set(l){this[r]=l}}})}apply(t){t.forEach(e=>e(this))}},V=new Fi({_scriptable:i=>!i.startsWith("on"),_indexable:i=>i!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[Ta,La,Ia]);function Fa(i){return!i||A(i.size)||A(i.family)?null:(i.style?i.style+" ":"")+(i.weight?i.weight+" ":"")+i.size+"px "+i.family}function ke(i,t,e,s,n){let o=t[n];return o||(o=t[n]=i.measureText(n).width,e.push(n)),o>s&&(s=o),s}function pn(i,t,e,s){s=s||{};let n=s.data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==t&&(n=s.data={},o=s.garbageCollect=[],s.font=t),i.save(),i.font=t;let a=0,r=e.length,l,c,h,d,u;for(l=0;le.length){for(l=0;l0&&i.stroke()}}function ht(i,t,e){return e=e||.5,!t||i&&i.x>t.left-e&&i.xt.top-e&&i.y0&&o.strokeColor!=="",l,c;for(i.save(),i.font=n.string,za(i,o),l=0;l+i||0;function li(i,t){let e={},s=T(t),n=s?Object.keys(t):t,o=T(i)?s?a=>D(i[a],i[t[a]]):a=>i[a]:()=>i;for(let a of n)e[a]=ja(o(a));return e}function Qi(i){return li(i,{top:"y",right:"x",bottom:"y",left:"x"})}function Tt(i){return li(i,["topLeft","topRight","bottomLeft","bottomRight"])}function q(i){let t=Qi(i);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function $(i,t){i=i||{},t=t||V.font;let e=D(i.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let s=D(i.style,t.style);s&&!(""+s).match(Na)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);let n={family:D(i.family,t.family),lineHeight:Ha(D(i.lineHeight,t.lineHeight),e),size:e,style:s,weight:D(i.weight,t.weight),string:""};return n.string=Fa(n),n}function ae(i,t,e,s){let n=!0,o,a,r;for(o=0,a=i.length;oe&&r===0?0:r+l;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function yt(i,t){return Object.assign(Object.create(i),t)}function ci(i,t=[""],e,s,n=()=>i[0]){let o=e||i;typeof s>"u"&&(s=vn("_fallback",i));let a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:i,_rootScopes:o,_fallback:s,_getTarget:n,override:r=>ci([r,...i],t,o,s)};return new Proxy(a,{deleteProperty(r,l){return delete r[l],delete r._keys,delete i[0][l],!0},get(r,l){return _n(r,l,()=>Ja(l,t,i,r))},getOwnPropertyDescriptor(r,l){return Reflect.getOwnPropertyDescriptor(r._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(i[0])},has(r,l){return Gs(r).includes(l)},ownKeys(r){return Gs(r)},set(r,l,c){let h=r._storage||(r._storage=n());return r[l]=h[l]=c,delete r._keys,!0}})}function Bt(i,t,e,s){let n={_cacheable:!1,_proxy:i,_context:t,_subProxy:e,_stack:new Set,_descriptors:ts(i,s),setContext:o=>Bt(i,o,e,s),override:o=>Bt(i.override(o),t,e,s)};return new Proxy(n,{deleteProperty(o,a){return delete o[a],delete i[a],!0},get(o,a,r){return _n(o,a,()=>Ya(o,a,r))},getOwnPropertyDescriptor(o,a){return o._descriptors.allKeys?Reflect.has(i,a)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(i,a)},getPrototypeOf(){return Reflect.getPrototypeOf(i)},has(o,a){return Reflect.has(i,a)},ownKeys(){return Reflect.ownKeys(i)},set(o,a,r){return i[a]=r,delete o[a],!0}})}function ts(i,t={scriptable:!0,indexable:!0}){let{_scriptable:e=t.scriptable,_indexable:s=t.indexable,_allKeys:n=t.allKeys}=i;return{allKeys:n,scriptable:e,indexable:s,isScriptable:bt(e)?e:()=>e,isIndexable:bt(s)?s:()=>s}}var $a=(i,t)=>i?i+ii(t):t,es=(i,t)=>T(t)&&i!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function _n(i,t,e){if(Object.prototype.hasOwnProperty.call(i,t)||t==="constructor")return i[t];let s=e();return i[t]=s,s}function Ya(i,t,e){let{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=i,r=s[t];return bt(r)&&a.isScriptable(t)&&(r=Ua(t,r,i,e)),z(r)&&r.length&&(r=Xa(t,r,i,a.isIndexable)),es(t,r)&&(r=Bt(r,n,o&&o[t],a)),r}function Ua(i,t,e,s){let{_proxy:n,_context:o,_subProxy:a,_stack:r}=e;if(r.has(i))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+i);r.add(i);let l=t(o,a||s);return r.delete(i),es(i,l)&&(l=is(n._scopes,n,i,l)),l}function Xa(i,t,e,s){let{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=e;if(typeof o.index<"u"&&s(i))return t[o.index%t.length];if(T(t[0])){let l=t,c=n._scopes.filter(h=>h!==l);t=[];for(let h of l){let d=is(c,n,i,h);t.push(Bt(d,o,a&&a[i],r))}}return t}function yn(i,t,e){return bt(i)?i(t,e):i}var Ka=(i,t)=>i===!0?t:typeof i=="string"?_t(t,i):void 0;function qa(i,t,e,s,n){for(let o of t){let a=Ka(e,o);if(a){i.add(a);let r=yn(a._fallback,e,n);if(typeof r<"u"&&r!==e&&r!==s)return r}else if(a===!1&&typeof s<"u"&&e!==s)return null}return!1}function is(i,t,e,s){let n=t._rootScopes,o=yn(t._fallback,e,s),a=[...i,...n],r=new Set;r.add(s);let l=qs(r,a,e,o||e,s);return l===null||typeof o<"u"&&o!==e&&(l=qs(r,a,o,l,s),l===null)?!1:ci(Array.from(r),[""],n,o,()=>Ga(t,e,s))}function qs(i,t,e,s,n){for(;e;)e=qa(i,t,e,s,n);return e}function Ga(i,t,e){let s=i._getTarget();t in s||(s[t]={});let n=s[t];return z(n)&&T(e)?e:n||{}}function Ja(i,t,e,s){let n;for(let o of t)if(n=vn($a(o,i),e),typeof n<"u")return es(i,n)?is(e,s,i,n):n}function vn(i,t){for(let e of t){if(!e)continue;let s=e[i];if(typeof s<"u")return s}}function Gs(i){let t=i._keys;return t||(t=i._keys=Za(i._scopes)),t}function Za(i){let t=new Set;for(let e of i)for(let s of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(s);return Array.from(t)}function ss(i,t,e,s){let{iScale:n}=i,{key:o="r"}=this._parsing,a=new Array(s),r,l,c,h;for(r=0,l=s;rti==="x"?"y":"x";function tr(i,t,e,s){let n=i.skip?t:i,o=t,a=e.skip?t:e,r=ti(o,n),l=ti(a,o),c=r/(r+l),h=l/(r+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;let d=s*c,u=s*h;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function er(i,t,e){let s=i.length,n,o,a,r,l,c=Qt(i,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")sr(i,n);else{let c=s?i[i.length-1]:i[0];for(o=0,a=i.length;oi.ownerDocument.defaultView.getComputedStyle(i,null);function or(i,t){return ui(i).getPropertyValue(t)}var ar=["top","right","bottom","left"];function zt(i,t,e){let s={};e=e?"-"+e:"";for(let n=0;n<4;n++){let o=ar[n];s[o]=parseFloat(i[t+"-"+o+e])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}var rr=(i,t,e)=>(i>0||t>0)&&(!e||!e.shadowRoot);function lr(i,t){let e=i.touches,s=e&&e.length?e[0]:i,{offsetX:n,offsetY:o}=s,a=!1,r,l;if(rr(n,o,i.target))r=n,l=o;else{let c=t.getBoundingClientRect();r=s.clientX-c.left,l=s.clientY-c.top,a=!0}return{x:r,y:l,box:a}}function Lt(i,t){if("native"in i)return i;let{canvas:e,currentDevicePixelRatio:s}=t,n=ui(e),o=n.boxSizing==="border-box",a=zt(n,"padding"),r=zt(n,"border","width"),{x:l,y:c,box:h}=lr(i,e),d=a.left+(h&&r.left),u=a.top+(h&&r.top),{width:f,height:g}=t;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*e.width/s),y:Math.round((c-u)/g*e.height/s)}}function cr(i,t,e){let s,n;if(t===void 0||e===void 0){let o=i&&di(i);if(!o)t=i.clientWidth,e=i.clientHeight;else{let a=o.getBoundingClientRect(),r=ui(o),l=zt(r,"border","width"),c=zt(r,"padding");t=a.width-c.width-l.width,e=a.height-c.height-l.height,s=ei(r.maxWidth,o,"clientWidth"),n=ei(r.maxHeight,o,"clientHeight")}}return{width:t,height:e,maxWidth:s||Qe,maxHeight:n||Qe}}var Dt=i=>Math.round(i*10)/10;function wn(i,t,e,s){let n=ui(i),o=zt(n,"margin"),a=ei(n.maxWidth,i,"clientWidth")||Qe,r=ei(n.maxHeight,i,"clientHeight")||Qe,l=cr(i,t,e),{width:c,height:h}=l;if(n.boxSizing==="content-box"){let u=zt(n,"border","width"),f=zt(n,"padding");c-=f.width+u.width,h-=f.height+u.height}return c=Math.max(0,c-o.width),h=Math.max(0,s?c/s:h-o.height),c=Dt(Math.min(c,a,l.maxWidth)),h=Dt(Math.min(h,r,l.maxHeight)),c&&!h&&(h=Dt(c/2)),(t!==void 0||e!==void 0)&&s&&l.height&&h>l.height&&(h=l.height,c=Dt(Math.floor(h*s))),{width:c,height:h}}function ns(i,t,e){let s=t||1,n=Dt(i.height*s),o=Dt(i.width*s);i.height=Dt(i.height),i.width=Dt(i.width);let a=i.canvas;return a.style&&(e||!a.style.height&&!a.style.width)&&(a.style.height=`${i.height}px`,a.style.width=`${i.width}px`),i.currentDevicePixelRatio!==s||a.height!==n||a.width!==o?(i.currentDevicePixelRatio=s,a.height=n,a.width=o,i.ctx.setTransform(s,0,0,s,0,0),!0):!1}var Sn=(function(){let i=!1;try{let t={get passive(){return i=!0,!1}};hi()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch{}return i})();function os(i,t){let e=or(i,t),s=e&&e.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function Pt(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:i.y+e*(t.y-i.y)}}function Pn(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:s==="middle"?e<.5?i.y:t.y:s==="after"?e<1?i.y:t.y:e>0?t.y:i.y}}function Dn(i,t,e,s){let n={x:i.cp2x,y:i.cp2y},o={x:t.cp1x,y:t.cp1y},a=Pt(i,n,e),r=Pt(n,o,e),l=Pt(o,t,e),c=Pt(a,r,e),h=Pt(r,l,e);return Pt(c,h,e)}var hr=function(i,t){return{x(e){return i+i+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,s){return e-s},leftForLtr(e,s){return e-s}}},dr=function(){return{x(i){return i},setWidth(i){},textAlign(i){return i},xPlus(i,t){return i+t},leftForLtr(i,t){return i}}};function Wt(i,t,e){return i?hr(t,e):dr()}function as(i,t){let e,s;(t==="ltr"||t==="rtl")&&(e=i.canvas.style,s=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),i.prevTextDirection=s)}function rs(i,t){t!==void 0&&(delete i.prevTextDirection,i.canvas.style.setProperty("direction",t[0],t[1]))}function On(i){return i==="angle"?{between:se,compare:Oa,normalize:X}:{between:ut,compare:(t,e)=>t-e,normalize:t=>t}}function Js({start:i,end:t,count:e,loop:s,style:n}){return{start:i%e,end:t%e,loop:s&&(t-i+1)%e===0,style:n}}function ur(i,t,e){let{property:s,start:n,end:o}=e,{between:a,normalize:r}=On(s),l=t.length,{start:c,end:h,loop:d}=i,u,f;if(d){for(c+=l,h+=l,u=0,f=l;ul(n,v,b)&&r(n,v)!==0,_=()=>r(o,b)===0||l(o,v,b),k=()=>p||y(),w=()=>!p||_();for(let S=h,P=h;S<=d;++S)x=t[S%a],!x.skip&&(b=c(x[s]),b!==v&&(p=l(b,n,o),m===null&&k()&&(m=r(b,n)===0?S:P),m!==null&&w()&&(g.push(Js({start:m,end:S,loop:u,count:a,style:f})),m=null),P=S,v=b));return m!==null&&g.push(Js({start:m,end:d,loop:u,count:a,style:f})),g}function cs(i,t){let e=[],s=i.segments;for(let n=0;nn&&i[o%t].skip;)o--;return o%=t,{start:n,end:o}}function gr(i,t,e,s){let n=i.length,o=[],a=t,r=i[t],l;for(l=t+1;l<=e;++l){let c=i[l%n];c.skip||c.stop?r.skip||(s=!1,o.push({start:t%n,end:(l-1)%n,loop:s}),t=a=c.stop?l:null):(a=l,r.skip&&(t=l)),r=c}return a!==null&&o.push({start:t%n,end:a%n,loop:s}),o}function Cn(i,t){let e=i.points,s=i.options.spanGaps,n=e.length;if(!n)return[];let o=!!i._loop,{start:a,end:r}=fr(e,n,o,s);if(s===!0)return Zs(i,[{start:a,end:r,loop:o}],e,t);let l=rr({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Yi.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,n)=>{if(!s.running||!s.items.length)return;let o=s.items,a=o.length-1,r=!1,l;for(;a>=0;--a)l=o[a],l._active?(l._total>s.duration&&(s.duration=l._total),l.tick(t),r=!0):(o[a]=o[o.length-1],o.pop());r&&(n.draw(),this._notify(n,s,t,"progress")),o.length||(s.running=!1,this._notify(n,s,t,"complete"),s.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){let e=this._charts,s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){let e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((s,n)=>Math.max(s,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;let e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){let e=this._charts.get(t);if(!e||!e.items.length)return;let s=e.items,n=s.length-1;for(;n>=0;--n)s[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}},vt=new Ms,An="transparent",xr={boolean(i,t,e){return e>.5?t:i},color(i,t,e){let s=Gi(i||An),n=s.valid&&Gi(t||An);return n&&n.valid?n.mix(s,e).hexString():t},number(i,t,e){return i+(t-i)*e}},ks=class{constructor(t,e,s,n){let o=e[s];n=ae([t.to,n,o,t.from]);let a=ae([t.from,o,n]);this._active=!0,this._fn=t.fn||xr[t.type||typeof a],this._easing=Jt[t.easing]||Jt.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);let n=this._target[this._prop],o=s-this._start,a=this._duration-o;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=ae([t.to,e,n,t.from]),this._from=ae([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){let e=t-this._start,s=this._duration,n=this._prop,o=this._from,a=this._loop,r=this._to,l;if(this._active=o!==r&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,r,l)}wait(){let t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){let e=t?"res":"rej",s=this._promises||[];for(let n=0;n{let o=t[n];if(!T(o))return;let a={};for(let r of e)a[r]=o[r];(z(o.properties)&&o.properties||[n]).forEach(r=>{(r===n||!s.has(r))&&s.set(r,a)})})}_animateOptions(t,e){let s=e.options,n=yr(t,s);if(!n)return[];let o=this._createAnimations(n,s);return s.$shared&&_r(t.options.$animations,s).then(()=>{t.options=s},()=>{}),o}_createAnimations(t,e){let s=this._properties,n=[],o=t.$animations||(t.$animations={}),a=Object.keys(e),r=Date.now(),l;for(l=a.length-1;l>=0;--l){let c=a[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}let h=e[c],d=o[c],u=s.get(c);if(d)if(u&&d.active()){d.update(u,h,r);continue}else d.cancel();if(!u||!u.duration){t[c]=h;continue}o[c]=d=new ks(u,t,c,h),n.push(d)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}let s=this._createAnimations(t,e);if(s.length)return vt.add(this._chart,s),!0}};function _r(i,t){let e=[],s=Object.keys(t);for(let n=0;n0||!e&&o<0)return n.index}return null}function En(i,t){let{chart:e,_cachedMeta:s}=i,n=e._stacks||(e._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,c=a.axis,h=wr(o,a,s),d=t.length,u;for(let f=0;fe[s].axis===t).shift()}function Dr(i,t){return yt(i,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function Or(i,t,e){return yt(i,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function Oe(i,t){let e=i.controller.index,s=i.vScale&&i.vScale.axis;if(s){t=t||i._parsed;for(let n of t){let o=n._stacks;if(!o||o[s]===void 0||o[s][e]===void 0)return;delete o[s][e],o[s]._visualValues!==void 0&&o[s]._visualValues[e]!==void 0&&delete o[s]._visualValues[e]}}}var fs=i=>i==="reset"||i==="none",In=(i,t)=>t?i:Object.assign({},i),Cr=(i,t,e)=>i&&!t.hidden&&t._stacked&&{keys:Ao(e,!0),values:null},it=class{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=ds(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Oe(this._cachedMeta),this.index=t}linkScales(){let t=this.chart,e=this._cachedMeta,s=this.getDataset(),n=(d,u,f,g)=>d==="x"?u:d==="r"?g:f,o=e.xAxisID=D(s.xAxisID,us(t,"x")),a=e.yAxisID=D(s.yAxisID,us(t,"y")),r=e.rAxisID=D(s.rAxisID,us(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,o,a,r),h=e.vAxisID=n(l,a,o,r);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(r),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){let e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){let t=this._cachedMeta;this._data&&ji(this._data,this),t._stacked&&Oe(t)}_dataCheck(){let t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(T(e)){let n=this._cachedMeta;this._data=kr(e,n)}else if(s!==e){if(s){ji(s,this);let n=this._cachedMeta;Oe(n),n._parsed=[]}e&&Object.isExtensible(e)&&dn(e,this),this._syncList=[],this._data=e}}addElements(){let t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){let e=this._cachedMeta,s=this.getDataset(),n=!1;this._dataCheck();let o=e._stacked;e._stacked=ds(e.vScale,e),e.stack!==s.stack&&(n=!0,Oe(e),e.stack=s.stack),this._resyncElements(t),(n||o!==e._stacked)&&(En(this,e._parsed),e._stacked=ds(e.vScale,e))}configure(){let t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){let{_cachedMeta:s,_data:n}=this,{iScale:o,_stacked:a}=s,r=o.axis,l=t===0&&e===n.length?!0:s._sorted,c=t>0&&s._parsed[t-1],h,d,u;if(this._parsing===!1)s._parsed=n,s._sorted=!0,u=n;else{z(n[t])?u=this.parseArrayData(s,n,t,e):T(n[t])?u=this.parseObjectData(s,n,t,e):u=this.parsePrimitiveData(s,n,t,e);let f=()=>d[r]===null||c&&d[r]p||d=0;--u)if(!g()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){let e=this._cachedMeta._parsed,s=[],n,o,a;for(n=0,o=e.length;n=0&&tthis.getContext(s,n,e),p=c.resolveNamedOptions(u,f,g,d);return p.$shared&&(p.$shared=l,o[a]=Object.freeze(In(p,l))),p}_resolveAnimations(t,e,s){let n=this.chart,o=this._cachedDataOpts,a=`animation-${e}`,r=o[a];if(r)return r;let l;if(n.options.animation!==!1){let h=this.chart.config,d=h.datasetAnimationScopeKeys(this._type,e),u=h.getOptionScopes(this.getDataset(),d);l=h.createResolver(u,this.getContext(t,s,e))}let c=new vi(n,l&&l.animations);return l&&l._cacheable&&(o[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||fs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){let s=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(s),a=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,s),{sharedOptions:o,includeOptions:a}}updateElement(t,e,s,n){fs(n)?Object.assign(t,s):this._resolveAnimations(e,n).update(t,s)}updateSharedOptions(t,e,s){t&&!fs(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,n){t.active=n;let o=this.getStyle(e,n);this._resolveAnimations(e,s,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){let t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){let e=this._data,s=this._cachedMeta.data;for(let[r,l,c]of this._syncList)this[r](l,c);this._syncList=[];let n=s.length,o=e.length,a=Math.min(o,n);a&&this.parse(0,a),o>n?this._insertElements(n,o-n,t):o{for(c.length+=e,r=c.length-1;r>=a;r--)c[r]=c[r-e]};for(l(o),r=t;rn-o))}return i._cache.$bar}function Tr(i){let t=i.iScale,e=Ar(t,i.type),s=t._length,n,o,a,r,l=()=>{a===32767||a===-32768||(ee(r)&&(s=Math.min(s,Math.abs(a-r)||s)),r=a)};for(n=0,o=e.length;n0?n[i-1]:null,r=iMath.abs(r)&&(l=r,c=a),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:o,min:a,max:r}}function To(i,t,e,s){return z(i)?Er(i,t,e,s):t[e.axis]=e.parse(i,s),t}function Fn(i,t,e,s){let n=i.iScale,o=i.vScale,a=n.getLabels(),r=n===o,l=[],c,h,d,u;for(c=e,h=e+s;c=e?1:-1)}function Fr(i){let t,e,s,n,o;return i.horizontal?(t=i.base>i.x,e="left",s="right"):(t=i.baseh.controller.options.grouped),o=s.options.stacked,a=[],r=this._cachedMeta.controller.getParsed(e),l=r&&r[s.axis],c=h=>{let d=h._parsed.find(f=>f[s.axis]===l),u=d&&d[h.vScale.axis];if(A(u)||isNaN(u))return!0};for(let h of n)if(!(e!==void 0&&c(h))&&((o===!1||a.indexOf(h.stack)===-1||o===void 0&&h.stack===void 0)&&a.push(h.stack),h.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){let t={},e=this.getFirstScaleIdForIndexAxis();for(let s of this.chart.data.datasets)t[D(this.chart.options.indexAxis==="x"?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){let n=this._getStacks(t,s),o=e!==void 0?n.indexOf(e):-1;return o===-1?n.length-1:o}_getRuler(){let t=this.options,e=this._cachedMeta,s=e.iScale,n=[],o,a;for(o=0,a=e.data.length;o=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:n,yScale:o}=e,a=this.getParsed(t),r=n.getLabelForValue(a.x),l=o.getLabelForValue(a.y),c=a._custom;return{label:s[t]||"",value:"("+r+", "+l+(c?", "+c:"")+")"}}update(t){let e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,n){let o=n==="reset",{iScale:a,vScale:r}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=a.axis,d=r.axis;for(let u=e;use(v,r,l,!0)?1:Math.max(y,y*e,_,_*e),g=(v,y,_)=>se(v,r,l,!0)?-1:Math.min(y,y*e,_,_*e),p=f(0,c,d),m=f(H,h,u),b=g(R,c,d),x=g(R+H,h,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}var kt=class extends it{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){let s=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=s;else{let o=l=>+s[l];if(T(s[t])){let{key:l="value"}=this._parsing;o=c=>+_t(s[c],l)}let a,r;for(a=t,r=t+e;a0&&!isNaN(t)?B*(Math.abs(t)/e):0}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=ne(e._parsed[t],s.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){let e=0,s=this.chart,n,o,a,r,l;if(!t){for(n=0,o=s.data.datasets.length;nt!=="spacing",_indexable:t=>t!=="spacing"&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),M(kt,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data,{labels:{pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((l,c)=>{let d=t.getDatasetMeta(0).controller.getStyle(c);return{text:l,fillStyle:d.backgroundColor,fontColor:o,hidden:!t.getDataVisibility(c),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:n,pointStyle:s,borderRadius:a&&(r||d.borderRadius),index:c}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});var he=class extends it{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){let e=this._cachedMeta,{dataset:s,data:n=[],_dataset:o}=e,a=this.chart._animationsDisabled,{start:r,count:l}=Xi(e,n,a);this._drawStart=r,this._drawCount=l,Ki(e)&&(r=0,l=n.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!o._decimated,s.points=n;let c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:c},t),this.updateElements(n,r,l,t)}updateElements(t,e,s,n){let o=n==="reset",{iScale:a,vScale:r,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=Vt(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||n==="none",x=e+s,v=t.length,y=e>0&&this.getParsed(e-1);for(let _=0;_=x){w.skip=!0;continue}let S=this.getParsed(_),P=A(S[f]),O=w[u]=a.getPixelForValue(S[u],_),C=w[f]=o||P?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,S,l):S[f],_);w.skip=isNaN(O)||isNaN(C)||P,w.stop=_>0&&Math.abs(S[u]-y[u])>m,p&&(w.parsed=S,w.raw=c.data[_]),d&&(w.options=h||this.resolveDataElementOptions(_,k.active?"active":n)),b||this.updateElement(k,_,w,n),y=S}}getMaxOverflow(){let t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return s;let o=n[0].size(this.resolveDataElementOptions(0)),a=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(s,o,a)/2}draw(){let t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}};M(he,"id","line"),M(he,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),M(he,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});var Yt=class extends it{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){let e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=ne(e._parsed[t].r,s.options.locale);return{label:n[t]||"",value:o}}parseObjectData(t,e,s,n){return ss.bind(this)(t,e,s,n)}update(t){let e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){let t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((s,n)=>{let o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(oe.max&&(e.max=o))}),e}_updateRadius(){let t=this.chart,e=t.chartArea,s=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),a=Math.max(s.cutoutPercentage?o/100*s.cutoutPercentage:1,0),r=(o-a)/t.getVisibleDatasetCount();this.outerRadius=o-r*this.index,this.innerRadius=this.outerRadius-r}updateElements(t,e,s,n){let o=n==="reset",a=this.chart,l=a.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*R,f=u,g,p=360/this.countVisibleElements();for(g=0;g{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?ot(this.resolveDataElementOptions(t,e).angle||s):0}};M(Yt,"id","polarArea"),M(Yt,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),M(Yt,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){let e=t.data;if(e.labels.length&&e.datasets.length){let{labels:{pointStyle:s,color:n}}=t.legend.options;return e.labels.map((o,a)=>{let l=t.getDatasetMeta(0).controller.getStyle(a);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:n,lineWidth:l.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(a),index:a}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var Re=class extends kt{};M(Re,"id","pie"),M(Re,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});var de=class extends it{getLabelAndValue(t){let e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,n){return ss.bind(this)(t,e,s,n)}update(t){let e=this._cachedMeta,s=e.dataset,n=e.data||[],o=e.iScale.getLabels();if(s.points=n,t!=="resize"){let a=this.resolveDatasetElementOptions(t);this.options.showLine||(a.borderWidth=0);let r={_loop:!0,_fullLoop:o.length===n.length,options:a};this.updateElement(s,void 0,r,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,s,n){let o=this._cachedMeta.rScale,a=n==="reset";for(let r=e;r0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(k[f]-v[f])>b,m&&(w.parsed=k,w.raw=c.data[y]),u&&(w.options=d||this.resolveDataElementOptions(y,_.active?"active":n)),x||this.updateElement(_,y,w,n),v=k}this.updateSharedOptions(d,n,h)}getMaxOverflow(){let t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let r=0;for(let l=e.length-1;l>=0;--l)r=Math.max(r,e[l].size(this.resolveDataElementOptions(l))/2);return r>0&&r}let s=t.dataset,n=s.options&&s.options.borderWidth||0;if(!e.length)return n;let o=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,o,a)/2}};M(ue,"id","scatter"),M(ue,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),M(ue,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});var Nr=Object.freeze({__proto__:null,BarController:le,BubbleController:ce,DoughnutController:kt,LineController:he,PieController:Re,PolarAreaController:Yt,RadarController:de,ScatterController:ue});function Nt(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var ws=class i{constructor(t){M(this,"options");this.options=t||{}}static override(t){Object.assign(i.prototype,t)}init(){}formats(){return Nt()}parse(){return Nt()}format(){return Nt()}add(){return Nt()}diff(){return Nt()}startOf(){return Nt()}endOf(){return Nt()}},Hr={_date:ws};function jr(i,t,e,s){let{controller:n,data:o,_sorted:a}=i,r=n._cachedMeta.iScale,l=i.dataset&&i.dataset.options?i.dataset.options.spanGaps:null;if(r&&t===r.axis&&t!=="r"&&a&&o.length){let c=r._reversePixels?ln:ct;if(s){if(n._sharedOptions){let h=o[0],d=typeof h.getRange=="function"&&h.getRange(t);if(d){let u=c(o,t,e-d),f=c(o,t,e+d);return{lo:u.lo,hi:f.hi}}}}else{let h=c(o,t,e);if(l){let{vScale:d}=n._cachedMeta,{_parsed:u}=i,f=u.slice(0,h.lo+1).reverse().findIndex(p=>!A(p[d.axis]));h.lo-=Math.max(0,f);let g=u.slice(h.hi).findIndex(p=>!A(p[d.axis]));h.hi+=Math.max(0,g)}return h}}return{lo:0,hi:o.length-1}}function $e(i,t,e,s,n){let o=i.getSortedVisibleDatasetMetas(),a=e[t];for(let r=0,l=o.length;r{l[a]&&l[a](t[e],n)&&(o.push({element:l,datasetIndex:c,index:h}),r=r||l.inRange(t.x,t.y,n))}),s&&!r?[]:o}var Xr={evaluateInteractionItems:$e,modes:{index(i,t,e,s){let n=Lt(t,i),o=e.axis||"x",a=e.includeInvisible||!1,r=e.intersect?ps(i,n,o,s,a):ms(i,n,o,!1,s,a),l=[];return r.length?(i.getSortedVisibleDatasetMetas().forEach(c=>{let h=r[0].index,d=c.data[h];d&&!d.skip&&l.push({element:d,datasetIndex:c.index,index:h})}),l):[]},dataset(i,t,e,s){let n=Lt(t,i),o=e.axis||"xy",a=e.includeInvisible||!1,r=e.intersect?ps(i,n,o,s,a):ms(i,n,o,!1,s,a);if(r.length>0){let l=r[0].datasetIndex,c=i.getDatasetMeta(l).data;r=[];for(let h=0;he.pos===t)}function Wn(i,t){return i.filter(e=>Lo.indexOf(e.pos)===-1&&e.box.axis===t)}function Ae(i,t){return i.sort((e,s)=>{let n=t?s:e,o=t?e:s;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function Kr(i){let t=[],e,s,n,o,a,r;for(e=0,s=(i||[]).length;ec.box.fullSize),!0),s=Ae(Ce(t,"left"),!0),n=Ae(Ce(t,"right")),o=Ae(Ce(t,"top"),!0),a=Ae(Ce(t,"bottom")),r=Wn(t,"x"),l=Wn(t,"y");return{fullSize:e,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ce(t,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}function Nn(i,t,e,s){return Math.max(i[e],t[e])+Math.max(i[s],t[s])}function Ro(i,t){i.top=Math.max(i.top,t.top),i.left=Math.max(i.left,t.left),i.bottom=Math.max(i.bottom,t.bottom),i.right=Math.max(i.right,t.right)}function Zr(i,t,e,s){let{pos:n,box:o}=e,a=i.maxPadding;if(!T(n)){e.size&&(i[n]-=e.size);let d=s[e.stack]||{size:0,count:1};d.size=Math.max(d.size,e.horizontal?o.height:o.width),e.size=d.size/d.count,i[n]+=e.size}o.getPadding&&Ro(a,o.getPadding());let r=Math.max(0,t.outerWidth-Nn(a,i,"left","right")),l=Math.max(0,t.outerHeight-Nn(a,i,"top","bottom")),c=r!==i.w,h=l!==i.h;return i.w=r,i.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Qr(i){let t=i.maxPadding;function e(s){let n=Math.max(t[s]-i[s],0);return i[s]+=n,n}i.y+=e("top"),i.x+=e("left"),e("right"),e("bottom")}function tl(i,t){let e=t.maxPadding;function s(n){let o={left:0,top:0,right:0,bottom:0};return n.forEach(a=>{o[a]=Math.max(t[a],e[a])}),o}return s(i?["left","right"]:["top","bottom"])}function Ee(i,t,e,s){let n=[],o,a,r,l,c,h;for(o=0,a=i.length,c=0;o{typeof p.beforeLayout=="function"&&p.beforeLayout()});let h=l.reduce((p,m)=>m.box.options&&m.box.options.display===!1?p:p+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},n);Ro(u,q(s));let f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=Gr(l.concat(c),d);Ee(r.fullSize,f,d,g),Ee(l,f,d,g),Ee(c,f,d,g)&&Ee(l,f,d,g),Qr(f),Hn(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,Hn(r.rightAndBottom,f,d,g),i.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},E(r.chartArea,p=>{let m=p.box;Object.assign(m,i.chartArea),m.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}},Mi=class{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,n){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):s)}}isAttached(t){return!0}updateConfig(t){}},Ss=class extends Mi{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}},_i="$chartjs",el={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},jn=i=>i===null||i==="";function il(i,t){let e=i.style,s=i.getAttribute("height"),n=i.getAttribute("width");if(i[_i]={initial:{height:s,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",jn(n)){let o=os(i,"width");o!==void 0&&(i.width=o)}if(jn(s))if(i.style.height==="")i.height=i.width/(t||2);else{let o=os(i,"height");o!==void 0&&(i.height=o)}return i}var Eo=Sn?{passive:!0}:!1;function sl(i,t,e){i&&i.addEventListener(t,e,Eo)}function nl(i,t,e){i&&i.canvas&&i.canvas.removeEventListener(t,e,Eo)}function ol(i,t){let e=el[i.type]||i.type,{x:s,y:n}=Lt(i,t);return{type:e,chart:t,native:i,x:s!==void 0?s:null,y:n!==void 0?n:null}}function ki(i,t){for(let e of i)if(e===t||e.contains(t))return!0}function al(i,t,e){let s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(let r of o)a=a||ki(r.addedNodes,s),a=a&&!ki(r.removedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function rl(i,t,e){let s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(let r of o)a=a||ki(r.removedNodes,s),a=a&&!ki(r.addedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}var Ne=new Map,$n=0;function Io(){let i=window.devicePixelRatio;i!==$n&&($n=i,Ne.forEach((t,e)=>{e.currentDevicePixelRatio!==i&&t()}))}function ll(i,t){Ne.size||window.addEventListener("resize",Io),Ne.set(i,t)}function cl(i){Ne.delete(i),Ne.size||window.removeEventListener("resize",Io)}function hl(i,t,e){let s=i.canvas,n=s&&di(s);if(!n)return;let o=Ui((r,l)=>{let c=n.clientWidth;e(r,l),c{let l=r[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||o(c,h)});return a.observe(n),ll(i,o),a}function bs(i,t,e){e&&e.disconnect(),t==="resize"&&cl(i)}function dl(i,t,e){let s=i.canvas,n=Ui(o=>{i.ctx!==null&&e(ol(o,i))},i);return sl(s,t,n),n}var Ps=class extends Mi{acquireContext(t,e){let s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(il(t,e),s):null}releaseContext(t){let e=t.canvas;if(!e[_i])return!1;let s=e[_i].initial;["height","width"].forEach(o=>{let a=s[o];A(a)?e.removeAttribute(o):e.setAttribute(o,a)});let n=s.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[_i],!0}addEventListener(t,e,s){this.removeEventListener(t,e);let n=t.$proxies||(t.$proxies={}),a={attach:al,detach:rl,resize:hl}[e]||dl;n[e]=a(t,e,s)}removeEventListener(t,e){let s=t.$proxies||(t.$proxies={}),n=s[e];if(!n)return;({attach:bs,detach:bs,resize:bs}[e]||nl)(t,e,n),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,n){return wn(t,e,s,n)}isAttached(t){let e=t&&di(t);return!!(e&&e.isConnected)}};function ul(i){return!hi()||typeof OffscreenCanvas<"u"&&i instanceof OffscreenCanvas?Ss:Ps}var st=class{constructor(){M(this,"x");M(this,"y");M(this,"active",!1);M(this,"options");M(this,"$animations")}tooltipPosition(t){let{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return Vt(this.x)&&Vt(this.y)}getProps(t,e){let s=this.$animations;if(!e||!s)return this;let n={};return t.forEach(o=>{n[o]=s[o]&&s[o].active()?s[o]._to:this[o]}),n}};M(st,"defaults",{}),M(st,"defaultRoutes");function fl(i,t){let e=i.options.ticks,s=gl(i),n=Math.min(e.maxTicksLimit||s,s),o=e.major.enabled?ml(t):[],a=o.length,r=o[0],l=o[a-1],c=[];if(a>n)return bl(t,c,o,a/n),c;let h=pl(o,t,n);if(a>0){let d,u,f=a>1?Math.round((l-r)/(a-1)):null;for(gi(t,c,h,A(f)?0:r-f,r),d=0,u=a-1;dn)return l}return Math.max(n,1)}function ml(i){let t=[],e,s;for(e=0,s=i.length;ei==="left"?"right":i==="right"?"left":i,Yn=(i,t,e)=>t==="top"||t==="left"?i[t]+e:i[t]-e,Un=(i,t)=>Math.min(t||i,i);function Xn(i,t){let e=[],s=i.length/t,n=i.length,o=0;for(;oa+r)))return l}function vl(i,t){E(i,e=>{let s=e.gc,n=s.length/2,o;if(n>t){for(o=0;os?s:e,s=n&&e>s?e:s,{min:Z(e,Z(s,e)),max:Z(s,Z(e,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){F(this.options.beforeUpdate,[this])}update(t,e,s){let{beginAtZero:n,grace:o,ticks:a}=this.options,r=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=xn(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let l=r=o||s<=1||!this.isHorizontal()){this.labelRotation=n;return}let h=this._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Y(this.chart.width-d,0,this.maxWidth);r=t.offset?this.maxWidth/s:f/(s-1),d+6>r&&(r=f/(s-(t.offset?.5:1)),l=this.maxHeight-Te(t.grid)-e.padding-Kn(t.title,this.chart.options.font),c=Math.sqrt(d*d+u*u),a=si(Math.min(Math.asin(Y((h.highest.height+6)/r,-1,1)),Math.asin(Y(l/c,-1,1))-Math.asin(Y(u/c,-1,1)))),a=Math.max(n,Math.min(o,a))),this.labelRotation=a}afterCalculateLabelRotation(){F(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){F(this.options.beforeFit,[this])}fit(){let t={width:0,height:0},{chart:e,options:{ticks:s,title:n,grid:o}}=this,a=this._isVisible(),r=this.isHorizontal();if(a){let l=Kn(n,e.options.font);if(r?(t.width=this.maxWidth,t.height=Te(o)+l):(t.height=this.maxHeight,t.width=Te(o)+l),s.display&&this.ticks.length){let{first:c,last:h,widest:d,highest:u}=this._getLabelSizes(),f=s.padding*2,g=ot(this.labelRotation),p=Math.cos(g),m=Math.sin(g);if(r){let b=s.mirror?0:m*d.width+p*u.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{let b=s.mirror?0:p*d.width+m*u.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,h,m,p)}}this._handleMargins(),r?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,n){let{ticks:{align:o,padding:a},position:r}=this.options,l=this.labelRotation!==0,c=r!=="top"&&this.axis==="x";if(this.isHorizontal()){let h=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1),u=0,f=0;l?c?(u=n*t.width,f=s*e.height):(u=s*t.height,f=n*e.width):o==="start"?f=e.width:o==="end"?u=t.width:o!=="inner"&&(u=t.width/2,f=e.width/2),this.paddingLeft=Math.max((u-h+a)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-d+a)*this.width/(this.width-d),0)}else{let h=e.height/2,d=t.height/2;o==="start"?(h=0,d=t.height):o==="end"&&(h=e.height,d=0),this.paddingTop=h+a,this.paddingBottom=d+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){F(this.options.afterFit,[this])}isHorizontal(){let{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,s;for(e=0,s=t.length;e({width:a[P]||0,height:r[P]||0});return{first:S(0),last:S(e-1),widest:S(k),highest:S(w),widths:a,heights:r}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){let e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);let e=this._startPixel+t*this._length;return rn(this._alignToPixels?Ct(this.chart,e,0):e)}getDecimalForPixel(t){let e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){let e=this.ticks||[];if(t>=0&&tr*n?r/s:l/n:l*n0}_computeGridLineItems(t){let e=this.axis,s=this.chart,n=this.options,{grid:o,position:a,border:r}=n,l=o.offset,c=this.isHorizontal(),d=this.ticks.length+(l?1:0),u=Te(o),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(W){return Ct(s,W,p)},x,v,y,_,k,w,S,P,O,C,L,U;if(a==="top")x=b(this.bottom),w=this.bottom-u,P=x-m,C=b(t.top)+m,U=t.bottom;else if(a==="bottom")x=b(this.top),C=t.top,U=b(t.bottom)-m,w=x+m,P=this.top+u;else if(a==="left")x=b(this.right),k=this.right-u,S=x-m,O=b(t.left)+m,L=t.right;else if(a==="right")x=b(this.left),O=t.left,L=b(t.right)-m,k=x+m,S=this.left+u;else if(e==="x"){if(a==="center")x=b((t.top+t.bottom)/2+.5);else if(T(a)){let W=Object.keys(a)[0],j=a[W];x=b(this.chart.scales[W].getPixelForValue(j))}C=t.top,U=t.bottom,w=x+m,P=w+u}else if(e==="y"){if(a==="center")x=b((t.left+t.right)/2);else if(T(a)){let W=Object.keys(a)[0],j=a[W];x=b(this.chart.scales[W].getPixelForValue(j))}k=x-m,S=k-u,O=t.left,L=t.right}let et=D(n.ticks.maxTicksLimit,d),I=Math.max(1,Math.ceil(d/et));for(v=0;v0&&(It-=Et/2);break}Ye={left:It,top:xe,width:Et+qt.width,height:be+qt.height,color:I.backdropColor}}m.push({label:y,font:P,textOffset:L,options:{rotation:p,color:j,strokeColor:rt,strokeWidth:G,textAlign:Kt,textBaseline:U,translation:[_,k],backdrop:Ye}})}return m}_getXAxisLabelAlignment(){let{position:t,ticks:e}=this.options;if(-ot(this.labelRotation))return t==="top"?"left":"right";let n="center";return e.align==="start"?n="left":e.align==="end"?n="right":e.align==="inner"&&(n="inner"),n}_getYAxisLabelAlignment(t){let{position:e,ticks:{crossAlign:s,mirror:n,padding:o}}=this.options,a=this._getLabelSizes(),r=t+o,l=a.widest.width,c,h;return e==="left"?n?(h=this.right+o,s==="near"?c="left":s==="center"?(c="center",h+=l/2):(c="right",h+=l)):(h=this.right-r,s==="near"?c="right":s==="center"?(c="center",h-=l/2):(c="left",h=this.left)):e==="right"?n?(h=this.left+o,s==="near"?c="right":s==="center"?(c="center",h-=l/2):(c="left",h-=l)):(h=this.left+r,s==="near"?c="left":s==="center"?(c="center",h+=l/2):(c="right",h=this.right)):c="right",{textAlign:c,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;let t=this.chart,e=this.options.position;if(e==="left"||e==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(e==="top"||e==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){let{ctx:t,options:{backgroundColor:e},left:s,top:n,width:o,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,n,o,a),t.restore())}getLineWidthForValue(t){let e=this.options.grid;if(!this._isVisible()||!e.display)return 0;let n=this.ticks.findIndex(o=>o.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){let e=this.options.grid,s=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o,a,r=(l,c,h)=>{!h.width||!h.color||(s.save(),s.lineWidth=h.width,s.strokeStyle=h.color,s.setLineDash(h.borderDash||[]),s.lineDashOffset=h.borderDashOffset,s.beginPath(),s.moveTo(l.x,l.y),s.lineTo(c.x,c.y),s.stroke(),s.restore())};if(e.display)for(o=0,a=n.length;o{this.draw(o)}}]:[{z:s,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){let e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",n=[],o,a;for(o=0,a=e.length;o{let s=e.split("."),n=s.pop(),o=[i].concat(s).join("."),a=t[e].split("."),r=a.pop(),l=a.join(".");V.route(o,n,l,r)})}function Ol(i){return"id"in i&&"defaults"in i}var Ds=class{constructor(){this.controllers=new pe(it,"datasets",!0),this.elements=new pe(st,"elements"),this.plugins=new pe(Object,"plugins"),this.scales=new pe(Xt,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(n=>{let o=s||this._getRegistryForType(n);s||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):E(n,a=>{let r=s||this._getRegistryForType(a);this._exec(t,r,a)})})}_exec(t,e,s){let n=ii(t);F(s["before"+n],[],s),e[t](s),F(s["after"+n],[],s)}_getRegistryForType(t){for(let e=0;eo.filter(r=>!a.some(l=>r.plugin.id===l.plugin.id));this._notify(n(e,s),t,"stop"),this._notify(n(s,e),t,"start")}};function Cl(i){let t={},e=[],s=Object.keys(gt.plugins.items);for(let o=0;o1&&qn(i[0].toLowerCase());if(s)return s}throw new Error(`Cannot determine type of '${i}' axis. Please provide 'axis' or 'position' option.`)}function Gn(i,t,e){if(e[t+"AxisID"]===i)return{axis:t}}function Fl(i,t){if(t.data&&t.data.datasets){let e=t.data.datasets.filter(s=>s.xAxisID===i||s.yAxisID===i);if(e.length)return Gn(i,"x",e[0])||Gn(i,"y",e[0])}return{}}function zl(i,t){let e=Ot[i.type]||{scales:{}},s=t.scales||{},n=Cs(i.type,t),o=Object.create(null);return Object.keys(s).forEach(a=>{let r=s[a];if(!T(r))return console.error(`Invalid scale configuration for scale: ${a}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${a}`);let l=As(a,r,Fl(a,i),V.scales[r.type]),c=El(l,n),h=e.scales||{};o[a]=te(Object.create(null),[{axis:l},r,h[l],h[c]])}),i.data.datasets.forEach(a=>{let r=a.type||i.type,l=a.indexAxis||Cs(r,t),h=(Ot[r]||{}).scales||{};Object.keys(h).forEach(d=>{let u=Rl(d,l),f=a[u+"AxisID"]||u;o[f]=o[f]||Object.create(null),te(o[f],[{axis:u},s[f],h[d]])})}),Object.keys(o).forEach(a=>{let r=o[a];te(r,[V.scales[r.type],V.scale])}),o}function Fo(i){let t=i.options||(i.options={});t.plugins=D(t.plugins,{}),t.scales=zl(i,t)}function zo(i){return i=i||{},i.datasets=i.datasets||[],i.labels=i.labels||[],i}function Bl(i){return i=i||{},i.data=zo(i.data),Fo(i),i}var Jn=new Map,Bo=new Set;function pi(i,t){let e=Jn.get(i);return e||(e=t(),Jn.set(i,e),Bo.add(e)),e}var Le=(i,t,e)=>{let s=_t(t,e);s!==void 0&&i.add(s)},Ts=class{constructor(t){this._config=Bl(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=zo(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){let t=this._config;this.clearCache(),Fo(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pi(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return pi(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return pi(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){let e=t.id,s=this.type;return pi(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){let s=this._scopeCache,n=s.get(t);return(!n||e)&&(n=new Map,s.set(t,n)),n}getOptionScopes(t,e,s){let{options:n,type:o}=this,a=this._cachedScopes(t,s),r=a.get(e);if(r)return r;let l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(d=>Le(l,t,d))),h.forEach(d=>Le(l,n,d)),h.forEach(d=>Le(l,Ot[o]||{},d)),h.forEach(d=>Le(l,V,d)),h.forEach(d=>Le(l,ai,d))});let c=Array.from(l);return c.length===0&&c.push(Object.create(null)),Bo.has(e)&&a.set(e,c),c}chartOptionScopes(){let{options:t,type:e}=this;return[t,Ot[e]||{},V.datasets[e]||{},{type:e},V,ai]}resolveNamedOptions(t,e,s,n=[""]){let o={$shared:!0},{resolver:a,subPrefixes:r}=Zn(this._resolverCache,t,n),l=a;if(Wl(a,e)){o.$shared=!1,s=bt(s)?s():s;let c=this.createResolver(t,s,r);l=Bt(a,s,c)}for(let c of e)o[c]=l[c];return o}createResolver(t,e,s=[""],n){let{resolver:o}=Zn(this._resolverCache,t,s);return T(e)?Bt(o,e,void 0,n):o}};function Zn(i,t,e){let s=i.get(t);s||(s=new Map,i.set(t,s));let n=e.join(),o=s.get(n);return o||(o={resolver:ci(t,e),subPrefixes:e.filter(r=>!r.toLowerCase().includes("hover"))},s.set(n,o)),o}var Vl=i=>T(i)&&Object.getOwnPropertyNames(i).some(t=>bt(i[t]));function Wl(i,t){let{isScriptable:e,isIndexable:s}=ts(i);for(let n of t){let o=e(n),a=s(n),r=(a||o)&&i[n];if(o&&(bt(r)||Vl(r))||a&&z(r))return!0}return!1}var Nl="4.5.1",Hl=["top","bottom","left","right","chartArea"];function Qn(i,t){return i==="top"||i==="bottom"||Hl.indexOf(i)===-1&&t==="x"}function to(i,t){return function(e,s){return e[i]===s[i]?e[t]-s[t]:e[i]-s[i]}}function eo(i){let t=i.chart,e=t.options.animation;t.notifyPlugins("afterRender"),F(e&&e.onComplete,[i],t)}function jl(i){let t=i.chart,e=t.options.animation;F(e&&e.onProgress,[i],t)}function Vo(i){return hi()&&typeof i=="string"?i=document.getElementById(i):i&&i.length&&(i=i[0]),i&&i.canvas&&(i=i.canvas),i}var yi={},io=i=>{let t=Vo(i);return Object.values(yi).filter(e=>e.canvas===t).pop()};function $l(i,t,e){let s=Object.keys(i);for(let n of s){let o=+n;if(o>=t){let a=i[n];delete i[n],(e>0||o>t)&&(i[o+e]=a)}}}function Yl(i,t,e,s){return!e||i.type==="mouseout"?null:s?t:i}var at=class{static register(...t){gt.add(...t),so()}static unregister(...t){gt.remove(...t),so()}constructor(t,e){let s=this.config=new Ts(e),n=Vo(t),o=io(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");let a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ul(n)),this.platform.updateConfig(s);let r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,c=l&&l.height,h=l&&l.width;if(this.id=tn(),this.ctx=r,this.canvas=l,this.width=h,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Os,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=un(d=>this.update(d),a.resizeDelay||0),this._dataChanges=[],yi[this.id]=this,!r||!l){console.error("Failed to create chart: can't acquire context from the given item");return}vt.listen(this,"complete",eo),vt.listen(this,"progress",jl),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:n,_aspectRatio:o}=this;return A(t)?e&&o?o:n?s/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return gt}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ns(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ji(this.canvas,this.ctx),this}stop(){return vt.stop(this),this}resize(t,e){vt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){let s=this.options,n=this.canvas,o=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,o),r=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,ns(this,r,!0)&&(this.notifyPlugins("resize",{size:a}),F(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){let e=this.options.scales||{};E(e,(s,n)=>{s.id=n})}buildOrUpdateScales(){let t=this.options,e=t.scales,s=this.scales,n=Object.keys(s).reduce((a,r)=>(a[r]=!1,a),{}),o=[];e&&(o=o.concat(Object.keys(e).map(a=>{let r=e[a],l=As(a,r),c=l==="r",h=l==="x";return{options:r,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),E(o,a=>{let r=a.options,l=r.id,c=As(l,r),h=D(r.type,a.dtype);(r.position===void 0||Qn(r.position,c)!==Qn(a.dposition))&&(r.position=a.dposition),n[l]=!0;let d=null;if(l in s&&s[l].type===h)d=s[l];else{let u=gt.getScale(h);d=new u({id:l,type:h,ctx:this.ctx,chart:this}),s[d.id]=d}d.init(r,t)}),E(n,(a,r)=>{a||delete s[r]}),E(s,a=>{J.configure(this,a,a.options),J.addBox(this,a)})}_updateMetasets(){let t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((n,o)=>n.index-o.index),s>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((s,n)=>{e.filter(o=>o===s._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let t=[],e=this.data.datasets,s,n;for(this._removeUnreferencedMetasets(),s=0,n=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){let e=this.config;e.update();let s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;let o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(to("z","_idx"));let{_active:r,_lastEvent:l}=this;l?this._eventHandler(l,!0):r.length&&this._updateHoverStyles(r,r,!0),this.render()}_updateScales(){E(this.scales,t=>{J.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);(!Bi(e,s)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(let{method:s,start:n,count:o}of e){let a=s==="_removeElements"?-o:o;$l(t,n,a)}}_getUniformDataChanges(){let t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];let e=this.data.datasets.length,s=o=>new Set(t.filter(a=>a[0]===o).map((a,r)=>r+","+a.splice(1).join(","))),n=s(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;J.update(this,this.width,this.height,t);let e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],E(this.boxes,n=>{s&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,s=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){let e=this.ctx,s={meta:t,index:t.index,cancelable:!0},n=hs(this,t);this.notifyPlugins("beforeDatasetDraw",s)!==!1&&(n&&Pe(e,n),t.controller.draw(),n&&De(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return ht(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,n){let o=Xr.modes[e];return typeof o=="function"?o(this,t,s,n):[]}getDatasetMeta(t){let e=this.data.datasets[t],s=this._metasets,n=s.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(n)),n}getContext(){return this.$context||(this.$context=yt(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){let e=this.data.datasets[t];if(!e)return!1;let s=this.getDatasetMeta(t);return typeof s.hidden=="boolean"?!s.hidden:!e.hidden}setDatasetVisibility(t,e){let s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){let n=s?"show":"hide",o=this.getDatasetMeta(t),a=o.controller._resolveAnimations(void 0,n);ee(e)?(o.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(o,{visible:s}),this.update(r=>r.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){let e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),vt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,o,a),t[o]=a},n=(o,a,r)=>{o.offsetX=a,o.offsetY=r,this._eventHandler(o)};E(this.options.events,o=>s(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});let t=this._responsiveListeners,e=this.platform,s=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)},a,r=()=>{n("attach",r),this.attached=!0,this.resize(),s("resize",o),s("detach",a)};a=()=>{this.attached=!1,n("resize",o),this._stop(),this._resize(0,0),s("attach",r)},e.isAttached(this.canvas)?r():a()}unbindEvents(){E(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},E(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){let n=s?"set":"remove",o,a,r,l;for(e==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),r=0,l=t.length;r{let r=this.getDatasetMeta(o);if(!r)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:r.data[a],index:a}});!we(s,e)&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,s){let n=this.options.hover,o=(l,c)=>l.filter(h=>!c.some(d=>h.datasetIndex===d.datasetIndex&&h.index===d.index)),a=o(e,t),r=s?t:o(t,e);a.length&&this.updateHoverStyle(a,n.mode,!1),r.length&&n.mode&&this.updateHoverStyle(r,n.mode,!0)}_eventHandler(t,e){let s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=a=>(a.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",s,n)===!1)return;let o=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,n),(o||s.changed)&&this.render(),this}_handleEvent(t,e,s){let{_active:n=[],options:o}=this,a=e,r=this._getActiveElements(t,n,s,a),l=nn(t),c=Yl(t,this._lastEvent,s,l);s&&(this._lastEvent=null,F(o.onHover,[t,r,this],this),l&&F(o.onClick,[t,r,this],this));let h=!we(r,n);return(h||e)&&(this._active=r,this._updateHoverStyles(r,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,s,n){if(t.type==="mouseout")return[];if(!s)return e;let o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}};M(at,"defaults",V),M(at,"instances",yi),M(at,"overrides",Ot),M(at,"registry",gt),M(at,"version",Nl),M(at,"getChart",io);function so(){return E(at.instances,i=>i._plugins.invalidate())}function Ul(i,t,e){let{startAngle:s,x:n,y:o,outerRadius:a,innerRadius:r,options:l}=t,{borderWidth:c,borderJoinStyle:h}=l,d=Math.min(c/a,X(s-e));if(i.beginPath(),i.arc(n,o,a-c/2,s+d/2,e-d/2),r>0){let u=Math.min(c/r,X(s-e));i.arc(n,o,r+c/2,e-u/2,s+u/2,!0)}else{let u=Math.min(c/2,a*X(s-e));if(h==="round")i.arc(n,o,u,e-R/2,s+R/2,!0);else if(h==="bevel"){let f=2*u*u,g=-f*Math.cos(e+R/2)+n,p=-f*Math.sin(e+R/2)+o,m=f*Math.cos(s+R/2)+n,b=f*Math.sin(s+R/2)+o;i.lineTo(g,p),i.lineTo(m,b)}}i.closePath(),i.moveTo(0,0),i.rect(0,0,i.canvas.width,i.canvas.height),i.clip("evenodd")}function Xl(i,t,e){let{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=t,c=n/r;i.beginPath(),i.arc(o,a,r,s-c,e+c),l>n?(c=n/l,i.arc(o,a,l,e+c,s-c,!0)):i.arc(o,a,n,e+H,s-H),i.closePath(),i.clip()}function Kl(i){return li(i,["outerStart","outerEnd","innerStart","innerEnd"])}function ql(i,t,e,s){let n=Kl(i.options.borderRadius),o=(e-t)/2,a=Math.min(o,s*t/2),r=l=>{let c=(e-Math.min(o,l))*s/2;return Y(l,0,Math.min(o,c))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Y(n.innerStart,0,a),innerEnd:Y(n.innerEnd,0,a)}}function re(i,t,e,s){return{x:e+i*Math.cos(t),y:s+i*Math.sin(t)}}function wi(i,t,e,s,n,o){let{x:a,y:r,startAngle:l,pixelMargin:c,innerRadius:h}=t,d=Math.max(t.outerRadius+s+e-c,0),u=h>0?h+s+e+c:0,f=0,g=n-l;if(s){let I=h>0?h-s:0,W=d>0?d-s:0,j=(I+W)/2,rt=j!==0?g*j/(j+s):g;f=(g-rt)/2}let p=Math.max(.001,g*d-e/R)/d,m=(g-p)/2,b=l+m+f,x=n-m-f,{outerStart:v,outerEnd:y,innerStart:_,innerEnd:k}=ql(t,u,d,x-b),w=d-v,S=d-y,P=b+v/w,O=x-y/S,C=u+_,L=u+k,U=b+_/C,et=x-k/L;if(i.beginPath(),o){let I=(P+O)/2;if(i.arc(a,r,d,P,I),i.arc(a,r,d,I,O),y>0){let G=re(S,O,a,r);i.arc(G.x,G.y,y,O,x+H)}let W=re(L,x,a,r);if(i.lineTo(W.x,W.y),k>0){let G=re(L,et,a,r);i.arc(G.x,G.y,k,x+H,et+Math.PI)}let j=(x-k/u+(b+_/u))/2;if(i.arc(a,r,u,x-k/u,j,!0),i.arc(a,r,u,j,b+_/u,!0),_>0){let G=re(C,U,a,r);i.arc(G.x,G.y,_,U+Math.PI,b-H)}let rt=re(w,b,a,r);if(i.lineTo(rt.x,rt.y),v>0){let G=re(w,P,a,r);i.arc(G.x,G.y,v,b-H,P)}}else{i.moveTo(a,r);let I=Math.cos(P)*d+a,W=Math.sin(P)*d+r;i.lineTo(I,W);let j=Math.cos(O)*d+a,rt=Math.sin(O)*d+r;i.lineTo(j,rt)}i.closePath()}function Gl(i,t,e,s,n){let{fullCircles:o,startAngle:a,circumference:r}=t,l=t.endAngle;if(o){wi(i,t,e,s,l,n);for(let c=0;c=R&&f===0&&h!=="miter"&&Ul(i,t,p),o||(wi(i,t,e,s,p,n),i.stroke())}var jt=class extends st{constructor(e){super();M(this,"circumference");M(this,"endAngle");M(this,"fullCircles");M(this,"innerRadius");M(this,"outerRadius");M(this,"pixelMargin");M(this,"startAngle");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,s,n){let o=this.getProps(["x","y"],n),{angle:a,distance:r}=Hi(o,{x:e,y:s}),{startAngle:l,endAngle:c,innerRadius:h,outerRadius:d,circumference:u}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),f=(this.options.spacing+this.options.borderWidth)/2,g=D(u,c-l),p=se(a,l,c)&&l!==c,m=g>=B||p,b=ut(r,h+f,d+f);return m&&b}getCenterPoint(e){let{x:s,y:n,startAngle:o,endAngle:a,innerRadius:r,outerRadius:l}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:c,spacing:h}=this.options,d=(o+a)/2,u=(r+l+h+c)/2;return{x:s+Math.cos(d)*u,y:n+Math.sin(d)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:s,circumference:n}=this,o=(s.offset||0)/4,a=(s.spacing||0)/2,r=s.circular;if(this.pixelMargin=s.borderAlign==="inner"?.33:0,this.fullCircles=n>B?Math.floor(n/B):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let l=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(l)*o,Math.sin(l)*o);let c=1-Math.sin(Math.min(R,n||0)),h=o*c;e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,Gl(e,this,h,a,r),Jl(e,this,h,a,r),e.restore()}};M(jt,"id","arc"),M(jt,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),M(jt,"defaultRoutes",{backgroundColor:"backgroundColor"}),M(jt,"descriptors",{_scriptable:!0,_indexable:e=>e!=="borderDash"});function Wo(i,t,e=t){i.lineCap=D(e.borderCapStyle,t.borderCapStyle),i.setLineDash(D(e.borderDash,t.borderDash)),i.lineDashOffset=D(e.borderDashOffset,t.borderDashOffset),i.lineJoin=D(e.borderJoinStyle,t.borderJoinStyle),i.lineWidth=D(e.borderWidth,t.borderWidth),i.strokeStyle=D(e.borderColor,t.borderColor)}function Zl(i,t,e){i.lineTo(e.x,e.y)}function Ql(i){return i.stepped?mn:i.tension||i.cubicInterpolationMode==="monotone"?bn:Zl}function No(i,t,e={}){let s=i.length,{start:n=0,end:o=s-1}=e,{start:a,end:r}=t,l=Math.max(n,a),c=Math.min(o,r),h=nr&&o>r;return{count:s,start:l,loop:t.loop,ilen:c(a+(c?r-y:y))%o,v=()=>{p!==m&&(i.lineTo(h,m),i.lineTo(h,p),i.lineTo(h,b))};for(l&&(f=n[x(0)],i.moveTo(f.x,f.y)),u=0;u<=r;++u){if(f=n[x(u)],f.skip)continue;let y=f.x,_=f.y,k=y|0;k===g?(_m&&(m=_),h=(d*h+y)/++d):(v(),i.lineTo(y,_),g=k,d=0,p=m=_),b=_}v()}function Ls(i){let t=i.options,e=t.borderDash&&t.borderDash.length;return!i._decimated&&!i._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?ec:tc}function ic(i){return i.stepped?Pn:i.tension||i.cubicInterpolationMode==="monotone"?Dn:Pt}function sc(i,t,e,s){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,s)&&n.closePath()),Wo(i,t.options),i.stroke(n)}function nc(i,t,e,s){let{segments:n,options:o}=t,a=Ls(t);for(let r of n)Wo(i,o,r.style),i.beginPath(),a(i,t,r,{start:e,end:e+s-1})&&i.closePath(),i.stroke()}var oc=typeof Path2D=="function";function ac(i,t,e,s){oc&&!t.options.segment?sc(i,t,e,s):nc(i,t,e,s)}var pt=class extends st{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){let s=this.options;if((s.tension||s.cubicInterpolationMode==="monotone")&&!s.stepped&&!this._pointsUpdated){let n=s.spanGaps?this._loop:this._fullLoop;kn(this._points,s,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Cn(this,this.options.segment))}first(){let t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){let t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){let s=this.options,n=t[e],o=this.points,a=cs(this,{property:e,start:n,end:n});if(!a.length)return;let r=[],l=ic(s),c,h;for(c=0,h=a.length;ct!=="borderDash"&&t!=="fill"});function no(i,t,e,s){let n=i.options,{[e]:o}=i.getProps([e],s);return Math.abs(t-o)i.replace("rgb(","rgba(").replace(")",", 0.5)"));function jo(i){return Rs[i%Rs.length]}function $o(i){return oo[i%oo.length]}function fc(i,t){return i.borderColor=jo(t),i.backgroundColor=$o(t),++t}function gc(i,t){return i.backgroundColor=i.data.map(()=>jo(t++)),t}function pc(i,t){return i.backgroundColor=i.data.map(()=>$o(t++)),t}function mc(i){let t=0;return(e,s)=>{let n=i.getDatasetMeta(s).controller;n instanceof kt?t=gc(e,t):n instanceof Yt?t=pc(e,t):n&&(t=fc(e,t))}}function ao(i){let t;for(t in i)if(i[t].borderColor||i[t].backgroundColor)return!0;return!1}function bc(i){return i&&(i.borderColor||i.backgroundColor)}function xc(){return V.borderColor!=="rgba(0,0,0,0.1)"||V.backgroundColor!=="rgba(0,0,0,0.1)"}var _c={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(i,t,e){if(!e.enabled)return;let{data:{datasets:s},options:n}=i.config,{elements:o}=n,a=ao(s)||bc(n)||o&&ao(o)||xc();if(!e.forceOverride&&a)return;let r=mc(i);s.forEach(r)}};function yc(i,t,e,s,n){let o=n.samples||s;if(o>=e)return i.slice(t,t+e);let a=[],r=(e-2)/(o-2),l=0,c=t+e-1,h=t,d,u,f,g,p;for(a[l++]=i[h],d=0;df&&(f=g,u=i[x],p=x);a[l++]=u,h=p}return a[l++]=i[c],a}function vc(i,t,e,s){let n=0,o=0,a,r,l,c,h,d,u,f,g,p,m=[],b=t+e-1,x=i[t].x,y=i[b].x-x;for(a=t;ap&&(p=c,u=a),n=(o*n+r.x)/++o;else{let k=a-1;if(!A(d)&&!A(u)){let w=Math.min(d,u),S=Math.max(d,u);w!==f&&w!==k&&m.push({...i[w],x:n}),S!==f&&S!==k&&m.push({...i[S],x:n})}a>0&&k!==f&&m.push(i[k]),m.push(r),h=_,o=0,g=p=c,d=u=f=a}}return m}function Yo(i){if(i._decimated){let t=i._data;delete i._decimated,delete i._data,Object.defineProperty(i,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function ro(i){i.data.datasets.forEach(t=>{Yo(t)})}function Mc(i,t){let e=t.length,s=0,n,{iScale:o}=i,{min:a,max:r,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(s=Y(ct(t,o.axis,a).lo,0,e-1)),c?n=Y(ct(t,o.axis,r).hi+1,s,e)-s:n=e-s,{start:s,count:n}}var kc={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(i,t,e)=>{if(!e.enabled){ro(i);return}let s=i.width;i.data.datasets.forEach((n,o)=>{let{_data:a,indexAxis:r}=n,l=i.getDatasetMeta(o),c=a||n.data;if(ae([r,i.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;let h=i.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||i.options.parsing)return;let{start:d,count:u}=Mc(l,c),f=e.threshold||4*s;if(u<=f){Yo(n);return}A(a)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(p){this._data=p}}));let g;switch(e.algorithm){case"lttb":g=yc(c,d,u,s,e);break;case"min-max":g=vc(c,d,u,s);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=g})},destroy(i){ro(i)}};function wc(i,t,e){let s=i.segments,n=i.points,o=t.points,a=[];for(let r of s){let{start:l,end:c}=r;c=Di(l,c,n);let h=Es(e,n[l],n[c],r.loop);if(!t.segments){a.push({source:r,target:h,start:n[l],end:n[c]});continue}let d=cs(t,h);for(let u of d){let f=Es(e,o[u.start],o[u.end],u.loop),g=ls(r,n,f);for(let p of g)a.push({source:p,target:u,start:{[e]:lo(h,f,"start",Math.max)},end:{[e]:lo(h,f,"end",Math.min)}})}}return a}function Es(i,t,e,s){if(s)return;let n=t[i],o=e[i];return i==="angle"&&(n=X(n),o=X(o)),{property:i,start:n,end:o}}function Sc(i,t){let{x:e=null,y:s=null}=i||{},n=t.points,o=[];return t.segments.forEach(({start:a,end:r})=>{r=Di(a,r,n);let l=n[a],c=n[r];s!==null?(o.push({x:l.x,y:s}),o.push({x:c.x,y:s})):e!==null&&(o.push({x:e,y:l.y}),o.push({x:e,y:c.y}))}),o}function Di(i,t,e){for(;t>i;t--){let s=e[t];if(!isNaN(s.x)&&!isNaN(s.y))break}return t}function lo(i,t,e,s){return i&&t?s(i[e],t[e]):i?i[e]:t?t[e]:0}function Uo(i,t){let e=[],s=!1;return z(i)?(s=!0,e=i):e=Sc(i,t),e.length?new pt({points:e,options:{tension:0},_loop:s,_fullLoop:s}):null}function co(i){return i&&i.fill!==!1}function Pc(i,t,e){let n=i[t].fill,o=[t],a;if(!e)return n;for(;n!==!1&&o.indexOf(n)===-1;){if(!N(n))return n;if(a=i[n],!a)return!1;if(a.visible)return n;o.push(n),n=a.fill}return!1}function Dc(i,t,e){let s=Tc(i);if(T(s))return isNaN(s.value)?!1:s;let n=parseFloat(s);return N(n)&&Math.floor(n)===n?Oc(s[0],t,n,e):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function Oc(i,t,e,s){return(i==="-"||i==="+")&&(e=t+e),e===t||e<0||e>=s?!1:e}function Cc(i,t){let e=null;return i==="start"?e=t.bottom:i==="end"?e=t.top:T(i)?e=t.getPixelForValue(i.value):t.getBasePixel&&(e=t.getBasePixel()),e}function Ac(i,t,e){let s;return i==="start"?s=e:i==="end"?s=t.options.reverse?t.min:t.max:T(i)?s=i.value:s=t.getBaseValue(),s}function Tc(i){let t=i.options,e=t.fill,s=D(e&&e.target,e);return s===void 0&&(s=!!t.backgroundColor),s===!1||s===null?!1:s===!0?"origin":s}function Lc(i){let{scale:t,index:e,line:s}=i,n=[],o=s.segments,a=s.points,r=Rc(t,e);r.push(Uo({x:null,y:t.bottom},s));for(let l=0;l=0;--a){let r=n[a].$filler;r&&(r.line.updateControlPoints(o,r.axis),s&&r.fill&&ys(i.ctx,r,o))}},beforeDatasetsDraw(i,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;let s=i.getSortedVisibleDatasetMetas();for(let n=s.length-1;n>=0;--n){let o=s[n].$filler;co(o)&&ys(i.ctx,o,i.chartArea)}},beforeDatasetDraw(i,t,e){let s=t.meta.$filler;!co(s)||e.drawTime!=="beforeDatasetDraw"||ys(i.ctx,s,i.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}},go=(i,t)=>{let{boxHeight:e=t,boxWidth:s=t}=i;return i.usePointStyle&&(e=Math.min(e,t),s=i.pointStyleWidth||Math.min(s,t)),{boxWidth:s,boxHeight:e,itemHeight:Math.max(t,e)}},$c=(i,t)=>i!==null&&t!==null&&i.datasetIndex===t.datasetIndex&&i.index===t.index,Pi=class extends st{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let t=this.options.labels||{},e=F(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(s=>t.filter(s,this.chart.data))),t.sort&&(e=e.sort((s,n)=>t.sort(s,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){let{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}let s=t.labels,n=$(s.font),o=n.size,a=this._computeTitleHeight(),{boxWidth:r,itemHeight:l}=go(s,o),c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(a,o,r,l)+10):(h=this.maxHeight,c=this._fitCols(a,n,r,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,n){let{ctx:o,maxWidth:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+r,d=t;o.textAlign="left",o.textBaseline="middle";let u=-1,f=-h;return this.legendItems.forEach((g,p)=>{let m=s+e/2+o.measureText(g.text).width;(p===0||c[c.length-1]+m+2*r>a)&&(d+=h,c[c.length-(p>0?0:1)]=0,f+=h,u++),l[p]={left:0,top:f,row:u,width:m,height:n},c[c.length-1]+=m+r}),d}_fitCols(t,e,s,n){let{ctx:o,maxHeight:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=a-t,d=r,u=0,f=0,g=0,p=0;return this.legendItems.forEach((m,b)=>{let{itemWidth:x,itemHeight:v}=Yc(s,e,o,m,n);b>0&&f+v+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,p++,u=f=0),l[b]={left:g,top:f,col:p,width:x,height:v},u=Math.max(u,x),f+=v+r}),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){if(!this.options.display)return;let t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:n},rtl:o}}=this,a=Wt(o,this.left,this.width);if(this.isHorizontal()){let r=0,l=K(s,this.left+n,this.right-this.lineWidths[r]);for(let c of e)r!==c.row&&(r=c.row,l=K(s,this.left+n,this.right-this.lineWidths[r])),c.top+=this.top+t+n,c.left=a.leftForLtr(a.x(l),c.width),l+=c.width+n}else{let r=0,l=K(s,this.top+t+n,this.bottom-this.columnSizes[r].height);for(let c of e)c.col!==r&&(r=c.col,l=K(s,this.top+t+n,this.bottom-this.columnSizes[r].height)),c.top=l,c.left+=this.left+n,c.left=a.leftForLtr(a.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){let t=this.ctx;Pe(t,this),this._draw(),De(t)}}_draw(){let{options:t,columnSizes:e,lineWidths:s,ctx:n}=this,{align:o,labels:a}=t,r=V.color,l=Wt(t.rtl,this.left,this.width),c=$(a.font),{padding:h}=a,d=c.size,u=d/2,f;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;let{boxWidth:g,boxHeight:p,itemHeight:m}=go(a,d),b=function(k,w,S){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;n.save();let P=D(S.lineWidth,1);if(n.fillStyle=D(S.fillStyle,r),n.lineCap=D(S.lineCap,"butt"),n.lineDashOffset=D(S.lineDashOffset,0),n.lineJoin=D(S.lineJoin,"miter"),n.lineWidth=P,n.strokeStyle=D(S.strokeStyle,r),n.setLineDash(D(S.lineDash,[])),a.usePointStyle){let O={radius:p*Math.SQRT2/2,pointStyle:S.pointStyle,rotation:S.rotation,borderWidth:P},C=l.xPlus(k,g/2),L=w+u;Zi(n,O,C,L,a.pointStyleWidth&&g)}else{let O=w+Math.max((d-p)/2,0),C=l.leftForLtr(k,g),L=Tt(S.borderRadius);n.beginPath(),Object.values(L).some(U=>U!==0)?oe(n,{x:C,y:O,w:g,h:p,radius:L}):n.rect(C,O,g,p),n.fill(),P!==0&&n.stroke()}n.restore()},x=function(k,w,S){At(n,S.text,k,w+m/2,c,{strikethrough:S.hidden,textAlign:l.textAlign(S.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();v?f={x:K(o,this.left+h,this.right-s[0]),y:this.top+h+y,line:0}:f={x:this.left+h,y:K(o,this.top+y+h,this.bottom-e[0].height),line:0},as(this.ctx,t.textDirection);let _=m+h;this.legendItems.forEach((k,w)=>{n.strokeStyle=k.fontColor,n.fillStyle=k.fontColor;let S=n.measureText(k.text).width,P=l.textAlign(k.textAlign||(k.textAlign=a.textAlign)),O=g+u+S,C=f.x,L=f.y;l.setWidth(this.width),v?w>0&&C+O+h>this.right&&(L=f.y+=_,f.line++,C=f.x=K(o,this.left+h,this.right-s[f.line])):w>0&&L+_>this.bottom&&(C=f.x=C+e[f.line].width+h,f.line++,L=f.y=K(o,this.top+y+h,this.bottom-e[f.line].height));let U=l.x(C);if(b(U,L,k),C=fn(P,C+g+u,v?C+O:this.right,t.rtl),x(l.x(C),L,k),v)f.x+=O+h;else if(typeof k.text!="string"){let et=c.lineHeight;f.y+=Xo(k,et)+h}else f.y+=_}),rs(this.ctx,t.textDirection)}drawTitle(){let t=this.options,e=t.title,s=$(e.font),n=q(e.padding);if(!e.display)return;let o=Wt(t.rtl,this.left,this.width),a=this.ctx,r=e.position,l=s.size/2,c=n.top+l,h,d=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),h=this.top+c,d=K(t.align,d,this.right-u);else{let g=this.columnSizes.reduce((p,m)=>Math.max(p,m.height),0);h=c+K(t.align,this.top,this.bottom-g-t.labels.padding-this._computeTitleHeight())}let f=K(r,d,d+u);a.textAlign=o.textAlign(oi(r)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,At(a,e.text,f,h,s)}_computeTitleHeight(){let t=this.options.title,e=$(t.font),s=q(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,n,o;if(ut(t,this.left,this.right)&&ut(e,this.top,this.bottom)){for(o=this.legendHitBoxes,s=0;so.length>a.length?o:a)),t+e.size/2+s.measureText(n).width}function Xc(i,t,e){let s=i;return typeof t.text!="string"&&(s=Xo(t,e)),s}function Xo(i,t){let e=i.text?i.text.length:0;return t*e}function Kc(i,t){return!!((i==="mousemove"||i==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(i==="click"||i==="mouseup"))}var qc={id:"legend",_element:Pi,start(i,t,e){let s=i.legend=new Pi({ctx:i.ctx,options:e,chart:i});J.configure(i,s,e),J.addBox(i,s)},stop(i){J.removeBox(i,i.legend),delete i.legend},beforeUpdate(i,t,e){let s=i.legend;J.configure(i,s,e),s.options=e},afterUpdate(i){let t=i.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(i,t){t.replay||i.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(i,t,e){let s=t.datasetIndex,n=e.chart;n.isDatasetVisible(s)?(n.hide(s),t.hidden=!0):(n.show(s),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:i=>i.chart.options.color,boxWidth:40,padding:10,generateLabels(i){let t=i.data.datasets,{labels:{usePointStyle:e,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=i.legend.options;return i._getSortedDatasetMetas().map(l=>{let c=l.controller.getStyle(e?0:void 0),h=q(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:c.borderColor,pointStyle:s||c.pointStyle,rotation:c.rotation,textAlign:n||c.textAlign,borderRadius:a&&(r||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:i=>i.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:i=>!i.startsWith("on"),labels:{_scriptable:i=>!["generateLabels","filter","sort"].includes(i)}}},He=class extends st{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){let s=this.options;if(this.left=0,this.top=0,!s.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;let n=z(s.text)?s.text.length:1;this._padding=q(s.padding);let o=n*$(s.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){let t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){let{top:e,left:s,bottom:n,right:o,options:a}=this,r=a.align,l=0,c,h,d;return this.isHorizontal()?(h=K(r,s,o),d=e+t,c=o-s):(a.position==="left"?(h=s+t,d=K(r,n,e),l=R*-.5):(h=o-t,d=K(r,e,n),l=R*.5),c=n-e),{titleX:h,titleY:d,maxWidth:c,rotation:l}}draw(){let t=this.ctx,e=this.options;if(!e.display)return;let s=$(e.font),o=s.lineHeight/2+this._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=this._drawArgs(o);At(t,e.text,0,0,s,{color:e.color,maxWidth:l,rotation:c,textAlign:oi(e.align),textBaseline:"middle",translation:[a,r]})}};function Gc(i,t){let e=new He({ctx:i.ctx,options:t,chart:i});J.configure(i,e,t),J.addBox(i,e),i.titleBlock=e}var Jc={id:"title",_element:He,start(i,t,e){Gc(i,e)},stop(i){let t=i.titleBlock;J.removeBox(i,t),delete i.titleBlock},beforeUpdate(i,t,e){let s=i.titleBlock;J.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},mi=new WeakMap,Zc={id:"subtitle",start(i,t,e){let s=new He({ctx:i.ctx,options:e,chart:i});J.configure(i,s,e),J.addBox(i,s),mi.set(i,s)},stop(i){J.removeBox(i,mi.get(i)),mi.delete(i)},beforeUpdate(i,t,e){let s=mi.get(i);J.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}},Ie={average(i){if(!i.length)return!1;let t,e,s=new Set,n=0,o=0;for(t=0,e=i.length;tr+l)/s.size,y:n/o}},nearest(i,t){if(!i.length)return!1;let e=t.x,s=t.y,n=Number.POSITIVE_INFINITY,o,a,r;for(o=0,a=i.length;o-1?i.split(` `):i}function Qc(i,t){let{element:e,datasetIndex:s,index:n}=t,o=i.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:i,label:a,parsed:o.getParsed(n),raw:i.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:e}}function po(i,t){let e=i.chart.ctx,{body:s,footer:n,title:o}=i,{boxWidth:a,boxHeight:r}=t,l=$(t.bodyFont),c=$(t.titleFont),h=$(t.footerFont),d=o.length,u=n.length,f=s.length,g=q(t.padding),p=g.height,m=0,b=s.reduce((y,_)=>y+_.before.length+_.lines.length+_.after.length,0);if(b+=i.beforeBody.length+i.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),b){let y=t.displayColors?Math.max(r,l.lineHeight):l.lineHeight;p+=f*y+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}u&&(p+=t.footerMarginTop+u*h.lineHeight+(u-1)*t.footerSpacing);let x=0,v=function(y){m=Math.max(m,e.measureText(y).width+x)};return e.save(),e.font=c.string,E(i.title,v),e.font=l.string,E(i.beforeBody.concat(i.afterBody),v),x=t.displayColors?a+2+t.boxPadding:0,E(s,y=>{E(y.before,v),E(y.lines,v),E(y.after,v)}),x=0,e.font=h.string,E(i.footer,v),e.restore(),m+=g.width,{width:m,height:p}}function th(i,t){let{y:e,height:s}=t;return ei.height-s/2?"bottom":"center"}function eh(i,t,e,s){let{x:n,width:o}=s,a=e.caretSize+e.caretPadding;if(i==="left"&&n+o+a>t.width||i==="right"&&n-o-a<0)return!0}function ih(i,t,e,s){let{x:n,width:o}=e,{width:a,chartArea:{left:r,right:l}}=i,c="center";return s==="center"?c=n<=(r+l)/2?"left":"right":n<=o/2?c="left":n>=a-o/2&&(c="right"),eh(c,i,t,e)&&(c="center"),c}function mo(i,t,e){let s=e.yAlign||t.yAlign||th(i,e);return{xAlign:e.xAlign||t.xAlign||ih(i,t,e,s),yAlign:s}}function sh(i,t){let{x:e,width:s}=i;return t==="right"?e-=s:t==="center"&&(e-=s/2),e}function nh(i,t,e){let{y:s,height:n}=i;return t==="top"?s+=e:t==="bottom"?s-=n+e:s-=n/2,s}function bo(i,t,e,s){let{caretSize:n,caretPadding:o,cornerRadius:a}=i,{xAlign:r,yAlign:l}=e,c=n+o,{topLeft:h,topRight:d,bottomLeft:u,bottomRight:f}=Tt(a),g=sh(t,r),p=nh(t,l,c);return l==="center"?r==="left"?g+=c:r==="right"&&(g-=c):r==="left"?g-=Math.max(h,u)+n:r==="right"&&(g+=Math.max(d,f)+n),{x:Y(g,0,s.width-t.width),y:Y(p,0,s.height-t.height)}}function bi(i,t,e){let s=q(e.padding);return t==="center"?i.x+i.width/2:t==="right"?i.x+i.width-s.right:i.x+s.left}function xo(i){return ft([],Mt(i))}function oh(i,t,e){return yt(i,{tooltip:t,tooltipItems:e,type:"tooltip"})}function _o(i,t){let e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?i.override(e):i}var Ko={beforeTitle:dt,title(i){if(i.length>0){let t=i[0],e=t.chart.data.labels,s=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(s>0&&t.dataIndex"u"?Ko[t].call(e,s):n}var We=class extends st{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){let t=this._cachedAnimations;if(t)return t;let e=this.chart,s=this.options.setContext(this.getContext()),n=s.enabled&&e.options.animation&&s.animations,o=new vi(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=oh(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){let{callbacks:s}=e,n=Q(s,"beforeTitle",this,t),o=Q(s,"title",this,t),a=Q(s,"afterTitle",this,t),r=[];return r=ft(r,Mt(n)),r=ft(r,Mt(o)),r=ft(r,Mt(a)),r}getBeforeBody(t,e){return xo(Q(e.callbacks,"beforeBody",this,t))}getBody(t,e){let{callbacks:s}=e,n=[];return E(t,o=>{let a={before:[],lines:[],after:[]},r=_o(s,o);ft(a.before,Mt(Q(r,"beforeLabel",this,o))),ft(a.lines,Q(r,"label",this,o)),ft(a.after,Mt(Q(r,"afterLabel",this,o))),n.push(a)}),n}getAfterBody(t,e){return xo(Q(e.callbacks,"afterBody",this,t))}getFooter(t,e){let{callbacks:s}=e,n=Q(s,"beforeFooter",this,t),o=Q(s,"footer",this,t),a=Q(s,"afterFooter",this,t),r=[];return r=ft(r,Mt(n)),r=ft(r,Mt(o)),r=ft(r,Mt(a)),r}_createItems(t){let e=this._active,s=this.chart.data,n=[],o=[],a=[],r=[],l,c;for(l=0,c=e.length;lt.filter(h,d,u,s))),t.itemSort&&(r=r.sort((h,d)=>t.itemSort(h,d,s))),E(r,h=>{let d=_o(t.callbacks,h);n.push(Q(d,"labelColor",this,h)),o.push(Q(d,"labelPointStyle",this,h)),a.push(Q(d,"labelTextColor",this,h))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){let s=this.options.setContext(this.getContext()),n=this._active,o,a=[];if(!n.length)this.opacity!==0&&(o={opacity:0});else{let r=Ie[s.position].call(this,n,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);let l=this._size=po(this,s),c=Object.assign({},r,l),h=mo(this.chart,s,c),d=bo(s,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,o={opacity:1,x:d.x,y:d.y,width:l.width,height:l.height,caretX:r.x,caretY:r.y}}this._tooltipItems=a,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,n){let o=this.getCaretPosition(t,s,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,s){let{xAlign:n,yAlign:o}=this,{caretSize:a,cornerRadius:r}=s,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:d}=Tt(r),{x:u,y:f}=t,{width:g,height:p}=e,m,b,x,v,y,_;return o==="center"?(y=f+p/2,n==="left"?(m=u,b=m-a,v=y+a,_=y-a):(m=u+g,b=m+a,v=y-a,_=y+a),x=m):(n==="left"?b=u+Math.max(l,h)+a:n==="right"?b=u+g-Math.max(c,d)-a:b=this.caretX,o==="top"?(v=f,y=v-a,m=b-a,x=b+a):(v=f+p,y=v+a,m=b+a,x=b-a),_=v),{x1:m,x2:b,x3:x,y1:v,y2:y,y3:_}}drawTitle(t,e,s){let n=this.title,o=n.length,a,r,l;if(o){let c=Wt(s.rtl,this.x,this.width);for(t.x=bi(this,s.titleAlign,s),e.textAlign=c.textAlign(s.titleAlign),e.textBaseline="middle",a=$(s.titleFont),r=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;lx!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,oe(t,{x:p,y:g,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),oe(t,{x:m,y:g+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(p,g,c,l),t.strokeRect(p,g,c,l),t.fillStyle=a.backgroundColor,t.fillRect(m,g+1,c-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){let{body:n}=this,{bodySpacing:o,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c,boxPadding:h}=s,d=$(s.bodyFont),u=d.lineHeight,f=0,g=Wt(s.rtl,this.x,this.width),p=function(S){e.fillText(S,g.x(t.x+f),t.y+u/2),t.y+=u+o},m=g.textAlign(a),b,x,v,y,_,k,w;for(e.textAlign=a,e.textBaseline="middle",e.font=d.string,t.x=bi(this,m,s),e.fillStyle=s.bodyColor,E(this.beforeBody,p),f=r&&m!=="right"?a==="center"?c/2+h:c+2+h:0,y=0,k=n.length;y0&&e.stroke()}_updateAnimationTarget(t){let e=this.chart,s=this.$animations,n=s&&s.x,o=s&&s.y;if(n||o){let a=Ie[t.position].call(this,this._active,this._eventPosition);if(!a)return;let r=this._size=po(this,t),l=Object.assign({},a,this._size),c=mo(e,t,l),h=bo(t,l,c,e);(n._to!==h.x||o._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=r.width,this.height=r.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){let e=this.options.setContext(this.getContext()),s=this.opacity;if(!s)return;this._updateAnimationTarget(e);let n={width:this.width,height:this.height},o={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;let a=q(e.padding),r=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&r&&(t.save(),t.globalAlpha=s,this.drawBackground(o,t,n,e),as(t,e.textDirection),o.y+=a.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),rs(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){let s=this._active,n=t.map(({datasetIndex:r,index:l})=>{let c=this.chart.getDatasetMeta(r);if(!c)throw new Error("Cannot find a dataset at index "+r);return{datasetIndex:r,element:c.data[l],index:l}}),o=!we(s,n),a=this._positionChanged(n,e);(o||a)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let n=this.options,o=this._active||[],a=this._getActiveElements(t,o,e,s),r=this._positionChanged(a,t),l=e||!we(a,o)||r;return l&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,n){let o=this.options;if(t.type==="mouseout")return[];if(!n)return e.filter(r=>this.chart.data.datasets[r.datasetIndex]&&this.chart.getDatasetMeta(r.datasetIndex).controller.getParsed(r.index)!==void 0);let a=this.chart.getElementsAtEventForMode(t,o.mode,o,s);return o.reverse&&a.reverse(),a}_positionChanged(t,e){let{caretX:s,caretY:n,options:o}=this,a=Ie[o.position].call(this,t,e);return a!==!1&&(s!==a.x||n!==a.y)}};M(We,"positioners",Ie);var ah={id:"tooltip",_element:We,positioners:Ie,afterInit(i,t,e){e&&(i.tooltip=new We({chart:i,options:e}))},beforeUpdate(i,t,e){i.tooltip&&i.tooltip.initialize(e)},reset(i,t,e){i.tooltip&&i.tooltip.initialize(e)},afterDraw(i){let t=i.tooltip;if(t&&t._willRender()){let e={tooltip:t};if(i.notifyPlugins("beforeTooltipDraw",{...e,cancelable:!0})===!1)return;t.draw(i.ctx),i.notifyPlugins("afterTooltipDraw",e)}},afterEvent(i,t){if(i.tooltip){let e=t.replay;i.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(i,t)=>t.bodyFont.size,boxWidth:(i,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Ko},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:i=>i!=="filter"&&i!=="itemSort"&&i!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},rh=Object.freeze({__proto__:null,Colors:_c,Decimation:kc,Filler:jc,Legend:qc,SubTitle:Zc,Title:Jc,Tooltip:ah}),lh=(i,t,e,s)=>(typeof t=="string"?(e=i.push(t)-1,s.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function ch(i,t,e,s){let n=i.indexOf(t);if(n===-1)return lh(i,t,e,s);let o=i.lastIndexOf(t);return n!==o?e:n}var hh=(i,t)=>i===null?null:Y(Math.round(i),0,t);function yo(i){let t=this.getLabels();return i>=0&&ie.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}};M(Fe,"id","category"),M(Fe,"defaults",{ticks:{callback:yo}});function dh(i,t){let e=[],{bounds:n,step:o,min:a,max:r,precision:l,count:c,maxTicks:h,maxDigits:d,includeBounds:u}=i,f=o||1,g=h-1,{min:p,max:m}=t,b=!A(a),x=!A(r),v=!A(c),y=(m-p)/(d+1),_=Vi((m-p)/g/f)*f,k,w,S,P;if(_<1e-14&&!b&&!x)return[{value:p},{value:m}];P=Math.ceil(m/_)-Math.floor(p/_),P>g&&(_=Vi(P*_/g/f)*f),A(l)||(k=Math.pow(10,l),_=Math.ceil(_*k)/k),n==="ticks"?(w=Math.floor(p/_)*_,S=Math.ceil(m/_)*_):(w=p,S=m),b&&x&&o&&an((r-a)/o,_/1e3)?(P=Math.round(Math.min((r-a)/_,h)),_=(r-a)/P,w=a,S=r):v?(w=b?a:w,S=x?r:S,P=c-1,_=(S-w)/P):(P=(S-w)/_,ie(P,Math.round(P),_/1e3)?P=Math.round(P):P=Math.ceil(P));let O=Math.max(Ni(_),Ni(w));k=Math.pow(10,A(l)?O:l),w=Math.round(w*k)/k,S=Math.round(S*k)/k;let C=0;for(b&&(u&&w!==a?(e.push({value:a}),wr)break;e.push({value:L})}return x&&u&&S!==r?e.length&&ie(e[e.length-1].value,r,vo(r,y,i))?e[e.length-1].value=r:e.push({value:r}):(!x||S===r)&&e.push({value:S}),e}function vo(i,t,{horizontal:e,minRotation:s}){let n=ot(s),o=(e?Math.sin(n):Math.cos(n))||.001,a=.75*t*(""+i).length;return Math.min(t/o,a)}var me=class extends Xt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return A(t)||(typeof t=="number"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){let{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds(),{min:n,max:o}=this,a=l=>n=e?n:l,r=l=>o=s?o:l;if(t){let l=lt(n),c=lt(o);l<0&&c<0?r(0):l>0&&c>0&&a(0)}if(n===o){let l=o===0?1:Math.abs(o*.05);r(o+l),t||a(n-l)}this.min=n,this.max=o}getTickLimit(){let t=this.options.ticks,{maxTicksLimit:e,stepSize:s}=t,n;return s?(n=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){let t=this.options,e=t.ticks,s=this.getTickLimit();s=Math.max(2,s);let n={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},o=this._range||this,a=dh(n,o);return t.bounds==="ticks"&&Wi(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){let t=this.ticks,e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){let n=(s-e)/Math.max(t.length-1,1)/2;e-=n,s+=n}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}},ze=class extends me{determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=N(t)?t:0,this.max=N(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){let t=this.isHorizontal(),e=t?this.width:this.height,s=ot(this.options.ticks.minRotation),n=(t?Math.sin(s):Math.cos(s))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}};M(ze,"id","linear"),M(ze,"defaults",{ticks:{callback:Se.formatters.numeric}});var je=i=>Math.floor(xt(i)),Ht=(i,t)=>Math.pow(10,je(i)+t);function Mo(i){return i/Math.pow(10,je(i))===1}function ko(i,t,e){let s=Math.pow(10,e),n=Math.floor(i/s);return Math.ceil(t/s)-n}function uh(i,t){let e=t-i,s=je(e);for(;ko(i,t,s)>10;)s++;for(;ko(i,t,s)<10;)s--;return Math.min(s,je(i))}function fh(i,{min:t,max:e}){t=Z(i.min,t);let s=[],n=je(t),o=uh(t,e),a=o<0?Math.pow(10,Math.abs(o)):1,r=Math.pow(10,o),l=n>o?Math.pow(10,n):0,c=Math.round((t-l)*a)/a,h=Math.floor((t-l)/r/10)*r*10,d=Math.floor((c-h)/Math.pow(10,o)),u=Z(i.min,Math.round((l+h+d*Math.pow(10,o))*a)/a);for(;u=10?d=d<15?15:20:d++,d>=20&&(o++,d=2,a=o>=0?1:a),u=Math.round((l+h+d*Math.pow(10,o))*a)/a;let f=Z(i.max,u);return s.push({value:f,major:Mo(f),significand:d}),s}var Be=class extends Xt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){let s=me.prototype.parse.apply(this,[t,e]);if(s===0){this._zero=!0;return}return N(s)&&s>0?s:null}determineDataLimits(){let{min:t,max:e}=this.getMinMax(!0);this.min=N(t)?Math.max(0,t):null,this.max=N(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!N(this._userMin)&&(this.min=t===Ht(this.min,0)?Ht(this.min,-1):Ht(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:t,maxDefined:e}=this.getUserBounds(),s=this.min,n=this.max,o=r=>s=t?s:r,a=r=>n=e?n:r;s===n&&(s<=0?(o(1),a(10)):(o(Ht(s,-1)),a(Ht(n,1)))),s<=0&&o(Ht(n,-1)),n<=0&&a(Ht(s,1)),this.min=s,this.max=n}buildTicks(){let t=this.options,e={min:this._userMin,max:this._userMax},s=fh(e,this);return t.bounds==="ticks"&&Wi(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return t===void 0?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){let t=this.min;super.configure(),this._startValue=xt(t),this._valueRange=xt(this.max)-xt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(xt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){let e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}};M(Be,"id","logarithmic"),M(Be,"defaults",{ticks:{callback:Se.formatters.logarithmic,major:{enabled:!0}}});function Is(i){let t=i.ticks;if(t.display&&i.display){let e=q(t.backdropPadding);return D(t.font&&t.font.size,V.font.size)+e.height}return 0}function gh(i,t,e){return e=z(e)?e:[e],{w:pn(i,t.string,e),h:e.length*t.lineHeight}}function wo(i,t,e,s,n){return i===s||i===n?{start:t-e/2,end:t+e/2}:in?{start:t-e,end:t}:{start:t,end:t+e}}function ph(i){let t={l:i.left+i._padding.left,r:i.right-i._padding.right,t:i.top+i._padding.top,b:i.bottom-i._padding.bottom},e=Object.assign({},t),s=[],n=[],o=i._pointLabels.length,a=i.options.pointLabels,r=a.centerPointLabels?R/o:0;for(let l=0;lt.r&&(r=(s.end-t.r)/o,i.r=Math.max(i.r,t.r+r)),n.startt.b&&(l=(n.end-t.b)/a,i.b=Math.max(i.b,t.b+l))}function bh(i,t,e){let s=i.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=e,l=i.getPointPosition(t,s+n+a,o),c=Math.round(si(X(l.angle+H))),h=Mh(l.y,r.h,c),d=yh(c),u=vh(l.x,r.w,d);return{visible:!0,x:l.x,y:h,textAlign:d,left:u,top:h,right:u+r.w,bottom:h+r.h}}function xh(i,t){if(!t)return!0;let{left:e,top:s,right:n,bottom:o}=i;return!(ht({x:e,y:s},t)||ht({x:e,y:o},t)||ht({x:n,y:s},t)||ht({x:n,y:o},t))}function _h(i,t,e){let s=[],n=i._pointLabels.length,o=i.options,{centerPointLabels:a,display:r}=o.pointLabels,l={extra:Is(o)/2,additionalAngle:a?R/n:0},c;for(let h=0;h270||e<90)&&(i-=t),i}function kh(i,t,e){let{left:s,top:n,right:o,bottom:a}=e,{backdropColor:r}=t;if(!A(r)){let l=Tt(t.borderRadius),c=q(t.backdropPadding);i.fillStyle=r;let h=s-c.left,d=n-c.top,u=o-s+c.width,f=a-n+c.height;Object.values(l).some(g=>g!==0)?(i.beginPath(),oe(i,{x:h,y:d,w:u,h:f,radius:l}),i.fill()):i.fillRect(h,d,u,f)}}function wh(i,t){let{ctx:e,options:{pointLabels:s}}=i;for(let n=t-1;n>=0;n--){let o=i._pointLabelItems[n];if(!o.visible)continue;let a=s.setContext(i.getPointLabelContext(n));kh(e,a,o);let r=$(a.font),{x:l,y:c,textAlign:h}=o;At(e,i._pointLabels[n],l,c+r.lineHeight/2,r,{color:a.color,textAlign:h,textBaseline:"middle"})}}function qo(i,t,e,s){let{ctx:n}=i;if(e)n.arc(i.xCenter,i.yCenter,t,0,B);else{let o=i.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let a=1;a{let n=F(this.options.pointLabels.callback,[e,s],this);return n||n===0?n:""}).filter((e,s)=>this.chart.getDataVisibility(s))}fit(){let t=this.options;t.display&&t.pointLabels.display?ph(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,n))}getIndexAngle(t){let e=B/(this._pointLabels.length||1),s=this.options.startAngle||0;return X(t*e+ot(s))}getDistanceFromCenterForValue(t){if(A(t))return NaN;let e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(A(t))return NaN;let e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){let e=this._pointLabels||[];if(t>=0&&t{if(d!==0||d===0&&this.min<0){l=this.getDistanceFromCenterForValue(h.value);let u=this.getContext(d),f=n.setContext(u),g=o.setContext(u);Sh(this,f,l,a,g)}}),s.display){for(t.save(),r=a-1;r>=0;r--){let h=s.setContext(this.getPointLabelContext(r)),{color:d,lineWidth:u}=h;!u||!d||(t.lineWidth=u,t.strokeStyle=d,t.setLineDash(h.borderDash),t.lineDashOffset=h.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),c=this.getPointPosition(r,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(c.x,c.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){let t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;let n=this.getIndexAngle(0),o,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((r,l)=>{if(l===0&&this.min>=0&&!e.reverse)return;let c=s.setContext(this.getContext(l)),h=$(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,a=t.measureText(r.label).width,t.fillStyle=c.backdropColor;let d=q(c.backdropPadding);t.fillRect(-a/2-d.left,-o-h.size/2-d.top,a+d.width,h.size+d.height)}At(t,r.label,0,-o,h,{color:c.color,strokeColor:c.textStrokeColor,strokeWidth:c.textStrokeWidth})}),t.restore()}drawTitle(){}};M($t,"id","radialLinear"),M($t,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Se.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),M($t,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),M($t,"descriptors",{angleLines:{_fallback:"grid"}});var Oi={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},tt=Object.keys(Oi);function So(i,t){return i-t}function Po(i,t){if(A(t))return null;let e=i._adapter,{parser:s,round:n,isoWeekday:o}=i._parseOpts,a=t;return typeof s=="function"&&(a=s(a)),N(a)||(a=typeof s=="string"?e.parse(a,s):e.parse(a)),a===null?null:(n&&(a=n==="week"&&(Vt(o)||o===!0)?e.startOf(a,"isoWeek",o):e.startOf(a,n)),+a)}function Do(i,t,e,s){let n=tt.length;for(let o=tt.indexOf(i);o=tt.indexOf(e);o--){let a=tt[o];if(Oi[a].common&&i._adapter.diff(n,s,a)>=t-1)return a}return tt[e?tt.indexOf(e):0]}function Oh(i){for(let t=tt.indexOf(i)+1,e=tt.length;t=t?e[s]:e[n];i[o]=!0}}function Ch(i,t,e,s){let n=i._adapter,o=+n.startOf(t[0].value,s),a=t[t.length-1].value,r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=e[r],l>=0&&(t[l].major=!0);return t}function Co(i,t,e){let s=[],n={},o=t.length,a,r;for(a=0;a+t.value))}initOffsets(t=[]){let e=0,s=0,n,o;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?s=o:s=(o-this.getDecimalForValue(t[t.length-2]))/2);let a=t.length<3?.5:.25;e=Y(e,0,a),s=Y(s,0,a),this._offsets={start:e,end:s,factor:1/(e+1+s)}}_generate(){let t=this._adapter,e=this.min,s=this.max,n=this.options,o=n.time,a=o.unit||Do(o.minUnit,e,s,this._getLabelCapacity(e)),r=D(n.ticks.stepSize,1),l=a==="week"?o.isoWeekday:!1,c=Vt(l)||l===!0,h={},d=e,u,f;if(c&&(d=+t.startOf(d,"isoWeek",l)),d=+t.startOf(d,c?"day":a),t.diff(s,e,a)>1e5*r)throw new Error(e+" and "+s+" are too far apart with stepSize of "+r+" "+a);let g=n.ticks.source==="data"&&this.getDataTimestamps();for(u=d,f=0;u+p)}getLabelForValue(t){let e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){let n=this.options.time.displayFormats,o=this._unit,a=e||n[o];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,n){let o=this.options,a=o.ticks.callback;if(a)return F(a,[t,e,s],this);let r=o.time.displayFormats,l=this._unit,c=this._majorUnit,h=l&&r[l],d=c&&r[c],u=s[e],f=c&&d&&u&&u.major;return this._adapter.format(t,n||(f?d:h))}generateTickLabels(t){let e,s,n;for(e=0,s=t.length;e0?r:1}getDataTimestamps(){let t=this._cache.data||[],e,s;if(t.length)return t;let n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,s=n.length;e=i[s].pos&&t<=i[n].pos&&({lo:s,hi:n}=ct(i,"pos",t)),{pos:o,time:r}=i[s],{pos:a,time:l}=i[n]):(t>=i[s].time&&t<=i[n].time&&({lo:s,hi:n}=ct(i,"time",t)),{time:o,pos:r}=i[s],{time:a,pos:l}=i[n]);let c=a-o;return c?r+(l-r)*(t-o)/c:r}var Ve=class extends Ut{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=xi(e,this.min),this._tableRange=xi(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){let{min:e,max:s}=this,n=[],o=[],a,r,l,c,h;for(a=0,r=t.length;a=e&&c<=s&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,r=n.length;an-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;let e=this.getDataTimestamps(),s=this.getLabelTimestamps();return e.length&&s.length?t=this.normalize(e.concat(s)):t=e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(xi(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){let e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return xi(this._table,s*this._tableRange+this._minPos,!0)}};M(Ve,"id","timeseries"),M(Ve,"defaults",Ut.defaults);var Ah=Object.freeze({__proto__:null,CategoryScale:Fe,LinearScale:ze,LogarithmicScale:Be,RadialLinearScale:$t,TimeScale:Ut,TimeSeriesScale:Ve}),Go=[Nr,uc,rh,Ah];at.register(...Go);var Fs=at;function Th({dataChecksum:i,labels:t,values:e}){return{dataChecksum:i,init(){Alpine.effect(()=>{Alpine.store("theme");let s=this.getChart();s&&s.destroy(),this.initChart()}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Alpine.store("theme")==="system"&&this.$nextTick(()=>{let s=this.getChart();s&&s.destroy(),this.initChart()})})},initChart(){if(!(!this.$refs.canvas||!this.$refs.backgroundColorElement||!this.$refs.borderColorElement))return new Fs(this.$refs.canvas,{type:"line",data:{labels:t,datasets:[{data:e,borderWidth:2,fill:"start",tension:.5,backgroundColor:getComputedStyle(this.$refs.backgroundColorElement).color,borderColor:getComputedStyle(this.$refs.borderColorElement).color}]},options:{animation:{duration:0},elements:{point:{radius:0}},maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{x:{display:!1},y:{display:!1}},tooltips:{enabled:!1}}})},getChart(){return this.$refs.canvas?Fs.getChart(this.$refs.canvas):null}}}export{Th as default}; /*! Bundled license information: @kurkle/color/dist/color.esm.js: (*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme * (c) 2024 Jukka Kurkela * Released under the MIT License *) chart.js/dist/chunks/helpers.dataset.js: chart.js/dist/chart.js: (*! * Chart.js v4.5.1 * https://www.chartjs.org * (c) 2025 Chart.js Contributors * Released under the MIT License *) */ ================================================ FILE: public/js/relaticle/flowforge/components/flowforge.js ================================================ function d({state:a}){return{state:a,isLoading:{},fullyLoaded:{},init(){this.$wire.$on("kanban-items-loaded",t=>{let{columnId:e,isFullyLoaded:o}=t;o&&(this.fullyLoaded[e]=!0)})},handleSortableEnd(t){let e=t.to.sortable.toArray(),o=t.item.getAttribute("x-sortable-item");if(!o&&(o=t.item.getAttribute("data-card-id"),!o)){console.error("Flowforge: Could not determine card ID for move operation");return}let s=t.to.getAttribute("data-column-id");if(!s){console.error("Flowforge: Target column ID is missing");return}let i=t.item;this.setCardState(i,!0);let r=e.indexOf(o),l=r>0?e[r-1]:null,n=rthis.setCardState(i,!1)).catch(()=>this.setCardState(i,!1))},setCardState(t,e){t.style.opacity=e?"0.7":"",t.style.pointerEvents=e?"none":""},isLoadingColumn(t){return this.isLoading[t]||!1},isColumnFullyLoaded(t){return this.fullyLoaded[t]||!1},handleSmoothScroll(t){this.isLoadingColumn(t)||this.isColumnFullyLoaded(t)||(this.isLoading[t]=!0,this.$wire.loadMoreItems(t).then(()=>setTimeout(()=>this.isLoading[t]=!1,100)).catch(()=>this.isLoading[t]=!1))},handleColumnScroll(t,e){if(this.isColumnFullyLoaded(e))return;let{scrollTop:o,scrollHeight:s,clientHeight:i}=t.target;(o+i)/s>=.8&&!this.isLoadingColumn(e)&&this.handleSmoothScroll(e)}}}export{d as default}; ================================================ FILE: public/js/relaticle/flowforge/flowforge.js ================================================ function o({state:i}){return{state:i,columns:i.columns,currentColumn:null,isLoading:{},init:function(){this.$wire.$on("kanban-record-created",e=>{let a=e[0].id,t=e[0].column;this.$dispatch("close-modal",{id:"create-record-modal"}),setTimeout(()=>{let n=document.querySelector(`[x-sortable-item="${a}"]`);n&&(n.classList.add("animate-kanban-card-add"),setTimeout(()=>{n.classList.remove("animate-kanban-card-add")},500))},300)}),this.$wire.$on("kanban-record-updated",e=>{}),this.$wire.$on("kanban-record-deleted",e=>{let a=e[0].id;this.$dispatch("close-modal",{id:"edit-record-modal"}),setTimeout(()=>{let t=document.querySelector(`[x-sortable-item="${a}"]`);t&&(t.classList.add("animate-kanban-card-delete"),setTimeout(()=>{t.classList.remove("animate-kanban-card-delete")},500))},300)}),this.$wire.$on("kanban-items-loaded",e=>{let a=e[0]?.columnId;a&&(this.isLoading[a]=!1)}),this.$wire.$on("close-modal",e=>{})},isLoadingColumn(e){return this.isLoading[e]||!1},beginLoading(e){this.isLoading[e]=!0}}}export{o as default}; ================================================ FILE: public/manifest.webmanifest ================================================ { "icons": [ { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ] } ================================================ FILE: public/robots.txt ================================================ User-agent: * Disallow: User-agent: GPTBot Allow: / User-agent: ClaudeBot Allow: / User-agent: PerplexityBot Allow: / User-agent: Google-Extended Allow: / Sitemap: https://relaticle.com/sitemap.xml ================================================ FILE: public/site.webmanifest ================================================ { "name": "Relaticle", "short_name": "Relaticle", "icons": [ { "src": "/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { "src": "/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } ], "theme_color": "#ffffff", "background_color": "#ffffff", "display": "standalone" } ================================================ FILE: rector.php ================================================ withSetProviders(LaravelSetProvider::class) ->withComposerBased(laravel: true) ->withPaths([ __DIR__.'/app', __DIR__.'/packages', __DIR__.'/bootstrap/app.php', __DIR__.'/config', __DIR__.'/database', __DIR__.'/public', ]) ->withSkip([ AddOverrideAttributeToOverriddenMethodsRector::class, RemoveUnusedPrivateMethodRector::class => [ // Skip Filament importer lifecycle hooks - they're called dynamically via callHook() __DIR__.'/app/Filament/Imports/*', ], PrivatizeFinalClassMethodRector::class => [ // Filament expects protected visibility for lifecycle hooks __DIR__.'/app/Filament/Imports/*', ], ArrayToFirstClassCallableRector::class => [ // class_exists has optional bool param that conflicts with Collection::first signature __DIR__.'/app/Providers/AppServiceProvider.php', ], ArrowFunctionDelegatingCallToFirstClassCallableRector::class => [ // class_exists has optional bool param that conflicts with Collection::first signature __DIR__.'/app/Providers/AppServiceProvider.php', ], AddHasFactoryToModelsRector::class => [ __DIR__.'/app/Models/PersonalAccessToken.php', __DIR__.'/packages/ImportWizard/src/Models/*', ], ]) ->withSets([ LaravelSetList::LARAVEL_ARRAYACCESS_TO_METHOD_CALL, LaravelSetList::LARAVEL_ARRAY_STR_FUNCTION_TO_STATIC_CALL, LaravelSetList::LARAVEL_CODE_QUALITY, LaravelSetList::LARAVEL_COLLECTION, LaravelSetList::LARAVEL_CONTAINER_STRING_TO_FULLY_QUALIFIED_NAME, LaravelSetList::LARAVEL_ELOQUENT_MAGIC_METHOD_TO_QUERY_BUILDER, LaravelSetList::LARAVEL_FACADE_ALIASES_TO_FULL_NAMES, LaravelSetList::LARAVEL_FACTORIES, LaravelSetList::LARAVEL_IF_HELPERS, LaravelSetList::LARAVEL_TESTING, LaravelSetList::LARAVEL_TYPE_DECLARATIONS, ]) ->withRules([ EmptyToBlankAndFilledFuncRector::class, UseForwardsCallsTraitRector::class, ]) ->withPreparedSets( deadCode: true, codeQuality: true, typeDeclarations: true, privatization: true, earlyReturn: true, ) ->withPhpSets(); ================================================ FILE: resources/css/app.css ================================================ /* Import Tailwind CSS 4 */ @import "tailwindcss"; /* Tailwind Typography Plugin */ @plugin "@tailwindcss/typography"; @import "./fonts.css"; @import "./theme.css"; [x-cloak] { display: none !important; } ================================================ FILE: resources/css/filament/admin/theme.css ================================================ @import '../../../../vendor/filament/filament/resources/css/theme.css'; @import '../../fonts.css'; @import '../../theme.css'; @source '../../../../app/Filament'; @source '../../../../resources/views/filament'; @source '../../../../vendor/relaticle/custom-fields'; ================================================ FILE: resources/css/filament/app/theme.css ================================================ @import '../../../../vendor/filament/filament/resources/css/theme.css'; @import '../../fonts.css'; @import '../../theme.css'; @source '../../../../app/Filament'; @source '../../../../resources/views'; /* ImportWizard */ @source '../../../../packages/ImportWizard/resources'; @source '../../../../packages/ImportWizardNew/resources'; /* Custom Fields */ @source '../../../../vendor/relaticle/flowforge/resources/views/**/*.blade.php'; @source '../../../../vendor/relaticle/custom-fields/resources'; /* =================================== Relaticle Brand Theme Customization Pure Tailwind CSS Classes Only =================================== */ /* App Panel Custom Layout */ .fi-app-layout { @apply flex h-screen; } .fi-app-main-wrapper { @apply flex-1 flex flex-col min-w-0; /* Only the content area scrolls, not the topbar */ > .fi-layout { @apply flex-1 overflow-y-auto; } } .fi-header-heading { @apply text-2xl font-bold; } /* Sidebar Enhancements */ .fi-sidebar { @apply bg-gray-50 border-r border-gray-200 dark:bg-gray-800 dark:border-gray-800; .fi-dropdown-list-item-image { @apply rounded-md; } } .fi-sidebar-nav { @apply space-y-1 pt-2.5; } .fi-sidebar-item { @apply transition-colors duration-200 ease-in-out; .fi-sidebar-item-btn { @apply dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800; padding-block: calc(var(--spacing) * 1.7); } .fi-sidebar-item-icon { width: calc(var(--spacing) * 5); height: calc(var(--spacing) * 5); } .fi-sidebar-item-grouped-border { width: calc(var(--spacing) * 5); height: calc(var(--spacing) * 5); } } .fi-sidebar-item.fi-active { > .fi-sidebar-item-btn { @apply bg-gray-100 dark:bg-gray-800 font-semibold; } } .fi-sidebar-group { @apply rounded-xl; } .fi-sidebar-group-items { @apply rounded-xl; } /* Top Navigation Bar */ .fi-topbar { @apply min-h-14; } .fi-topbar nav { @apply px-4 lg:px-6; } /* Button Enhancements */ .fi-btn { @apply relative overflow-hidden transition-shadow duration-200 rounded-xl; } /* Icon Buttons */ .fi-icon-btn { @apply rounded-xl; } /* Cards & Sections */ /* Form Components */ .fi-fo-component-ctn { @apply rounded-xl; } /* Select & Dropdown Inputs */ .fi-select-input { @apply rounded-lg; } /* Tables */ .fi-ta-ctn { @apply rounded-xl shadow-sm; } /* Compact table density */ .fi-ta-header-cell { @apply py-2 text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-400; } .fi-ta-text:not(.fi-inline), .fi-ta-icon:not(.fi-inline), .fi-ta-color:not(.fi-inline), .fi-ta-image:not(.fi-inline) { @apply px-3 py-2; } .fi-ta-cell:has(.fi-ta-actions) { @apply px-3 py-2; } .fi-ta-cell:has(.fi-ta-record-checkbox) { @apply py-2; } .fi-ta-cell.fi-ta-selection-cell { @apply py-2 text-start first-of-type:ps-4 sm:first-of-type:ps-4; } /* Column borders on body rows only (header uses resize handle's visual separator) */ .fi-ta-table tbody td:not(:last-child):not(.fi-ta-selection-cell) { @apply border-r border-gray-100 dark:border-gray-800; } .fi-ta-content { @apply rounded-xl overflow-hidden; } .fi-ta-table thead { @apply bg-gradient-to-r from-gray-50 to-gray-100 dark:from-gray-800 dark:to-gray-900; } /* Table header actions */ .fi-ta-header { /*@apply rounded-t-xl;*/ } /* Table bulk actions */ .fi-ta-bulk-actions { @apply rounded-xl; } /* Pagination container */ .fi-ta-pagination { @apply rounded-b-xl bg-white dark:bg-gray-900; } .fi-pagination { @apply rounded-b-xl; } /* Stats Widgets */ .fi-wi-stats-overview-stat { @apply relative overflow-hidden transition-shadow duration-300 bg-gradient-to-br from-white to-gray-50 dark:from-gray-800 dark:to-gray-900 hover:shadow-md rounded-xl; } /* Widget Containers */ .fi-wi-widget { @apply rounded-xl; } /* Badges */ .fi-badge { @apply rounded-lg; } /* Pills & Tags */ .fi-tag { @apply rounded-lg; } /* Modals */ .fi-modal-slide-over { .fi-modal-window { @apply backdrop-blur-sm rounded-xl shadow-xl max-h-[calc(100vh-2rem)] mt-2.5 mr-3; } } .fi-modal-content { @apply rounded-xl; } /* Dropdowns */ .fi-dropdown-panel { @apply rounded-xl; } .fi-dropdown-list-item { @apply rounded-lg; } /* Panels */ .fi-panel { @apply rounded-xl; } /* Infolists */ .fi-in-component { @apply rounded-xl; } /* Action Modals */ .fi-ac-modal { @apply rounded-xl; } /* Breadcrumbs */ .fi-breadcrumbs { @apply text-sm; } .fi-breadcrumbs-item a { @apply transition-colors duration-200 hover:text-primary-600 dark:hover:text-primary-400; } /* Actions */ .fi-ac-action:hover, .fi-ta-actions button:hover { @apply transition-opacity duration-200 opacity-80; } /* Smooth Transitions */ .fi-panel-content { @apply transition-opacity duration-300 ease-out; } /* Custom Scrollbar Styling */ .fi-sidebar { @apply h-full bg-white dark:bg-gray-900; scrollbar-width: thin; scrollbar-color: theme('colors.gray.400') theme('colors.gray.100'); } /* Sidebar scrollable content area */ .fi-sidebar-nav { @apply overflow-y-auto overflow-x-hidden; scrollbar-width: thin; scrollbar-color: theme('colors.gray.400') theme('colors.gray.100'); } .fi-sidebar::-webkit-scrollbar { @apply w-2; } .fi-sidebar::-webkit-scrollbar-track { @apply bg-gray-100 dark:bg-gray-800; } .fi-sidebar::-webkit-scrollbar-thumb { @apply bg-gray-400 dark:bg-gray-600 rounded-full hover:bg-gray-500 dark:hover:bg-gray-500; } /* Additional Component Polish */ /* Avatar */ .fi-avatar { @apply rounded-full; } /* User Menu */ .fi-user-menu-trigger { @apply rounded-xl; } /* Tenant Menu */ .fi-tenant-menu-trigger { @apply rounded-lg; .fi-tenant-avatar { @apply rounded-md w-6 h-6; } } /* Tenant Menu Dropdown - avatar images in the dropdown list */ .fi-tenant-menu .fi-dropdown-list-item-image { @apply rounded-md w-6 h-6 shrink-0; } /* Ensure tenant menu dropdown is visible above content when sidebar is collapsed */ .fi-tenant-menu .fi-dropdown-panel { @apply z-50; } /* Checkbox and Radio */ .fi-checkbox-input { @apply rounded-md; } .fi-radio-input { @apply rounded-lg; } .fi-input-wrp { @apply rounded-lg; } /* Toggle Switch */ .fi-toggle { @apply rounded-full; } /* Color Picker */ .fi-color-picker { @apply rounded-xl; } /* Date Picker */ .fi-date-picker { @apply rounded-xl; } /* File Upload */ .fi-file-upload { @apply rounded-xl; } .fi-file-upload-button { @apply rounded-xl; } /* Rich Editor */ .fi-rich-editor { @apply rounded-xl; } /* Tabs */ .fi-tabs-tab { @apply rounded-xl; } /* Wizard */ .fi-wizard { @apply rounded-xl; } .fi-wizard-step { @apply rounded-xl; } /* Account Widget */ .fi-account-widget { @apply rounded-xl; } /* Simple Page */ .fi-simple-main { @apply rounded-xl; } /* Layout Components */ .fi-layout-component { @apply rounded-xl; } /* Grid and Split Layouts */ .fi-fo-grid { @apply rounded-xl; } .fi-fo-split { @apply rounded-xl; } /* Fieldset */ .fi-fo-fieldset { @apply rounded-xl border border-gray-200 dark:border-gray-700; } /* Repeater */ .fi-fo-repeater { @apply rounded-xl; } .fi-fo-repeater-item { @apply rounded-xl; } /* Builder */ .fi-fo-builder { @apply rounded-xl; } .fi-fo-builder-block { @apply rounded-xl; } /* FlowForge Specific Customizations */ .flowforge-column-header { @apply bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700 rounded-t-xl; } ================================================ FILE: resources/css/fonts.css ================================================ @font-face { font-family: "Inter"; src: url("/fonts/inter/InterVariable.woff2") format("woff2"); font-style: normal; font-weight: 100 900; font-display: swap; } @font-face { font-family: "Satoshi"; src: url("/fonts/satoshi/Satoshi-Variable.woff2") format("woff2"); font-style: normal; font-weight: 300 900; font-display: swap; } @font-face { font-family: "Satoshi"; src: url("/fonts/satoshi/Satoshi-VariableItalic.woff2") format("woff2"); font-style: italic; font-weight: 300 900; font-display: swap; } ================================================ FILE: resources/css/theme.css ================================================ /* Theme Configuration */ @theme { /* Font Family */ --font-default: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-display: "Satoshi", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-sans: var(--font-default); /* Primary Color Scale */ --color-primary-50: oklch(0.969 0.016 293.756); --color-primary-100: oklch(0.943 0.028 294.588); --color-primary-200: oklch(0.894 0.055 293.283); --color-primary-300: oklch(0.811 0.101 293.571); --color-primary-400: oklch(0.709 0.159 293.541); --color-primary-500: oklch(0.606 0.219 292.717); --color-primary-600: oklch(0.541 0.247 293.009); --color-primary-700: oklch(0.491 0.241 292.581); --color-primary-800: oklch(0.432 0.211 292.759); --color-primary-900: oklch(0.380 0.178 293.745); --color-primary-950: oklch(0.283 0.135 291.089); --color-primary: oklch(0.541 0.247 293.009); /* DEFAULT: primary-600 */ } @custom-variant dark (&:where(.dark, .dark *)); /* Hero gradient text animation — slow, subtle shimmer */ @keyframes gradient-shift { 0%, 100% { background-position: 0% center; } 50% { background-position: 100% center; } } /* Badge spinning border */ @keyframes badge-spin { from { --badge-angle: 0deg; } to { --badge-angle: 360deg; } } @property --badge-angle { syntax: ""; initial-value: 0deg; inherits: false; } .hero-badge-wrapper { overflow: hidden; } .hero-badge-border { position: absolute; inset: -1px; border-radius: 9999px; background: conic-gradient( from var(--badge-angle), transparent 0%, transparent 30%, var(--color-primary-300) 42%, var(--color-primary) 50%, var(--color-primary-300) 58%, transparent 70%, transparent 100% ); animation: badge-spin 4s linear infinite; mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask-composite: exclude; -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; padding: 1px; } :is(.dark) .hero-badge-border { background: conic-gradient( from var(--badge-angle), transparent 0%, transparent 30%, var(--color-primary-400) 42%, var(--color-primary-300) 50%, var(--color-primary-400) 58%, transparent 70%, transparent 100% ); } /* Hero underline shimmer sweep */ @keyframes shimmer-sweep { 0% { background-position: 200% center; } 40% { background-position: -50% center; } 100% { background-position: -50% center; } } /* Hero entrance animation — staggered fade + slide up */ @keyframes hero-fade-up { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: translateY(0); } } .hero-enter { opacity: 0; animation: hero-fade-up 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .hero-enter-1 { animation-delay: 0ms; } .hero-enter-2 { animation-delay: 120ms; } .hero-enter-3 { animation-delay: 240ms; } .hero-enter-4 { animation-delay: 360ms; } .hero-enter-5 { animation-delay: 500ms; } .hero-enter-6 { animation-delay: 650ms; } /* Tab active indicator slide */ .hero-tab-indicator { transition: left 0.35s cubic-bezier(0.16, 1, 0.3, 1), width 0.35s cubic-bezier(0.16, 1, 0.3, 1); } /* Respect reduced motion preference */ @media (prefers-reduced-motion: reduce) { .hero-enter { opacity: 1; animation: none; } .hero-tab-indicator { transition: none; } } ================================================ FILE: resources/js/app.js ================================================ import Alpine from "alpinejs" import collapse from "@alpinejs/collapse" Alpine.plugin(collapse) window.Alpine = Alpine Alpine.start() ================================================ FILE: resources/js/motion.js ================================================ import { animate, scroll, inView, stagger, hover, press } from "motion" window.animate = animate window.scroll = scroll window.inView = inView window.stagger = stagger window.hover = hover window.press = press ================================================ FILE: resources/markdown/brand-assets.md ================================================ # Relaticle Brand Assets ## Asset Map - `public/brand/logomark.svg`: Symbol-only mark. - `public/brand/wordmark.svg`: Lowercase `relaticle` vector wordmark. - `public/brand/logo-lockup.svg`: Horizontal lockup (logomark + wordmark). ## Blade Components - `resources/views/components/brand/logomark.blade.php`: - Use as `` - Renders the symbol-only mark via the lockup source-of-truth component. - `resources/views/components/brand/wordmark.blade.php`: - Use as `` - Uses `currentColor` for light/dark adaptation. - `resources/views/components/brand/logo-lockup.blade.php`: - Use as `` - Props: - `size="sm|md|lg"` - `showWordmark="true|false"` ## Current Usage - Marketing header, footer, and mobile menu use lockup component: - `resources/views/components/layout/header.blade.php` - `resources/views/components/layout/footer.blade.php` - `resources/views/components/layout/mobile-menu.blade.php` - Filament app panel logo uses symbol-only component: - `resources/views/filament/app/logo.blade.php` - Email HTML header uses static PNG for client compatibility: - `resources/views/vendor/mail/html/header.blade.php` ## Basic Rules - Minimum size: - Logomark: do not render below `h-6`. - Wordmark: do not render below `h-4`. - Prefer lockup for primary navigation. - Use logomark-only component for tight app/panel/sidebar spaces. - Keep wordmark monochrome (`currentColor`) in app UI for theme consistency. - Treat `public/brand/*` as source assets for external/static consumers; use `x-brand.*` components in Blade UI. ================================================ FILE: resources/markdown/font-sources.md ================================================ # Font Sources This project hosts its runtime web fonts locally under `public/fonts`. ## Inter - Source URL: `https://rsms.me/inter/` - Downloaded file: `InterVariable.woff2` - Direct file URL used: `https://rsms.me/inter/font-files/InterVariable.woff2` - Retrieved: 2026-02-18 - License: SIL Open Font License 1.1 (Inter project) ## Satoshi - Source URL: `https://www.fontshare.com/fonts/satoshi` - CSS API URLs used: - `https://api.fontshare.com/v2/css?f[]=satoshi@1&display=swap` (variable normal) - `https://api.fontshare.com/v2/css?f[]=satoshi@2&display=swap` (variable italic) - Downloaded files: - `Satoshi-Variable.woff2` - `Satoshi-VariableItalic.woff2` - Retrieved: 2026-02-18 - License: Fontshare terms/license for Satoshi as published on Fontshare ================================================ FILE: resources/markdown/policy.md ================================================ # Privacy Policy **Effective date:** March 20, 2026 This Privacy Policy explains how Relaticle ("we", "us", "our") collects, uses, and protects your personal data when you use our services. --- ## 1. What We Collect ### Cloud Users (app.relaticle.com) - **Account information:** Name, email address, and password (hashed) - **Profile data:** Avatar, team name, and role - **CRM data:** Companies, people, opportunities, tasks, notes, and custom fields you create - **Usage data:** Login timestamps, feature usage, and error reports - **Technical data:** IP address, browser type, and device information ### Self-Hosted Users We do not collect any data from self-hosted installations. Your data stays entirely on your servers. ### Website Visitors (relaticle.com) - **Contact form submissions:** Name, email, and message content - **Analytics:** Anonymous page views and referrer data ## 2. How We Use Your Data We use your data to: - Provide and maintain the CRM service - Authenticate your account and enforce team-level access controls - Send transactional emails (password resets, team invitations) - Improve the service based on aggregated, anonymized usage patterns - Respond to support inquiries We do **not**: - Sell your data to third parties - Use your CRM data for advertising - Share your data with third parties except as described below - Train AI models on your data ## 3. Third-Party Services The Cloud service uses the following third-party providers: - **Hosting infrastructure:** For application and database hosting - **Email delivery:** For transactional emails (password resets, invitations) - **Error monitoring:** For detecting and fixing bugs (anonymized error reports) We do not share your CRM data with any third party. ## 4. Data Security We protect your data with: - Encrypted connections (TLS/HTTPS) for all data in transit - Encrypted database storage for sensitive fields - Team-based access isolation (multi-tenancy) - API token authentication with scoped permissions - Regular security updates and dependency audits ## 5. Data Retention - **Active accounts:** Data is retained as long as your account is active - **Deleted accounts:** Data is deleted within 30 days of account deletion - **Contact form submissions:** Retained for up to 12 months - **Server logs:** Retained for up to 90 days ## 6. Your Rights You have the right to: - **Access** your personal data at any time through the application - **Export** your data via the application or REST API - **Correct** inaccurate personal data through your profile settings - **Delete** your account and associated data - **Object** to data processing for specific purposes To exercise these rights, contact us at [Contact Us](/contact). We will respond within 15 business days. ## 7. Cookies The Cloud service uses essential cookies for: - Session management (keeping you logged in) - CSRF protection (security) - Theme preferences (light/dark mode) We do not use tracking cookies or third-party advertising cookies. ## 8. Children Our services are not directed to children under 16. We do not knowingly collect personal data from children. ## 9. Changes to This Policy We may update this Privacy Policy from time to time. We will notify registered users of material changes via email or in-app notification. ## 10. Contact Questions about this Privacy Policy? Reach us at [Contact Us](/contact). ================================================ FILE: resources/markdown/terms.md ================================================ # Terms of Service **Effective date:** March 20, 2026 These Terms of Service ("Terms") govern your use of Relaticle, an open-source CRM platform provided by Relaticle ("we", "us", "our"). By accessing or using our services, you agree to these Terms. --- ## 1. Services Relaticle provides a customer relationship management (CRM) platform available in two forms: - **Cloud (Managed Hosting):** We host and maintain the application at app.relaticle.com. You access it through your web browser. - **Self-Hosted:** You download and run the open-source software on your own infrastructure under the AGPL-3.0 license. These Terms apply to the Cloud service. Self-hosted installations are governed by the [AGPL-3.0 license](https://www.gnu.org/licenses/agpl-3.0.html). ## 2. Accounts You must provide accurate information when creating an account. You are responsible for maintaining the security of your account credentials. Notify us immediately if you suspect unauthorized access. You must be at least 16 years old to use our services. ## 3. Your Data You own your data. We do not claim any intellectual property rights over the data you store in Relaticle. - **Cloud users:** Your data is stored on our servers. You can export your data at any time via the application or the REST API. If you delete your account, we will delete your data within 30 days. - **Self-hosted users:** Your data never touches our servers. You have full control. ## 4. Acceptable Use You agree not to: - Use the service for any illegal purpose - Attempt to gain unauthorized access to other users' data - Interfere with or disrupt the service - Upload malicious content or code - Violate the intellectual property rights of others We reserve the right to suspend or terminate accounts that violate these terms. ## 5. API and MCP Access Access to the REST API and MCP server is governed by API tokens scoped to specific teams and permissions. You are responsible for keeping your API tokens secure. Revoke any token you believe has been compromised. ## 6. Pricing Relaticle is free to use. Both the Cloud and Self-Hosted options are available at no cost. We may introduce paid features in the future, but existing free functionality will remain free. ## 7. Availability We aim for high availability of the Cloud service but do not guarantee uninterrupted access. Scheduled maintenance will be announced in advance when possible. ## 8. Limitation of Liability The service is provided "as is" without warranty of any kind, express or implied. To the maximum extent permitted by law, we shall not be liable for any indirect, incidental, or consequential damages arising from your use of the service. ## 9. Changes to Terms We may update these Terms from time to time. We will notify registered users of material changes via email or in-app notification. Continued use of the service after changes constitutes acceptance. ## 10. Open Source Relaticle is open-source software licensed under AGPL-3.0. The source code is available at [github.com/Relaticle/relaticle](https://github.com/Relaticle/relaticle). Contributions are welcome under the same license. ## 11. Contact Questions about these Terms? Reach us at [Contact Us](/contact). ================================================ FILE: resources/views/api/api-token-manager.blade.php ================================================
{{ __('access-tokens.sections.create.title') }} {{ __('access-tokens.sections.create.description') }}
@if (Laravel\Jetstream\Jetstream::hasPermissions())
@foreach (Laravel\Jetstream\Jetstream::$permissions as $permission) @endforeach
@endif
{{ __('Created.') }} {{ __('Create') }}
@if ($this->user->tokens->isNotEmpty())
{{ __('access-tokens.sections.manage.title') }} {{ __('access-tokens.sections.manage.description') }}
@foreach ($this->user->tokens->sortBy('name') as $token)
{{ $token->name }}
@if ($token->last_used_at)
{{ __('Last used') }} {{ $token->last_used_at->diffForHumans() }}
@endif @if (Laravel\Jetstream\Jetstream::hasPermissions()) @endif
@endforeach
@endif {{ __('access-tokens.modals.show_token.title') }}
{{ __('access-tokens.modals.show_token.description') }}
{{ __('Close') }}
{{ __('access-tokens.modals.permissions.title') }}
@foreach (Laravel\Jetstream\Jetstream::$permissions as $permission) @endforeach
{{ __('Cancel') }} {{ __('Save') }}
{{ __('access-tokens.modals.delete.title') }} {{ __('access-tokens.modals.delete.description') }} {{ __('Cancel') }} {{ __('Delete') }}
================================================ FILE: resources/views/components/action-message.blade.php ================================================ @props(['on'])
merge(['class' => 'text-sm text-gray-600 dark:text-gray-400']) }}> {{ $slot->isEmpty() ? 'Saved.' : $slot }}
================================================ FILE: resources/views/components/action-section.blade.php ================================================
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> {{ $title }} {{ $description }}
{{ $content }}
================================================ FILE: resources/views/components/application-logo.blade.php ================================================ ================================================ FILE: resources/views/components/application-mark.blade.php ================================================ ================================================ FILE: resources/views/components/authentication-card-logo.blade.php ================================================ ================================================ FILE: resources/views/components/authentication-card.blade.php ================================================
{{ $logo }}
{{ $slot }}
================================================ FILE: resources/views/components/banner.blade.php ================================================ @props(['style' => session('flash.bannerStyle', 'success'), 'message' => session('flash.banner')])

================================================ FILE: resources/views/components/brand/logo-lockup.blade.php ================================================ @props([ 'showWordmark' => true, 'size' => 'md', ]) @php $sizeMap = [ 'sm' => 'h-7', 'md' => 'h-8', 'lg' => 'h-10', ]; $heightClass = $sizeMap[$size] ?? $sizeMap['md']; $viewWidth = $showWordmark ? 240 : 64; @endphp class("w-auto {$heightClass}") }} > @if ($showWordmark) @endif ================================================ FILE: resources/views/components/brand/logomark.blade.php ================================================ @props([ 'size' => 'md', ]) ================================================ FILE: resources/views/components/brand/wordmark.blade.php ================================================ class('h-5 w-auto') }} > ================================================ FILE: resources/views/components/browser-sessions.blade.php ================================================
{{ __('profile.sections.browser_sessions.notice') }}
@if (count($sessions) > 0)
@foreach ($sessions as $session)
@if ($session->agent->isDesktop()) @else @endif
{{ $session->agent->platform() ?: __('profile.sections.browser_sessions.labels.unknown_device') }} - {{ $session->agent->browser() ?: __('profile.sections.browser_sessions.labels.unknown_device') }}
{{ $session->ip_address }}, @if ($session->is_current_device) {{ __('profile.sections.browser_sessions.labels.current_device') }} @else {{ __('profile.sections.browser_sessions.labels.last_active') }} {{ $session->last_active }} @endif
@endforeach
@endif
================================================ FILE: resources/views/components/button.blade.php ================================================ merge(['type' => 'submit']) }}> {{ $slot }} ================================================ FILE: resources/views/components/checkbox.blade.php ================================================ merge(['class' => 'rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-gray-600 shadow-sm focus:ring-gray-500 dark:focus:ring-gray-600 dark:focus:ring-offset-gray-800']) !!}> ================================================ FILE: resources/views/components/confirmation-modal.blade.php ================================================ @props(['id' => null, 'maxWidth' => null])

{{ $title }}

{{ $content }}
{{ $footer }}
================================================ FILE: resources/views/components/confirms-password.blade.php ================================================ @props(['title' => __('Confirm Password'), 'content' => __('For your security, please confirm your password to continue.'), 'button' => __('Confirm')]) @php $confirmableId = md5($attributes->wire('then')); @endphp wire('then') }} x-data x-ref="span" x-on:click="$wire.startConfirmingPassword('{{ $confirmableId }}')" x-on:password-confirmed.window="setTimeout(() => $event.detail.id === '{{ $confirmableId }}' && $refs.span.dispatchEvent(new CustomEvent('then', { bubbles: false })), 250);" > {{ $slot }} @once {{ $title }} {{ $content }}
{{ __('Cancel') }} {{ $button }}
@endonce ================================================ FILE: resources/views/components/danger-button.blade.php ================================================ ================================================ FILE: resources/views/components/dialog-modal.blade.php ================================================ @props(['id' => null, 'maxWidth' => null])
{{ $title }}
{{ $content }}
{{ $footer }}
================================================ FILE: resources/views/components/dropdown-link.blade.php ================================================ merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out']) }}>{{ $slot }} ================================================ FILE: resources/views/components/dropdown.blade.php ================================================ @props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white dark:bg-gray-700', 'dropdownClasses' => '']) @php $alignmentClasses = match ($align) { 'left' => 'ltr:origin-top-left rtl:origin-top-right start-0', 'top' => 'origin-top', 'none', 'false' => '', default => 'ltr:origin-top-right rtl:origin-top-left end-0', }; $width = match ($width) { '48' => 'w-48', '60' => 'w-60', default => 'w-48', }; @endphp
{{ $trigger }}
================================================ FILE: resources/views/components/form-section.blade.php ================================================ @props(['submit'])
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> {{ $title }} {{ $description }}
{{ $form }}
@if (isset($actions))
{{ $actions }}
@endif
================================================ FILE: resources/views/components/input-error.blade.php ================================================ @props(['for']) @error($for)

merge(['class' => 'text-sm text-red-600 dark:text-red-400']) }}>{{ $message }}

@enderror ================================================ FILE: resources/views/components/input.blade.php ================================================ @props(['disabled' => false]) merge(['class' => 'border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-gray-500 dark:focus:border-gray-600 focus:ring-gray-500 dark:focus:ring-gray-600 rounded-md shadow-sm']) !!}> ================================================ FILE: resources/views/components/label.blade.php ================================================ @props(['value']) ================================================ FILE: resources/views/components/layout/footer.blade.php ================================================ ================================================ FILE: resources/views/components/layout/header.blade.php ================================================ ================================================ FILE: resources/views/components/layout/mobile-menu.blade.php ================================================ {{-- Full-screen mobile menu --}}
{{-- Header --}} {{-- Navigation --}} {{-- Bottom CTA --}}
Sign In Start for free
================================================ FILE: resources/views/components/legal-document.blade.php ================================================ @props([ 'title', 'subtitle', 'content', ])

{{ $title }}

{{ $subtitle }}

{!! $content !!}
================================================ FILE: resources/views/components/marketing/button.blade.php ================================================ @props([ 'variant' => 'primary', 'size' => 'base', 'href' => null, 'icon' => null, 'iconTrailing' => null, 'external' => false, ]) @php $tag = $href ? 'a' : 'button'; $sizes = [ 'sm' => 'h-9 px-5 text-sm rounded-lg', 'base' => 'h-11 px-8 text-sm rounded-lg', ]; $variants = [ 'primary' => 'bg-primary font-semibold text-white shadow-[0_1px_2px_rgba(0,0,0,0.1),inset_0_1px_0_rgba(255,255,255,0.1)] hover:brightness-110', 'secondary' => 'border border-gray-200 bg-white text-gray-700 shadow-[0_1px_2px_rgba(0,0,0,0.04)] hover:border-gray-300 hover:shadow-[0_2px_8px_rgba(0,0,0,0.06)] dark:border-white/[0.08] dark:bg-white/[0.03] dark:text-white dark:hover:bg-white/[0.06] dark:hover:border-white/[0.15]', ]; @endphp <{{ $tag }} {{ $attributes ->class([ 'inline-flex items-center justify-center gap-2 cursor-pointer font-medium transition-all duration-200', $sizes[$size] ?? $sizes['base'], $variants[$variant] ?? $variants['primary'], ]) ->merge(array_filter([ 'href' => $href, 'target' => $external ? '_blank' : null, 'rel' => $external ? 'noopener' : null, 'type' => ! $href ? 'button' : null, ])) }}> @if($icon) @endif {{ $slot }} @if($iconTrailing) @endif @if($external && ! $iconTrailing) @endif ================================================ FILE: resources/views/components/marketing/input.blade.php ================================================ @props([ 'label' => null, 'required' => false, ])
@if($label) @endif merge([ 'class' => 'w-full rounded-lg border border-gray-200 dark:border-white/[0.08] bg-white dark:bg-white/[0.03] px-4 py-3 text-sm text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 outline-none focus:border-primary focus:ring-2 focus:ring-primary/20 transition-colors', ]) }}> @error($attributes->get('name'))

{{ $message }}

@enderror
================================================ FILE: resources/views/components/marketing/textarea.blade.php ================================================ @props([ 'label' => null, 'required' => false, ])
@if($label) @endif @error($attributes->get('name'))

{{ $message }}

@enderror
================================================ FILE: resources/views/components/modal.blade.php ================================================ @props(['id', 'maxWidth']) @php $id = $id ?? md5($attributes->wire('model')); $maxWidth = [ 'sm' => 'sm:max-w-sm', 'md' => 'sm:max-w-md', 'lg' => 'sm:max-w-lg', 'xl' => 'sm:max-w-xl', '2xl' => 'sm:max-w-2xl', ][$maxWidth ?? '2xl']; @endphp ================================================ FILE: resources/views/components/nav-link.blade.php ================================================ @props(['active']) @php $classes = ($active ?? false) ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out' : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out'; @endphp merge(['class' => $classes]) }}> {{ $slot }} ================================================ FILE: resources/views/components/responsive-nav-link.blade.php ================================================ @props(['active']) @php $classes = ($active ?? false) ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-none focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out' : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out'; @endphp merge(['class' => $classes]) }}> {{ $slot }} ================================================ FILE: resources/views/components/secondary-button.blade.php ================================================ ================================================ FILE: resources/views/components/section-border.blade.php ================================================ ================================================ FILE: resources/views/components/section-title.blade.php ================================================

{{ $title }}

{{ $description }}

{{ $aside ?? '' }}
================================================ FILE: resources/views/components/switchable-team.blade.php ================================================ @props(['team', 'component' => 'dropdown-link'])
@method('PUT') @csrf
@if (Auth::user()->isCurrentTeam($team)) @endif
{{ $team->name }}
================================================ FILE: resources/views/components/theme-switcher.blade.php ================================================ @props(['size' => 'sm']) @php $iconSize = match($size) { 'md' => 'h-4 w-4', default => 'h-3.5 w-3.5', }; $buttonClass = 'p-1.5 rounded-full transition-all duration-200 cursor-pointer text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 aria-pressed:bg-white aria-pressed:dark:bg-gray-700 aria-pressed:shadow-sm aria-pressed:text-gray-900 aria-pressed:dark:text-white'; @endphp
================================================ FILE: resources/views/components/validation-errors.blade.php ================================================ @if ($errors->any())
{{ __('Whoops! Something went wrong.') }}
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif ================================================ FILE: resources/views/components/welcome.blade.php ================================================

Welcome to your Jetstream application!

Laravel Jetstream provides a beautiful, robust starting point for your next Laravel application. Laravel is designed to help you build your application using a development environment that is simple, powerful, and enjoyable. We believe you should love expressing your creativity through programming, so we have spent time carefully crafting the Laravel ecosystem to be a breath of fresh air. We hope you love it.

Laravel has wonderful documentation covering every aspect of the framework. Whether you're new to the framework or have previous experience, we recommend reading all of the documentation from beginning to end.

Explore the documentation

Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.

Start watching Laracasts

Laravel Jetstream is built with Tailwind, an amazing utility first CSS framework that doesn't get in your way. You'll be amazed how easily you can build and maintain fresh, modern designs with this wonderful framework at your fingertips.

Authentication

Authentication and registration views are included with Laravel Jetstream, as well as support for user email verification and resetting forgotten passwords. So, you're free to get started with what matters most: building your application.

================================================ FILE: resources/views/contact.blade.php ================================================ @push('turnstile') @endpush
{{-- Left: heading --}}

Get in Touch

Questions about enterprise deployments, custom integrations, or partnerships? We'd love to hear from you.

{{-- Right: form --}}
@if(session('success'))

Message sent

{{ session('success') }}

@else
@csrf {{ old('message') }} @error('cf-turnstile-response')

{{ $message }}

@enderror Send message @endif
================================================ FILE: resources/views/emails/team-invitation.blade.php ================================================ @component('mail::message') {{ __('You have been invited to join the :team team!', ['team' => $invitation->team->name]) }} @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::registration())) {{ __('If you do not have an account, you may create one by clicking the button below. After creating an account, you may click the invitation acceptance button in this email to accept the team invitation:') }} @component('mail::button', ['url' => route('register')]) {{ __('Create Account') }} @endcomponent {{ __('If you already have an account, you may accept this invitation by clicking the button below:') }} @else {{ __('You may accept this invitation by clicking the button below:') }} @endif @component('mail::button', ['url' => $acceptUrl]) {{ __('Accept Invitation') }} @endcomponent @if($invitation->expires_at) {{ __('This invitation will expire :expiry.', ['expiry' => $invitation->expires_at->diffForHumans()]) }} @endif {{ __('If you did not expect to receive an invitation to this team, you may discard this email.') }} @endcomponent ================================================ FILE: resources/views/filament/actions/ai-summary.blade.php ================================================

{{ $summary->summary }}

Generated {{ $summary->created_at->diffForHumans() }}
================================================ FILE: resources/views/filament/app/analytics.blade.php ================================================ @if(app()->isProduction() && !empty(config('services.fathom.site_id'))) @endif ================================================ FILE: resources/views/filament/app/import-preview-alpine.blade.php ================================================ ================================================ FILE: resources/views/filament/app/import-value-reviewer-alpine.blade.php ================================================ ================================================ FILE: resources/views/filament/app/logo-empty.blade.php ================================================ Relaticle ================================================ FILE: resources/views/filament/app/logo.blade.php ================================================
================================================ FILE: resources/views/filament/auth/social_login_buttons.blade.php ================================================
Continue with Google Continue with GitHub
or
================================================ FILE: resources/views/filament/components/infolists/avatar-name.blade.php ================================================ @php $state = $getState(); $hasAvatar = !empty($state['avatar']); // Get the label from the component - handle potential initialization issues try { $label = $getLabel(); } catch (\Throwable $e) { $label = null; } // Map text size to Tailwind class $textSizeClass = match ($state['textSize'] ?? 'sm') { 'xs' => 'text-xs', 'base' => 'text-base', 'lg' => 'text-lg', 'xl' => 'text-xl', default => 'text-sm', }; @endphp
@if ($label)
{{ $label }}
@endif
@if ($hasAvatar) !$state['circular'], // Force square shape when not circular ]) /> @endif @if ($state['name']) {{ $state['name'] }} @endif
================================================ FILE: resources/views/filament/pages/access-tokens.blade.php ================================================ {{ $this->form }} ================================================ FILE: resources/views/filament/pages/create-team.blade.php ================================================ ================================================ FILE: resources/views/filament/pages/dashboard.blade.php ================================================ ================================================ FILE: resources/views/filament/pages/edit-profile.blade.php ================================================ {{ $this->form }} ================================================ FILE: resources/views/filament/pages/edit-team.blade.php ================================================ {{ $this->form }} ================================================ FILE: resources/views/filament/tables/columns/avatar-name-column.blade.php ================================================ @php $record = $getRecord(); $name = $record->name ?? ''; $avatarUrl = $record->avatar; @endphp
{{ $name }}
================================================ FILE: resources/views/filament/tables/columns/logo-name-column.blade.php ================================================ @php $record = $getRecord(); $name = $record->name ?? ''; $logoUrl = $record->logo; @endphp
{{ $name }}
================================================ FILE: resources/views/home/index.blade.php ================================================ @php $faqs = [ ['Is Relaticle production-ready?', 'Yes. Relaticle has 1,100+ automated tests, 5-layer authorization, 56+ MCP-specific tests, and is used in production. The codebase is continuously tested with PHPStan static analysis and Pest mutation testing.'], ['What AI agents can I connect?', 'Any agent that speaks MCP (Model Context Protocol). Claude, ChatGPT, Gemini, open-source models, or your own custom agents. Relaticle\'s MCP server provides 30 tools for AI agents to read, create, update, and delete CRM data.'], ['What is MCP?', 'MCP (Model Context Protocol) is an open standard that lets AI agents interact with tools and data sources. Relaticle\'s MCP server gives agents 30 tools to work with your CRM data — listing companies, creating contacts, updating opportunities, and more.'], ['How is Relaticle different from HubSpot or Salesforce?', 'Relaticle is self-hosted (you own your data), open-source (AGPL-3.0), has 30 MCP tools (vs HubSpot\'s 9), and has no per-seat pricing. It\'s designed for teams who want AI agent integration without vendor lock-in.'], ['How do I deploy Relaticle?', 'Deploy with Docker Compose, Laravel Forge, or any PHP 8.4+ hosting with PostgreSQL. Self-hosted means your data never leaves your server. A managed hosting option is also available at app.relaticle.com.'], ['Can I customize the data model?', 'Yes. Relaticle offers 22 custom field types including text, email, phone, currency, date, select, multiselect, entity relationships, conditional visibility, and per-field encryption. No migrations or code changes needed.'], ]; @endphp @push('preload') @endpush @push('header') @vite('resources/js/motion.js') @endpush @include('home.partials.hero') @include('home.partials.features') @include('home.partials.community') @include('home.partials.faq') @include('home.partials.start-building') @php $schema = (new \Spatie\SchemaOrg\Graph()) ->softwareApplication(fn ($app) => $app ->name('Relaticle') ->applicationCategory('BusinessApplication') ->applicationSubCategory('CRM') ->operatingSystem('Linux, macOS, Windows') ->description('The open-source CRM built for AI agents. Self-hosted with a production-grade MCP server (30 tools), REST API, and 22 custom field types. Connect any AI agent -- Claude, GPT, or open-source models.') ->url(url('/')) ->offers(\Spatie\SchemaOrg\Schema::offer()->price('0')->priceCurrency('USD')) ->setProperty('featureList', [ 'MCP server with 30 tools for AI agents', 'REST API with full CRUD operations', '22 custom field types with conditional visibility and encryption', 'Self-hosted with full data ownership', 'Multi-team isolation with 5-layer authorization', '1,100+ automated tests', 'CSV import and export', 'AI-powered record summaries', ]) ->license('https://www.gnu.org/licenses/agpl-3.0.html') ) ->organization(fn ($org) => $org ->name('Relaticle') ->url(url('/')) ->logo(asset('favicon.svg')) ->sameAs(array_filter([ 'https://github.com/relaticle/relaticle', config('services.discord.invite_url'), ])) ) ->website(fn ($site) => $site ->name('Relaticle') ->url(url('/')) ) ->fAQPage(function ($faq) use ($faqs) { return $faq->mainEntity(array_map(fn ($item) => \Spatie\SchemaOrg\Schema::question() ->name($item[0]) ->acceptedAnswer( \Spatie\SchemaOrg\Schema::answer()->text($item[1]) ), $faqs)); }); @endphp {!! $schema->toScript() !!} ================================================ FILE: resources/views/home/partials/community.blade.php ================================================

Built in the Open

Relaticle is AGPL-3.0 open source. Star the repo, join Discord, and help shape the future of agent-native CRM.

@foreach([ ['url' => 'https://github.com/relaticle/relaticle', 'icon' => 'ri-github-fill', 'iconClass' => '', 'title' => 'GitHub', 'desc' => 'Star our repo, report issues, and contribute code. Completely open source and free to use.', 'cta' => 'View Repository', 'external' => true], ['url' => route('discord'), 'icon' => 'ri-discord-fill', 'iconClass' => 'text-[#5865F2]', 'title' => 'Discord', 'desc' => 'Chat with developers, get help, and share ideas. Join our growing community of builders.', 'cta' => 'Join Discord', 'external' => true], ['url' => route('documentation.index'), 'icon' => 'ri-book-open-line', 'iconClass' => 'text-primary dark:text-primary-400', 'title' => 'Documentation', 'desc' => 'Learn how to use Relaticle. Comprehensive guides for users and developers alike.', 'cta' => 'Read the Docs', 'external' => false], ] as $card)

{{ $card['title'] }}

{{ $card['desc'] }}

{{ $card['cta'] }}
@endforeach
@foreach([['AGPL-3.0', 'Open Source'], ['1,100+', 'Automated Tests'], ['30', 'MCP Tools'], ['Free', 'Forever']] as $index => [$value, $label])
{{ $value }}
{{ $label }}
@endforeach
================================================ FILE: resources/views/home/partials/faq.blade.php ================================================

Frequently Asked Questions

Everything you need to know about Relaticle, from deployment to AI agent integration.

@foreach($faqs as $index => [$question, $answer])
{{ $answer }}
@endforeach
================================================ FILE: resources/views/home/partials/features.blade.php ================================================ @php $cardBase = 'group feat-card rounded-xl border border-gray-200/80 dark:border-white/[0.06] bg-white dark:bg-white/[0.02] transition-all duration-300 hover:border-gray-300 dark:hover:border-white/[0.10] hover:shadow-sm'; $cardTitle = 'font-display text-lg font-medium text-gray-900 dark:text-white mb-2'; $cardDesc = 'text-[13px] leading-relaxed text-gray-500 dark:text-gray-400'; @endphp
Features

Built for humans. Accessible to AI.

30 MCP tools, a REST API, and 22 custom field types. Your team and your AI agents work from the same source of truth.

{{-- Agent-Native Infrastructure — 2col 2row --}}

Agent-Native Infrastructure

Connect any AI agent through the MCP server with 30 tools, or build custom integrations with the REST API. Full CRUD, custom field support, and schema discovery built in.

@foreach([['ri-claude-fill', 'text-[#D4763C]', 'Claude'], ['ri-openai-fill', 'text-gray-900 dark:text-gray-200', 'ChatGPT'], ['ri-gemini-fill', 'text-blue-500', 'Gemini']] as [$icon, $color, $name])
{{ $name }}
@endforeach
Custom
MCP Server · Connected
30 tools REST API v1 Schema auto
@foreach(['Contacts', 'Companies', 'Deals', 'Tasks', 'Notes'] as $e) {{ $e }} @endforeach
@foreach([42,81,119,158] as $i => $y) @endforeach @foreach([[65,40],[70,73],[82,105],[90,138],[100,170]] as [$sy,$ey]) @endforeach
Agents
@foreach([['ri-claude-fill', 'text-[#D4763C]', 'Claude', false], ['ri-openai-fill', 'text-gray-900 dark:text-gray-200', 'ChatGPT', false], ['ri-gemini-fill', 'text-blue-500', 'Gemini', false], ['ri-add-line', 'text-gray-400 dark:text-gray-500', 'Custom', true]] as [$icon, $color, $name, $dashed])
{{ $name }}
@endforeach
MCP Server
Connected
@foreach([['Tools', '30', ''], ['REST API', 'v1', ''], ['Schema', 'auto', 'text-emerald-700 dark:text-emerald-400']] as [$label, $val, $valClass])
{{ $label }} {{ $val }}
@endforeach
Your CRM
@foreach(['Contacts', 'Companies', 'Deals', 'Tasks', 'Notes'] as $entity)
{{ $entity }}
@endforeach
{{-- AI-Powered Insights --}}

AI-Powered Insights

One-click summaries of contacts and deals. AI analyzes notes, tasks, and interactions so you always know what happened and what to do next.

{{-- Animated insight lines --}}
{{-- Customizable Data Model --}}

Customizable Data Model

22 field types including entity relationships, conditional visibility, and per-field encryption.

@foreach([['Text', 'Company name...', false], ['Select', 'Industry', true]] as [$label, $placeholder, $hasArrow])
{{ $label }}
{{ $placeholder }} @if($hasArrow)@endif
@endforeach
Toggle
{{-- Company Management --}}

Company Management

Track companies with detailed profiles, linked contacts, and opportunity history. See the full picture at a glance.

{{-- People Management --}}

People Management

Rich contact profiles with interaction history, notes, and linked companies. Find anyone with advanced search and filters.

{{-- Sales Opportunities --}}

Sales Opportunities

Manage your pipeline with custom stages, lifecycle tracking, and win/loss analysis.

@foreach(['Lead', 'Qualified', 'Proposal', 'Won'] as $stage) {{ $stage }} @endforeach
{{-- Task Management — 2col --}}

Task Management

Create, assign, and track tasks linked to contacts, companies, and deals. Your AI agent can create follow-ups automatically.

@foreach([ [true, 'Send proposal to', '@Acme', 'bg-primary/10 text-primary-700 dark:text-primary-300'], [false, 'Follow up with', '@Sarah', 'bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300'], [false, 'Review Q4 pipeline', 'Due today', 'bg-amber-50 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300'], ] as [$done, $text, $badge, $badgeClass])
@if($done)@endif
{{ $text }} {{ $badge }}
@endforeach
{{-- Simple feature cards row 2 --}} @foreach([ ['ri-team-line', 'Team Collaboration', 'Multi-workspace support with role-based permissions and 5-layer authorization. Every team member sees exactly what they should.'], ['ri-download-cloud-2-line', 'Import & Export', 'Migrate from any CRM with CSV imports. Column mapping, validation, and error handling included. Export anytime — your data is yours.'], ] as [$icon, $title, $desc])

{{ $title }}

{{ $desc }}

@endforeach {{-- Notes & Activity Log — spans full width on tablet to avoid orphan gap --}}

Notes & Activity Log

Capture notes linked to any record. Your AI agent can log meeting notes automatically. Search and retrieve context instantly.

{{-- CTA Card --}}

Ready to start?

Give your AI agents a CRM they can actually use.

Start for free
No credit card·1,100+ tests·AGPL-3.0
================================================ FILE: resources/views/home/partials/hero-agent-preview.blade.php ================================================
{{-- Messages --}}
{{-- User 1 --}}
You
Add Sarah Chen as a contact at Kovra Systems. She's VP of Engineering.
{{-- AI Assistant 1: Tool call + response --}}
ChatGPT
relaticle/create-people completed
Done. I created the contact and linked her to Kovra Systems.
Sarah Chen
VP of Engineering · Kovra Systems
SC
{{-- User 2 --}}
You
Show me deals closing this quarter over $50K
{{-- AI Assistant 2: Tool call + deals --}}
ChatGPT
relaticle/list-opportunities completed
Found 3 deals worth $245K total.
@foreach([ ['Meridian Health', 'Platform License', '$120K', 'Apr 2', 'Proposal'], ['Trellis Labs', 'Team Expansion', '$85K', 'Apr 15', 'Qualified'], ['Arcwright Co', 'Add-on Pack', '$40K', 'May 1', 'Lead'], ] as [$company, $deal, $amount, $date, $stage])
{{ $company }}
{{ $deal }}
{{ $amount }}
{{ $stage }} · {{ $date }}
@endforeach
{{-- Input bar --}}
Message ChatGPT...
================================================ FILE: resources/views/home/partials/hero.blade.php ================================================
{{-- Background system — layered depth --}}
{{-- ── Badge (GitHub) ── --}} {{-- ── Heading ── --}}

The Open-Source CRM Built for AI Agents

Connect any AI agent with 30 MCP tools. Self-hosted. No per-seat pricing. Yours to own.

{{-- ── CTA Buttons ── --}}
Start for free Get in touch
{{-- ── App Preview with tabs ── --}}
{{-- Multi-color glow behind mockup --}} {{-- ── Decorative framing lines ── --}} {{-- Feature Tabs --}}
{{-- Mockup with layered glow border --}}
{{-- Browser chrome --}}
app.relaticle.com
{{-- Tab panels — grid stacking for Safari-smooth crossfade --}}
{{-- Pipeline tab (default — LCP element, must load eagerly) --}}
Relaticle CRM — Pipeline
{{-- AI Agent tab --}} {{-- Bottom fade overlay --}}
================================================ FILE: resources/views/home/partials/start-building.blade.php ================================================
{{-- Corner & top dots patterns --}}
@foreach([['left', 'br'], ['right', 'bl']] as [$side, $dir])
@endforeach

Your CRM, Your Rules

Self-hosted. Agent-native. Full control over your data and your AI.

Start for free Get in touch
================================================ FILE: resources/views/layouts/guest.blade.php ================================================ @props(['title', 'description' => 'Relaticle - The open-source CRM built for AI agents. Self-hosted with MCP server, REST API, and 22 custom field types.', 'ogTitle' => null, 'ogDescription' => null, 'ogImage' => null]) {{ $title ?? config('app.name', 'Relaticle - The Open-Source CRM Built for AI Agents') }} {{-- Preload critical fonts (discovered late if left to CSS) --}} @stack('preload') @vite(['resources/css/app.css', 'resources/js/app.js']) @stack('turnstile') @stack('header') @if(app()->isProduction() && !empty(config('services.fathom.site_id'))) @endif Skip to main content
{{ $slot }}
================================================ FILE: resources/views/livewire/app/access-tokens/create-access-token.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/access-tokens/manage-access-tokens.blade.php ================================================ {{ __('access-tokens.sections.manage.title') }} {{ __('access-tokens.sections.manage.description') }} {{ $this->table }} ================================================ FILE: resources/views/livewire/app/profile/delete-account.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/profile/logout-other-browser-sessions.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/profile/update-password.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/profile/update-profile-information.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/teams/add-team-member.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/teams/delete-team.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/livewire/app/teams/pending-team-invitations.blade.php ================================================ {{ __('teams.sections.pending_team_invitations.title') }} {{ __('teams.sections.pending_team_invitations.description') }} {{ $this->table }} ================================================ FILE: resources/views/livewire/app/teams/team-members.blade.php ================================================ {{ __('teams.sections.team_members.title') }} {{ __('teams.sections.team_members.description') }} {{ $this->table }} ================================================ FILE: resources/views/livewire/app/teams/update-team-name.blade.php ================================================
{{ $this->form }}
================================================ FILE: resources/views/mail/new-contact-submission.blade.php ================================================ # New Contact Submission **Name:** {{ $data['name'] }} **Email:** {{ $data['email'] }} @if($data['company']) **Company:** {{ $data['company'] }} @endif **Message:** {{ $data['message'] }} Reply to {{ $data['name'] }} ================================================ FILE: resources/views/policy.blade.php ================================================ ================================================ FILE: resources/views/pricing.blade.php ================================================
{{-- Badge --}}
Simple pricing
{{-- Header --}}

No per-seat pricing. Ever.

Unlimited users. Unlimited data. Self-host for free forever, or let us run it for you.

{{-- Pricing cards --}}
{{-- Cloud (primary) --}}
{{-- Recommended badge --}}
Recommended

Cloud

Managed hosting with automatic updates and backups

$0 /mo

Generous free tier. Always.

Everything included
    @foreach([ 'Unlimited users and data', 'MCP server with 30 tools', 'REST API with full CRUD', '22 custom field types', 'Multi-team workspaces', ] as $feature)
  • {{ $feature }}
  • @endforeach
Cloud benefits
    @foreach([ 'Zero-downtime updates', 'Automatic daily backups', 'No server maintenance', 'Email support', ] as $feature)
  • {{ $feature }}
  • @endforeach
Start for free
{{-- Self-Hosted --}}

Self-Hosted

Your server, your data, your rules

Free forever

AGPL-3.0 open source

Everything included
    @foreach([ 'Unlimited users and data', 'MCP server with 30 tools', 'REST API with full CRUD', '22 custom field types', 'Multi-team workspaces', ] as $feature)
  • {{ $feature }}
  • @endforeach
Self-hosted benefits
    @foreach([ 'Full source code access', 'Docker Compose deployment', 'Data never leaves your server', 'Community support (Discord)', ] as $feature)
  • {{ $feature }}
  • @endforeach
View on GitHub
{{-- Trust signals --}}
@foreach([ ['ri-shield-check-line', '1,100+', 'Automated Tests'], ['ri-robot-2-line', '30', 'MCP Tools'], ['ri-stack-line', '22', 'Field Types'], ['ri-lock-line', '5-Layer', 'Authorization'], ] as [$icon, $value, $label])
{{ $value }}
{{ $label }}
@endforeach
{{-- Help CTA --}}

Need help choosing?

Not sure which option fits? Have questions about deployment or migration? We're happy to help.

Get in touch
================================================ FILE: resources/views/profile/delete-user-form.blade.php ================================================ {{ __('Delete Account') }} {{ __('Permanently delete your account.') }}
{{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }}
{{ __('Delete Account') }}
{{ __('Delete Account') }} {{ __('Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }}
{{ __('Cancel') }} {{ __('Delete Account') }}
================================================ FILE: resources/views/profile/logout-other-browser-sessions-form.blade.php ================================================ {{ __('Browser Sessions') }} {{ __('Manage and log out your active sessions on other browsers and devices.') }}
{{ __('If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.') }}
@if (count($this->sessions) > 0)
@foreach ($this->sessions as $session)
@if ($session->agent->isDesktop()) @else @endif
{{ $session->agent->platform() ? $session->agent->platform() : __('Unknown') }} - {{ $session->agent->browser() ? $session->agent->browser() : __('Unknown') }}
{{ $session->ip_address }}, @if ($session->is_current_device) {{ __('This device') }} @else {{ __('Last active') }} {{ $session->last_active }} @endif
@endforeach
@endif
{{ __('Log Out Other Browser Sessions') }} {{ __('Done.') }}
{{ __('Log Out Other Browser Sessions') }} {{ __('Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.') }}
{{ __('Cancel') }} {{ __('Log Out Other Browser Sessions') }}
================================================ FILE: resources/views/profile/two-factor-authentication-form.blade.php ================================================ {{ __('Two Factor Authentication') }} {{ __('Add additional security to your account using two factor authentication.') }}

@if ($this->enabled) @if ($showingConfirmation) {{ __('Finish enabling two factor authentication.') }} @else {{ __('You have enabled two factor authentication.') }} @endif @else {{ __('You have not enabled two factor authentication.') }} @endif

{{ __('When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone\'s Google Authenticator application.') }}

@if ($this->enabled) @if ($showingQrCode)

@if ($showingConfirmation) {{ __('To finish enabling two factor authentication, scan the following QR code using your phone\'s authenticator application or enter the setup key and provide the generated OTP code.') }} @else {{ __('Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application or enter the setup key.') }} @endif

{!! $this->user->twoFactorQrCodeSvg() !!}

{{ __('Setup Key') }}: {{ decrypt($this->user->two_factor_secret) }}

@if ($showingConfirmation)
@endif @endif @if ($showingRecoveryCodes)

{{ __('Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.') }}

@foreach (json_decode(decrypt($this->user->two_factor_recovery_codes), true) as $code)
{{ $code }}
@endforeach
@endif @endif
@if (! $this->enabled) {{ __('Enable') }} @else @if ($showingRecoveryCodes) {{ __('Regenerate Recovery Codes') }} @elseif ($showingConfirmation) {{ __('Confirm') }} @else {{ __('Show Recovery Codes') }} @endif @if ($showingConfirmation) {{ __('Cancel') }} @else {{ __('Disable') }} @endif @endif
================================================ FILE: resources/views/profile/update-password-form.blade.php ================================================ {{ __('Update Password') }} {{ __('Ensure your account is using a long, random password to stay secure.') }}
{{ __('Saved.') }} {{ __('Save') }}
================================================ FILE: resources/views/profile/update-profile-information-form.blade.php ================================================ {{ __('Profile Information') }} {{ __('Update your account\'s profile information and email address.') }} @if (Laravel\Jetstream\Jetstream::managesProfilePhotos())
{{ $this->user->name }}
{{ __('Select A New Photo') }} @if ($this->user->profile_photo_path) {{ __('Remove Photo') }} @endif
@endif
@if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::emailVerification()) && ! $this->user->hasVerifiedEmail())

{{ __('Your email address is unverified.') }}

@if ($this->verificationLinkSent)

{{ __('A new verification link has been sent to your email address.') }}

@endif @endif
{{ __('Saved.') }} {{ __('Save') }}
================================================ FILE: resources/views/teams/create-team-form.blade.php ================================================ {{ __('Team Details') }} {{ __('Create a new team to collaborate with others on projects.') }}
{{ $this->user->name }}
{{ $this->user->name }}
{{ $this->user->email }}
{{ __('Create') }}
================================================ FILE: resources/views/teams/delete-team-form.blade.php ================================================ {{ __('Delete Team') }} {{ __('Permanently delete this team.') }}
{{ __('Once a team is deleted, all of its resources and data will be permanently deleted. Before deleting this team, please download any data or information regarding this team that you wish to retain.') }}
{{ __('Delete Team') }} {{ __('Delete Team') }} {{ __('Are you sure you want to delete this team? Once a team is deleted, all of its resources and data will be permanently deleted.') }} {{ __('Cancel') }} {{ __('Delete Team') }}
================================================ FILE: resources/views/teams/invitation-expired.blade.php ================================================

{{ __('Invitation Expired') }}

{{ __('This team invitation has expired. Please ask the team owner to send you a new invitation.') }}

================================================ FILE: resources/views/teams/team-member-manager.blade.php ================================================
@if (Gate::check('addTeamMember', $team))
{{ __('Add Team Member') }} {{ __('Add a new team member to your team, allowing them to collaborate with you.') }}
{{ __('Please provide the email address of the person you would like to add to this team.') }}
@if (count($this->roles) > 0)
@foreach ($this->roles as $index => $role) @endforeach
@endif
{{ __('Added.') }} {{ __('Add') }}
@endif @if ($team->teamInvitations->isNotEmpty() && Gate::check('addTeamMember', $team))
{{ __('Pending Team Invitations') }} {{ __('These people have been invited to your team and have been sent an invitation email. They may join the team by accepting the email invitation.') }}
@foreach ($team->teamInvitations as $invitation)
{{ $invitation->email }}
@if (Gate::check('removeTeamMember', $team)) @endif
@endforeach
@endif @if ($team->users->isNotEmpty())
{{ __('Team Members') }} {{ __('All of the people that are part of this team.') }}
@foreach ($team->users->sortBy('name') as $user)
{{ $user->name }}
{{ $user->name }}
@if (Gate::check('updateTeamMember', $team) && Laravel\Jetstream\Jetstream::hasRoles()) @elseif (Laravel\Jetstream\Jetstream::hasRoles())
{{ Laravel\Jetstream\Jetstream::findRole($user->membership->role)->name }}
@endif @if ($this->user->id === $user->id) @elseif (Gate::check('removeTeamMember', $team)) @endif
@endforeach
@endif {{ __('Manage Role') }}
@foreach ($this->roles as $index => $role) @endforeach
{{ __('Cancel') }} {{ __('Save') }}
{{ __('Leave Team') }} {{ __('Are you sure you would like to leave this team?') }} {{ __('Cancel') }} {{ __('Leave') }} {{ __('Remove Team Member') }} {{ __('Are you sure you would like to remove this person from the team?') }} {{ __('Cancel') }} {{ __('Remove') }}
================================================ FILE: resources/views/teams/update-team-name-form.blade.php ================================================ {{ __('Team Name') }} {{ __('The team\'s name and owner information.') }}
{{ $team->owner->name }}
{{ $team->owner->name }}
{{ $team->owner->email }}
@if (Gate::check('update', $team)) {{ __('Saved.') }} {{ __('Save') }} @endif
================================================ FILE: resources/views/terms.blade.php ================================================ ================================================ FILE: resources/views/vendor/filament-panels/components/layout/index.blade.php ================================================ @php use Filament\Support\Enums\Width; $livewire ??= null; $hasTopbar = filament()->hasTopbar(); $isSidebarCollapsibleOnDesktop = filament()->isSidebarCollapsibleOnDesktop(); $isSidebarFullyCollapsibleOnDesktop = filament()->isSidebarFullyCollapsibleOnDesktop(); $hasTopNavigation = filament()->hasTopNavigation(); $hasNavigation = filament()->hasNavigation(); $renderHookScopes = $livewire?->getRenderHookScopes(); $maxContentWidth ??= (filament()->getMaxContentWidth() ?? Width::SevenExtraLarge); if (is_string($maxContentWidth)) { $maxContentWidth = Width::tryFrom($maxContentWidth) ?? $maxContentWidth; } $isAppPanel = filament()->getId() === 'app'; @endphp $hasNavigation, 'fi-body-has-sidebar-collapsible-on-desktop' => $isSidebarCollapsibleOnDesktop, 'fi-body-has-sidebar-fully-collapsible-on-desktop' => $isSidebarFullyCollapsibleOnDesktop, 'fi-body-has-topbar' => $hasTopbar, 'fi-body-has-top-navigation' => $hasTopNavigation, ]) > @if ($isAppPanel) {{-- Custom layout structure with full height sidebar and topbar for App panel --}}
{{-- Sidebar overlay for mobile --}} @if ($hasNavigation)
{{-- Sidebar - Keep all original Alpine.js functionality --}} @livewire(filament()->getSidebarLivewireComponent()) @endif {{-- Main content wrapper --}}
{{-- Topbar --}} @if ($hasTopbar) {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::TOPBAR_BEFORE, scopes: $renderHookScopes) }} @livewire(filament()->getTopbarLivewireComponent()) {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::TOPBAR_AFTER, scopes: $renderHookScopes) }} @endif {{-- Page content area --}}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::LAYOUT_START, scopes: $renderHookScopes) }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_BEFORE, scopes: $renderHookScopes) }}
value}" : $maxContentWidth, ]) > {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_START, scopes: $renderHookScopes) }} {{ $slot }} {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_END, scopes: $renderHookScopes) }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_AFTER, scopes: $renderHookScopes) }} {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::FOOTER, scopes: $renderHookScopes) }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::LAYOUT_END, scopes: $renderHookScopes) }}
@else {{-- Default Filament layout for other panels (e.g., sysadmin) --}} @if ($hasTopbar) {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::TOPBAR_BEFORE, scopes: $renderHookScopes) }} @livewire(filament()->getTopbarLivewireComponent()) {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::TOPBAR_AFTER, scopes: $renderHookScopes) }} @elseif ($hasNavigation)
! $isSidebarFullyCollapsibleOnDesktop, ]) >
@endif
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::LAYOUT_START, scopes: $renderHookScopes) }} @if ($hasNavigation)
@livewire(filament()->getSidebarLivewireComponent()) @endif
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_BEFORE, scopes: $renderHookScopes) }}
value}" : $maxContentWidth, ]) > {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_START, scopes: $renderHookScopes) }} {{ $slot }} {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_END, scopes: $renderHookScopes) }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::CONTENT_AFTER, scopes: $renderHookScopes) }} {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::FOOTER, scopes: $renderHookScopes) }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::LAYOUT_END, scopes: $renderHookScopes) }}
@endif
================================================ FILE: resources/views/vendor/mail/html/button.blade.php ================================================ @props([ 'url', 'color' => 'primary', 'align' => 'center', ]) ================================================ FILE: resources/views/vendor/mail/html/footer.blade.php ================================================ ================================================ FILE: resources/views/vendor/mail/html/header.blade.php ================================================ @props(['url']) ================================================ FILE: resources/views/vendor/mail/html/layout.blade.php ================================================ {{ config('app.name') }} {{ $head ?? '' }} ================================================ FILE: resources/views/vendor/mail/html/message.blade.php ================================================ {{-- Header --}} {{ config('app.name') }} {{-- Body --}} {{ $slot }} {{-- Subcopy --}} @isset($subcopy) {{ $subcopy }} @endisset {{-- Footer --}} © {{ date('Y') }} {{ config('app.name') }}. {{ __('All rights reserved.') }} ================================================ FILE: resources/views/vendor/mail/html/panel.blade.php ================================================ ================================================ FILE: resources/views/vendor/mail/html/subcopy.blade.php ================================================ ================================================ FILE: resources/views/vendor/mail/html/table.blade.php ================================================
{{ Illuminate\Mail\Markdown::parse($slot) }}
================================================ FILE: resources/views/vendor/mail/html/themes/default.css ================================================ /* Base */ body, body *:not(html):not(style):not(br):not(tr):not(code) { box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; position: relative; } body { -webkit-text-size-adjust: none; background-color: #ffffff; color: #718096; height: 100%; line-height: 1.4; margin: 0; padding: 0; width: 100% !important; } p, ul, ol, blockquote { line-height: 1.4; text-align: left; } a { color: #3869d4; } a img { border: none; } /* Typography */ h1 { color: #3d4852; font-size: 18px; font-weight: bold; margin-top: 0; text-align: left; } h2 { font-size: 16px; font-weight: bold; margin-top: 0; text-align: left; } h3 { font-size: 14px; font-weight: bold; margin-top: 0; text-align: left; } p { font-size: 16px; line-height: 1.5em; margin-top: 0; text-align: left; } p.sub { font-size: 12px; } img { max-width: 100%; } /* Layout */ .wrapper { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 100%; background-color: #edf2f7; margin: 0; padding: 0; width: 100%; } .content { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 100%; margin: 0; padding: 0; width: 100%; } /* Header */ .header { padding: 25px 0; text-align: center; } .header a { color: #3d4852; font-size: 19px; font-weight: bold; text-decoration: none; } /* Logo */ .logo { height: 39px; max-height: 39px; width: auto; } /* Body */ .body { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 100%; background-color: #edf2f7; border-bottom: 1px solid #edf2f7; border-top: 1px solid #edf2f7; margin: 0; padding: 0; width: 100%; } .inner-body { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 570px; background-color: #ffffff; border-color: #e8e5ef; border-radius: 2px; border-width: 1px; box-shadow: 0 2px 0 rgba(0, 0, 150, 0.025), 2px 4px 0 rgba(0, 0, 150, 0.015); margin: 0 auto; padding: 0; width: 570px; } .inner-body a { word-break: break-all; } /* Subcopy */ .subcopy { border-top: 1px solid #e8e5ef; margin-top: 25px; padding-top: 25px; } .subcopy p { font-size: 14px; } /* Footer */ .footer { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 570px; margin: 0 auto; padding: 0; text-align: center; width: 570px; } .footer p { color: #b0adc5; font-size: 12px; text-align: center; } .footer a { color: #b0adc5; text-decoration: underline; } /* Tables */ .table table { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 100%; margin: 30px auto; width: 100%; } .table th { border-bottom: 1px solid #edeff2; margin: 0; padding-bottom: 8px; } .table td { color: #74787e; font-size: 15px; line-height: 18px; margin: 0; padding: 10px 0; } .content-cell { max-width: 100vw; padding: 32px; } /* Buttons */ .action { -premailer-cellpadding: 0; -premailer-cellspacing: 0; -premailer-width: 100%; margin: 30px auto; padding: 0; text-align: center; width: 100%; float: unset; } .button { -webkit-text-size-adjust: none; border-radius: 4px; color: #fff; display: inline-block; overflow: hidden; text-decoration: none; } .button-blue, .button-primary { background-color: #7c3aed; /* Updated to brand blue color */ border-bottom: 8px solid #7c3aed; border-left: 18px solid #7c3aed; border-right: 18px solid #7c3aed; border-top: 8px solid #7c3aed; } .button-green, .button-success { background-color: #48bb78; border-bottom: 8px solid #48bb78; border-left: 18px solid #48bb78; border-right: 18px solid #48bb78; border-top: 8px solid #48bb78; } .button-red, .button-error { background-color: #e53e3e; border-bottom: 8px solid #e53e3e; border-left: 18px solid #e53e3e; border-right: 18px solid #e53e3e; border-top: 8px solid #e53e3e; } /* Panels */ .panel { border-left: #0077C8 solid 4px; /* Also updated panel border to match brand color */ margin: 21px 0; } .panel-content { background-color: #edf2f7; color: #718096; padding: 16px; } .panel-content p { color: #718096; } .panel-item { padding: 0; } .panel-item p:last-of-type { margin-bottom: 0; padding-bottom: 0; } /* Utilities */ .break-all { word-break: break-all; } ================================================ FILE: resources/views/vendor/mail/text/button.blade.php ================================================ {{ $slot }}: {{ $url }} ================================================ FILE: resources/views/vendor/mail/text/footer.blade.php ================================================ {{ $slot }} ================================================ FILE: resources/views/vendor/mail/text/header.blade.php ================================================ {{ $slot }}: {{ $url }} ================================================ FILE: resources/views/vendor/mail/text/layout.blade.php ================================================ {!! strip_tags($header ?? '') !!} {!! strip_tags($slot) !!} @isset($subcopy) {!! strip_tags($subcopy) !!} @endisset {!! strip_tags($footer ?? '') !!} ================================================ FILE: resources/views/vendor/mail/text/message.blade.php ================================================ {{-- Header --}} {{ config('app.name') }} {{-- Body --}} {{ $slot }} {{-- Subcopy --}} @isset($subcopy) {{ $subcopy }} @endisset {{-- Footer --}} © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') ================================================ FILE: resources/views/vendor/mail/text/panel.blade.php ================================================ {{ $slot }} ================================================ FILE: resources/views/vendor/mail/text/subcopy.blade.php ================================================ {{ $slot }} ================================================ FILE: resources/views/vendor/mail/text/table.blade.php ================================================ {{ $slot }} ================================================ FILE: resources/views/vendor/scribe/components/badges/auth.blade.php ================================================ @if($authenticated)@component('scribe::components.badges.base', ['colour' => "darkred", 'text' => 'requires authentication']) @endcomponent @endif ================================================ FILE: resources/views/vendor/scribe/components/badges/base.blade.php ================================================ {{ $text }} ================================================ FILE: resources/views/vendor/scribe/components/badges/deprecated.blade.php ================================================ @if($deprecated !== false) @php($text = $deprecated === true ? 'deprecated' : "deprecated:$deprecated") @component('scribe::components.badges.base', ['colour' => 'darkgoldenrod', 'text' => $text]) @endcomponent @endif ================================================ FILE: resources/views/vendor/scribe/components/badges/http-method.blade.php ================================================ @component('scribe::components.badges.base', [ 'colour' => \Knuckles\Scribe\Tools\WritingUtils::$httpMethodToCssColour[$method], 'text' => $method, ]) @endcomponent ================================================ FILE: resources/views/vendor/scribe/components/field-details.blade.php ================================================ @php $html ??= []; $class = $html['class'] ?? null; @endphp {{ $name }}   @if($type){{ $type }}@endif  @if($isInput && !$required)optional@endif   @if($isInput && $deprecated)deprecated@endif   @if($isInput && empty($hasChildren)) @php $isList = Str::endsWith($type, '[]'); $fullName = str_replace('[]', '.0', $fullName ?? $name); $baseType = $isList ? substr($type, 0, -2) : $type; // Ignore the first '[]': the frontend will take care of it while (\Str::endsWith($baseType, '[]')) { $fullName .= '.0'; $baseType = substr($baseType, 0, -2); } // When the body is an array, the item names will be ".0.thing" $fullName = ltrim($fullName, '.'); $inputType = match($baseType) { 'number', 'integer' => 'number', 'file' => 'file', default => 'text', }; @endphp @if($type === 'boolean') @elseif($isList) @else @endif @endif
@php if($example !== null && $example !== '' && !is_array($example)) { $exampleAsString = $example; if (is_bool($example)) { $exampleAsString = $example ? "true" : "false"; } $description .= " Example: `$exampleAsString`"; } @endphp {!! Parsedown::instance()->text(trim($description)) !!} @if(!empty($enumValues)) Must be one of:
    {!! implode(" ", array_map(fn($val) => "
  • $val
  • ", $enumValues)) !!}
@endif ================================================ FILE: resources/views/vendor/scribe/components/nested-fields.blade.php ================================================ @php $isInput ??= true; $level ??= 0; @endphp @foreach($fields as $name => $field) @if($name === '[]') @php $description = "The request body is an array ({$field['type']}`)"; $description .= !empty($field['description']) ? ", representing ".lcfirst($field['description'])."." : '.'; if(count($field['__fields'])) $description .= " Each item has the following properties:"; @endphp {!! Parsedown::instance()->text($description) !!} @foreach($field['__fields'] as $subfieldName => $subfield) @if(!empty($subfield['__fields'])) @else
@component('scribe::components.field-details', [ 'name' => $subfieldName, 'fullName' => $subfield['name'], 'type' => $subfield['type'] ?? 'string', 'required' => $subfield['required'] ?? false, 'deprecated' => $subfield['deprecated'] ?? false, 'description' => $subfield['description'] ?? '', 'example' => $subfield['example'] ?? '', 'enumValues' => $subfield['enumValues'] ?? null, 'endpointId' => $endpointId, 'hasChildren' => false, 'component' => 'body', 'isInput' => $isInput, ]) @endcomponent
@endif @endforeach @elseif(!empty($field['__fields']))
@component('scribe::components.field-details', [ 'name' => $name, 'fullName' => $field['name'], 'type' => $field['type'] ?? 'string', 'required' => $field['required'] ?? false, 'deprecated' => $field['deprecated'] ?? false, 'description' => $field['description'] ?? '', 'example' => $field['example'] ?? '', 'enumValues' => $field['enumValues'] ?? null, 'endpointId' => $endpointId, 'hasChildren' => true, 'component' => 'body', 'isInput' => $isInput, ]) @endcomponent @foreach($field['__fields'] as $subfieldName => $subfield) @if(!empty($subfield['__fields'])) @else
@component('scribe::components.field-details', [ 'name' => $subfieldName, 'fullName' => $subfield['name'], 'type' => $subfield['type'] ?? 'string', 'required' => $subfield['required'] ?? false, 'deprecated' => $subfield['deprecated'] ?? false, 'description' => $subfield['description'] ?? '', 'example' => $subfield['example'] ?? '', 'enumValues' => $subfield['enumValues'] ?? null, 'endpointId' => $endpointId, 'hasChildren' => false, 'component' => 'body', 'isInput' => $isInput, ]) @endcomponent
@endif @endforeach
@else
@component('scribe::components.field-details', [ 'name' => $name, 'fullName' => $field['name'], 'type' => $field['type'] ?? 'string', 'required' => $field['required'] ?? false, 'deprecated' => $field['deprecated'] ?? false, 'description' => $field['description'] ?? '', 'example' => $field['example'] ?? '', 'enumValues' => $field['enumValues'] ?? null, 'endpointId' => $endpointId, 'hasChildren' => false, 'component' => 'body', 'isInput' => $isInput, ]) @endcomponent
@endif @endforeach ================================================ FILE: resources/views/vendor/scribe/external/elements.blade.php ================================================ {!! $metadata['title'] !!} $value) {{-- Attributes specified first override later ones --}} {!! $attribute !!}="{!! $value !!}" @endforeach apiDescriptionUrl="{!! $metadata['openapi_spec_url'] !!}" router="hash" layout="sidebar" hideTryIt="{!! ($tryItOut['enabled'] ?? true) ? '' : 'true'!!}" @if(!empty($metadata['logo'])) logo="{!! $metadata['logo'] !!}" @endif /> ================================================ FILE: resources/views/vendor/scribe/external/rapidoc.blade.php ================================================ $value) {{-- Attributes specified first override later ones --}} {!! $attribute !!}="{!! $value !!}" @endforeach spec-url="{!! $metadata['openapi_spec_url'] !!}" render-style="read" allow-try="{!! ($tryItOut['enabled'] ?? true) ? 'true' : 'false'!!}" > @if($metadata['logo']) @endif ================================================ FILE: resources/views/vendor/scribe/external/scalar.blade.php ================================================ {!! $metadata['title'] !!} ================================================ FILE: resources/views/vendor/scribe/markdown/auth.blade.php ================================================ @php use Knuckles\Scribe\Tools\Utils as u; @endphp # {{ u::trans("scribe::headings.auth") }} @if(!$isAuthed) {!! u::trans("scribe::auth.none") !!} @else {!! $authDescription !!} {!! $extraAuthInfo !!} @endif ================================================ FILE: resources/views/vendor/scribe/markdown/intro.blade.php ================================================ @php use Knuckles\Scribe\Tools\Utils as u; @endphp # {{ u::trans("scribe::headings.introduction") }} {!! $description !!} {!! $introText !!} ================================================ FILE: resources/views/vendor/scribe/partials/example-requests/bash.md.blade.php ================================================ @php use Knuckles\Scribe\Tools\WritingUtils as u; /** @var Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp ```bash curl --request {{$endpoint->httpMethods[0]}} \ {{$endpoint->httpMethods[0] == 'GET' ? '--get ' : ''}}"{!! rtrim($baseUrl, '/') !!}/{{ ltrim($endpoint->boundUri, '/') }}@if(count($endpoint->cleanQueryParameters))?{!! u::printQueryParamsAsString($endpoint->cleanQueryParameters) !!}@endif"@if(count($endpoint->headers)) \ @foreach($endpoint->headers as $header => $value) --header "{{$header}}: {{ addslashes($value) }}"@if(! ($loop->last) || ($loop->last && count($endpoint->bodyParameters))) \ @endif @endforeach @endif @if($endpoint->hasFiles() || (isset($endpoint->headers['Content-Type']) && $endpoint->headers['Content-Type'] == 'multipart/form-data' && count($endpoint->cleanBodyParameters))) @foreach($endpoint->cleanBodyParameters as $parameter => $value) @foreach(u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $actualValue) --form "{!! "$key=".$actualValue !!}"@if(!($loop->parent->last) || count($endpoint->fileParameters))\ @endif @endforeach @endforeach @foreach($endpoint->fileParameters as $parameter => $value) @foreach(u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $file) --form "{!! "$key=@".$file->path() !!}" @if(!($loop->parent->last))\ @endif @endforeach @endforeach @elseif(count($endpoint->cleanBodyParameters)) @if ($endpoint->headers['Content-Type'] == 'application/x-www-form-urlencoded') --data "{!! http_build_query($endpoint->cleanBodyParameters, '', '&') !!}" @else --data "{!! addslashes(json_encode($endpoint->cleanBodyParameters, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)) !!}" @endif @endif ``` ================================================ FILE: resources/views/vendor/scribe/partials/example-requests/javascript.md.blade.php ================================================ @php use Knuckles\Scribe\Tools\WritingUtils as u; /** @var Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp ```javascript const url = new URL( "{!! rtrim($baseUrl, '/') !!}/{{ ltrim($endpoint->boundUri, '/') }}" ); @if(count($endpoint->cleanQueryParameters)) const params = {!! u::printQueryParamsAsKeyValue($endpoint->cleanQueryParameters, "\"", ":", 4, "{}") !!}; Object.keys(params) .forEach(key => url.searchParams.append(key, params[key])); @endif @if(!empty($endpoint->headers)) const headers = { @foreach($endpoint->headers as $header => $value) "{{$header}}": "{{$value}}", @endforeach @empty($endpoint->headers['Accept']) "Accept": "application/json", @endempty }; @endif @if($endpoint->hasFiles() || (isset($endpoint->headers['Content-Type']) && $endpoint->headers['Content-Type'] == 'multipart/form-data' && count($endpoint->cleanBodyParameters))) const body = new FormData(); @foreach($endpoint->cleanBodyParameters as $parameter => $value) @foreach( u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $actualValue) body.append('{!! $key !!}', '{!! $actualValue !!}'); @endforeach @endforeach @foreach($endpoint->fileParameters as $parameter => $value) @foreach( u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $file) body.append('{!! $key !!}', document.querySelector('input[name="{!! $key !!}"]').files[0]); @endforeach @endforeach @elseif(count($endpoint->cleanBodyParameters)) @if ($endpoint->headers['Content-Type'] == 'application/x-www-form-urlencoded') let body = "{!! http_build_query($endpoint->cleanBodyParameters, '', '&') !!}"; @else let body = {!! json_encode($endpoint->cleanBodyParameters, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) !!}; @endif @endif fetch(url, { method: "{{$endpoint->httpMethods[0]}}", @if(count($endpoint->headers)) headers, @endif @if($endpoint->hasFiles() || (isset($endpoint->headers['Content-Type']) && $endpoint->headers['Content-Type'] == 'multipart/form-data' && count($endpoint->cleanBodyParameters))) body, @elseif(count($endpoint->cleanBodyParameters)) @if ($endpoint->headers['Content-Type'] == 'application/x-www-form-urlencoded') body, @else body: JSON.stringify(body), @endif @endif }).then(response => response.json()); ``` ================================================ FILE: resources/views/vendor/scribe/partials/example-requests/php.md.blade.php ================================================ @php use Knuckles\Scribe\Tools\WritingUtils as u; /** @var Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp ```php $client = new \GuzzleHttp\Client(); $url = '{!! rtrim($baseUrl, '/') . '/' . ltrim($endpoint->boundUri, '/') !!}'; @if($endpoint->hasHeadersOrQueryOrBodyParams()) $response = $client->{{ strtolower($endpoint->httpMethods[0]) }}( $url, [ @if(!empty($endpoint->headers)) 'headers' => {!! u::printPhpValue($endpoint->headers, 8) !!}, @endif @if(!empty($endpoint->cleanQueryParameters)) 'query' => {!! u::printQueryParamsAsKeyValue($endpoint->cleanQueryParameters, "'", " =>", 12, "[]", 8) !!}, @endif @if($endpoint->hasFiles() || (isset($endpoint->headers['Content-Type']) && $endpoint->headers['Content-Type'] == 'multipart/form-data' && !empty($endpoint->cleanBodyParameters))) 'multipart' => [ @foreach($endpoint->cleanBodyParameters as $parameter => $value) @foreach(u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $actualValue) [ 'name' => '{!! $key !!}', 'contents' => '{!! $actualValue !!}' ], @endforeach @endforeach @foreach($endpoint->fileParameters as $parameter => $value) @foreach(u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $file) [ 'name' => '{!! $key !!}', 'contents' => fopen('{!! $file->path() !!}', 'r') ], @endforeach @endforeach ], @elseif(count($endpoint->cleanBodyParameters)) @if ($endpoint->headers['Content-Type'] == 'application/x-www-form-urlencoded') 'form_params' => {!! u::printPhpValue($endpoint->cleanBodyParameters, 8) !!}, @else 'json' => {!! u::printPhpValue($endpoint->cleanBodyParameters, 8) !!}, @endif @endif ] ); @else $response = $client->{{ strtolower($endpoint->httpMethods[0]) }}($url); @endif $body = $response->getBody(); print_r(json_decode((string) $body)); ``` ================================================ FILE: resources/views/vendor/scribe/partials/example-requests/python.md.blade.php ================================================ @php use Knuckles\Scribe\Tools\WritingUtils as u; /** @var Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp ```python import requests import json url = '{!! rtrim($baseUrl, '/') !!}/{{ $endpoint->boundUri }}' @if($endpoint->hasFiles() || (isset($endpoint->headers['Content-Type']) && $endpoint->headers['Content-Type'] == 'multipart/form-data' && count($endpoint->cleanBodyParameters))) files = { @foreach($endpoint->cleanBodyParameters as $parameter => $value) @foreach(u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $actualValue) '{!! $key !!}': (None, '{!! $actualValue !!}')@if(!($loop->parent->last) || count($endpoint->fileParameters)), @endif @endforeach @endforeach @foreach($endpoint->fileParameters as $parameter => $value) @foreach(u::getParameterNamesAndValuesForFormData($parameter, $value) as $key => $file) '{!! $key !!}': open('{!! $file->path() !!}', 'rb')@if(!($loop->parent->last)), @endif @endforeach @endforeach } @endif @if(count($endpoint->cleanBodyParameters)) payload = {!! json_encode($endpoint->cleanBodyParameters, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) !!} @endif @if(count($endpoint->cleanQueryParameters)) params = {!! u::printQueryParamsAsKeyValue($endpoint->cleanQueryParameters, "'", ":", 2, "{}") !!} @endif @if(!empty($endpoint->headers)) headers = { @foreach($endpoint->headers as $header => $value) '{{$header}}': '{{$value}}'@if(!($loop->last)), @endif @endforeach } @endif @php $optionalArguments = []; if (count($endpoint->headers)) $optionalArguments[] = "headers=headers"; if (count($endpoint->fileParameters)) $optionalArguments[] = "files=files"; if (count($endpoint->cleanBodyParameters) && $endpoint->headers['Content-Type'] != 'multipart/form-data') $optionalArguments[] = (count($endpoint->fileParameters) || $endpoint->headers['Content-Type'] == 'application/x-www-form-urlencoded' ? "data=payload" : "json=payload"); if (count($endpoint->cleanQueryParameters)) $optionalArguments[] = "params=params"; $optionalArguments = implode(', ',$optionalArguments); @endphp response = requests.request('{{$endpoint->httpMethods[0]}}', url, {{ $optionalArguments }}) response.json() ``` ================================================ FILE: resources/views/vendor/scribe/themes/default/endpoint.blade.php ================================================ @php use Knuckles\Scribe\Tools\Utils as u; /** @var Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp

{{ $endpoint->name() }}

@component('scribe::components.badges.auth', ['authenticated' => $endpoint->isAuthed()]) @endcomponent @component('scribe::components.badges.deprecated', ['deprecated' => $endpoint->metadata->deprecated]) @endcomponent

{!! Parsedown::instance()->text($endpoint->metadata->description ?: '') !!}
{{ u::trans("scribe::endpoint.example_request") }}:
@foreach($metadata['example_languages'] as $language)
@include("scribe::partials.example-requests.$language")
@endforeach
@if($endpoint->isGet() || $endpoint->hasResponses()) @foreach($endpoint->responses as $response)

{{ u::trans("scribe::endpoint.example_response") }} ({{ $response->fullDescription() }}):

@if(count($response->headers))
Show headers
@foreach($response->headers as $header => $value)
{{ $header }}: {{ is_array($value) ? implode('; ', $value) : $value }}
@endforeach 
@endif
@if($response->isBinary())
{!! u::trans("scribe::endpoint.responses.binary") !!} - {{ htmlentities(str_replace("<>", "", $response->content)) }}
@elseif($response->status == 204)
{!! u::trans("scribe::endpoint.responses.empty") !!}
@else
@php($parsed = json_decode($response->content))
{{-- If response is a JSON string, prettify it. Otherwise, just print it --}}
{!! htmlentities($parsed != null ? json_encode($parsed, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $response->content) !!}
@endif 
@endforeach @endif

{{ u::trans("scribe::endpoint.request") }}    @if($metadata['try_it_out']['enabled'] ?? false)    @endif

@foreach($endpoint->httpMethods as $method)

@component('scribe::components.badges.http-method', ['method' => $method])@endcomponent {{$endpoint->uri}}

@endforeach @if(count($endpoint->headers))

{{ u::trans("scribe::endpoint.headers") }}

@foreach($endpoint->headers as $name => $example) isAuthed() && 'header' == $metadata['auth']['location'] && $metadata['auth']['name'] == $name) { $htmlOptions = ['class' => 'auth-value']; } ?>
@component('scribe::components.field-details', [ 'name' => $name, 'type' => null, 'required' => true, 'deprecated' => false, 'description' => null, 'example' => $example, 'endpointId' => $endpoint->endpointId(), 'component' => 'header', 'isInput' => true, 'html' => $htmlOptions, ]) @endcomponent
@endforeach @endif @if(count($endpoint->urlParameters))

{{ u::trans("scribe::endpoint.url_parameters") }}

@foreach($endpoint->urlParameters as $attribute => $parameter)
@component('scribe::components.field-details', [ 'name' => $parameter->name, 'type' => $parameter->type ?? 'string', 'required' => $parameter->required, 'deprecated' => $parameter->deprecated, 'description' => $parameter->description, 'example' => $parameter->example ?? '', 'enumValues' => $parameter->enumValues, 'endpointId' => $endpoint->endpointId(), 'component' => 'url', 'isInput' => true, ]) @endcomponent
@endforeach @endif @if(count($endpoint->queryParameters))

{{ u::trans("scribe::endpoint.query_parameters") }}

@foreach($endpoint->queryParameters as $attribute => $parameter) isAuthed() && 'query' == $metadata['auth']['location'] && $metadata['auth']['name'] == $attribute) { $htmlOptions = ['class' => 'auth-value']; } ?>
@component('scribe::components.field-details', [ 'name' => $parameter->name, 'type' => $parameter->type, 'required' => $parameter->required, 'deprecated' => $parameter->deprecated, 'description' => $parameter->description, 'example' => $parameter->example ?? '', 'enumValues' => $parameter->enumValues, 'endpointId' => $endpoint->endpointId(), 'component' => 'query', 'isInput' => true, 'html' => $htmlOptions, ]) @endcomponent
@endforeach @endif @if(count($endpoint->nestedBodyParameters))

{{ u::trans("scribe::endpoint.body_parameters") }}

@endif @if(count($endpoint->responseFields))

{{ u::trans("scribe::endpoint.response") }}

{{ u::trans("scribe::endpoint.response_fields") }}

@endif ================================================ FILE: resources/views/vendor/scribe/themes/default/groups.blade.php ================================================ @foreach($groupedEndpoints as $group)

{!! $group['name'] !!}

{!! Parsedown::instance()->text($group['description']) !!} @foreach($group['subgroups'] as $subgroupName => $subgroup) @if($subgroupName !== "")

{{ $subgroupName }}

@php($subgroupDescription = collect($subgroup)->first(fn ($e) => $e->metadata->subgroupDescription)?->metadata?->subgroupDescription) @if($subgroupDescription)

{!! Parsedown::instance()->text($subgroupDescription) !!}

@endif @endif @foreach($subgroup as $endpoint) @include("scribe::themes.default.endpoint") @endforeach @endforeach @endforeach ================================================ FILE: resources/views/vendor/scribe/themes/default/index.blade.php ================================================ @php use Knuckles\Scribe\Tools\WritingUtils as u; @endphp {!! $metadata['title'] !!} @if(isset($metadata['example_languages'])) @endif @if($tryItOut['enabled'] ?? true) @endif @include("scribe::themes.default.sidebar")
{!! $intro !!} {!! $auth !!} @include("scribe::themes.default.groups") {!! $append !!}
@if(isset($metadata['example_languages']))
@foreach($metadata['example_languages'] as $name => $lang) @php if (is_numeric($name)) $name = $lang; @endphp @endforeach
@endif
================================================ FILE: resources/views/vendor/scribe/themes/default/sidebar.blade.php ================================================ @php use Knuckles\Scribe\Tools\Utils as u; @endphp MENU navbar-image
@if($metadata['logo'] != false) @endif @isset($metadata['example_languages'])
@foreach($metadata['example_languages'] as $name => $lang) @php if (is_numeric($name)) $name = $lang; @endphp @endforeach
@endisset
@foreach($headings as $h1) @endforeach
================================================ FILE: resources/views/vendor/scribe/themes/elements/components/field-details.blade.php ================================================ @php $hasChildren ??= false; $isArrayBody = $name == "[]"; $expandable = $hasChildren && !$isArrayBody; @endphp
@if($expandable)
@endif @unless($isArrayBody)
{{ $name }}
@if($type) {{ $type }} @endif
@if($required || $deprecated)
@if($required) required @endif @if($deprecated) deprecated @endif
@endif @endunless
@if($description)
{!! Parsedown::instance()->text($description) !!}
@endif @if(!empty($enumValues)) Must be one of:
    {!! implode(" ", array_map(fn($val) => "
  • $val
  • ", $enumValues)) !!}
@endif @if($isArrayBody)
array of:
@if($required)
required @endif
@endif @if(!$hasChildren && !is_null($example) && $example !== '')
Example:
{{ is_array($example) || is_bool($example) ? json_encode($example) : $example }}
@endif
================================================ FILE: resources/views/vendor/scribe/themes/elements/components/nested-fields.blade.php ================================================ @php $level ??= 0; $levelNestingClass = match($level) { 0 => "sl-ml-px", default => "sl-ml-7" }; $expandable ??= !isset($fields["[]"]); @endphp @foreach($fields as $name => $field)
@component('scribe::themes.elements.components.field-details', [ 'name' => $name, 'type' => $field['type'] ?? 'string', 'required' => $field['required'] ?? false, 'deprecated' => $field['deprecated'] ?? false, 'description' => $field['description'] ?? '', 'example' => $field['example'] ?? '', 'enumValues' => $field['enumValues'] ?? null, 'endpointId' => $endpointId, 'hasChildren' => !empty($field['__fields']), 'component' => 'body', ]) @endcomponent @if(!empty($field['__fields']))
@component('scribe::themes.elements.components.nested-fields', [ 'fields' => $field['__fields'], 'endpointId' => $endpointId, 'level' => $level + 1, 'expandable'=> $expandable, ]) @endcomponent
@endif
@endforeach ================================================ FILE: resources/views/vendor/scribe/themes/elements/endpoint.blade.php ================================================ @php use Knuckles\Scribe\Tools\Utils as u; /** @var Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp

{{ $endpoint->name() }}

@foreach($endpoint->httpMethods as $method)
{{ $method }}
@endforeach
{!! rtrim($baseUrl, '/') !!}
/{{ ltrim($endpoint->uri, '/') }}
@if($endpoint->metadata->authenticated)
requires authentication
@endif @if($endpoint->metadata->deprecated === true)
deprecated
@endif @if(is_string($endpoint->metadata->deprecated))
deprecated:{{$endpoint->metadata->deprecated}}
@endif
{!! Parsedown::instance()->text($endpoint->metadata->description ?: '') !!}
@if(count($endpoint->headers))

{{ u::trans("scribe::endpoint.headers") }}

@foreach($endpoint->headers as $header => $value) @component('scribe::themes.elements.components.field-details', [ 'name' => $header, 'type' => null, 'required' => false, 'deprecated' => false, 'description' => null, 'example' => $value, 'endpointId' => $endpoint->endpointId(), 'component' => 'header', 'isInput' => true, ]) @endcomponent @endforeach
@endif @if(count($endpoint->urlParameters))

{{ u::trans("scribe::endpoint.url_parameters") }}

@foreach($endpoint->urlParameters as $attribute => $parameter) @component('scribe::themes.elements.components.field-details', [ 'name' => $parameter->name, 'type' => $parameter->type ?? 'string', 'required' => $parameter->required, 'deprecated' => $parameter->deprecated, 'description' => $parameter->description, 'example' => $parameter->example ?? '', 'enumValues' => $parameter->enumValues, 'endpointId' => $endpoint->endpointId(), 'component' => 'url', 'isInput' => true, ]) @endcomponent @endforeach
@endif @if(count($endpoint->queryParameters))

{{ u::trans("scribe::endpoint.query_parameters") }}

@foreach($endpoint->queryParameters as $attribute => $parameter) @component('scribe::themes.elements.components.field-details', [ 'name' => $parameter->name, 'type' => $parameter->type, 'required' => $parameter->required, 'deprecated' => $parameter->deprecated, 'description' => $parameter->description, 'example' => $parameter->example ?? '', 'enumValues' => $parameter->enumValues, 'endpointId' => $endpoint->endpointId(), 'component' => 'query', 'isInput' => true, ]) @endcomponent @endforeach
@endif @if(count($endpoint->nestedBodyParameters))

{{ u::trans("scribe::endpoint.body_parameters") }}

@component('scribe::themes.elements.components.nested-fields', [ 'fields' => $endpoint->nestedBodyParameters, 'endpointId' => $endpoint->endpointId(), ]) @endcomponent
@endif @if(count($endpoint->responseFields))

{{ u::trans("scribe::endpoint.response_fields") }}

@component('scribe::themes.elements.components.nested-fields', [ 'fields' => $endpoint->nestedResponseFields, 'endpointId' => $endpoint->endpointId(), 'isInput' => false, ]) @endcomponent
@endif
@if($metadata['try_it_out']['enabled'] ?? false) @include("scribe::themes.elements.try_it_out") @endif @if($metadata['example_languages'])
{{ u::trans("scribe::endpoint.example_request") }}:
@foreach($metadata['example_languages'] as $index => $language)
@include("scribe::partials.example-requests.$language")
@endforeach
@endif @if($endpoint->isGet() || $endpoint->hasResponses())
{{ u::trans("scribe::endpoint.example_response") }}:
@foreach($endpoint->responses as $index => $response)
@if(count($response->headers))
Headers @php $headerLines = []; foreach($response->headers as $header => $value) { $headerLines[] = $header . ': ' . (is_array($value) ? implode('; ', $value) : $value); } @endphp
{{ implode("\n", $headerLines) }}
@endif @if($response->isBinary())
[{{ u::trans("scribe::endpoint.responses.binary") }}] - {{ htmlentities(str_replace("<>", "", $response->content)) }}
@elseif($response->status == 204)
[{{ u::trans("scribe::endpoint.responses.empty") }}]
@else @php($parsed = json_decode($response->content)) {{-- If response is a JSON string, prettify it. Otherwise, just print it --}}
{!! htmlentities($parsed != null ? json_encode($parsed, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $response->content) !!}
@endif
@endforeach
@endif
================================================ FILE: resources/views/vendor/scribe/themes/elements/groups.blade.php ================================================ @foreach($groupedEndpoints as $group)

{!! $group['name'] !!}

{!! Parsedown::instance()->text($group['description']) !!} @foreach($group['subgroups'] as $subgroupName => $subgroup) @if($subgroupName !== "")

{{ $subgroupName }}

@php($subgroupDescription = collect($subgroup)->first(fn ($e) => $e->metadata->subgroupDescription)?->metadata?->subgroupDescription) @if($subgroupDescription) {!! Parsedown::instance()->text($subgroupDescription) !!} @endif
@endif @foreach($subgroup as $endpoint) @include("scribe::themes.elements.endpoint") @endforeach @endforeach @endforeach ================================================ FILE: resources/views/vendor/scribe/themes/elements/index.blade.php ================================================ @php use Knuckles\Scribe\Tools\WritingUtils as u; @endphp {!! $metadata['title'] !!} @if($tryItOut['enabled'] ?? true) @endif @if($metadata['example_languages']) @endif
@include("scribe::themes.elements.sidebar")

{!! $metadata['title'] !!}

@if($metadata['postman_collection_url']) Postman collection → @endif @if($metadata['openapi_spec_url']) OpenAPI spec → @endif
{!! $intro !!} {!! $auth !!}
@include("scribe::themes.elements.groups")
{!! $append !!}
================================================ FILE: resources/views/vendor/scribe/themes/elements/sidebar.blade.php ================================================ ================================================ FILE: resources/views/vendor/scribe/themes/elements/try_it_out.blade.php ================================================ @php use Knuckles\Scribe\Tools\Utils as u; /** @var \Knuckles\Camel\Output\OutputEndpointData $endpoint */ @endphp
@if($endpoint->isAuthed() && $metadata['auth']['location'] !== 'body') @endif @if(count($endpoint->headers)) @endif @if(count($endpoint->urlParameters)) @endif @if(count($endpoint->queryParameters)) @endif @if(count($endpoint->bodyParameters)) @endif
================================================ FILE: routes/ai.php ================================================ group(function () use ($mcpPath, $mcpMiddleware): void { Mcp::web($mcpPath, RelaticleServer::class) ->middleware($mcpMiddleware); }); } else { Mcp::web($mcpPath, RelaticleServer::class) ->middleware($mcpMiddleware); } ================================================ FILE: routes/api.php ================================================ middleware([ForceJsonResponse::class, 'auth:sanctum', 'throttle:api', EnsureTokenHasAbility::class, SetApiTeamContext::class]) ->group(function (): void { Route::get('user', function (Request $request) { return new UserResource($request->user()); }); Route::apiResource('companies', CompaniesController::class); Route::apiResource('people', PeopleController::class); Route::apiResource('opportunities', OpportunitiesController::class); Route::apiResource('tasks', TasksController::class); Route::apiResource('notes', NotesController::class); Route::get('custom-fields', [CustomFieldsController::class, 'index'])->name('custom-fields.index'); }); ================================================ FILE: routes/web.php ================================================ group(function () { Route::get('/auth/redirect/{provider}', RedirectController::class) ->name('auth.socialite.redirect') ->middleware('throttle:10,1'); Route::get('/auth/callback/{provider}', CallbackController::class) ->name('auth.socialite.callback') ->middleware('throttle:10,1'); Route::get('/login', fn () => redirect()->to(url()->getAppUrl('login')))->name('login'); Route::get('/register', fn () => redirect()->to(url()->getAppUrl('register')))->name('register'); Route::get('/forgot-password', fn () => redirect()->to(url()->getAppUrl('forgot-password')))->name('password.request'); }); Route::middleware(ProvideMarkdownResponse::class)->group(function (): void { Route::get('/', HomeController::class); Route::get('/terms-of-service', TermsOfServiceController::class)->name('terms.show'); Route::get('/privacy-policy', PrivacyPolicyController::class)->name('policy.show'); Route::get('/pricing', fn () => view('pricing'))->name('pricing'); Route::get('/contact', [ContactController::class, 'show'])->name('contact'); Route::post('/contact', [ContactController::class, 'store'])->middleware(['throttle:5,1', ProtectAgainstSpam::class]); }); Route::get('/dashboard', fn () => redirect()->to(url()->getAppUrl()))->name('dashboard'); Route::get('/team-invitations/{invitation}', AcceptTeamInvitationController::class) ->middleware(['signed', 'auth', 'verified', AuthenticateSession::class]) ->name('team-invitations.accept'); // Legacy documentation redirects Route::get('/documentation/{slug?}', fn (string $slug = '') => redirect("/docs/{$slug}", 301)) ->where('slug', '.*'); // Community redirects Route::get('/discord', function () { return redirect()->away(config('services.discord.invite_url')); })->name('discord'); ================================================ FILE: storage/app/.gitignore ================================================ * !public/ !.gitignore ================================================ FILE: storage/clockwork/.gitignore ================================================ *.json *.json.gz index ================================================ FILE: storage/framework/.gitignore ================================================ compiled.php config.php down events.scanned.php maintenance.php routes.php routes.scanned.php schedule-* services.json ================================================ FILE: storage/framework/cache/.gitignore ================================================ * !data/ !.gitignore ================================================ FILE: storage/framework/sessions/.gitignore ================================================ * !.gitignore ================================================ FILE: storage/framework/testing/.gitignore ================================================ * !.gitignore ================================================ FILE: storage/framework/views/.gitignore ================================================ * !.gitignore ================================================ FILE: storage/logs/.gitignore ================================================ * !.gitignore ================================================ FILE: storage/pail/.gitignore ================================================ * !.gitignore ================================================ FILE: stubs/Mailcoach.stub ================================================ */ public $tags; } namespace Spatie\MailcoachSdk\Facades; /** * @method static \Spatie\MailcoachSdk\Resources\Subscriber createSubscriber(string $emailListUuid, array $attributes) * @method static ?\Spatie\MailcoachSdk\Resources\Subscriber findByEmail(string $emailListUuid, string $email) * @method static \Spatie\MailcoachSdk\Resources\Subscriber updateSubscriber(string $subscriberUuid, array $attributes) * @method static \Spatie\MailcoachSdk\Resources\Subscriber subscriber(string $uuid) * @method static void deleteSubscriber(string $subscriberUuid) * @method static void confirmSubscriber(string $subscriberUuid) * @method static void unsubscribeSubscriber(string $subscriberUuid) * @method static void resubscribeSubscriber(string $subscriberUuid) * @method static void resendConfirmation(string $subscriberUuid) * * @see \Spatie\MailcoachSdk\Mailcoach */ class Mailcoach { } ================================================ FILE: tests/Arch/ArchTest.php ================================================ preset()->php(); // arch()->preset()->strict(); arch()->preset()->security()->ignoring('assert'); arch()->preset() ->laravel() ->ignoring([ 'App\Providers\AppServiceProvider', 'App\Providers\Filament\AppPanelProvider', 'Relaticle\Admin\AdminPanelProvider', 'App\Enums\EnumValues', 'App\Enums\CustomFields\CustomFieldTrait', 'App\Mcp', ]); arch('strict types') ->expect('App') ->toUseStrictTypes(); arch('avoid open for extension') ->expect('App') ->classes() ->toBeFinal() ->ignoring([ BaseLivewireComponent::class, BaseImporter::class, BaseExporter::class, BaseListTool::class, BaseShowTool::class, BaseCreateTool::class, BaseUpdateTool::class, BaseDeleteTool::class, BaseAttachTool::class, BaseDetachTool::class, ImportPage::class, PersonalAccessToken::class, ]); arch('ensure no extends') ->expect('App') ->classes() ->not ->toBeAbstract() ->ignoring([ BaseLivewireComponent::class, BaseImporter::class, BaseExporter::class, BaseListTool::class, BaseShowTool::class, BaseCreateTool::class, BaseUpdateTool::class, BaseDeleteTool::class, BaseAttachTool::class, BaseDetachTool::class, ImportPage::class, ]); arch('avoid mutation') ->expect('App') ->classes() ->toBeReadonly() ->ignoring([ 'App\Console\Commands', 'App\Exceptions', 'App\Filament', 'App\Health', 'App\Http\Requests', 'App\Http\Resources', 'App\Jobs', 'App\Listeners', 'App\Livewire', 'App\Mail', 'App\Mcp', 'App\Models', 'App\Data', 'App\Notifications', 'App\Providers', 'App\View', 'App\Services\Favicon\Drivers', 'App\Providers\Filament', 'App\Scribe', ]); arch('avoid inheritance') ->expect('App') ->classes() ->toExtendNothing() ->ignoring([ 'App\Console\Commands', 'App\Exceptions', 'App\Filament', 'App\Http\Requests', 'App\Http\Resources', 'App\Jobs', 'App\Data', 'App\Livewire', 'App\Mail', 'App\Health', 'App\Mcp', 'App\Models', 'App\Notifications', 'App\Providers', 'App\Scribe', 'App\View', ]); // arch('annotations') // ->expect('App') // ->toHavePropertiesDocumented() // ->toHaveMethodsDocumented(); arch('main app must not depend on SystemAdmin module') ->expect('App') ->not ->toUse('Relaticle\SystemAdmin') ->ignoring([ 'App\Providers\AppServiceProvider', 'App\Console\Commands\InstallCommand', 'App\Console\Commands\CreateSystemAdminCommand', ]); arch('SystemAdmin module must not depend on main app namespace') ->expect('Relaticle\SystemAdmin') ->not ->toUse('App') ->ignoring([ 'App\Models', 'App\Enums', 'App\Rules', ]); arch('API controllers must not use Eloquent query methods directly') ->expect('App\Http\Controllers\Api\V1') ->not ->toUse([ 'Illuminate\Support\Facades\DB', ]); arch('API controllers must depend on actions for write operations') ->expect('App\Http\Controllers\Api\V1') ->toOnlyUse([ 'App\Actions', 'App\Enums', 'App\Http\Requests', 'App\Http\Resources', 'App\Models', 'Illuminate', 'Knuckles\Scribe', 'response', ]); arch('MCP tools must not use DB facade directly') ->expect('App\Mcp\Tools') ->not ->toUse([ 'Illuminate\Support\Facades\DB', ]); arch('must not use custom-fields package models directly') ->expect([ 'App', 'Relaticle\ImportWizard', 'Relaticle\OnboardSeed', 'Relaticle\Documentation', ]) ->not ->toUse([ 'Relaticle\CustomFields\Models\CustomField', 'Relaticle\CustomFields\Models\CustomFieldOption', 'Relaticle\CustomFields\Models\CustomFieldSection', 'Relaticle\CustomFields\Models\CustomFieldValue', ]) ->ignoring([ 'App\Models\CustomField', 'App\Models\CustomFieldOption', 'App\Models\CustomFieldSection', 'App\Models\CustomFieldValue', ]); ================================================ FILE: tests/Browser/Auth/LoginBrowserTest.php ================================================ withTeam()->create(); $team = $user->ownedTeams()->first(); $this->visit('/app/login') ->type('[id="form.email"]', $user->email) ->type('[id="form.password"]', 'password') ->click('button.fi-btn') ->assertPathIs("/app/{$team->slug}/companies"); }); ================================================ FILE: tests/Browser/Auth/PasswordResetBrowserTest.php ================================================ withTeam()->create(); $this->visit('/app/login') ->click('a[href*="password-reset"]') ->assertPathContains('/password-reset/request') ->assertSee('Forgot password?') ->type('[id="form.email"]', $user->email) ->press('Send email') ->waitForText('We have emailed your password reset link', 10) ->assertSee('We have emailed your password reset link'); }); it('can reset password using a valid reset link', function (): void { $user = User::factory()->withTeam()->create(); $token = Password::broker('users')->createToken($user); $resetUrl = Filament::getPanel('app')->getResetPasswordUrl($token, $user); $this->visit('/app/login') ->navigate($resetUrl) ->assertSee('Reset password') ->type('[id="form.password"]', 'new-secure-password') ->type('[id="form.passwordConfirmation"]', 'new-secure-password') ->press('Reset password') ->waitForText('Your password has been reset', 10) ->assertPathContains('/login'); expect(Hash::check('new-secure-password', $user->fresh()->password))->toBeTrue(); }); ================================================ FILE: tests/Browser/CRM/CompanyBrowserTest.php ================================================ withTeam()->create(); $team = $user->ownedTeams()->first(); $this->visit('/app/login') ->type('[id="form.email"]', $user->email) ->type('[id="form.password"]', 'password') ->click('button.fi-btn') ->assertPathIs("/app/{$team->slug}/companies") ->press('New company') ->type('[id="mountedActionSchema0.name"]', 'Browser Test Corp') ->press('Create') ->assertSee('Browser Test Corp'); expect(Company::where('name', 'Browser Test Corp')->where('team_id', $team->id)->exists())->toBeTrue(); }); ================================================ FILE: tests/Browser/ImportWizard/ImportWizardBrowserTest.php ================================================ withTeam()->create(); $team = $user->ownedTeams()->first(); $this->visit('/app/login') ->type('[id="form.email"]', $user->email) ->type('[id="form.password"]', 'password') ->click('button.fi-btn') ->assertPathIs("/app/{$team->slug}/companies") ->navigate("/app/{$team->slug}/companies/import") ->assertSee('Import Companies') ->assertSee('Drop your .CSV file onto this area to upload'); // The full upload + wizard flow involves Livewire file uploads and complex // server-side state transitions that are better covered by the existing // Livewire feature tests in tests/Feature/ImportWizard/. }); ================================================ FILE: tests/Browser/Onboarding/OnboardingBrowserTest.php ================================================ create(); $this->visit('/app/login') ->type('[id="form.email"]', $user->email) ->type('[id="form.password"]', 'password') ->click('button.fi-btn') ->assertPathIs('/app/new') ->navigate('/app/new') ->assertSee('Create your workspace') ->type('[id="form.name"]', 'My First Workspace') ->type('[id="form.slug"]', 'my-first-workspace') ->press('Create Team') ->assertPathContains('/app/my-first-workspace/companies'); $user->refresh(); expect($user->ownedTeams)->toHaveCount(1) ->and($user->ownedTeams->first()->name)->toBe('My First Workspace'); }); ================================================ FILE: tests/Browser/SmokeBrowserTest.php ================================================ visit('/') ->assertNoJavaScriptErrors(); }); ================================================ FILE: tests/Browser/Teams/TeamBrowserTest.php ================================================ withTeam()->create(); $team = $user->ownedTeams()->first(); $this->visit('/app/login') ->type('[id="form.email"]', $user->email) ->type('[id="form.password"]', 'password') ->click('button.fi-btn') ->assertPathIs("/app/{$team->slug}/companies") ->navigate('/app/new') ->assertSee('Create your workspace') ->type('[id="form.name"]', 'Second Workspace') ->type('[id="form.slug"]', 'second-workspace') ->press('Create Team') ->assertPathContains('/app/second-workspace/companies'); expect(Team::where('name', 'Second Workspace')->where('user_id', $user->id)->exists())->toBeTrue(); }); ================================================ FILE: tests/Feature/AI/RecordSummaryServiceTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); Filament::setTenant($this->user->currentTeam); }); describe('RecordContextBuilder', function () { it('builds context for a company', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(['name' => 'Test Company']); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($company); expect($context) ->toHaveKey('entity_type', 'Company') ->toHaveKey('name', 'Test Company') ->toHaveKey('basic_info') ->toHaveKey('relationships') ->toHaveKey('notes') ->toHaveKey('tasks'); }); it('builds context for a person', function () { $person = People::factory() ->for($this->user->currentTeam) ->create(['name' => 'John Doe']); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($person); expect($context) ->toHaveKey('entity_type', 'Person') ->toHaveKey('name', 'John Doe') ->toHaveKey('basic_info') ->toHaveKey('notes') ->toHaveKey('tasks'); }); it('builds context for an opportunity', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $opportunity = Opportunity::factory() ->for($this->user->currentTeam) ->for($company) ->create(['name' => 'Test Deal']); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($opportunity); expect($context) ->toHaveKey('entity_type', 'Opportunity') ->toHaveKey('basic_info') ->toHaveKey('company', $company->name) ->toHaveKey('notes') ->toHaveKey('tasks'); }); it('includes related notes in context', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $notes = Note::factory() ->for($this->user->currentTeam) ->count(3) ->create(); $company->notes()->attach($notes); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($company->fresh()); expect($context['notes']) ->toHaveKey('items') ->toHaveKey('showing', 3) ->toHaveKey('total', 3) ->toHaveKey('has_more', false) ->and($context['notes']['items'])->toHaveCount(3); }); it('includes related tasks in context', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $tasks = Task::factory() ->for($this->user->currentTeam) ->count(2) ->create(); $company->tasks()->attach($tasks); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($company->fresh()); expect($context['tasks']) ->toHaveKey('items') ->toHaveKey('showing', 2) ->toHaveKey('total', 2) ->toHaveKey('has_more', false) ->and($context['tasks']['items'])->toHaveCount(2); }); it('limits related records and shows pagination info', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $notes = Note::factory() ->for($this->user->currentTeam) ->count(15) ->create(); $company->notes()->attach($notes); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($company->fresh()); expect($context['notes']) ->toHaveKey('showing', 10) ->toHaveKey('total', 15) ->toHaveKey('has_more', true) ->and($context['notes']['items'])->toHaveCount(10); }); it('handles multi-value custom fields as strings in basic info', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $domainsField = CustomField::query() ->where('code', CompanyField::DOMAINS->value) ->forEntity(Company::class) ->firstOrFail(); CustomFieldValue::forceCreate([ 'tenant_id' => $this->user->currentTeam->getKey(), 'entity_type' => 'company', 'entity_id' => $company->getKey(), 'custom_field_id' => $domainsField->getKey(), 'json_value' => ['example.com', 'test.org'], ]); $builder = app(RecordContextBuilder::class); $context = $builder->buildContext($company); expect($context['basic_info']['domain']) ->toBeString() ->toBe('example.com, test.org'); }); it('throws exception for unsupported model', function () { $builder = app(RecordContextBuilder::class); $builder->buildContext(new User); })->throws(InvalidArgumentException::class); }); describe('RecordSummaryService', function () { it('generates and caches a summary for a company', function () { Prism::fake([ TextResponseFake::make() ->withText('Test Company is a promising lead with recent engagement.') ->withUsage(new Usage(100, 50)) ->withFinishReason(FinishReason::Stop), ]); $company = Company::factory() ->for($this->user->currentTeam) ->create(); $service = app(RecordSummaryService::class); $summary = $service->getSummary($company); expect($summary) ->toBeInstanceOf(AiSummary::class) ->summary->toBe('Test Company is a promising lead with recent engagement.') ->model_used->toBe('claude-haiku-4-5') ->prompt_tokens->toBe(100) ->completion_tokens->toBe(50); $this->assertDatabaseHas('ai_summaries', [ 'summarizable_type' => $company->getMorphClass(), 'summarizable_id' => $company->getKey(), 'team_id' => $this->user->currentTeam->getKey(), ]); }); it('returns cached summary when available', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $cached = AiSummary::create([ 'team_id' => $this->user->currentTeam->getKey(), 'summarizable_type' => $company->getMorphClass(), 'summarizable_id' => $company->getKey(), 'summary' => 'Cached summary text', 'model_used' => 'claude-haiku-4-5', 'prompt_tokens' => 50, 'completion_tokens' => 25, ]); $service = app(RecordSummaryService::class); $summary = $service->getSummary($company->fresh()); expect($summary->id)->toBe($cached->id) ->and($summary->summary)->toBe('Cached summary text'); }); it('regenerates summary when requested', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); AiSummary::create([ 'team_id' => $this->user->currentTeam->getKey(), 'summarizable_type' => $company->getMorphClass(), 'summarizable_id' => $company->getKey(), 'summary' => 'Old cached summary', 'model_used' => 'claude-haiku-4-5', 'prompt_tokens' => 50, 'completion_tokens' => 25, ]); Prism::fake([ TextResponseFake::make() ->withText('New regenerated summary') ->withUsage(new Usage(100, 50)) ->withFinishReason(FinishReason::Stop), ]); $service = app(RecordSummaryService::class); $summary = $service->getSummary($company->fresh(), regenerate: true); expect($summary->summary)->toBe('New regenerated summary'); $this->assertDatabaseCount('ai_summaries', 1); $this->assertDatabaseHas('ai_summaries', [ 'summary' => 'New regenerated summary', ]); }); it('generates summary for a person', function () { Prism::fake([ TextResponseFake::make() ->withText('John is a key decision maker at Acme Corp.') ->withUsage(new Usage(80, 40)) ->withFinishReason(FinishReason::Stop), ]); $person = People::factory() ->for($this->user->currentTeam) ->create(['name' => 'John Doe']); $service = app(RecordSummaryService::class); $summary = $service->getSummary($person); expect($summary->summary)->toBe('John is a key decision maker at Acme Corp.'); }); it('generates summary for an opportunity', function () { Prism::fake([ TextResponseFake::make() ->withText('High-value opportunity in negotiation stage.') ->withUsage(new Usage(90, 45)) ->withFinishReason(FinishReason::Stop), ]); $company = Company::factory() ->for($this->user->currentTeam) ->create(); $opportunity = Opportunity::factory() ->for($this->user->currentTeam) ->for($company) ->create(); $service = app(RecordSummaryService::class); $summary = $service->getSummary($opportunity); expect($summary->summary)->toBe('High-value opportunity in negotiation stage.'); }); }); describe('HasAiSummary trait', function () { it('provides aiSummary relationship on Company', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); expect($company->aiSummary())->toBeInstanceOf(MorphOne::class); }); it('can invalidate summary directly via trait method', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); AiSummary::create([ 'team_id' => $this->user->currentTeam->getKey(), 'summarizable_type' => $company->getMorphClass(), 'summarizable_id' => $company->getKey(), 'summary' => 'Test summary', 'model_used' => 'claude-haiku-4-5', 'prompt_tokens' => 50, 'completion_tokens' => 25, ]); $this->assertDatabaseHas('ai_summaries', [ 'summarizable_type' => $company->getMorphClass(), 'summarizable_id' => $company->getKey(), ]); $company->invalidateAiSummary(); $this->assertDatabaseMissing('ai_summaries', [ 'summarizable_type' => $company->getMorphClass(), 'summarizable_id' => $company->getKey(), ]); }); it('can invalidate summary for person', function () { $person = People::factory() ->for($this->user->currentTeam) ->create(); AiSummary::create([ 'team_id' => $this->user->currentTeam->getKey(), 'summarizable_type' => $person->getMorphClass(), 'summarizable_id' => $person->getKey(), 'summary' => 'Test summary', 'model_used' => 'claude-haiku-4-5', 'prompt_tokens' => 50, 'completion_tokens' => 25, ]); $person->invalidateAiSummary(); $this->assertDatabaseMissing('ai_summaries', [ 'summarizable_type' => $person->getMorphClass(), 'summarizable_id' => $person->getKey(), ]); }); it('can invalidate summary for opportunity', function () { $company = Company::factory() ->for($this->user->currentTeam) ->create(); $opportunity = Opportunity::factory() ->for($this->user->currentTeam) ->for($company) ->create(); AiSummary::create([ 'team_id' => $this->user->currentTeam->getKey(), 'summarizable_type' => $opportunity->getMorphClass(), 'summarizable_id' => $opportunity->getKey(), 'summary' => 'Test summary', 'model_used' => 'claude-haiku-4-5', 'prompt_tokens' => 50, 'completion_tokens' => 25, ]); $opportunity->invalidateAiSummary(); $this->assertDatabaseMissing('ai_summaries', [ 'summarizable_type' => $opportunity->getMorphClass(), 'summarizable_id' => $opportunity->getKey(), ]); }); }); ================================================ FILE: tests/Feature/AccessTokens/AccessTokenPermissionsTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); $token = $user->tokens()->create([ 'name' => 'Test Token', 'token' => Str::random(40), 'abilities' => ['create', 'read'], ]); livewire(ManageAccessTokens::class) ->callTableAction('permissions', $token, data: [ 'permissions' => ['delete', 'update'], ]); $freshToken = $user->fresh()->tokens->first(); expect($freshToken->abilities)->toBe(['delete', 'update']); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('table shows team name column', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $user->tokens()->create([ 'name' => 'Test Token', 'token' => Str::random(40), 'abilities' => ['read'], 'team_id' => $user->currentTeam->id, ]); livewire(ManageAccessTokens::class) ->assertCanRenderTableColumn('team.name'); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('table shows expiration column', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $user->tokens()->create([ 'name' => 'Expiring Token', 'token' => Str::random(40), 'abilities' => ['read'], 'expires_at' => now()->addDays(30), ]); livewire(ManageAccessTokens::class) ->assertCanRenderTableColumn('expires_at'); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); ================================================ FILE: tests/Feature/AccessTokens/CreateAccessTokenTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Test Token', 'team_id' => $user->currentTeam->id, 'expiration' => '30', 'permissions' => ['read', 'update'], ]) ->call('createToken') ->assertHasNoFormErrors(); $token = $user->fresh()->tokens->first(); expect($token) ->name->toEqual('Test Token') ->team_id->toEqual($user->currentTeam->id) ->can('read')->toBeTrue() ->can('delete')->toBeFalse(); expect($token->expires_at)->not->toBeNull(); expect($token->expires_at->startOfDay()->equalTo(now()->addDays(30)->startOfDay()))->toBeTrue(); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('token with no expiration stores null expires_at', function () { $this->actingAs($user = User::factory()->withTeam()->create()); livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Forever Token', 'team_id' => $user->currentTeam->id, 'expiration' => '0', 'permissions' => ['read'], ]) ->call('createToken') ->assertHasNoFormErrors(); expect($user->fresh()->tokens->first()->expires_at)->toBeNull(); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('cannot create token for a team user does not belong to', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $otherTeam = Team::factory()->create(); livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Sneaky Token', 'team_id' => $otherTeam->id, 'expiration' => '30', 'permissions' => ['read'], ]) ->call('createToken'); expect($user->fresh()->tokens)->toHaveCount(0); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('token name is required', function () { $this->actingAs(User::factory()->withTeam()->create()); livewire(CreateAccessToken::class) ->fillForm([ 'name' => '', 'permissions' => ['read'], ]) ->call('createToken') ->assertHasFormErrors(['name' => 'required']); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('token name must be unique per user', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $user->tokens()->create([ 'name' => 'Existing Token', 'token' => Str::random(40), 'abilities' => ['read'], ]); livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Existing Token', 'permissions' => ['read'], ]) ->call('createToken') ->assertHasFormErrors(['name' => 'unique']); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('permissions are required', function () { $this->actingAs(User::factory()->withTeam()->create()); livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Test Token', 'permissions' => [], ]) ->call('createToken') ->assertHasFormErrors(['permissions' => 'required']); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('plain text token is shown after creation', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $component = livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Test Token', 'team_id' => $user->currentTeam->id, 'expiration' => '7', 'permissions' => ['read'], ]) ->call('createToken'); expect($component->get('plainTextToken'))->not->toBeNull(); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); test('team_id and expiration are required', function () { $this->actingAs(User::factory()->withTeam()->create()); livewire(CreateAccessToken::class) ->fillForm([ 'name' => 'Test Token', 'team_id' => null, 'expiration' => null, 'permissions' => ['read'], ]) ->call('createToken') ->assertHasFormErrors(['team_id' => 'required', 'expiration' => 'required']); })->skip(fn () => ! Features::hasApiFeatures(), 'API support is not enabled.'); ================================================ FILE: tests/Feature/AccessTokens/DeleteAccessTokenTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); $token = $user->tokens()->create([ 'name' => 'Test Token', 'token' => Str::random(40), 'abilities' => ['create', 'read'], ]); livewire(ManageAccessTokens::class) ->callTableAction('delete', $token); expect($user->fresh()->tokens)->toHaveCount(0); })->skip(function () { return ! Features::hasApiFeatures(); }, 'API support is not enabled.'); ================================================ FILE: tests/Feature/Api/V1/ApiMiddlewareTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); describe('ForceJsonResponse', function (): void { it('returns JSON even without Accept header', function (): void { $token = $this->user->createToken('test', ['*'])->plainTextToken; $response = $this->withToken($token) ->get('/api/v1/companies'); $response->assertOk(); expect($response->headers->get('Content-Type'))->toContain('json'); }); it('returns JSON validation error without Accept header', function (): void { $token = $this->user->createToken('test', ['*'])->plainTextToken; $response = $this->withToken($token) ->post('/api/v1/companies', []); $response->assertUnprocessable(); expect($response->headers->get('Content-Type'))->toContain('json'); }); }); describe('rate limiting', function (): void { it('returns 429 after exceeding threshold', function (): void { RateLimiter::for('api', fn () => Limit::perMinute(3)->by($this->user->id)); $token = $this->user->createToken('test', ['*'])->plainTextToken; for ($i = 0; $i < 3; $i++) { $this->withToken($token) ->getJson('/api/v1/companies') ->assertOk(); } $this->withToken($token) ->getJson('/api/v1/companies') ->assertTooManyRequests(); }); it('enforces separate write rate limit', function (): void { RateLimiter::for('api', function () { return [ Limit::perMinute(100)->by('team:test'), Limit::perMinute(2)->by('token:test:write'), ]; }); $token = $this->user->createToken('test', ['*'])->plainTextToken; $this->withToken($token) ->postJson('/api/v1/companies', ['name' => 'A']) ->assertCreated(); $this->withToken($token) ->postJson('/api/v1/companies', ['name' => 'B']) ->assertCreated(); $this->withToken($token) ->postJson('/api/v1/companies', ['name' => 'C']) ->assertTooManyRequests(); }); }); describe('real-token middleware chain', function (): void { it('authenticates and scopes via real bearer token through full middleware stack', function (): void { $companies = Company::factory()->for($this->team)->count(2)->create(); $raw = Str::random(40); $token = $this->user->tokens()->create([ 'name' => 'full-stack-test', 'token' => hash('sha256', $raw), 'abilities' => ['*'], 'team_id' => $this->team->id, ]); $plainToken = "{$token->id}|{$raw}"; $response = $this->withToken($plainToken) ->getJson('/api/v1/companies'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($companies[0]->id); expect($ids)->toContain($companies[1]->id); expect($response->headers->get('Content-Type'))->toContain('json'); }); it('rejects request with invalid bearer token', function (): void { $this->withToken('invalid-token') ->getJson('/api/v1/companies') ->assertUnauthorized(); }); }); ================================================ FILE: tests/Feature/Api/V1/ApiTeamScopingTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('uses current team by default', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/companies'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($company->id); }); it('can switch team via X-Team-Id header', function (): void { $otherTeam = Team::factory()->create(); $this->user->teams()->attach($otherTeam); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => $otherTeam->id])); Sanctum::actingAs($this->user); Company::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/companies', ['X-Team-Id' => $otherTeam->id]); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($otherCompany->id); }); it('rejects X-Team-Id for team user does not belong to', function (): void { $foreignTeam = Team::factory()->create(); Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies', ['X-Team-Id' => $foreignTeam->id]) ->assertForbidden(); }); it('returns 403 when user has no team', function (): void { $userWithoutTeam = User::factory()->create(); $userWithoutTeam->current_team_id = null; $userWithoutTeam->save(); Sanctum::actingAs($userWithoutTeam); $this->getJson('/api/v1/companies') ->assertForbidden(); }); describe('expired token', function (): void { it('returns 401 for an expired token', function (): void { $newToken = $this->user->createToken('expired', ['*'], now()->subHour()); $newToken->accessToken->fill(['team_id' => $this->team->id])->save(); $this->withToken($newToken->plainTextToken) ->getJson('/api/v1/companies') ->assertUnauthorized(); }); }); describe('token-based team scoping', function (): void { it('resolves team context from token team_id', function (): void { $otherTeam = Team::factory()->create(); $this->user->teams()->attach($otherTeam); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => $otherTeam->id])); Company::factory()->for($this->team)->create(); $raw = Str::random(40); $token = $this->user->tokens()->create([ 'name' => 'team-scoped', 'token' => hash('sha256', $raw), 'abilities' => ['*'], 'team_id' => $otherTeam->id, ]); $plainToken = "{$token->id}|{$raw}"; $response = $this->withToken($plainToken) ->getJson('/api/v1/companies'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($otherCompany->id); }); it('ignores X-Team-Id header when token has team_id', function (): void { $otherTeam = Team::factory()->create(); $this->user->teams()->attach($otherTeam); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => $otherTeam->id])); Company::factory()->for($this->team)->create(); $raw = Str::random(40); $token = $this->user->tokens()->create([ 'name' => 'team-scoped', 'token' => hash('sha256', $raw), 'abilities' => ['*'], 'team_id' => $otherTeam->id, ]); $plainToken = "{$token->id}|{$raw}"; $response = $this->withToken($plainToken) ->getJson('/api/v1/companies', ['X-Team-Id' => $this->team->id]); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($otherCompany->id); }); }); describe('revoked team membership', function (): void { it('rejects token when user no longer belongs to the token team', function (): void { $otherTeam = Team::factory()->create(); $this->user->teams()->attach($otherTeam); $raw = Str::random(40); $token = $this->user->tokens()->create([ 'name' => 'team-scoped', 'token' => hash('sha256', $raw), 'abilities' => ['*'], 'team_id' => $otherTeam->id, ]); $this->user->teams()->detach($otherTeam); $plainToken = "{$token->id}|{$raw}"; $this->withToken($plainToken) ->getJson('/api/v1/companies') ->assertForbidden(); }); }); describe('switchTeam regression', function (): void { it('does not persist current_team_id to database on API call', function (): void { $otherTeam = Team::factory()->create(); $this->user->teams()->attach($otherTeam); $this->user->switchTeam($this->team); $originalTeamId = $this->user->fresh()->current_team_id; $raw = Str::random(40); $token = $this->user->tokens()->create([ 'name' => 'team-scoped', 'token' => hash('sha256', $raw), 'abilities' => ['*'], 'team_id' => $otherTeam->id, ]); $plainToken = "{$token->id}|{$raw}"; $this->withToken($plainToken) ->getJson('/api/v1/companies') ->assertOk(); expect($this->user->fresh()->current_team_id)->toBe($originalTeamId); }); }); describe('/api/v1/user endpoint', function (): void { it('returns current authenticated user', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/user') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->where('data.id', (string) $this->user->id) ->where('data.type', 'users') ->where('data.attributes.name', $this->user->name) ->where('data.attributes.email', $this->user->email) ->missing('data.attributes.password') ->etc() ); }); it('requires authentication', function (): void { $this->getJson('/api/v1/user') ->assertUnauthorized(); }); }); ================================================ FILE: tests/Feature/Api/V1/CompaniesApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('requires authentication', function (): void { $this->getJson('/api/v1/companies')->assertUnauthorized(); }); it('can list companies', function (): void { Sanctum::actingAs($this->user); $seeded = Company::query()->where('team_id', $this->team->id)->count(); Company::factory(3)->for($this->team)->create(); $this->getJson('/api/v1/companies') ->assertOk() ->assertJsonCount($seeded + 3, 'data') ->assertJsonStructure(['data' => [['id', 'type', 'attributes']]]); }); it('can create a company', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', ['name' => 'Acme Corp']) ->assertCreated() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'companies') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Acme Corp') ->where('creation_source', CreationSource::API->value) ->whereType('created_at', 'string') ->whereType('custom_fields', 'array') ->etc() ) ->etc() ) ); $this->assertDatabaseHas('companies', ['name' => 'Acme Corp', 'team_id' => $this->team->id]); }); it('validates required fields on create', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', []) ->assertUnprocessable() ->assertInvalid(['name']); }); it('can show a company', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(['name' => 'Show Test']); $this->getJson("/api/v1/companies/{$company->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $company->id) ->where('type', 'companies') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Show Test') ->whereType('creation_source', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); }); it('can update a company', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $this->putJson("/api/v1/companies/{$company->id}", ['name' => 'Updated Name']) ->assertOk() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $company->id) ->where('type', 'companies') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Updated Name') ->etc() ) ->etc() ) ); }); it('can delete a company', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $this->deleteJson("/api/v1/companies/{$company->id}") ->assertNoContent(); $this->assertSoftDeleted('companies', ['id' => $company->id]); }); it('scopes companies to current team', function (): void { $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => Team::factory()->create()->id])); Sanctum::actingAs($this->user); $ownCompany = Company::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/companies'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($ownCompany->id); expect($ids)->not->toContain($otherCompany->id); }); describe('cross-tenant isolation', function (): void { it('cannot show a company from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => $otherTeam->id])); $this->getJson("/api/v1/companies/{$otherCompany->id}") ->assertNotFound(); }); it('cannot update a company from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => $otherTeam->id])); $this->putJson("/api/v1/companies/{$otherCompany->id}", ['name' => 'Hacked']) ->assertNotFound(); }); it('cannot delete a company from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create(['team_id' => $otherTeam->id])); $this->deleteJson("/api/v1/companies/{$otherCompany->id}") ->assertNotFound(); }); }); describe('includes', function (): void { it('can include relations on list endpoint', function (): void { Sanctum::actingAs($this->user); Company::factory()->for($this->team)->create(); $this->getJson('/api/v1/companies?include=creator') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.0.relationships.creator') ->has('included') ->etc() ); }); it('can include relations on show endpoint with full structure', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $this->getJson("/api/v1/companies/{$company->id}?include=creator") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ->has('attributes', fn (AssertableJson $json) => $json ->has('name') ->has('email') ) ->etc() ) ->etc() ); }); it('can include multiple relations', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $this->getJson("/api/v1/companies/{$company->id}?include=creator,people") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator') ->has('data.relationships.people') ->etc() ); }); it('does not include relations when not requested', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/companies/{$company->id}") ->assertOk(); expect($response->json('data.relationships'))->toBeNull(); }); it('can include relationship counts', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); People::factory(3)->for($this->team)->create(['company_id' => $company->id]); $response = $this->getJson('/api/v1/companies?include=peopleCount'); $response->assertOk(); $companyData = collect($response->json('data')) ->firstWhere('id', $company->id); expect($companyData['attributes']['people_count'])->toBe(3); }); it('rejects disallowed includes on list endpoint', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies?include=secret') ->assertStatus(400); }); }); describe('custom fields', function (): void { beforeEach(function (): void { $this->section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'company', 'name' => 'General', 'code' => 'general', 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); }); it('can create a company with custom fields', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'industry', 'name' => 'Industry', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'industry' => 'Technology', ], ]) ->assertCreated() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Acme Corp') ->where('custom_fields.industry', 'Technology') ->etc() ) ->etc() ) ); }); it('can update a company with custom fields', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'industry', 'name' => 'Industry', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $company = Company::factory()->for($this->team)->create(); $this->putJson("/api/v1/companies/{$company->id}", [ 'name' => 'Updated Name', 'custom_fields' => [ 'industry' => 'Finance', ], ]) ->assertOk() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Updated Name') ->where('custom_fields.industry', 'Finance') ->etc() ) ->etc() ) ); }); it('validates custom field values on create', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'annual_revenue', 'name' => 'Annual Revenue', 'type' => 'number', 'sort_order' => 1, 'active' => true, 'validation_rules' => [ ['name' => 'numeric', 'parameters' => []], ], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'annual_revenue' => 'not-a-number', ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.annual_revenue']); }); it('rejects unknown custom field codes', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'nonexistent_field' => 'some value', ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields']); }); it('does not leak available field names in validation errors', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'secret_field', 'name' => 'Secret Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $response = $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'unknown_key' => 'some value', ], ]); $response->assertUnprocessable() ->assertInvalid(['custom_fields']); $errorMessage = $response->json('errors.custom_fields.0'); expect($errorMessage) ->toContain('unknown_key') ->not->toContain('Available fields') ->not->toContain('secret_field'); }); it('rejects invalid option ID for select custom field on create', function (): void { Sanctum::actingAs($this->user); $field = CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'stage', 'name' => 'Stage', 'type' => 'select', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $field->options()->createMany([ ['name' => 'Lead', 'sort_order' => 1, 'tenant_id' => $this->team->id], ['name' => 'Customer', 'sort_order' => 2, 'tenant_id' => $this->team->id], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'stage' => 'invalid-option-id-xyz', ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.stage']); }); it('accepts valid option ID for select custom field on create', function (): void { Sanctum::actingAs($this->user); $field = CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'stage', 'name' => 'Stage', 'type' => 'select', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $option = $field->options()->create([ 'name' => 'Lead', 'sort_order' => 1, 'tenant_id' => $this->team->id, ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'stage' => $option->id, ], ]) ->assertCreated() ->assertValid(); }); it('rejects invalid option ID for select custom field on update', function (): void { Sanctum::actingAs($this->user); $field = CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'stage', 'name' => 'Stage', 'type' => 'select', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $field->options()->createMany([ ['name' => 'Lead', 'sort_order' => 1, 'tenant_id' => $this->team->id], ['name' => 'Customer', 'sort_order' => 2, 'tenant_id' => $this->team->id], ]); $company = Company::factory()->for($this->team)->create(); $this->putJson("/api/v1/companies/{$company->id}", [ 'name' => 'Updated Name', 'custom_fields' => [ 'stage' => 999999, ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.stage']); }); it('rejects invalid option IDs for multi-select custom field', function (): void { Sanctum::actingAs($this->user); $field = CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'categories', 'name' => 'Categories', 'type' => 'multi-select', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $validOption = $field->options()->create([ 'name' => 'Option A', 'sort_order' => 1, 'tenant_id' => $this->team->id, ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'categories' => [$validOption->id, 'invalid-id'], ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.categories.1']); }); it('accepts valid option IDs for multi-select custom field', function (): void { Sanctum::actingAs($this->user); $field = CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'categories', 'name' => 'Categories', 'type' => 'multi-select', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $options = $field->options()->createMany([ ['name' => 'Option A', 'sort_order' => 1, 'tenant_id' => $this->team->id], ['name' => 'Option B', 'sort_order' => 2, 'tenant_id' => $this->team->id], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'categories' => $options->pluck('id')->all(), ], ]) ->assertCreated() ->assertValid(); }); it('handles orphaned custom field values gracefully', function (): void { $company = Company::factory()->for($this->team)->create(); $customField = CustomField::create([ 'tenant_id' => $this->team->getKey(), 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'orphan_field', 'name' => 'Orphan Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); TenantContextService::withTenant( $this->team->getKey(), fn () => $company->saveCustomFields(['orphan_field' => 'test value']), ); // Simulate an orphaned value by injecting a CustomFieldValue with a null customField relation $company->load('customFieldValues.customField'); $orphanedValue = new CustomFieldValue; $orphanedValue->setRelation('customField', null); $company->setRelation( 'customFieldValues', $company->customFieldValues->push($orphanedValue), ); $resource = new CompanyResource($company); $attributes = $resource->toAttributes(request()); expect($attributes['custom_fields']) ->toBeInstanceOf(stdClass::class) ->and($attributes['custom_fields']->orphan_field)->toBe('test value'); }); it('rejects custom_fields sent as a string', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => 'not-an-array', ]) ->assertUnprocessable() ->assertInvalid(['custom_fields']); }); it('rejects custom_fields sent as an integer', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => 123, ]) ->assertUnprocessable() ->assertInvalid(['custom_fields']); }); it('accepts request without custom_fields key', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', ]) ->assertCreated(); }); it('rejects invalid domain format in link custom field', function (): void { Sanctum::actingAs($this->user); $domainsField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'company') ->where('code', 'domains') ->first(); expect($domainsField)->not->toBeNull('domains custom field should be auto-created by team listener'); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'domains' => ['not a valid domain'], ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.domains.0']); }); it('accepts valid items in link custom field', function (): void { Sanctum::actingAs($this->user); $domainsField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'company') ->where('code', 'domains') ->first(); expect($domainsField)->not->toBeNull('domains custom field should be auto-created by team listener'); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'domains' => ['acme.com', 'example.org'], ], ]) ->assertCreated(); }); it('rejects invalid email in email custom field', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'emails', 'name' => 'Emails', 'type' => 'email', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'emails' => ['not-an-email'], ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.emails.0']); }); it('accepts valid items in email custom field', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'emails', 'name' => 'Emails', 'type' => 'email', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'emails' => ['info@acme.com', 'sales@acme.com'], ], ]) ->assertCreated(); }); it('rejects invalid phone number in phone custom field', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'phones', 'name' => 'Phones', 'type' => 'phone', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'phones' => ['not-a-phone'], ], ]) ->assertUnprocessable() ->assertInvalid(['custom_fields.phones.0']); }); it('accepts valid items in phone custom field', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'phones', 'name' => 'Phones', 'type' => 'phone', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $this->postJson('/api/v1/companies', [ 'name' => 'Acme Corp', 'custom_fields' => [ 'phones' => ['+14155552671'], ], ]) ->assertCreated(); }); }); describe('filtering and sorting', function (): void { it('can filter companies by name', function (): void { Sanctum::actingAs($this->user); Company::factory()->for($this->team)->create(['name' => 'Acme Corp']); Company::factory()->for($this->team)->create(['name' => 'Beta Inc']); $response = $this->getJson('/api/v1/companies?filter[name]=Acme'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name'); expect($names)->toContain('Acme Corp'); expect($names)->not->toContain('Beta Inc'); }); it('can sort companies by name ascending', function (): void { Sanctum::actingAs($this->user); Company::factory()->for($this->team)->create(['name' => 'Zulu Corp']); Company::factory()->for($this->team)->create(['name' => 'Alpha Inc']); $response = $this->getJson('/api/v1/companies?sort=name'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name')->values(); $alphaIndex = $names->search('Alpha Inc'); $zuluIndex = $names->search('Zulu Corp'); expect($alphaIndex)->toBeLessThan($zuluIndex); }); it('can sort companies by name descending', function (): void { Sanctum::actingAs($this->user); Company::factory()->for($this->team)->create(['name' => 'Alpha Inc']); Company::factory()->for($this->team)->create(['name' => 'Zulu Corp']); $response = $this->getJson('/api/v1/companies?sort=-name'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name')->values(); $zuluIndex = $names->search('Zulu Corp'); $alphaIndex = $names->search('Alpha Inc'); expect($zuluIndex)->toBeLessThan($alphaIndex); }); it('rejects disallowed filter fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies?filter[team_id]=fake') ->assertStatus(400); }); it('rejects disallowed sort fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies?sort=team_id') ->assertStatus(400); }); }); describe('soft deletes', function (): void { it('excludes soft-deleted companies from list', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(['name' => 'Deleted Corp']); $company->delete(); $active = Company::factory()->for($this->team)->create(['name' => 'Active Corp']); $response = $this->getJson('/api/v1/companies'); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($active->id); expect($ids)->not->toContain($company->id); }); it('cannot show a soft-deleted company', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $company->delete(); $this->getJson("/api/v1/companies/{$company->id}") ->assertNotFound(); }); it('cannot update a soft-deleted company', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $company->delete(); $this->putJson("/api/v1/companies/{$company->id}", ['name' => 'Revived']) ->assertNotFound(); }); }); describe('pagination', function (): void { it('paginates with per_page parameter', function (): void { Sanctum::actingAs($this->user); Company::factory(5)->for($this->team)->create(); $this->getJson('/api/v1/companies?per_page=2') ->assertOk() ->assertJsonCount(2, 'data'); }); it('returns second page of results', function (): void { Sanctum::actingAs($this->user); Company::factory(5)->for($this->team)->create(); $page1 = $this->getJson('/api/v1/companies?per_page=3&page=1'); $page2 = $this->getJson('/api/v1/companies?per_page=3&page=2'); $page1->assertOk()->assertJsonCount(3, 'data'); $page2->assertOk(); $page1Ids = collect($page1->json('data'))->pluck('id'); $page2Ids = collect($page2->json('data'))->pluck('id'); expect($page1Ids->intersect($page2Ids))->toBeEmpty(); }); it('caps per_page at maximum allowed value', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies?per_page=500') ->assertUnprocessable() ->assertInvalid(['per_page']); }); it('returns empty data array for page beyond results', function (): void { Sanctum::actingAs($this->user); Company::factory(2)->for($this->team)->create(); $this->getJson('/api/v1/companies?page=999') ->assertOk() ->assertJsonCount(0, 'data'); }); }); describe('mass assignment protection', function (): void { it('ignores team_id in create request', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $this->postJson('/api/v1/companies', [ 'name' => 'Test Corp', 'team_id' => $otherTeam->id, ]) ->assertCreated(); $company = Company::query()->where('name', 'Test Corp')->first(); expect($company->team_id)->toBe($this->team->id); }); it('ignores creator_id in create request', function (): void { Sanctum::actingAs($this->user); $otherUser = User::factory()->create(); $this->postJson('/api/v1/companies', [ 'name' => 'Test Corp', 'creator_id' => $otherUser->id, ]) ->assertCreated(); $company = Company::query()->where('name', 'Test Corp')->first(); expect($company->creator_id)->toBe($this->user->id); }); it('ignores team_id in update request', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $this->putJson("/api/v1/companies/{$company->id}", [ 'name' => 'Updated', 'team_id' => $otherTeam->id, ]) ->assertOk(); expect($company->refresh()->team_id)->toBe($this->team->id); }); }); describe('input validation', function (): void { it('rejects name exceeding 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', ['name' => str_repeat('a', 256)]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('rejects non-string name', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', ['name' => 12345]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('rejects array as name', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', ['name' => ['nested' => 'value']]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('accepts name at exactly 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/companies', ['name' => str_repeat('a', 255)]) ->assertCreated(); }); }); describe('non-existent record', function (): void { it('returns 404 for non-existent company', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies/'.Str::ulid()) ->assertNotFound(); }); }); it('can update a company via PATCH', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $response = $this->patchJson("/api/v1/companies/{$company->id}", [ 'name' => 'Patched Name', ]); $response->assertOk(); expect($company->refresh()->name)->toBe('Patched Name'); }); it('requires authentication for write operations', function (string $method, string $url): void { $response = $this->json($method, $url, ['name' => 'Test']); $response->assertUnauthorized(); })->with([ 'POST' => ['POST', '/api/v1/companies'], 'PUT' => ['PUT', '/api/v1/companies/fake-id'], 'DELETE' => ['DELETE', '/api/v1/companies/fake-id'], ]); describe('cursor pagination', function (): void { it('returns cursor-paginated results', function (): void { Sanctum::actingAs($this->user); Company::factory()->count(5)->create([ 'team_id' => $this->team->id, ]); $response = $this->getJson('/api/v1/companies?cursor=true&per_page=2'); $response->assertOk() ->assertJsonCount(2, 'data') ->assertJsonStructure([ 'data', 'meta' => ['path', 'per_page'], 'links' => ['next', 'prev'], ]); expect($response->json('meta.per_page'))->toBe(2); expect($response->json('links.next'))->not->toBeNull(); expect($response->json('links.prev'))->toBeNull(); $firstIds = collect($response->json('data'))->pluck('id'); expect($firstIds)->toHaveCount(2); }); }); ================================================ FILE: tests/Feature/Api/V1/CustomFieldsApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); $this->section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'company', 'name' => 'API Test', 'code' => 'api_test', 'type' => 'section', 'sort_order' => 99, 'active' => true, ]); $this->seededCount = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('active', true) ->count(); }); it('requires authentication', function (): void { $this->getJson('/api/v1/custom-fields')->assertUnauthorized(); }); it('can list custom fields with expected structure', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_industry', 'name' => 'Industry', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [ 'required' => true, ], ]); $response = $this->getJson('/api/v1/custom-fields?per_page=100'); $response->assertOk() ->assertJsonCount($this->seededCount + 1, 'data'); $field = collect($response->json('data')) ->first(fn ($item) => ($item['attributes']['code'] ?? null) === 'cf_industry'); expect($field) ->not->toBeNull() ->and($field['attributes']['name'])->toBe('Industry') ->and($field['attributes']['type'])->toBe('text') ->and($field['attributes']['entity_type'])->toBe('company') ->and($field['attributes']['required'])->toBeTrue() ->and($field['attributes'])->toHaveKeys(['code', 'name', 'type', 'entity_type', 'required', 'created_at', 'updated_at']) ->and($field)->toHaveKeys(['id', 'type']) ->and($field['type'])->toBe('custom_fields'); }); it('returns required as false when field has no required rule', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_notes', 'name' => 'Notes', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $response = $this->getJson('/api/v1/custom-fields?per_page=100'); $response->assertOk(); $field = collect($response->json('data')) ->first(fn ($item) => ($item['attributes']['code'] ?? null) === 'cf_notes'); expect($field)->not->toBeNull() ->and($field['attributes']['required'])->toBeFalse(); }); it('can filter by entity_type', function (): void { Sanctum::actingAs($this->user); $personSection = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'people', 'name' => 'API Test Person', 'code' => 'api_test_person', 'type' => 'section', 'sort_order' => 99, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_industry', 'name' => 'Industry', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $personSection->id, 'entity_type' => 'people', 'code' => 'cf_birthday', 'name' => 'Birthday', 'type' => 'date', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $response = $this->getJson('/api/v1/custom-fields?entity_type=company&per_page=100'); $response->assertOk(); $entityTypes = collect($response->json('data'))->pluck('attributes.entity_type')->unique(); expect($entityTypes->all())->toBe(['company']); $codes = collect($response->json('data'))->pluck('attributes.code'); expect($codes)->toContain('cf_industry'); expect($codes)->not->toContain('cf_birthday'); }); it('does not return custom fields from other teams', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherSection = CustomFieldSection::create([ 'tenant_id' => $otherTeam->id, 'entity_type' => 'company', 'name' => 'Other Team', 'code' => 'other_team', 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_own_field', 'name' => 'Own Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); CustomField::create([ 'tenant_id' => $otherTeam->id, 'custom_field_section_id' => $otherSection->id, 'entity_type' => 'company', 'code' => 'cf_secret_field', 'name' => 'Secret Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $response = $this->getJson('/api/v1/custom-fields?per_page=100'); $response->assertOk(); $codes = collect($response->json('data'))->pluck('attributes.code'); expect($codes)->toContain('cf_own_field'); expect($codes)->not->toContain('cf_secret_field'); }); it('includes options for select fields', function (): void { Sanctum::actingAs($this->user); $field = CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_status', 'name' => 'Status', 'type' => 'select', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $field->options()->createMany([ ['name' => 'Active', 'sort_order' => 1, 'tenant_id' => $this->team->id], ['name' => 'Inactive', 'sort_order' => 2, 'tenant_id' => $this->team->id], ]); $response = $this->getJson('/api/v1/custom-fields?per_page=100'); $response->assertOk(); $fieldData = collect($response->json('data')) ->first(fn ($item) => ($item['attributes']['code'] ?? null) === 'cf_status'); expect($fieldData)->not->toBeNull() ->and($fieldData['attributes']['options'])->toHaveCount(2) ->and($fieldData['attributes']['options'][0]['label'])->toBe('Active') ->and($fieldData['attributes']['options'][0])->toHaveKey('value'); }); it('paginates results by default', function (): void { Sanctum::actingAs($this->user); foreach (range(1, 20) as $i) { CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => "cf_field_{$i}", 'name' => "Field {$i}", 'type' => 'text', 'sort_order' => $i, 'active' => true, 'validation_rules' => [], ]); } $response = $this->getJson('/api/v1/custom-fields'); $response->assertOk() ->assertJsonStructure(['data', 'links', 'meta']) ->assertJsonPath('meta.per_page', 15); expect($response->json('data'))->toHaveCount(min(15, $this->seededCount + 20)); }); it('respects per_page parameter', function (): void { Sanctum::actingAs($this->user); foreach (range(1, 10) as $i) { CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => "cf_page_field_{$i}", 'name' => "Page Field {$i}", 'type' => 'text', 'sort_order' => $i, 'active' => true, 'validation_rules' => [], ]); } $response = $this->getJson('/api/v1/custom-fields?per_page=5'); $response->assertOk() ->assertJsonPath('meta.per_page', 5); expect($response->json('data'))->toHaveCount(5); }); it('caps per_page at 100', function (): void { Sanctum::actingAs($this->user); $response = $this->getJson('/api/v1/custom-fields?per_page=200'); $response->assertUnprocessable(); }); it('rejects non-integer per_page', function (): void { Sanctum::actingAs($this->user); $response = $this->getJson('/api/v1/custom-fields?per_page=abc'); $response->assertUnprocessable(); }); it('supports page navigation', function (): void { Sanctum::actingAs($this->user); foreach (range(1, 5) as $i) { CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => "cf_nav_field_{$i}", 'name' => "Nav Field {$i}", 'type' => 'text', 'sort_order' => $i, 'active' => true, 'validation_rules' => [], ]); } $totalFields = $this->seededCount + 5; $page1 = $this->getJson('/api/v1/custom-fields?per_page=3'); $page1->assertOk() ->assertJsonPath('meta.per_page', 3) ->assertJsonPath('meta.current_page', 1) ->assertJsonPath('meta.total', $totalFields); expect($page1->json('data'))->toHaveCount(3); $page2 = $this->getJson('/api/v1/custom-fields?per_page=3&page=2'); $page2->assertOk() ->assertJsonPath('meta.current_page', 2); expect($page2->json('data'))->toHaveCount(min(3, $totalFields - 3)); }); it('excludes inactive custom fields', function (): void { Sanctum::actingAs($this->user); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_active_field', 'name' => 'Active Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $this->section->id, 'entity_type' => 'company', 'code' => 'cf_inactive_field', 'name' => 'Inactive Field', 'type' => 'text', 'sort_order' => 2, 'active' => false, 'validation_rules' => [], ]); $response = $this->getJson('/api/v1/custom-fields?per_page=100'); $response->assertOk(); $codes = collect($response->json('data'))->pluck('attributes.code'); expect($codes)->toContain('cf_active_field'); expect($codes)->not->toContain('cf_inactive_field'); }); ================================================ FILE: tests/Feature/Api/V1/NotesApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('requires authentication', function (): void { $this->getJson('/api/v1/notes')->assertUnauthorized(); }); it('can list notes', function (): void { Sanctum::actingAs($this->user); $seeded = Note::query()->where('team_id', $this->team->id)->count(); Note::factory(3)->for($this->team)->create(); $this->getJson('/api/v1/notes') ->assertOk() ->assertJsonCount($seeded + 3, 'data') ->assertJsonStructure(['data' => [['id', 'type', 'attributes']]]); }); it('can create a note', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/notes', ['title' => 'Meeting notes']) ->assertCreated() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'notes') ->has('attributes', fn (AssertableJson $json) => $json ->where('title', 'Meeting notes') ->where('creation_source', CreationSource::API->value) ->whereType('created_at', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); $this->assertDatabaseHas('notes', ['title' => 'Meeting notes', 'team_id' => $this->team->id]); }); it('validates required fields on create', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/notes', []) ->assertUnprocessable() ->assertInvalid(['title']); }); it('can show a note', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(['title' => 'Show Test']); $this->getJson("/api/v1/notes/{$note->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $note->id) ->where('type', 'notes') ->has('attributes', fn (AssertableJson $json) => $json ->where('title', 'Show Test') ->whereType('creation_source', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); }); it('can update a note', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $this->putJson("/api/v1/notes/{$note->id}", ['title' => 'Updated Title']) ->assertOk() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $note->id) ->where('type', 'notes') ->has('attributes', fn (AssertableJson $json) => $json ->where('title', 'Updated Title') ->etc() ) ->etc() ) ); }); it('can delete a note', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $this->deleteJson("/api/v1/notes/{$note->id}") ->assertNoContent(); $this->assertSoftDeleted('notes', ['id' => $note->id]); }); it('scopes notes to current team', function (): void { $otherNote = Note::withoutEvents(fn () => Note::factory()->create(['team_id' => Team::factory()->create()->id])); Sanctum::actingAs($this->user); $ownNote = Note::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/notes'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($ownNote->id); expect($ids)->not->toContain($otherNote->id); }); describe('cross-tenant isolation', function (): void { it('cannot show a note from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherNote = Note::withoutEvents(fn () => Note::factory()->create(['team_id' => $otherTeam->id])); $this->getJson("/api/v1/notes/{$otherNote->id}") ->assertNotFound(); }); it('cannot update a note from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherNote = Note::withoutEvents(fn () => Note::factory()->create(['team_id' => $otherTeam->id])); $this->putJson("/api/v1/notes/{$otherNote->id}", ['title' => 'Hacked']) ->assertNotFound(); }); it('cannot delete a note from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherNote = Note::withoutEvents(fn () => Note::factory()->create(['team_id' => $otherTeam->id])); $this->deleteJson("/api/v1/notes/{$otherNote->id}") ->assertNotFound(); }); }); describe('includes', function (): void { it('can include creator on show endpoint', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $this->getJson("/api/v1/notes/{$note->id}?include=creator") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ->has('attributes') ->etc() ) ->etc() ); }); it('can include creator on list endpoint', function (): void { Sanctum::actingAs($this->user); Note::factory()->for($this->team)->create(); $this->getJson('/api/v1/notes?include=creator') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.0.relationships.creator') ->has('included') ->etc() ); }); it('can include companies on show endpoint', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $note = Note::factory()->for($this->team)->create(); $note->companies()->attach($company); $this->getJson("/api/v1/notes/{$note->id}?include=companies") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.companies.data') ->has('included') ->etc() ); }); it('can include multiple relations', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $note = Note::factory()->for($this->team)->create(); $note->companies()->attach($company); $this->getJson("/api/v1/notes/{$note->id}?include=creator,companies") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator') ->has('data.relationships.companies') ->etc() ); }); it('does not include relations when not requested', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/notes/{$note->id}") ->assertOk(); expect($response->json('data.relationships'))->toBeNull(); }); it('can include relationship counts', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/notes?include=companiesCount'); $response->assertOk(); $noteData = collect($response->json('data')) ->firstWhere('id', $note->id); expect($noteData['attributes']['companies_count'])->toBe(0); }); it('rejects disallowed includes on list endpoint', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/notes?include=secret') ->assertStatus(400); }); }); describe('filtering and sorting', function (): void { it('can filter notes by title', function (): void { Sanctum::actingAs($this->user); Note::factory()->for($this->team)->create(['title' => 'Meeting summary']); Note::factory()->for($this->team)->create(['title' => 'Code review']); $response = $this->getJson('/api/v1/notes?filter[title]=Meeting'); $response->assertOk(); $titles = collect($response->json('data'))->pluck('attributes.title'); expect($titles)->toContain('Meeting summary'); expect($titles)->not->toContain('Code review'); }); it('can sort notes by title ascending', function (): void { Sanctum::actingAs($this->user); Note::factory()->for($this->team)->create(['title' => 'Zulu Note']); Note::factory()->for($this->team)->create(['title' => 'Alpha Note']); $response = $this->getJson('/api/v1/notes?sort=title'); $response->assertOk(); $titles = collect($response->json('data'))->pluck('attributes.title')->values(); $alphaIndex = $titles->search('Alpha Note'); $zuluIndex = $titles->search('Zulu Note'); expect($alphaIndex)->toBeLessThan($zuluIndex); }); it('can sort notes by title descending', function (): void { Sanctum::actingAs($this->user); Note::factory()->for($this->team)->create(['title' => 'Alpha Note']); Note::factory()->for($this->team)->create(['title' => 'Zulu Note']); $response = $this->getJson('/api/v1/notes?sort=-title'); $response->assertOk(); $titles = collect($response->json('data'))->pluck('attributes.title')->values(); $zuluIndex = $titles->search('Zulu Note'); $alphaIndex = $titles->search('Alpha Note'); expect($zuluIndex)->toBeLessThan($alphaIndex); }); it('rejects disallowed filter fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/notes?filter[team_id]=fake') ->assertStatus(400); }); it('rejects disallowed sort fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/notes?sort=team_id') ->assertStatus(400); }); }); describe('pagination', function (): void { it('paginates with per_page parameter', function (): void { Sanctum::actingAs($this->user); Note::factory(5)->for($this->team)->create(); $this->getJson('/api/v1/notes?per_page=2') ->assertOk() ->assertJsonCount(2, 'data'); }); it('returns second page of results', function (): void { Sanctum::actingAs($this->user); Note::factory(5)->for($this->team)->create(); $page1 = $this->getJson('/api/v1/notes?per_page=3&page=1'); $page2 = $this->getJson('/api/v1/notes?per_page=3&page=2'); $page1->assertOk()->assertJsonCount(3, 'data'); $page2->assertOk(); $page1Ids = collect($page1->json('data'))->pluck('id'); $page2Ids = collect($page2->json('data'))->pluck('id'); expect($page1Ids->intersect($page2Ids))->toBeEmpty(); }); it('caps per_page at maximum allowed value', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/notes?per_page=500') ->assertUnprocessable() ->assertInvalid(['per_page']); }); it('returns empty data array for page beyond results', function (): void { Sanctum::actingAs($this->user); Note::factory(2)->for($this->team)->create(); $this->getJson('/api/v1/notes?page=999') ->assertOk() ->assertJsonCount(0, 'data'); }); }); describe('mass assignment protection', function (): void { it('ignores team_id in create request', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $this->postJson('/api/v1/notes', [ 'title' => 'Test Note', 'team_id' => $otherTeam->id, ]) ->assertCreated(); $note = Note::query()->where('title', 'Test Note')->first(); expect($note->team_id)->toBe($this->team->id); }); it('ignores creator_id in create request', function (): void { Sanctum::actingAs($this->user); $otherUser = User::factory()->create(); $this->postJson('/api/v1/notes', [ 'title' => 'Test Note', 'creator_id' => $otherUser->id, ]) ->assertCreated(); $note = Note::query()->where('title', 'Test Note')->first(); expect($note->creator_id)->toBe($this->user->id); }); it('ignores team_id in update request', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $this->putJson("/api/v1/notes/{$note->id}", [ 'title' => 'Updated', 'team_id' => $otherTeam->id, ]) ->assertOk(); expect($note->refresh()->team_id)->toBe($this->team->id); }); }); describe('input validation', function (): void { it('rejects title exceeding 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/notes', ['title' => str_repeat('a', 256)]) ->assertUnprocessable() ->assertInvalid(['title']); }); it('rejects non-string title', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/notes', ['title' => 12345]) ->assertUnprocessable() ->assertInvalid(['title']); }); it('rejects array as title', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/notes', ['title' => ['nested' => 'value']]) ->assertUnprocessable() ->assertInvalid(['title']); }); it('accepts title at exactly 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/notes', ['title' => str_repeat('a', 255)]) ->assertCreated(); }); }); describe('soft deletes', function (): void { it('excludes soft-deleted notes from list', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $deleted = Note::factory()->for($this->team)->create(); $deleted->delete(); $ids = collect($this->getJson('/api/v1/notes')->json('data'))->pluck('id'); expect($ids)->toContain($note->id); expect($ids)->not->toContain($deleted->id); }); it('cannot show a soft-deleted note', function (): void { Sanctum::actingAs($this->user); $note = Note::factory()->for($this->team)->create(); $note->delete(); $this->getJson("/api/v1/notes/{$note->id}") ->assertNotFound(); }); }); describe('non-existent record', function (): void { it('returns 404 for non-existent note', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/notes/'.Str::ulid()) ->assertNotFound(); }); }); it('can create a note with relationship ids', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->postJson('/api/v1/notes', [ 'title' => 'Linked note', 'company_ids' => [$company->id], 'people_ids' => [$person->id], 'opportunity_ids' => [$opportunity->id], ]) ->assertCreated(); $note = Note::query()->where('title', 'Linked note')->first(); expect($note->companies)->toHaveCount(1) ->and($note->people)->toHaveCount(1) ->and($note->opportunities)->toHaveCount(1); }); it('rejects cross-tenant relationship ids on note create', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::factory()->for($otherTeam)->create(); $this->postJson('/api/v1/notes', [ 'title' => 'Should fail', 'company_ids' => [$otherCompany->id], ]) ->assertUnprocessable() ->assertInvalid(['company_ids.0']); }); ================================================ FILE: tests/Feature/Api/V1/OpportunitiesApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('requires authentication', function (): void { $this->getJson('/api/v1/opportunities')->assertUnauthorized(); }); it('can list opportunities', function (): void { Sanctum::actingAs($this->user); $seeded = Opportunity::query()->where('team_id', $this->team->id)->count(); Opportunity::factory(3)->for($this->team)->create(); $this->getJson('/api/v1/opportunities') ->assertOk() ->assertJsonCount($seeded + 3, 'data') ->assertJsonStructure(['data' => [['id', 'type', 'attributes']]]); }); it('can create an opportunity', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/opportunities', ['name' => 'Big Deal']) ->assertCreated() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'opportunities') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Big Deal') ->where('creation_source', CreationSource::API->value) ->whereType('created_at', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); $this->assertDatabaseHas('opportunities', ['name' => 'Big Deal', 'team_id' => $this->team->id]); }); it('validates required fields on create', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/opportunities', []) ->assertUnprocessable() ->assertInvalid(['name']); }); it('can show an opportunity', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(['name' => 'Show Test']); $this->getJson("/api/v1/opportunities/{$opportunity->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $opportunity->id) ->where('type', 'opportunities') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Show Test') ->whereType('creation_source', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); }); it('can update an opportunity', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->putJson("/api/v1/opportunities/{$opportunity->id}", ['name' => 'Updated Name']) ->assertOk() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $opportunity->id) ->where('type', 'opportunities') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Updated Name') ->etc() ) ->etc() ) ); }); it('can delete an opportunity', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->deleteJson("/api/v1/opportunities/{$opportunity->id}") ->assertNoContent(); $this->assertSoftDeleted('opportunities', ['id' => $opportunity->id]); }); it('scopes opportunities to current team', function (): void { $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create(['team_id' => Team::factory()->create()->id])); Sanctum::actingAs($this->user); $ownOpportunity = Opportunity::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/opportunities'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($ownOpportunity->id); expect($ids)->not->toContain($otherOpportunity->id); }); describe('cross-tenant isolation', function (): void { it('cannot show an opportunity from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create(['team_id' => $otherTeam->id])); $this->getJson("/api/v1/opportunities/{$otherOpportunity->id}") ->assertNotFound(); }); it('cannot update an opportunity from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create(['team_id' => $otherTeam->id])); $this->putJson("/api/v1/opportunities/{$otherOpportunity->id}", ['name' => 'Hacked']) ->assertNotFound(); }); it('cannot delete an opportunity from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create(['team_id' => $otherTeam->id])); $this->deleteJson("/api/v1/opportunities/{$otherOpportunity->id}") ->assertNotFound(); }); it('rejects company_id from another team on create', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); $this->postJson('/api/v1/opportunities', [ 'name' => 'Test Deal', 'company_id' => $otherCompany->id, ]) ->assertUnprocessable() ->assertInvalid(['company_id']); }); it('rejects contact_id from another team on create', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherPerson = People::withoutEvents(fn () => People::factory()->create([ 'team_id' => $otherTeam->id, ])); $this->postJson('/api/v1/opportunities', [ 'name' => 'Test Deal', 'contact_id' => $otherPerson->id, ]) ->assertUnprocessable() ->assertInvalid(['contact_id']); }); }); describe('includes', function (): void { it('can include creator on show endpoint', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->getJson("/api/v1/opportunities/{$opportunity->id}?include=creator") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ->has('attributes') ->etc() ) ->etc() ); }); it('can include creator on list endpoint', function (): void { Sanctum::actingAs($this->user); Opportunity::factory()->for($this->team)->create(); $this->getJson('/api/v1/opportunities?include=creator') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.0.relationships.creator') ->has('included') ->etc() ); }); it('can include company on show endpoint', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(['company_id' => $company->id]); $this->getJson("/api/v1/opportunities/{$opportunity->id}?include=company") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.company.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'companies') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'companies') ->has('attributes') ->etc() ) ->etc() ); }); it('can include contact on show endpoint', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(['contact_id' => $person->id]); $this->getJson("/api/v1/opportunities/{$opportunity->id}?include=contact") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.contact.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'people') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'people') ->has('attributes') ->etc() ) ->etc() ); }); it('can include multiple relations', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(['company_id' => $company->id]); $this->getJson("/api/v1/opportunities/{$opportunity->id}?include=creator,company") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator') ->has('data.relationships.company') ->etc() ); }); it('does not include relations when not requested', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/opportunities/{$opportunity->id}") ->assertOk(); expect($response->json('data.relationships'))->toBeNull(); }); it('can include relationship counts', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/opportunities?include=tasksCount'); $response->assertOk(); $oppData = collect($response->json('data')) ->firstWhere('id', $opportunity->id); expect($oppData['attributes']['tasks_count'])->toBe(0); }); it('rejects disallowed includes on list endpoint', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/opportunities?include=secret') ->assertStatus(400); }); }); describe('filtering and sorting', function (): void { it('can filter opportunities by name', function (): void { Sanctum::actingAs($this->user); Opportunity::factory()->for($this->team)->create(['name' => 'Enterprise Deal']); Opportunity::factory()->for($this->team)->create(['name' => 'Small Contract']); $response = $this->getJson('/api/v1/opportunities?filter[name]=Enterprise'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name'); expect($names)->toContain('Enterprise Deal'); expect($names)->not->toContain('Small Contract'); }); it('can filter opportunities by company_id', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $matched = Opportunity::factory()->for($this->team)->create(['company_id' => $company->id]); $unmatched = Opportunity::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/opportunities?filter[company_id]={$company->id}"); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($matched->id); expect($ids)->not->toContain($unmatched->id); }); it('can sort opportunities by name ascending', function (): void { Sanctum::actingAs($this->user); Opportunity::factory()->for($this->team)->create(['name' => 'Zulu Deal']); Opportunity::factory()->for($this->team)->create(['name' => 'Alpha Deal']); $response = $this->getJson('/api/v1/opportunities?sort=name'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name')->values(); $alphaIndex = $names->search('Alpha Deal'); $zuluIndex = $names->search('Zulu Deal'); expect($alphaIndex)->toBeLessThan($zuluIndex); }); it('can sort opportunities by name descending', function (): void { Sanctum::actingAs($this->user); Opportunity::factory()->for($this->team)->create(['name' => 'Alpha Deal']); Opportunity::factory()->for($this->team)->create(['name' => 'Zulu Deal']); $response = $this->getJson('/api/v1/opportunities?sort=-name'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name')->values(); $zuluIndex = $names->search('Zulu Deal'); $alphaIndex = $names->search('Alpha Deal'); expect($zuluIndex)->toBeLessThan($alphaIndex); }); it('rejects disallowed filter fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/opportunities?filter[team_id]=fake') ->assertStatus(400); }); it('rejects disallowed sort fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/opportunities?sort=team_id') ->assertStatus(400); }); }); describe('pagination', function (): void { it('paginates with per_page parameter', function (): void { Sanctum::actingAs($this->user); Opportunity::factory(5)->for($this->team)->create(); $this->getJson('/api/v1/opportunities?per_page=2') ->assertOk() ->assertJsonCount(2, 'data'); }); it('returns second page of results', function (): void { Sanctum::actingAs($this->user); Opportunity::factory(5)->for($this->team)->create(); $page1 = $this->getJson('/api/v1/opportunities?per_page=3&page=1'); $page2 = $this->getJson('/api/v1/opportunities?per_page=3&page=2'); $page1->assertOk()->assertJsonCount(3, 'data'); $page2->assertOk(); $page1Ids = collect($page1->json('data'))->pluck('id'); $page2Ids = collect($page2->json('data'))->pluck('id'); expect($page1Ids->intersect($page2Ids))->toBeEmpty(); }); it('caps per_page at maximum allowed value', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/opportunities?per_page=500') ->assertUnprocessable() ->assertInvalid(['per_page']); }); it('returns empty data array for page beyond results', function (): void { Sanctum::actingAs($this->user); Opportunity::factory(2)->for($this->team)->create(); $this->getJson('/api/v1/opportunities?page=999') ->assertOk() ->assertJsonCount(0, 'data'); }); }); describe('mass assignment protection', function (): void { it('ignores team_id in create request', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $this->postJson('/api/v1/opportunities', [ 'name' => 'Test Deal', 'team_id' => $otherTeam->id, ]) ->assertCreated(); $opportunity = Opportunity::query()->where('name', 'Test Deal')->first(); expect($opportunity->team_id)->toBe($this->team->id); }); it('ignores creator_id in create request', function (): void { Sanctum::actingAs($this->user); $otherUser = User::factory()->create(); $this->postJson('/api/v1/opportunities', [ 'name' => 'Test Deal', 'creator_id' => $otherUser->id, ]) ->assertCreated(); $opportunity = Opportunity::query()->where('name', 'Test Deal')->first(); expect($opportunity->creator_id)->toBe($this->user->id); }); it('ignores team_id in update request', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $this->putJson("/api/v1/opportunities/{$opportunity->id}", [ 'name' => 'Updated', 'team_id' => $otherTeam->id, ]) ->assertOk(); expect($opportunity->refresh()->team_id)->toBe($this->team->id); }); }); describe('input validation', function (): void { it('rejects name exceeding 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/opportunities', ['name' => str_repeat('a', 256)]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('rejects non-string name', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/opportunities', ['name' => 12345]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('rejects array as name', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/opportunities', ['name' => ['nested' => 'value']]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('accepts name at exactly 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/opportunities', ['name' => str_repeat('a', 255)]) ->assertCreated(); }); it('accepts null to clear a date custom field', function (): void { Sanctum::actingAs($this->user); $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'opportunity', 'name' => 'Date Fields', 'code' => 'date_fields_test', 'type' => 'section', 'sort_order' => 99, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'opportunity', 'code' => 'target_close_date', 'name' => 'Target Close Date', 'type' => 'date', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->putJson("/api/v1/opportunities/{$opportunity->id}", [ 'name' => $opportunity->name, 'custom_fields' => ['target_close_date' => null], ]) ->assertOk() ->assertValid(); }); it('accepts null to clear a datetime custom field', function (): void { Sanctum::actingAs($this->user); $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'opportunity', 'name' => 'Timestamps', 'code' => 'timestamps', 'type' => 'section', 'sort_order' => 2, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'opportunity', 'code' => 'last_contacted_at', 'name' => 'Last Contacted At', 'type' => 'date-time', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->putJson("/api/v1/opportunities/{$opportunity->id}", [ 'name' => $opportunity->name, 'custom_fields' => ['last_contacted_at' => null], ]) ->assertOk() ->assertValid(); }); }); describe('soft deletes', function (): void { it('excludes soft-deleted opportunities from list', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $deleted = Opportunity::factory()->for($this->team)->create(); $deleted->delete(); $ids = collect($this->getJson('/api/v1/opportunities')->json('data'))->pluck('id'); expect($ids)->toContain($opportunity->id); expect($ids)->not->toContain($deleted->id); }); it('cannot show a soft-deleted opportunity', function (): void { Sanctum::actingAs($this->user); $opportunity = Opportunity::factory()->for($this->team)->create(); $opportunity->delete(); $this->getJson("/api/v1/opportunities/{$opportunity->id}") ->assertNotFound(); }); }); describe('non-existent record', function (): void { it('returns 404 for non-existent opportunity', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/opportunities/'.Str::ulid()) ->assertNotFound(); }); }); it('includes company_id and contact_id in attributes', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create([ 'company_id' => $company->id, 'contact_id' => $person->id, ]); $this->getJson("/api/v1/opportunities/{$opportunity->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.attributes', fn (AssertableJson $json) => $json ->where('company_id', $company->id) ->where('contact_id', $person->id) ->etc() ) ->etc() ); }); ================================================ FILE: tests/Feature/Api/V1/PeopleApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('requires authentication', function (): void { $this->getJson('/api/v1/people')->assertUnauthorized(); }); it('can list people', function (): void { Sanctum::actingAs($this->user); $people = People::factory(3)->for($this->team)->create(); $response = $this->getJson('/api/v1/people'); $response->assertOk() ->assertJsonStructure(['data' => [['id', 'type', 'attributes']]]); $ids = collect($response->json('data'))->pluck('id'); $people->each(fn (People $person) => expect($ids)->toContain($person->id)); }); it('can create a person', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', ['name' => 'John Doe']) ->assertCreated() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'people') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'John Doe') ->where('creation_source', CreationSource::API->value) ->whereType('created_at', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); $this->assertDatabaseHas('people', ['name' => 'John Doe', 'team_id' => $this->team->id]); }); it('validates required fields on create', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', []) ->assertUnprocessable() ->assertInvalid(['name']); }); it('can show a person', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(['name' => 'Show Test']); $this->getJson("/api/v1/people/{$person->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $person->id) ->where('type', 'people') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Show Test') ->whereType('creation_source', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); }); it('can update a person', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $this->putJson("/api/v1/people/{$person->id}", ['name' => 'Updated Name']) ->assertOk() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $person->id) ->where('type', 'people') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Updated Name') ->etc() ) ->etc() ) ); }); it('can delete a person', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $this->deleteJson("/api/v1/people/{$person->id}") ->assertNoContent(); $this->assertSoftDeleted('people', ['id' => $person->id]); }); it('scopes people to current team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); Sanctum::actingAs($this->user); $ownPerson = People::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/people'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($ownPerson->id); expect($ids)->not->toContain($otherPerson->id); }); describe('cross-tenant isolation', function (): void { it('cannot show a person from another team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); Sanctum::actingAs($this->user); $this->getJson("/api/v1/people/{$otherPerson->id}") ->assertNotFound(); }); it('cannot update a person from another team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); Sanctum::actingAs($this->user); $this->putJson("/api/v1/people/{$otherPerson->id}", ['name' => 'Hacked']) ->assertNotFound(); }); it('cannot delete a person from another team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); Sanctum::actingAs($this->user); $this->deleteJson("/api/v1/people/{$otherPerson->id}") ->assertNotFound(); }); it('rejects company_id from another team on create', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); $this->postJson('/api/v1/people', [ 'name' => 'Test Person', 'company_id' => $otherCompany->id, ]) ->assertUnprocessable() ->assertInvalid(['company_id']); }); it('rejects company_id from another team on update', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); $this->putJson("/api/v1/people/{$person->id}", [ 'company_id' => $otherCompany->id, ]) ->assertUnprocessable() ->assertInvalid(['company_id']); }); }); describe('includes', function (): void { it('can include creator on show endpoint', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $this->getJson("/api/v1/people/{$person->id}?include=creator") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ->has('attributes') ->etc() ) ->etc() ); }); it('can include creator on list endpoint', function (): void { Sanctum::actingAs($this->user); People::factory()->for($this->team)->create(); $this->getJson('/api/v1/people?include=creator') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.0.relationships.creator') ->has('included') ->etc() ); }); it('can include company on show endpoint', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(['company_id' => $company->id]); $this->getJson("/api/v1/people/{$person->id}?include=company") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.company.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'companies') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'companies') ->has('attributes') ->etc() ) ->etc() ); }); it('can include multiple relations', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(['company_id' => $company->id]); $this->getJson("/api/v1/people/{$person->id}?include=creator,company") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator') ->has('data.relationships.company') ->etc() ); }); it('does not include relations when not requested', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/people/{$person->id}") ->assertOk(); expect($response->json('data.relationships'))->toBeNull(); }); it('can include relationship counts', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/people?include=tasksCount'); $response->assertOk(); $personData = collect($response->json('data')) ->firstWhere('id', $person->id); expect($personData['attributes']['tasks_count'])->toBe(0); }); it('rejects disallowed includes on list endpoint', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/people?include=secret') ->assertStatus(400); }); }); describe('filtering and sorting', function (): void { it('can filter people by name', function (): void { Sanctum::actingAs($this->user); People::factory()->for($this->team)->create(['name' => 'Alice Johnson']); People::factory()->for($this->team)->create(['name' => 'Bob Smith']); $response = $this->getJson('/api/v1/people?filter[name]=Alice'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name'); expect($names)->toContain('Alice Johnson'); expect($names)->not->toContain('Bob Smith'); }); it('can filter people by company_id', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $matched = People::factory()->for($this->team)->create(['company_id' => $company->id]); $unmatched = People::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/people?filter[company_id]={$company->id}"); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($matched->id); expect($ids)->not->toContain($unmatched->id); }); it('can sort people by name ascending', function (): void { Sanctum::actingAs($this->user); People::factory()->for($this->team)->create(['name' => 'Zulu Person']); People::factory()->for($this->team)->create(['name' => 'Alpha Person']); $response = $this->getJson('/api/v1/people?sort=name'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name')->values(); $alphaIndex = $names->search('Alpha Person'); $zuluIndex = $names->search('Zulu Person'); expect($alphaIndex)->toBeLessThan($zuluIndex); }); it('can sort people by name descending', function (): void { Sanctum::actingAs($this->user); People::factory()->for($this->team)->create(['name' => 'Alpha Person']); People::factory()->for($this->team)->create(['name' => 'Zulu Person']); $response = $this->getJson('/api/v1/people?sort=-name'); $response->assertOk(); $names = collect($response->json('data'))->pluck('attributes.name')->values(); $zuluIndex = $names->search('Zulu Person'); $alphaIndex = $names->search('Alpha Person'); expect($zuluIndex)->toBeLessThan($alphaIndex); }); it('rejects disallowed filter fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/people?filter[team_id]=fake') ->assertStatus(400); }); it('rejects disallowed sort fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/people?sort=team_id') ->assertStatus(400); }); }); describe('pagination', function (): void { it('paginates with per_page parameter', function (): void { Sanctum::actingAs($this->user); People::factory(5)->for($this->team)->create(); $this->getJson('/api/v1/people?per_page=2') ->assertOk() ->assertJsonCount(2, 'data'); }); it('returns second page of results', function (): void { Sanctum::actingAs($this->user); People::factory(5)->for($this->team)->create(); $page1 = $this->getJson('/api/v1/people?per_page=3&page=1'); $page2 = $this->getJson('/api/v1/people?per_page=3&page=2'); $page1->assertOk()->assertJsonCount(3, 'data'); $page2->assertOk(); $page1Ids = collect($page1->json('data'))->pluck('id'); $page2Ids = collect($page2->json('data'))->pluck('id'); expect($page1Ids->intersect($page2Ids))->toBeEmpty(); }); it('caps per_page at maximum allowed value', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/people?per_page=500') ->assertUnprocessable() ->assertInvalid(['per_page']); }); it('returns empty data array for page beyond results', function (): void { Sanctum::actingAs($this->user); People::factory(2)->for($this->team)->create(); $this->getJson('/api/v1/people?page=999') ->assertOk() ->assertJsonCount(0, 'data'); }); }); describe('mass assignment protection', function (): void { it('ignores team_id in create request', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $this->postJson('/api/v1/people', [ 'name' => 'Test Person', 'team_id' => $otherTeam->id, ]) ->assertCreated(); $person = People::query()->where('name', 'Test Person')->first(); expect($person->team_id)->toBe($this->team->id); }); it('ignores creator_id in create request', function (): void { Sanctum::actingAs($this->user); $otherUser = User::factory()->create(); $this->postJson('/api/v1/people', [ 'name' => 'Test Person', 'creator_id' => $otherUser->id, ]) ->assertCreated(); $person = People::query()->where('name', 'Test Person')->first(); expect($person->creator_id)->toBe($this->user->id); }); it('ignores team_id in update request', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $this->putJson("/api/v1/people/{$person->id}", [ 'name' => 'Updated', 'team_id' => $otherTeam->id, ]) ->assertOk(); expect($person->refresh()->team_id)->toBe($this->team->id); }); }); describe('input validation', function (): void { it('rejects name exceeding 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', ['name' => str_repeat('a', 256)]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('rejects non-string name', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', ['name' => 12345]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('rejects array as name', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', ['name' => ['nested' => 'value']]) ->assertUnprocessable() ->assertInvalid(['name']); }); it('accepts name at exactly 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', ['name' => str_repeat('a', 255)]) ->assertCreated(); }); it('rejects invalid company_id format', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/people', [ 'name' => 'Test Person', 'company_id' => 'not-a-valid-id', ]) ->assertUnprocessable() ->assertInvalid(['company_id']); }); }); describe('soft deletes', function (): void { it('excludes soft-deleted people from list', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $deleted = People::factory()->for($this->team)->create(); $deleted->delete(); $ids = collect($this->getJson('/api/v1/people')->json('data'))->pluck('id'); expect($ids)->toContain($person->id); expect($ids)->not->toContain($deleted->id); }); it('cannot show a soft-deleted person', function (): void { Sanctum::actingAs($this->user); $person = People::factory()->for($this->team)->create(); $person->delete(); $this->getJson("/api/v1/people/{$person->id}") ->assertNotFound(); }); }); describe('non-existent record', function (): void { it('returns 404 for non-existent person', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/people/'.Str::ulid()) ->assertNotFound(); }); }); it('includes company_id in attributes', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create([ 'company_id' => $company->id, ]); $this->getJson("/api/v1/people/{$person->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.attributes', fn (AssertableJson $json) => $json ->where('company_id', $company->id) ->etc() ) ->etc() ); }); ================================================ FILE: tests/Feature/Api/V1/TasksApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('requires authentication', function (): void { $this->getJson('/api/v1/tasks')->assertUnauthorized(); }); it('can list tasks', function (): void { Sanctum::actingAs($this->user); $seeded = Task::query()->where('team_id', $this->team->id)->count(); Task::factory(3)->for($this->team)->create(); $this->getJson('/api/v1/tasks') ->assertOk() ->assertJsonCount($seeded + 3, 'data') ->assertJsonStructure(['data' => [['id', 'type', 'attributes']]]); }); it('can create a task', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/tasks', ['title' => 'Fix bug']) ->assertCreated() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'tasks') ->has('attributes', fn (AssertableJson $json) => $json ->where('title', 'Fix bug') ->where('creation_source', CreationSource::API->value) ->whereType('created_at', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); $this->assertDatabaseHas('tasks', ['title' => 'Fix bug', 'team_id' => $this->team->id]); }); it('validates required fields on create', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/tasks', []) ->assertUnprocessable() ->assertInvalid(['title']); }); it('can show a task', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(['title' => 'Show Test']); $this->getJson("/api/v1/tasks/{$task->id}") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $task->id) ->where('type', 'tasks') ->has('attributes', fn (AssertableJson $json) => $json ->where('title', 'Show Test') ->whereType('creation_source', 'string') ->whereType('custom_fields', 'array') ->missing('team_id') ->missing('creator_id') ->etc() ) ->etc() ) ); }); it('can update a task', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $this->putJson("/api/v1/tasks/{$task->id}", ['title' => 'Updated Title']) ->assertOk() ->assertValid() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->where('id', $task->id) ->where('type', 'tasks') ->has('attributes', fn (AssertableJson $json) => $json ->where('title', 'Updated Title') ->etc() ) ->etc() ) ); }); it('can delete a task', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $this->deleteJson("/api/v1/tasks/{$task->id}") ->assertNoContent(); $this->assertSoftDeleted('tasks', ['id' => $task->id]); }); it('scopes tasks to current team', function (): void { $otherTask = Task::withoutEvents(fn () => Task::factory()->create(['team_id' => Team::factory()->create()->id])); Sanctum::actingAs($this->user); $ownTask = Task::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/tasks'); $response->assertOk(); $ids = collect($response->json('data'))->pluck('id'); expect($ids)->toContain($ownTask->id); expect($ids)->not->toContain($otherTask->id); }); it('can create a task with relationship ids', function (): void { Sanctum::actingAs($this->user); $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(); $this->postJson('/api/v1/tasks', [ 'title' => 'Linked task', 'company_ids' => [$company->id], 'people_ids' => [$person->id], 'opportunity_ids' => [$opportunity->id], 'assignee_ids' => [$this->user->id], ]) ->assertCreated(); $task = Task::query()->where('title', 'Linked task')->first(); expect($task->companies)->toHaveCount(1) ->and($task->people)->toHaveCount(1) ->and($task->opportunities)->toHaveCount(1) ->and($task->assignees)->toHaveCount(1); }); it('rejects cross-tenant relationship ids on task create', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherCompany = Company::factory()->for($otherTeam)->create(); $this->postJson('/api/v1/tasks', [ 'title' => 'Should fail', 'company_ids' => [$otherCompany->id], ]) ->assertUnprocessable() ->assertInvalid(['company_ids.0']); }); describe('cross-tenant isolation', function (): void { it('cannot show a task from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherTask = Task::withoutEvents(fn () => Task::factory()->create(['team_id' => $otherTeam->id])); $this->getJson("/api/v1/tasks/{$otherTask->id}") ->assertNotFound(); }); it('cannot update a task from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherTask = Task::withoutEvents(fn () => Task::factory()->create(['team_id' => $otherTeam->id])); $this->putJson("/api/v1/tasks/{$otherTask->id}", ['title' => 'Hacked']) ->assertNotFound(); }); it('cannot delete a task from another team', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $otherTask = Task::withoutEvents(fn () => Task::factory()->create(['team_id' => $otherTeam->id])); $this->deleteJson("/api/v1/tasks/{$otherTask->id}") ->assertNotFound(); }); }); describe('includes', function (): void { it('can include creator on show endpoint', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $this->getJson("/api/v1/tasks/{$task->id}?include=creator") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator.data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ) ->has('included.0', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ->has('attributes') ->etc() ) ->etc() ); }); it('can include creator on list endpoint', function (): void { Sanctum::actingAs($this->user); Task::factory()->for($this->team)->create(); $this->getJson('/api/v1/tasks?include=creator') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.0.relationships.creator') ->has('included') ->etc() ); }); it('can include assignees on show endpoint', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $task->assignees()->attach($this->user); $this->getJson("/api/v1/tasks/{$task->id}?include=assignees") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.assignees.data') ->has('included') ->etc() ); }); it('can include multiple relations', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $task->assignees()->attach($this->user); $this->getJson("/api/v1/tasks/{$task->id}?include=creator,assignees") ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data.relationships.creator') ->has('data.relationships.assignees') ->etc() ); }); it('does not include relations when not requested', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $response = $this->getJson("/api/v1/tasks/{$task->id}") ->assertOk(); expect($response->json('data.relationships'))->toBeNull(); }); it('can include relationship counts', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $response = $this->getJson('/api/v1/tasks?include=assigneesCount'); $response->assertOk(); $taskData = collect($response->json('data')) ->firstWhere('id', $task->id); expect($taskData['attributes']['assignees_count'])->toBe(0); }); it('rejects disallowed includes on list endpoint', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/tasks?include=secret') ->assertStatus(400); }); }); describe('filtering and sorting', function (): void { it('ignores assigned_to_me filter when value is false', function (): void { Sanctum::actingAs($this->user); $unassignedTask = Task::factory()->for($this->team)->create(['title' => 'Unassigned']); $assignedTask = Task::factory()->for($this->team)->create(['title' => 'Assigned']); $assignedTask->assignees()->attach($this->user); $this->getJson('/api/v1/tasks?filter[assigned_to_me]=false') ->assertOk() ->assertJsonFragment(['title' => 'Unassigned']) ->assertJsonFragment(['title' => 'Assigned']); }); it('can filter tasks by title', function (): void { Sanctum::actingAs($this->user); Task::factory()->for($this->team)->create(['title' => 'Fix login bug']); Task::factory()->for($this->team)->create(['title' => 'Deploy to staging']); $response = $this->getJson('/api/v1/tasks?filter[title]=login'); $response->assertOk(); $titles = collect($response->json('data'))->pluck('attributes.title'); expect($titles)->toContain('Fix login bug'); expect($titles)->not->toContain('Deploy to staging'); }); it('can sort tasks by title ascending', function (): void { Sanctum::actingAs($this->user); Task::factory()->for($this->team)->create(['title' => 'Zulu Task']); Task::factory()->for($this->team)->create(['title' => 'Alpha Task']); $response = $this->getJson('/api/v1/tasks?sort=title'); $response->assertOk(); $titles = collect($response->json('data'))->pluck('attributes.title')->values(); $alphaIndex = $titles->search('Alpha Task'); $zuluIndex = $titles->search('Zulu Task'); expect($alphaIndex)->toBeLessThan($zuluIndex); }); it('can sort tasks by title descending', function (): void { Sanctum::actingAs($this->user); Task::factory()->for($this->team)->create(['title' => 'Alpha Task']); Task::factory()->for($this->team)->create(['title' => 'Zulu Task']); $response = $this->getJson('/api/v1/tasks?sort=-title'); $response->assertOk(); $titles = collect($response->json('data'))->pluck('attributes.title')->values(); $zuluIndex = $titles->search('Zulu Task'); $alphaIndex = $titles->search('Alpha Task'); expect($zuluIndex)->toBeLessThan($alphaIndex); }); it('rejects disallowed filter fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/tasks?filter[team_id]=fake') ->assertStatus(400); }); it('rejects disallowed sort fields', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/tasks?sort=team_id') ->assertStatus(400); }); }); describe('pagination', function (): void { it('paginates with per_page parameter', function (): void { Sanctum::actingAs($this->user); Task::factory(5)->for($this->team)->create(); $this->getJson('/api/v1/tasks?per_page=2') ->assertOk() ->assertJsonCount(2, 'data'); }); it('returns second page of results', function (): void { Sanctum::actingAs($this->user); Task::factory(5)->for($this->team)->create(); $page1 = $this->getJson('/api/v1/tasks?per_page=3&page=1'); $page2 = $this->getJson('/api/v1/tasks?per_page=3&page=2'); $page1->assertOk()->assertJsonCount(3, 'data'); $page2->assertOk(); $page1Ids = collect($page1->json('data'))->pluck('id'); $page2Ids = collect($page2->json('data'))->pluck('id'); expect($page1Ids->intersect($page2Ids))->toBeEmpty(); }); it('caps per_page at maximum allowed value', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/tasks?per_page=500') ->assertUnprocessable() ->assertInvalid(['per_page']); }); it('returns empty data array for page beyond results', function (): void { Sanctum::actingAs($this->user); Task::factory(2)->for($this->team)->create(); $this->getJson('/api/v1/tasks?page=999') ->assertOk() ->assertJsonCount(0, 'data'); }); }); describe('mass assignment protection', function (): void { it('ignores team_id in create request', function (): void { Sanctum::actingAs($this->user); $otherTeam = Team::factory()->create(); $this->postJson('/api/v1/tasks', [ 'title' => 'Test Task', 'team_id' => $otherTeam->id, ]) ->assertCreated(); $task = Task::query()->where('title', 'Test Task')->first(); expect($task->team_id)->toBe($this->team->id); }); it('ignores creator_id in create request', function (): void { Sanctum::actingAs($this->user); $otherUser = User::factory()->create(); $this->postJson('/api/v1/tasks', [ 'title' => 'Test Task', 'creator_id' => $otherUser->id, ]) ->assertCreated(); $task = Task::query()->where('title', 'Test Task')->first(); expect($task->creator_id)->toBe($this->user->id); }); it('ignores team_id in update request', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $this->putJson("/api/v1/tasks/{$task->id}", [ 'title' => 'Updated', 'team_id' => $otherTeam->id, ]) ->assertOk(); expect($task->refresh()->team_id)->toBe($this->team->id); }); }); describe('input validation', function (): void { it('rejects title exceeding 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/tasks', ['title' => str_repeat('a', 256)]) ->assertUnprocessable() ->assertInvalid(['title']); }); it('rejects non-string title', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/tasks', ['title' => 12345]) ->assertUnprocessable() ->assertInvalid(['title']); }); it('rejects array as title', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/tasks', ['title' => ['nested' => 'value']]) ->assertUnprocessable() ->assertInvalid(['title']); }); it('accepts title at exactly 255 characters', function (): void { Sanctum::actingAs($this->user); $this->postJson('/api/v1/tasks', ['title' => str_repeat('a', 255)]) ->assertCreated(); }); }); describe('soft deletes', function (): void { it('excludes soft-deleted tasks from list', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $deleted = Task::factory()->for($this->team)->create(); $deleted->delete(); $ids = collect($this->getJson('/api/v1/tasks')->json('data'))->pluck('id'); expect($ids)->toContain($task->id); expect($ids)->not->toContain($deleted->id); }); it('cannot show a soft-deleted task', function (): void { Sanctum::actingAs($this->user); $task = Task::factory()->for($this->team)->create(); $task->delete(); $this->getJson("/api/v1/tasks/{$task->id}") ->assertNotFound(); }); }); describe('non-existent record', function (): void { it('returns 404 for non-existent task', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/tasks/'.Str::ulid()) ->assertNotFound(); }); }); ================================================ FILE: tests/Feature/Api/V1/TokenAbilitiesApiTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); describe('read-only token', function (): void { beforeEach(function (): void { $this->token = $this->user->createToken('test', ['read'])->plainTextToken; }); it('can list companies', function (): void { $this->withToken($this->token) ->getJson('/api/v1/companies') ->assertOk(); }); it('can show a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->getJson("/api/v1/companies/{$company->id}") ->assertOk(); }); it('cannot create a company', function (): void { $this->withToken($this->token) ->postJson('/api/v1/companies', ['name' => 'Blocked']) ->assertForbidden(); }); it('cannot update a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->putJson("/api/v1/companies/{$company->id}", ['name' => 'Blocked']) ->assertForbidden(); }); it('cannot delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->deleteJson("/api/v1/companies/{$company->id}") ->assertForbidden(); }); }); describe('create-only token', function (): void { beforeEach(function (): void { $this->token = $this->user->createToken('test', ['create'])->plainTextToken; }); it('cannot list companies', function (): void { $this->withToken($this->token) ->getJson('/api/v1/companies') ->assertForbidden(); }); it('can create a company', function (): void { $this->withToken($this->token) ->postJson('/api/v1/companies', ['name' => 'Allowed Corp']) ->assertCreated(); }); it('cannot update a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->putJson("/api/v1/companies/{$company->id}", ['name' => 'Blocked']) ->assertForbidden(); }); it('cannot delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->deleteJson("/api/v1/companies/{$company->id}") ->assertForbidden(); }); }); describe('update-only token', function (): void { beforeEach(function (): void { $this->token = $this->user->createToken('test', ['update'])->plainTextToken; }); it('cannot list companies', function (): void { $this->withToken($this->token) ->getJson('/api/v1/companies') ->assertForbidden(); }); it('cannot create a company', function (): void { $this->withToken($this->token) ->postJson('/api/v1/companies', ['name' => 'Blocked']) ->assertForbidden(); }); it('can update a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->putJson("/api/v1/companies/{$company->id}", ['name' => 'Updated']) ->assertOk(); }); it('cannot delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->deleteJson("/api/v1/companies/{$company->id}") ->assertForbidden(); }); }); describe('delete-only token', function (): void { beforeEach(function (): void { $this->token = $this->user->createToken('test', ['delete'])->plainTextToken; }); it('cannot list companies', function (): void { $this->withToken($this->token) ->getJson('/api/v1/companies') ->assertForbidden(); }); it('cannot create a company', function (): void { $this->withToken($this->token) ->postJson('/api/v1/companies', ['name' => 'Blocked']) ->assertForbidden(); }); it('can delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->deleteJson("/api/v1/companies/{$company->id}") ->assertNoContent(); }); }); describe('wildcard token', function (): void { beforeEach(function (): void { $this->token = $this->user->createToken('test', ['*'])->plainTextToken; }); it('can list companies', function (): void { $this->withToken($this->token) ->getJson('/api/v1/companies') ->assertOk(); }); it('can create a company', function (): void { $this->withToken($this->token) ->postJson('/api/v1/companies', ['name' => 'Wildcard Corp']) ->assertCreated(); }); it('can update a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->putJson("/api/v1/companies/{$company->id}", ['name' => 'Updated']) ->assertOk(); }); it('can delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); $this->withToken($this->token) ->deleteJson("/api/v1/companies/{$company->id}") ->assertNoContent(); }); }); describe('multi-ability token', function (): void { it('read+create token can list and create but not update or delete', function (): void { $token = $this->user->createToken('test', ['read', 'create'])->plainTextToken; $this->withToken($token) ->getJson('/api/v1/companies') ->assertOk(); $this->withToken($token) ->postJson('/api/v1/companies', ['name' => 'Multi Corp']) ->assertCreated(); $company = Company::factory()->for($this->team)->create(); $this->withToken($token) ->putJson("/api/v1/companies/{$company->id}", ['name' => 'Blocked']) ->assertForbidden(); $this->withToken($token) ->deleteJson("/api/v1/companies/{$company->id}") ->assertForbidden(); }); }); ================================================ FILE: tests/Feature/Api/V1/UserEndpointTest.php ================================================ getJson('/api/v1/user')->assertUnauthorized(); }); it('returns user resource with correct shape', function (): void { $user = User::factory()->withPersonalTeam()->create([ 'name' => 'Jane Doe', 'email' => 'jane@example.com', ]); Sanctum::actingAs($user); $this->getJson('/api/v1/user') ->assertOk() ->assertJson(fn (AssertableJson $json) => $json ->has('data', fn (AssertableJson $json) => $json ->whereType('id', 'string') ->where('type', 'users') ->has('attributes', fn (AssertableJson $json) => $json ->where('name', 'Jane Doe') ->where('email', 'jane@example.com') ->missing('password') ->missing('remember_token') ->missing('two_factor_secret') ->missing('two_factor_recovery_codes') ->missing('current_team_id') ->missing('email_verified_at') ->missing('profile_photo_path') ->missing('profile_photo_url') ->missing('created_at') ->missing('updated_at') ) ) ); }); it('does not expose internal fields in response', function (): void { $user = User::factory()->withPersonalTeam()->create(); Sanctum::actingAs($user); $response = $this->getJson('/api/v1/user')->assertOk(); $attributes = $response->json('data.attributes'); expect(array_keys($attributes))->toBe(['name', 'email']); }); ================================================ FILE: tests/Feature/Auth/AuthenticationTest.php ================================================ get(url()->getAppUrl('login')); $response->assertStatus(200); }); test('users can authenticate using the login screen', function () { $user = User::factory()->withTeam()->create(); $team = $user->ownedTeams()->first(); livewire(Login::class) ->fillForm([ 'email' => $user->email, 'password' => 'password', ]) ->call('authenticate') ->assertRedirect(url()->getAppUrl("{$team->slug}/companies")); $this->assertAuthenticated(); }); test('users cannot authenticate with invalid password', function () { $user = User::factory()->create(); livewire(Login::class) ->fillForm([ 'email' => $user->email, 'password' => 'wrong-password', ]) ->call('authenticate') ->assertHasFormErrors(['email']); $this->assertGuest(); }); ================================================ FILE: tests/Feature/Auth/PasswordResetTest.php ================================================ get(url()->getAppUrl('password-reset/request')); $response->assertSuccessful(); }); test('reset password link can be requested', function () { Notification::fake(); $user = User::factory()->withTeam()->create(); livewire(RequestPasswordReset::class) ->fillForm([ 'email' => $user->email, ]) ->call('request') ->assertNotified(); Notification::assertSentTo($user, ResetPasswordNotification::class); }); test('reset password link is not sent for non-existent email', function () { Notification::fake(); livewire(RequestPasswordReset::class) ->fillForm([ 'email' => 'nonexistent@example.com', ]) ->call('request'); Notification::assertNothingSent(); }); test('password can be reset with valid token', function () { $user = User::factory()->withTeam()->create(); $token = Password::broker('users')->createToken($user); livewire(ResetPassword::class, [ 'email' => $user->email, 'token' => $token, ]) ->fillForm([ 'password' => 'new-secure-password', 'passwordConfirmation' => 'new-secure-password', ]) ->call('resetPassword') ->assertNotified() ->assertRedirect(); expect(Hash::check('new-secure-password', $user->fresh()->password))->toBeTrue(); }); test('password cannot be reset with invalid token', function () { $user = User::factory()->withTeam()->create(); livewire(ResetPassword::class, [ 'email' => $user->email, 'token' => 'invalid-token', ]) ->fillForm([ 'password' => 'new-secure-password', 'passwordConfirmation' => 'new-secure-password', ]) ->call('resetPassword') ->assertNotified(); expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); }); test('password reset requires confirmation to match', function () { $user = User::factory()->withTeam()->create(); $token = Password::broker('users')->createToken($user); livewire(ResetPassword::class, [ 'email' => $user->email, 'token' => $token, ]) ->fillForm([ 'password' => 'new-secure-password', 'passwordConfirmation' => 'different-password', ]) ->call('resetPassword') ->assertHasFormErrors(['password']); expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); }); test('signed password reset URL is accessible', function () { $user = User::factory()->withTeam()->create(); $token = Password::broker('users')->createToken($user); $url = Filament::getPanel('app')->getResetPasswordUrl($token, $user); $this->get($url)->assertSuccessful(); }); test('password reset URL with decoded percent-encoding is accessible', function () { $user = User::factory()->withTeam()->create(); $token = Password::broker('users')->createToken($user); $url = Filament::getPanel('app')->getResetPasswordUrl($token, $user); $this->get(urldecode($url))->assertSuccessful(); }); test('password reset URL with tampered email is rejected', function () { $user = User::factory()->withTeam()->create(); $token = Password::broker('users')->createToken($user); $url = Filament::getPanel('app')->getResetPasswordUrl($token, $user); // Tamper with the email parameter $tamperedUrl = preg_replace('/email=[^&]+/', 'email=hacker@example.com', $url); $this->get($tamperedUrl)->assertForbidden(); }); test('authenticated user is redirected from forgot password page', function () { $user = User::factory()->withTeam()->create(); $this->actingAs($user); livewire(RequestPasswordReset::class) ->assertRedirect(); }); ================================================ FILE: tests/Feature/Auth/RegistrationTest.php ================================================ fillForm([ 'name' => 'Jane Doe', 'email' => 'jane-test@gmail.com', 'password' => 'Password123!', 'passwordConfirmation' => 'Password123!', ]) ->call('register') ->assertHasNoFormErrors(); $user = User::where('email', 'jane-test@gmail.com')->first(); expect($user)->not->toBeNull() ->and($user->ownedTeams)->toHaveCount(0) ->and($user->personalTeam())->toBeNull(); }); ================================================ FILE: tests/Feature/Auth/SocialiteLoginTest.php ================================================ id = $id; $user->name = $name; $user->email = $email; return $user; } test('redirect to socialite provider', function () { Socialite::fake(SocialiteProvider::GOOGLE->value); $response = $this->get(route('auth.socialite.redirect', ['provider' => SocialiteProvider::GOOGLE->value])); $response->assertRedirect(); }); test('callback from socialite provider creates new user when user does not exist', function () { Socialite::fake( SocialiteProvider::GOOGLE->value, makeSocialiteUser('123456789', 'Test User', 'test@example.com'), ); $response = $this->get(route('auth.socialite.callback', ['provider' => SocialiteProvider::GOOGLE->value, 'code' => 'test-code'])); $this->assertDatabaseHas('users', [ 'email' => 'test@example.com', 'name' => 'Test User', ]); $this->assertDatabaseHas('user_social_accounts', [ 'provider_name' => SocialiteProvider::GOOGLE->value, 'provider_id' => '123456789', ]); $this->assertAuthenticated(); $response->assertRedirect(url()->getAppUrl()); }); test('callback from socialite provider logs in existing user when social account exists', function () { $user = User::factory()->withTeam()->create([ 'email' => 'existing@example.com', 'name' => 'Existing User', ]); UserSocialAccount::factory()->create([ 'user_id' => $user->id, 'provider_name' => SocialiteProvider::GOOGLE->value, 'provider_id' => '123456789', ]); Socialite::fake( SocialiteProvider::GOOGLE->value, makeSocialiteUser('123456789', 'Existing User', 'existing@example.com'), ); $response = $this->get(route('auth.socialite.callback', ['provider' => SocialiteProvider::GOOGLE->value, 'code' => 'test-code'])); $this->assertAuthenticated(); $this->assertAuthenticatedAs($user); $response->assertRedirect(url()->getAppUrl()); }); test('callback from socialite provider links social account to existing user when email matches', function () { $user = User::factory()->withTeam()->create([ 'email' => 'existing@example.com', 'name' => 'Existing User', ]); Socialite::fake( SocialiteProvider::GOOGLE->value, makeSocialiteUser('123456789', 'Existing User', 'existing@example.com'), ); $response = $this->get(route('auth.socialite.callback', ['provider' => SocialiteProvider::GOOGLE->value, 'code' => 'test-code'])); $response->assertRedirect(); $this->assertAuthenticated(); $this->assertAuthenticatedAs($user); }); test('callback from socialite provider handles error gracefully', function () { Socialite::fake( SocialiteProvider::GOOGLE->value, fn () => throw new Exception('Socialite error'), ); $response = $this->get(route('auth.socialite.callback', ['provider' => SocialiteProvider::GOOGLE->value, 'code' => 'test-code'])); $response->assertRedirect(route('login')); $response->assertSessionHasErrors(['login']); }); test('callback from socialite provider handles missing code parameter', function () { $response = $this->get(route('auth.socialite.callback', ['provider' => SocialiteProvider::GOOGLE->value])); $response->assertRedirect(route('login')); $response->assertSessionHasErrors(['login']); $response->assertSessionHas('errors'); $errors = session('errors')->getBag('default'); expect($errors->first('login'))->toBe('Authorization was cancelled or failed. Please try again.'); }); ================================================ FILE: tests/Feature/Auth/TwoFactorAuthenticationSettingsTest.php ================================================ actingAs($user = User::factory()->create()->fresh()); $this->withSession(['auth.password_confirmed_at' => time()]); Livewire::test(TwoFactorAuthenticationForm::class) ->call('enableTwoFactorAuthentication'); $user = $user->fresh(); expect($user->two_factor_secret)->not->toBeNull(); expect($user->recoveryCodes())->toHaveCount(8); })->skip(function () { return ! Features::canManageTwoFactorAuthentication(); }, 'Two factor authentication is not enabled.'); test('recovery codes can be regenerated', function () { $this->actingAs($user = User::factory()->create()->fresh()); $this->withSession(['auth.password_confirmed_at' => time()]); $component = Livewire::test(TwoFactorAuthenticationForm::class) ->call('enableTwoFactorAuthentication') ->call('regenerateRecoveryCodes'); $user = $user->fresh(); $component->call('regenerateRecoveryCodes'); expect($user->recoveryCodes())->toHaveCount(8); expect(array_diff($user->recoveryCodes(), $user->fresh()->recoveryCodes()))->toHaveCount(8); })->skip(function () { return ! Features::canManageTwoFactorAuthentication(); }, 'Two factor authentication is not enabled.'); test('two factor authentication can be disabled', function () { $this->actingAs($user = User::factory()->create()->fresh()); $this->withSession(['auth.password_confirmed_at' => time()]); $component = Livewire::test(TwoFactorAuthenticationForm::class) ->call('enableTwoFactorAuthentication'); $this->assertNotNull($user->fresh()->two_factor_secret); $component->call('disableTwoFactorAuthentication'); expect($user->fresh()->two_factor_secret)->toBeNull(); })->skip(function () { return ! Features::canManageTwoFactorAuthentication(); }, 'Two factor authentication is not enabled.'); ================================================ FILE: tests/Feature/Auth/UserModelTest.php ================================================ create(); $socialAccount = UserSocialAccount::factory()->create([ 'user_id' => $user->id, ]); expect($user->socialAccounts->first())->toBeInstanceOf(UserSocialAccount::class) ->and($user->socialAccounts->first()->id)->toBe($socialAccount->id); }); test('user belongs to many tasks', function () { $user = User::factory()->create(); $task = Task::factory()->create(); $user->tasks()->attach($task); expect($user->tasks->first())->toBeInstanceOf(Task::class) ->and($user->tasks->first()->id)->toBe($task->id); }); test('user can access tenants', function () { $user = User::factory()->create(); $team = Team::factory()->create(['user_id' => $user->id]); $user->ownedTeams()->save($team); $tenants = $user->getTenants(app(Panel::class)->id('app')); expect($tenants->count())->toBe(1) ->and($tenants->first()->id)->toBe($team->id); }); test('user can access tenant', function () { $user = User::factory()->create(); $team = Team::factory()->create(['user_id' => $user->id]); $user->ownedTeams()->save($team); $user->currentTeam()->associate($team); $user->save(); expect($user->canAccessTenant($team))->toBeTrue(); }); test('user has avatar', function () { $user = User::factory()->create([ 'name' => 'John Doe', ]); expect($user->getFilamentAvatarUrl())->not->toBeNull() ->and($user->avatar)->not->toBeNull(); }); ================================================ FILE: tests/Feature/CRM/CompanyModelTest.php ================================================ create(); $company = Company::factory()->create([ 'team_id' => $team->getKey(), ]); expect($company->team)->toBeInstanceOf(Team::class) ->and($company->team->getKey())->toBe($team->getKey()); }); test('company belongs to creator', function () { $user = User::factory()->create(); $company = Company::factory()->create([ 'creator_id' => $user->getKey(), ]); expect($company->creator)->toBeInstanceOf(User::class) ->and($company->creator->getKey())->toBe($user->getKey()); }); test('company belongs to account owner', function () { $user = User::factory()->create(); $company = Company::factory()->create([ 'account_owner_id' => $user->getKey(), ]); expect($company->accountOwner)->toBeInstanceOf(User::class) ->and($company->accountOwner->getKey())->toBe($user->getKey()); }); test('company has many people', function () { $company = Company::factory()->create(); $people = People::factory()->create([ 'company_id' => $company->getKey(), ]); expect($company->people->first())->toBeInstanceOf(People::class) ->and($company->people->first()->getKey())->toBe($people->getKey()); }); test('company has many opportunities', function () { $company = Company::factory()->create(); $opportunity = Opportunity::factory()->create([ 'company_id' => $company->getKey(), ]); expect($company->opportunities->first())->toBeInstanceOf(Opportunity::class) ->and($company->opportunities->first()->getKey())->toBe($opportunity->getKey()); }); test('company morph to many tasks', function () { $company = Company::factory()->create(); $task = Task::factory()->create(); $company->tasks()->attach($task); expect($company->tasks->first())->toBeInstanceOf(Task::class) ->and($company->tasks->first()->getKey())->toBe($task->getKey()); }); test('company morph to many notes', function () { $company = Company::factory()->create(); $note = Note::factory()->create(); $company->notes()->attach($note); expect($company->notes->first())->toBeInstanceOf(Note::class) ->and($company->notes->first()->getKey())->toBe($note->getKey()); }); test('company has logo attribute', function () { $company = Company::factory()->create([ 'name' => 'Test Company', ]); expect($company->logo)->not->toBeNull(); }); test('company uses media library', function () { $company = Company::factory()->create(); expect(class_implements($company))->toContain(HasMedia::class) ->and(class_uses_recursive($company))->toContain(InteractsWithMedia::class); }); test('company uses custom fields', function () { $company = Company::factory()->create(); expect(class_implements($company))->toContain(HasCustomFields::class) ->and(class_uses_recursive($company))->toContain(UsesCustomFields::class); }); ================================================ FILE: tests/Feature/Commands/InstallCommandTest.php ================================================ artisan('relaticle:install', [ '--force' => true, '--env-file' => $tempEnv, ]) ->expectsChoice('Which database would you like to use?', 'sqlite', [ 'sqlite' => 'SQLite (Recommended for local development)', 'pgsql' => 'PostgreSQL (Recommended for production)', ]) ->expectsConfirmation('Install demo data?', 'no') ->expectsConfirmation('Create system administrator account?', 'no') ->expectsOutputToContain('Starting installation process') ->expectsOutputToContain('System Requirements completed') ->expectsOutputToContain('Environment Setup completed') ->expectsOutputToContain('Database completed') ->expectsOutputToContain('Relaticle installed successfully!') ->assertSuccessful(); // Verify .env was modified in temp file expect(File::get($tempEnv))->toContain('DB_CONNECTION=sqlite'); File::delete($tempEnv); }); it('completes installation with demo data but no system admin', function (): void { $this->markTestSkipped('Demo data seeding test needs investigation'); $tempEnv = createTempEnvFile(); $this->artisan('relaticle:install', [ '--force' => true, '--env-file' => $tempEnv, ]) ->expectsChoice('Which database would you like to use?', 'sqlite', [ 'sqlite' => 'SQLite (Recommended for local development)', 'pgsql' => 'PostgreSQL (Recommended for production)', ]) ->expectsConfirmation('Install demo data?', 'yes') ->expectsConfirmation('Create system administrator account?', 'no') ->expectsOutputToContain('Starting installation process') ->expectsOutputToContain('Demo Data completed') ->expectsOutputToContain('Relaticle installed successfully!') ->assertExitCode(0); File::delete($tempEnv); }); it('creates system administrator when requested', function (): void { $tempEnv = createTempEnvFile(); // Clear any existing system administrators SystemAdministrator::query()->delete(); $this->artisan('relaticle:install', [ '--force' => true, '--env-file' => $tempEnv, ]) ->expectsChoice('Which database would you like to use?', 'sqlite', [ 'sqlite' => 'SQLite (Recommended for local development)', 'pgsql' => 'PostgreSQL (Recommended for production)', ]) ->expectsConfirmation('Install demo data?', 'no') ->expectsConfirmation('Create system administrator account?', 'yes') ->expectsQuestion('System Administrator name', 'Test Admin') ->expectsQuestion('System Administrator email address', 'test@example.com') ->expectsQuestion('System Administrator password (min. 8 characters)', 'password123') ->expectsOutputToContain('Creating System Administrator account') ->expectsOutputToContain('System Administrator created') ->expectsOutputToContain('Relaticle installed successfully!') ->assertSuccessful(); // Verify the system administrator was created expect(SystemAdministrator::where('email', 'test@example.com')->exists())->toBeTrue(); File::delete($tempEnv); }); it('skips system admin creation if one already exists', function (): void { $tempEnv = createTempEnvFile(); // Ensure a system administrator exists SystemAdministrator::firstOrCreate( ['email' => 'existing@example.com'], [ 'name' => 'Existing Admin', 'password' => bcrypt('password'), 'role' => SystemAdministratorRole::SuperAdministrator, 'email_verified_at' => now(), ] ); $this->artisan('relaticle:install', [ '--force' => true, '--env-file' => $tempEnv, ]) ->expectsChoice('Which database would you like to use?', 'sqlite', [ 'sqlite' => 'SQLite (Recommended for local development)', 'pgsql' => 'PostgreSQL (Recommended for production)', ]) ->expectsConfirmation('Install demo data?', 'no') ->expectsConfirmation('Create system administrator account?', 'yes') ->expectsConfirmation('Do you want to create another one?', 'no') ->expectsOutputToContain('A System Administrator already exists') ->expectsOutputToContain('System Administrator created') ->expectsOutputToContain('Relaticle installed successfully!') ->assertSuccessful(); File::delete($tempEnv); }); ================================================ FILE: tests/Feature/ContactFormTest.php ================================================ get('/contact') ->assertOk() ->assertViewIs('contact'); }); it('submits the contact form successfully with valid turnstile', function () { Mail::fake(); Turnstile::fake(); $this->post('/contact', [ 'name' => 'Jane Doe', 'email' => 'jane@gmail.com', 'company' => 'Acme Inc', 'message' => 'I would like to learn more about your enterprise plan and integrations.', 'cf-turnstile-response' => Turnstile::dummy(), ]) ->assertRedirect('/contact') ->assertSessionHas('success'); Mail::assertQueued(NewContactSubmissionMail::class); }); it('rejects submission when turnstile verification fails', function () { Mail::fake(); Turnstile::fake()->fail(); $this->post('/contact', [ 'name' => 'Jane Doe', 'email' => 'jane@gmail.com', 'message' => 'I would like to learn more about your enterprise plan and integrations.', 'cf-turnstile-response' => 'invalid-token', ]) ->assertSessionHasErrors('cf-turnstile-response'); Mail::assertNothingQueued(); }); it('rejects submission when turnstile response is missing', function () { Mail::fake(); $this->post('/contact', [ 'name' => 'Jane Doe', 'email' => 'jane@gmail.com', 'message' => 'I would like to learn more about your enterprise plan and integrations.', ]) ->assertSessionHasErrors('cf-turnstile-response'); Mail::assertNothingQueued(); }); ================================================ FILE: tests/Feature/Filament/App/Exports/CompanyExporterTest.php ================================================ except([ TeamCreated::class, 'eloquent.creating: App\\Models\\Team', ]); $this->team = Team::factory()->create(); $this->user = User::factory()->create(['current_team_id' => $this->team->id]); $this->user->teams()->attach($this->team); $this->actingAs($this->user); Filament::setTenant($this->team); }); test('exports company records', function () { Livewire::test(ListCompanies::class) ->assertActionExists('export') ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export)->not->toBeNull() ->and($export->exporter)->toBe(CompanyExporter::class) ->and($export->file_disk)->toBe('local') ->and($export->team_id)->toBe($this->team->id); }); test('exports respect team scoping', function () { $otherTeam = Team::factory()->create(['personal_team' => false]); $this->user->teams()->attach($otherTeam); Livewire::test(ListCompanies::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export->team_id)->toBe($this->team->id); }); test('export columns include system-seeded custom fields', function () { TenantContextService::setTenantId($this->team->id); $columns = CompanyExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); foreach (CompanyField::cases() as $field) { expect($columnLabels)->toContain($field->getDisplayName()); } }); test('export columns include user-created custom fields', function () { TenantContextService::setTenantId($this->team->id); CustomField::forceCreate([ 'name' => 'Company Size', 'code' => 'company_size', 'type' => 'text', 'entity_type' => 'company', 'tenant_id' => $this->team->id, 'sort_order' => 99, 'active' => true, 'system_defined' => false, 'settings' => new CustomFieldSettingsData, ]); $columns = CompanyExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); expect($columnLabels)->toContain('Company Size'); }); test('export generates CSV with correct data', function () { Storage::fake('local'); Company::factory()->create([ 'team_id' => $this->team->id, 'name' => 'Acme Corp', ]); Livewire::test(ListCompanies::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); $directory = $export->getFileDirectory(); $headers = Storage::disk('local')->get("{$directory}/headers.csv"); $data = Storage::disk('local')->get("{$directory}/0000000000000001.csv"); expect($headers)->toContain('Company Name') ->and($headers)->toContain('ICP') ->and($data)->toContain('Acme Corp'); }); ================================================ FILE: tests/Feature/Filament/App/Exports/NoteExporterTest.php ================================================ except([ TeamCreated::class, 'eloquent.creating: App\\Models\\Team', ]); $this->team = Team::factory()->create(); $this->user = User::factory()->create(['current_team_id' => $this->team->id]); $this->user->teams()->attach($this->team); $this->actingAs($this->user); Filament::setTenant($this->team); }); test('exports note records', function () { Livewire::test(ManageNotes::class) ->assertActionExists('export') ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export)->not->toBeNull() ->and($export->exporter)->toBe(NoteExporter::class) ->and($export->file_disk)->toBe('local') ->and($export->team_id)->toBe($this->team->id); }); test('exports respect team scoping', function () { $otherTeam = Team::factory()->create(['personal_team' => false]); $this->user->teams()->attach($otherTeam); Livewire::test(ManageNotes::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export->team_id)->toBe($this->team->id); }); test('export columns include system-seeded custom fields', function () { TenantContextService::setTenantId($this->team->id); $columns = NoteExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); foreach (NoteField::cases() as $field) { expect($columnLabels)->toContain($field->getDisplayName()); } }); test('export columns include user-created custom fields', function () { TenantContextService::setTenantId($this->team->id); CustomField::forceCreate([ 'name' => 'Follow-up Date', 'code' => 'follow_up_date', 'type' => 'date', 'entity_type' => 'note', 'tenant_id' => $this->team->id, 'sort_order' => 99, 'active' => true, 'system_defined' => false, 'settings' => new CustomFieldSettingsData, ]); $columns = NoteExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); expect($columnLabels)->toContain('Follow-up Date'); }); test('export generates CSV with correct data', function () { Storage::fake('local'); Note::factory()->create([ 'team_id' => $this->team->id, 'title' => 'Meeting notes Q1', ]); Livewire::test(ManageNotes::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); $directory = $export->getFileDirectory(); $headers = Storage::disk('local')->get("{$directory}/headers.csv"); $data = Storage::disk('local')->get("{$directory}/0000000000000001.csv"); expect($headers)->toContain('Title') ->and($headers)->toContain('Body') ->and($data)->toContain('Meeting notes Q1'); }); ================================================ FILE: tests/Feature/Filament/App/Exports/OpportunityExporterTest.php ================================================ except([ TeamCreated::class, 'eloquent.creating: App\\Models\\Team', ]); $this->team = Team::factory()->create(); $this->user = User::factory()->create(['current_team_id' => $this->team->id]); $this->user->teams()->attach($this->team); $this->actingAs($this->user); Filament::setTenant($this->team); }); test('exports opportunity records', function () { Livewire::test(ListOpportunities::class) ->assertActionExists('export') ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export)->not->toBeNull() ->and($export->exporter)->toBe(OpportunityExporter::class) ->and($export->file_disk)->toBe('local') ->and($export->team_id)->toBe($this->team->id); }); test('exports respect team scoping', function () { $otherTeam = Team::factory()->create(['personal_team' => false]); $this->user->teams()->attach($otherTeam); Livewire::test(ListOpportunities::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export->team_id)->toBe($this->team->id); }); test('export columns include system-seeded custom fields', function () { TenantContextService::setTenantId($this->team->id); $columns = OpportunityExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); foreach (OpportunityField::cases() as $field) { expect($columnLabels)->toContain($field->getDisplayName()); } }); test('export columns include user-created custom fields', function () { TenantContextService::setTenantId($this->team->id); CustomField::forceCreate([ 'name' => 'Win Probability', 'code' => 'win_probability', 'type' => 'number', 'entity_type' => 'opportunity', 'tenant_id' => $this->team->id, 'sort_order' => 99, 'active' => true, 'system_defined' => false, 'settings' => new CustomFieldSettingsData, ]); $columns = OpportunityExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); expect($columnLabels)->toContain('Win Probability'); }); test('export generates CSV with correct data', function () { Storage::fake('local'); Opportunity::factory()->create([ 'team_id' => $this->team->id, 'name' => 'Big Deal', ]); Livewire::test(ListOpportunities::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); $directory = $export->getFileDirectory(); $headers = Storage::disk('local')->get("{$directory}/headers.csv"); $data = Storage::disk('local')->get("{$directory}/0000000000000001.csv"); expect($headers)->toContain('Opportunity Name') ->and($headers)->toContain('Amount') ->and($data)->toContain('Big Deal'); }); ================================================ FILE: tests/Feature/Filament/App/Exports/PeopleExporterTest.php ================================================ except([ TeamCreated::class, 'eloquent.creating: App\\Models\\Team', ]); $this->team = Team::factory()->create(); $this->user = User::factory()->create(['current_team_id' => $this->team->id]); $this->user->teams()->attach($this->team); $this->actingAs($this->user); Filament::setTenant($this->team); }); test('exports people records', function () { Livewire::test(ListPeople::class) ->assertActionExists('export') ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export)->not->toBeNull() ->and($export->exporter)->toBe(PeopleExporter::class) ->and($export->file_disk)->toBe('local') ->and($export->team_id)->toBe($this->team->id); }); test('exports respect team scoping', function () { $otherTeam = Team::factory()->create(['personal_team' => false]); $this->user->teams()->attach($otherTeam); Livewire::test(ListPeople::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export->team_id)->toBe($this->team->id); }); test('export columns include system-seeded custom fields', function () { TenantContextService::setTenantId($this->team->id); $columns = PeopleExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); foreach (PeopleField::cases() as $field) { expect($columnLabels)->toContain($field->getDisplayName()); } }); test('export columns include user-created custom fields', function () { TenantContextService::setTenantId($this->team->id); CustomField::forceCreate([ 'name' => 'Lead Score', 'code' => 'lead_score', 'type' => 'number', 'entity_type' => 'people', 'tenant_id' => $this->team->id, 'sort_order' => 99, 'active' => true, 'system_defined' => false, 'settings' => new CustomFieldSettingsData, ]); $columns = PeopleExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); expect($columnLabels)->toContain('Lead Score'); }); test('export generates CSV with correct data', function () { Storage::fake('local'); People::factory()->create([ 'team_id' => $this->team->id, 'name' => 'Jane Doe', ]); Livewire::test(ListPeople::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); $directory = $export->getFileDirectory(); $headers = Storage::disk('local')->get("{$directory}/headers.csv"); $data = Storage::disk('local')->get("{$directory}/0000000000000001.csv"); expect($headers)->toContain('Name') ->and($headers)->toContain('Emails') ->and($data)->toContain('Jane Doe'); }); ================================================ FILE: tests/Feature/Filament/App/Exports/TaskExporterTest.php ================================================ except([ TeamCreated::class, 'eloquent.creating: App\\Models\\Team', ]); $this->team = Team::factory()->create(); $this->user = User::factory()->create(['current_team_id' => $this->team->id]); $this->user->teams()->attach($this->team); $this->actingAs($this->user); Filament::setTenant($this->team); }); test('exports task records', function () { Livewire::test(ManageTasks::class) ->assertActionExists('export') ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export)->not->toBeNull() ->and($export->exporter)->toBe(TaskExporter::class) ->and($export->file_disk)->toBe('local') ->and($export->team_id)->toBe($this->team->id); }); test('exports respect team scoping', function () { $otherTeam = Team::factory()->create(['personal_team' => false]); $this->user->teams()->attach($otherTeam); Livewire::test(ManageTasks::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); expect($export->team_id)->toBe($this->team->id); }); test('export columns include system-seeded custom fields', function () { TenantContextService::setTenantId($this->team->id); $columns = TaskExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); foreach (TaskField::cases() as $field) { expect($columnLabels)->toContain($field->getDisplayName()); } }); test('export columns include user-created custom fields', function () { TenantContextService::setTenantId($this->team->id); CustomField::forceCreate([ 'name' => 'Estimated Hours', 'code' => 'estimated_hours', 'type' => 'number', 'entity_type' => 'task', 'tenant_id' => $this->team->id, 'sort_order' => 99, 'active' => true, 'system_defined' => false, 'settings' => new CustomFieldSettingsData, ]); $columns = TaskExporter::getColumns(); $columnLabels = collect($columns)->map(fn ($column) => $column->getLabel())->all(); expect($columnLabels)->toContain('Estimated Hours'); }); test('export generates CSV with correct data', function () { Storage::fake('local'); Task::factory()->create([ 'team_id' => $this->team->id, 'title' => 'Fix login bug', ]); Livewire::test(ManageTasks::class) ->callAction('export') ->assertHasNoFormErrors(); $export = Export::latest()->first(); $directory = $export->getFileDirectory(); $headers = Storage::disk('local')->get("{$directory}/headers.csv"); $data = Storage::disk('local')->get("{$directory}/0000000000000001.csv"); expect($headers)->toContain('Title') ->and($headers)->toContain('Status') ->and($data)->toContain('Fix login bug'); }); ================================================ FILE: tests/Feature/Filament/App/Pages/OpportunitiesBoardTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->stageField = CustomField::query() ->forEntity(Opportunity::class) ->where('code', OpportunityField::STAGE) ->first(); }); function getOpportunityBoard(): Board { $component = livewire(OpportunitiesBoard::class); return $component->instance()->getBoard(); } it('can render the board page', function (): void { livewire(OpportunitiesBoard::class) ->assertOk(); }); it('displays opportunities in the correct board columns', function (): void { $prospecting = $this->stageField->options->firstWhere('name', 'Prospecting'); $closedWon = $this->stageField->options->firstWhere('name', 'Closed Won'); $prospectingOpportunity = Opportunity::factory()->for($this->team)->create(); $prospectingOpportunity->saveCustomFieldValue($this->stageField, $prospecting->getKey()); $closedWonOpportunity = Opportunity::factory()->for($this->team)->create(); $closedWonOpportunity->saveCustomFieldValue($this->stageField, $closedWon->getKey()); $board = getOpportunityBoard(); expect($board->getBoardRecords((string) $prospecting->getKey())->pluck('id')) ->toContain($prospectingOpportunity->id) ->and($board->getBoardRecords((string) $closedWon->getKey())->pluck('id')) ->toContain($closedWonOpportunity->id); }); it('does not show opportunities from other teams', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherOpportunity = Opportunity::factory()->for($otherUser->currentTeam)->create(); $board = getOpportunityBoard(); $allRecordIds = collect($this->stageField->options) ->flatMap(fn ($opt) => $board->getBoardRecords((string) $opt->getKey())) ->pluck('id'); expect($allRecordIds)->not->toContain($otherOpportunity->id); }); it('moves a card between columns via moveCard', function (): void { $prospecting = $this->stageField->options->firstWhere('name', 'Prospecting'); $qualification = $this->stageField->options->firstWhere('name', 'Qualification'); $opportunity = Opportunity::factory()->for($this->team)->create(); $opportunity->saveCustomFieldValue($this->stageField, $prospecting->getKey()); livewire(OpportunitiesBoard::class) ->call('moveCard', (string) $opportunity->id, (string) $qualification->getKey()) ->assertDispatched('kanban-card-moved'); $updatedValue = $opportunity->fresh()->customFieldValues() ->where('custom_field_id', $this->stageField->getKey()) ->value($this->stageField->getValueColumn()); expect($updatedValue)->toBe($qualification->getKey()); }); ================================================ FILE: tests/Feature/Filament/App/Pages/TasksBoardTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->statusField = CustomField::query() ->forEntity(Task::class) ->where('code', TaskField::STATUS) ->first(); }); function getTaskBoard(): Board { $component = livewire(TasksBoard::class); return $component->instance()->getBoard(); } it('can render the board page', function (): void { livewire(TasksBoard::class) ->assertOk(); }); it('displays tasks in the correct board columns', function (): void { $todo = $this->statusField->options->firstWhere('name', 'To do'); $done = $this->statusField->options->firstWhere('name', 'Done'); $todoTask = Task::factory()->for($this->team)->create(); $todoTask->saveCustomFieldValue($this->statusField, $todo->getKey()); $doneTask = Task::factory()->for($this->team)->create(); $doneTask->saveCustomFieldValue($this->statusField, $done->getKey()); $board = getTaskBoard(); expect($board->getBoardRecords((string) $todo->getKey())->pluck('id')) ->toContain($todoTask->id) ->and($board->getBoardRecords((string) $done->getKey())->pluck('id')) ->toContain($doneTask->id); }); it('does not show tasks from other teams', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTask = Task::factory()->for($otherUser->currentTeam)->create(); $board = getTaskBoard(); $allRecordIds = collect($this->statusField->options) ->flatMap(fn ($opt) => $board->getBoardRecords((string) $opt->getKey())) ->pluck('id'); expect($allRecordIds)->not->toContain($otherTask->id); }); it('moves a card between columns via moveCard', function (): void { $todo = $this->statusField->options->firstWhere('name', 'To do'); $inProgress = $this->statusField->options->firstWhere('name', 'In progress'); $task = Task::factory()->for($this->team)->create(); $task->saveCustomFieldValue($this->statusField, $todo->getKey()); livewire(TasksBoard::class) ->call('moveCard', (string) $task->id, (string) $inProgress->getKey()) ->assertDispatched('kanban-card-moved'); $updatedValue = $task->fresh()->customFieldValues() ->where('custom_field_id', $this->statusField->getKey()) ->value($this->statusField->getValueColumn()); expect($updatedValue)->toBe($inProgress->getKey()); }); ================================================ FILE: tests/Feature/Filament/App/Resources/CompanyResourceTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); it('can render the index page', function (): void { livewire(ListCompanies::class) ->assertOk(); }); it('can render the view page', function (): void { $record = Company::factory()->for($this->team)->create(); livewire(ViewCompany::class, ['record' => $record->getKey()]) ->assertOk(); }); it('can render `:dataset` column', function (string $column): void { livewire(ListCompanies::class) ->assertCanRenderTableColumn($column); })->with(['name', 'accountOwner.name', 'creator.name', 'created_at', 'updated_at']); it('cannot render `:dataset` column', function (string $column): void { livewire(ListCompanies::class) ->assertCanNotRenderTableColumn($column); })->with(['deleted_at']); it('has `:dataset` column', function (string $column): void { livewire(ListCompanies::class) ->assertTableColumnExists($column); })->with(['name', 'accountOwner.name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('shows `:dataset` column', function (string $column): void { livewire(ListCompanies::class) ->assertTableColumnVisible($column); })->with(['name', 'accountOwner.name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('can sort `:dataset` column', function (string $column): void { $records = Company::factory(3)->for($this->team)->create(); $sortingKey = data_get($records->first(), $column) instanceof BackedEnum ? fn (Model $record) => data_get($record, $column)->value : $column; livewire(ListCompanies::class) ->sortTable($column) ->assertCanSeeTableRecords($records->sortBy($sortingKey), inOrder: true) ->sortTable($column, 'desc') ->assertCanSeeTableRecords($records->sortByDesc($sortingKey), inOrder: true); })->with(['name', 'accountOwner.name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('can search `:dataset` column', function (string $column): void { $records = Company::factory(3)->for($this->team)->create(); $search = data_get($records->first(), $column); $visibleRecords = $records->filter(fn (Model $record) => data_get($record, $column) === $search); livewire(ListCompanies::class) ->searchTable($search instanceof BackedEnum ? $search->value : $search) ->assertCanSeeTableRecords($visibleRecords) ->assertCountTableRecords($visibleRecords->count()); })->with(['name', 'accountOwner.name', 'creator.name']); it('cannot display trashed records by default', function (): void { $records = Company::factory()->count(4)->for($this->team)->create(); $trashedRecords = Company::factory()->trashed()->count(6)->for($this->team)->create(); livewire(ListCompanies::class) ->assertCanSeeTableRecords($records) ->assertCanNotSeeTableRecords($trashedRecords) ->assertCountTableRecords(4); }); it('can paginate records', function (): void { $records = Company::factory(20)->for($this->team)->create(); // Fetch records with the same sort order as the table (created_at DESC) $sortedRecords = Company::query() ->whereIn('id', $records->pluck('id')) ->orderBy('created_at', 'desc') ->get(); livewire(ListCompanies::class) ->assertCanSeeTableRecords($sortedRecords->take(10), inOrder: true) ->call('gotoPage', 2) ->assertCanSeeTableRecords($sortedRecords->skip(10)->take(10), inOrder: true); }); it('can bulk delete records', function (): void { $records = Company::factory(5)->for($this->team)->create(); livewire(ListCompanies::class) ->assertCanSeeTableRecords($records) ->selectTableRecords($records) // NOTE: Using direct action array instead of TestAction::make()->bulk() // because TestAction triggers unnecessary form building during bulk actions ->callAction([['name' => 'delete', 'context' => ['table' => true, 'bulk' => true]]]) ->assertNotified() ->assertCanNotSeeTableRecords($records); $this->assertSoftDeleted($records); }); it('can create a company', function (): void { livewire(ListCompanies::class) ->callAction('create', data: [ 'name' => 'Acme Corp', ]) ->assertHasNoActionErrors(); $this->assertDatabaseHas(Company::class, [ 'name' => 'Acme Corp', 'team_id' => $this->team->id, ]); }); it('can edit a company', function (): void { $record = Company::factory()->for($this->team)->create(); livewire(ListCompanies::class) ->callAction(TestAction::make('edit')->table($record), data: [ 'name' => 'Updated Company', ]) ->assertHasNoActionErrors(); expect($record->refresh()->name)->toBe('Updated Company'); }); it('can delete a company', function (): void { $record = Company::factory()->for($this->team)->create(); livewire(ListCompanies::class) ->callAction(TestAction::make('delete')->table($record)); $this->assertSoftDeleted($record); }); it('validates name is required on create', function (): void { livewire(ListCompanies::class) ->callAction('create', data: [ 'name' => null, ]) ->assertHasActionErrors(['name' => 'required']); }); it('has `:dataset` filter', function (string $filter): void { livewire(ListCompanies::class) ->assertTableFilterExists($filter); })->with(['creation_source', 'trashed']); it('sets creator_id and team_id via observer when creating a company', function (): void { livewire(ListCompanies::class) ->callAction('create', data: [ 'name' => 'Observer Test Corp', ]) ->assertHasNoActionErrors(); $company = Company::query()->where('name', 'Observer Test Corp')->first(); expect($company->creator_id)->toBe($this->user->id) ->and($company->team_id)->toBe($this->team->id); }); it('authorizes team member to view and update own team company', function (): void { $record = Company::factory()->for($this->team)->create(); expect($this->user->can('view', $record))->toBeTrue() ->and($this->user->can('update', $record))->toBeTrue() ->and($this->user->can('delete', $record))->toBeTrue(); }); it('denies non-team-member from viewing another team company', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $this->actingAs($otherUser); $record = Company::factory()->for($otherTeam)->create(); $this->actingAs($this->user); expect($this->user->can('view', $record))->toBeFalse() ->and($this->user->can('update', $record))->toBeFalse() ->and($this->user->can('delete', $record))->toBeFalse(); }); ================================================ FILE: tests/Feature/Filament/App/Resources/NoteResourceTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); it('can render the index page', function (): void { livewire(ManageNotes::class) ->assertOk(); }); it('can render `:dataset` column', function (string $column): void { livewire(ManageNotes::class) ->assertCanRenderTableColumn($column); })->with(['title', 'companies.name', 'people.name', 'creator.name', 'created_at']); it('cannot render `:dataset` column', function (string $column): void { livewire(ManageNotes::class) ->assertCanNotRenderTableColumn($column); })->with(['deleted_at', 'updated_at']); it('has `:dataset` column', function (string $column): void { livewire(ManageNotes::class) ->assertTableColumnExists($column); })->with(['title', 'companies.name', 'people.name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('shows `:dataset` column', function (string $column): void { livewire(ManageNotes::class) ->assertTableColumnVisible($column); })->with(['title', 'companies.name', 'people.name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('can sort `:dataset` column', function (string $column): void { $records = Note::factory(3)->for($this->team)->create(); $sortingKey = data_get($records->first(), $column) instanceof BackedEnum ? fn (Model $record) => data_get($record, $column)->value : $column; livewire(ManageNotes::class) ->sortTable($column) ->assertCanSeeTableRecords($records->sortBy($sortingKey), inOrder: true) ->sortTable($column, 'desc') ->assertCanSeeTableRecords($records->sortByDesc($sortingKey), inOrder: true); })->with(['creator.name', 'deleted_at', 'created_at', 'updated_at']); it('can search `:dataset` column', function (string $column): void { $records = Note::factory(3)->for($this->team)->create(); $search = data_get($records->first(), $column); livewire(ManageNotes::class) ->searchTable($search instanceof BackedEnum ? $search->value : $search) ->assertCanSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) === $search)) ->assertCanNotSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) !== $search)); })->with(['title', 'creator.name']); it('cannot display trashed records by default', function (): void { $records = Note::factory()->count(4)->for($this->team)->create(); $trashedRecords = Note::factory()->trashed()->count(6)->for($this->team)->create(); livewire(ManageNotes::class) ->assertCanSeeTableRecords($records) ->assertCanNotSeeTableRecords($trashedRecords) ->assertCountTableRecords(4); }); it('can paginate records', function (): void { $records = Note::factory(20)->for($this->team)->create(); livewire(ManageNotes::class) ->assertCanSeeTableRecords($records->take(10), inOrder: true) ->call('gotoPage', 2) ->assertCanSeeTableRecords($records->skip(10)->take(10), inOrder: true); }); it('can bulk delete records', function (): void { $records = Note::factory(5)->for($this->team)->create(); livewire(ManageNotes::class) ->assertCanSeeTableRecords($records) ->selectTableRecords($records) // NOTE: Using direct action array instead of TestAction::make()->bulk() // because TestAction triggers unnecessary form building during bulk actions ->callAction([['name' => 'delete', 'context' => ['table' => true, 'bulk' => true]]]) ->assertNotified() ->assertCanNotSeeTableRecords($records); $this->assertSoftDeleted($records); }); it('can create a note', function (): void { livewire(ManageNotes::class) ->callAction('create', data: [ 'title' => 'New Note', ]) ->assertHasNoActionErrors(); $this->assertDatabaseHas(Note::class, [ 'title' => 'New Note', 'team_id' => $this->team->id, ]); }); it('can edit a note', function (): void { $record = Note::factory()->for($this->team)->create(); livewire(ManageNotes::class) ->callAction(TestAction::make('edit')->table($record), data: [ 'title' => 'Updated Note', ]) ->assertHasNoActionErrors(); expect($record->refresh()->title)->toBe('Updated Note'); }); it('can delete a note', function (): void { $record = Note::factory()->for($this->team)->create(); livewire(ManageNotes::class) ->callAction(TestAction::make('delete')->table($record)); $this->assertSoftDeleted($record); }); it('validates title is required on create', function (): void { livewire(ManageNotes::class) ->callAction('create', data: [ 'title' => null, ]) ->assertHasActionErrors(['title' => 'required']); }); it('has `:dataset` filter', function (string $filter): void { livewire(ManageNotes::class) ->assertTableFilterExists($filter); })->with(['creation_source', 'trashed']); it('sets creator_id and team_id via observer when creating a note', function (): void { livewire(ManageNotes::class) ->callAction('create', data: [ 'title' => 'Observer Test Note', ]) ->assertHasNoActionErrors(); $note = Note::query()->where('title', 'Observer Test Note')->first(); expect($note->creator_id)->toBe($this->user->id) ->and($note->team_id)->toBe($this->team->id); }); it('authorizes team member to view and update own team note', function (): void { $record = Note::factory()->for($this->team)->create(); expect($this->user->can('view', $record))->toBeTrue() ->and($this->user->can('update', $record))->toBeTrue() ->and($this->user->can('delete', $record))->toBeTrue(); }); it('denies non-team-member from viewing another team note', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $this->actingAs($otherUser); $record = Note::factory()->for($otherTeam)->create(); $this->actingAs($this->user); expect($this->user->can('view', $record))->toBeFalse() ->and($this->user->can('update', $record))->toBeFalse() ->and($this->user->can('delete', $record))->toBeFalse(); }); ================================================ FILE: tests/Feature/Filament/App/Resources/OpportunityResourceTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); it('can render the index page', function (): void { livewire(ListOpportunities::class) ->assertOk(); }); it('can render the view page', function (): void { $record = Opportunity::factory()->for($this->team)->create(); livewire(ViewOpportunity::class, ['record' => $record->getKey()]) ->assertOk(); }); it('can render `:dataset` column', function (string $column): void { livewire(ListOpportunities::class) ->assertCanRenderTableColumn($column); })->with(['name', 'creator.name']); it('cannot render `:dataset` column', function (string $column): void { livewire(ListOpportunities::class) ->assertCanNotRenderTableColumn($column); })->with(['deleted_at', 'created_at', 'updated_at']); it('has `:dataset` column', function (string $column): void { livewire(ListOpportunities::class) ->assertTableColumnExists($column); })->with(['name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('shows `:dataset` column', function (string $column): void { livewire(ListOpportunities::class) ->assertTableColumnVisible($column); })->with(['name', 'creator.name', 'deleted_at', 'created_at', 'updated_at']); it('can sort `:dataset` column', function (string $column): void { $records = Opportunity::factory(3)->for($this->team)->create(); $sortingKey = data_get($records->first(), $column) instanceof BackedEnum ? fn (Model $record) => data_get($record, $column)->value : $column; livewire(ListOpportunities::class) ->sortTable($column) ->assertCanSeeTableRecords($records->sortBy($sortingKey), inOrder: true) ->sortTable($column, 'desc') ->assertCanSeeTableRecords($records->sortByDesc($sortingKey), inOrder: true); })->with(['creator.name', 'deleted_at', 'created_at', 'updated_at']); it('can search `:dataset` column', function (string $column): void { $records = Opportunity::factory(3)->for($this->team)->create(); $search = data_get($records->first(), $column); livewire(ListOpportunities::class) ->searchTable($search instanceof BackedEnum ? $search->value : $search) ->assertCanSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) === $search)) ->assertCanNotSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) !== $search)); })->with(['name', 'creator.name']); it('cannot display trashed records by default', function (): void { $records = Opportunity::factory()->count(4)->for($this->team)->create(); $trashedRecords = Opportunity::factory()->trashed()->count(6)->for($this->team)->create(); livewire(ListOpportunities::class) ->assertCanSeeTableRecords($records) ->assertCanNotSeeTableRecords($trashedRecords) ->assertCountTableRecords(4); }); it('can paginate records', function (): void { $records = Opportunity::factory(20)->for($this->team)->create(); livewire(ListOpportunities::class) ->assertCanSeeTableRecords($records->take(10), inOrder: true) ->call('gotoPage', 2) ->assertCanSeeTableRecords($records->skip(10)->take(10), inOrder: true); }); it('can bulk delete records', function (): void { $records = Opportunity::factory(5)->for($this->team)->create(); livewire(ListOpportunities::class) ->assertCanSeeTableRecords($records) ->selectTableRecords($records) // NOTE: Using direct action array instead of TestAction::make()->bulk() // because TestAction triggers unnecessary form building during bulk actions ->callAction([['name' => 'delete', 'context' => ['table' => true, 'bulk' => true]]]) ->assertNotified() ->assertCanNotSeeTableRecords($records); $this->assertSoftDeleted($records); }); it('can create an opportunity', function (): void { livewire(ListOpportunities::class) ->callAction('create', data: [ 'name' => 'Big Deal', ]) ->assertHasNoActionErrors(); $this->assertDatabaseHas(Opportunity::class, [ 'name' => 'Big Deal', 'team_id' => $this->team->id, ]); }); it('can edit an opportunity', function (): void { $record = Opportunity::factory()->for($this->team)->create(); livewire(ListOpportunities::class) ->callAction(TestAction::make('edit')->table($record), data: [ 'name' => 'Updated Opportunity', ]) ->assertHasNoActionErrors(); expect($record->refresh()->name)->toBe('Updated Opportunity'); }); it('can delete an opportunity', function (): void { $record = Opportunity::factory()->for($this->team)->create(); livewire(ListOpportunities::class) ->callAction(TestAction::make('delete')->table($record)); $this->assertSoftDeleted($record); }); it('validates name is required on create', function (): void { livewire(ListOpportunities::class) ->callAction('create', data: [ 'name' => null, ]) ->assertHasActionErrors(['name' => 'required']); }); it('has `:dataset` filter', function (string $filter): void { livewire(ListOpportunities::class) ->assertTableFilterExists($filter); })->with(['creation_source', 'trashed']); it('sets creator_id and team_id via observer when creating an opportunity', function (): void { livewire(ListOpportunities::class) ->callAction('create', data: [ 'name' => 'Observer Test Deal', ]) ->assertHasNoActionErrors(); $opportunity = Opportunity::query()->where('name', 'Observer Test Deal')->first(); expect($opportunity->creator_id)->toBe($this->user->id) ->and($opportunity->team_id)->toBe($this->team->id); }); it('authorizes team member to view and update own team opportunity', function (): void { $record = Opportunity::factory()->for($this->team)->create(); expect($this->user->can('view', $record))->toBeTrue() ->and($this->user->can('update', $record))->toBeTrue() ->and($this->user->can('delete', $record))->toBeTrue(); }); it('denies non-team-member from viewing another team opportunity', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $this->actingAs($otherUser); $record = Opportunity::factory()->for($otherTeam)->create(); $this->actingAs($this->user); expect($this->user->can('view', $record))->toBeFalse() ->and($this->user->can('update', $record))->toBeFalse() ->and($this->user->can('delete', $record))->toBeFalse(); }); ================================================ FILE: tests/Feature/Filament/App/Resources/PeopleResourceTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); it('can render the index page', function (): void { livewire(ListPeople::class) ->assertOk(); }); it('can render the view page', function (): void { $record = People::factory()->for($this->team)->create(); livewire(ViewPeople::class, ['record' => $record->getKey()]) ->assertOk(); }); it('can render `:dataset` column', function (string $column): void { livewire(ListPeople::class) ->assertCanRenderTableColumn($column); })->with(['name', 'company.name', 'creator.name']); it('cannot render `:dataset` column', function (string $column): void { livewire(ListPeople::class) ->assertCanNotRenderTableColumn($column); })->with(['created_at', 'updated_at', 'deleted_at']); it('has `:dataset` column', function (string $column): void { livewire(ListPeople::class) ->assertTableColumnExists($column); })->with(['name', 'company.name', 'creator.name', 'created_at', 'updated_at', 'deleted_at']); it('shows `:dataset` column', function (string $column): void { livewire(ListPeople::class) ->assertTableColumnVisible($column); })->with(['name', 'company.name', 'creator.name', 'created_at', 'updated_at', 'deleted_at']); it('can sort `:dataset` column', function (string $column): void { $records = People::factory(3)->for($this->team)->create(); $sortingKey = data_get($records->first(), $column) instanceof BackedEnum ? fn (Model $record) => data_get($record, $column)->value : $column; livewire(ListPeople::class) ->sortTable($column) ->assertCanSeeTableRecords($records->sortBy($sortingKey), inOrder: true) ->sortTable($column, 'desc') ->assertCanSeeTableRecords($records->sortByDesc($sortingKey), inOrder: true); })->with(['company.name', 'creator.name', 'created_at', 'updated_at', 'deleted_at']); it('can search `:dataset` column', function (string $column): void { $records = People::factory(3)->for($this->team)->create(); $search = data_get($records->first(), $column); livewire(ListPeople::class) ->searchTable($search instanceof BackedEnum ? $search->value : $search) ->assertCanSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) === $search)) ->assertCanNotSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) !== $search)); })->with(['name', 'company.name', 'creator.name']); it('cannot display trashed records by default', function (): void { $records = People::factory()->count(4)->for($this->team)->create(); $trashedRecords = People::factory()->trashed()->count(6)->for($this->team)->create(); livewire(ListPeople::class) ->assertCanSeeTableRecords($records) ->assertCanNotSeeTableRecords($trashedRecords) ->assertCountTableRecords(4); }); it('can paginate records', function (): void { $records = People::factory(20)->for($this->team)->create(); livewire(ListPeople::class) ->assertCanSeeTableRecords($records->take(10), inOrder: true) ->call('gotoPage', 2) ->assertCanSeeTableRecords($records->skip(10)->take(10), inOrder: true); }); it('can bulk delete records', function (): void { $records = People::factory(5)->for($this->team)->create(); livewire(ListPeople::class) ->assertCanSeeTableRecords($records) ->selectTableRecords($records) // NOTE: Using direct action array instead of TestAction::make()->bulk() // because TestAction triggers unnecessary form building during bulk actions ->callAction([['name' => 'delete', 'context' => ['table' => true, 'bulk' => true]]]) ->assertNotified() ->assertCanNotSeeTableRecords($records); $this->assertSoftDeleted($records); }); it('can create a person', function (): void { livewire(ListPeople::class) ->callAction('create', data: [ 'name' => 'Jane Doe', ]) ->assertHasNoActionErrors(); $this->assertDatabaseHas(People::class, [ 'name' => 'Jane Doe', 'team_id' => $this->team->id, ]); }); it('can edit a person', function (): void { $record = People::factory()->for($this->team)->create(); livewire(ListPeople::class) ->callAction(TestAction::make('edit')->table($record), data: [ 'name' => 'Updated Person', ]) ->assertHasNoActionErrors(); expect($record->refresh()->name)->toBe('Updated Person'); }); it('can delete a person', function (): void { $record = People::factory()->for($this->team)->create(); livewire(ListPeople::class) ->callAction(TestAction::make('delete')->table($record)); $this->assertSoftDeleted($record); }); it('validates name is required on create', function (): void { livewire(ListPeople::class) ->callAction('create', data: [ 'name' => null, ]) ->assertHasActionErrors(['name' => 'required']); }); it('has `:dataset` filter', function (string $filter): void { livewire(ListPeople::class) ->assertTableFilterExists($filter); })->with(['creation_source', 'trashed']); it('sets creator_id and team_id via observer when creating a person', function (): void { livewire(ListPeople::class) ->callAction('create', data: [ 'name' => 'Observer Test Person', ]) ->assertHasNoActionErrors(); $person = People::query()->where('name', 'Observer Test Person')->first(); expect($person->creator_id)->toBe($this->user->id) ->and($person->team_id)->toBe($this->team->id); }); it('authorizes team member to view and update own team person', function (): void { $record = People::factory()->for($this->team)->create(); expect($this->user->can('view', $record))->toBeTrue() ->and($this->user->can('update', $record))->toBeTrue() ->and($this->user->can('delete', $record))->toBeTrue(); }); it('denies non-team-member from viewing another team person', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $this->actingAs($otherUser); $record = People::factory()->for($otherTeam)->create(); $this->actingAs($this->user); expect($this->user->can('view', $record))->toBeFalse() ->and($this->user->can('update', $record))->toBeFalse() ->and($this->user->can('delete', $record))->toBeFalse(); }); ================================================ FILE: tests/Feature/Filament/App/Resources/TaskResourceTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); it('can render the index page', function (): void { livewire(ManageTasks::class) ->assertOk(); }); it('can render `:dataset` column', function (string $column): void { livewire(ManageTasks::class) ->assertCanRenderTableColumn($column); })->with(['title', 'creator.name']); it('cannot render `:dataset` column', function (string $column): void { livewire(ManageTasks::class) ->assertCanNotRenderTableColumn($column); })->with(['assignees.name', 'created_at', 'updated_at', 'deleted_at']); it('has `:dataset` column', function (string $column): void { livewire(ManageTasks::class) ->assertTableColumnExists($column); })->with(['title', 'assignees.name', 'creator.name', 'created_at', 'updated_at', 'deleted_at']); it('shows `:dataset` column', function (string $column): void { livewire(ManageTasks::class) ->assertTableColumnVisible($column); })->with(['title', 'assignees.name', 'creator.name', 'created_at', 'updated_at', 'deleted_at']); it('can sort `:dataset` column', function (string $column): void { $records = Task::factory(3)->for($this->team)->create(); $sortingKey = data_get($records->first(), $column) instanceof BackedEnum ? fn (Model $record) => data_get($record, $column)->value : $column; livewire(ManageTasks::class) ->sortTable($column) ->assertCanSeeTableRecords($records->sortBy($sortingKey), inOrder: true) ->sortTable($column, 'desc') ->assertCanSeeTableRecords($records->sortByDesc($sortingKey), inOrder: true); })->with(['creator.name', 'created_at', 'updated_at', 'deleted_at']); it('can search `:dataset` column', function (string $column): void { $records = Task::factory(3)->for($this->team)->create(); $search = data_get($records->first(), $column); livewire(ManageTasks::class) ->searchTable($search instanceof BackedEnum ? $search->value : $search) ->assertCanSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) === $search)) ->assertCanNotSeeTableRecords($records->filter(fn (Model $record) => data_get($record, $column) !== $search)); })->with(['title', 'assignees.name', 'creator.name']); it('cannot display trashed records by default', function (): void { $records = Task::factory()->count(4)->for($this->team)->create(); $trashedRecords = Task::factory()->trashed()->count(6)->for($this->team)->create(); livewire(ManageTasks::class) ->assertCanSeeTableRecords($records) ->assertCanNotSeeTableRecords($trashedRecords) ->assertCountTableRecords(4); }); it('can paginate records', function (): void { $records = Task::factory(20)->for($this->team)->create(); livewire(ManageTasks::class) ->assertCanSeeTableRecords($records->take(10), inOrder: true) ->call('gotoPage', 2) ->assertCanSeeTableRecords($records->skip(10)->take(10), inOrder: true); }); it('can bulk delete records', function (): void { $records = Task::factory(5)->for($this->team)->create(); livewire(ManageTasks::class) ->assertCanSeeTableRecords($records) ->selectTableRecords($records) // NOTE: Using direct action array instead of TestAction::make()->bulk() // because TestAction triggers unnecessary form building during bulk actions ->callAction([['name' => 'delete', 'context' => ['table' => true, 'bulk' => true]]]) ->assertNotified() ->assertCanNotSeeTableRecords($records); $this->assertSoftDeleted($records); }); it('can create a task', function (): void { livewire(ManageTasks::class) ->callAction('create', data: [ 'title' => 'New Task', ]) ->assertHasNoActionErrors(); $this->assertDatabaseHas(Task::class, [ 'title' => 'New Task', 'team_id' => $this->team->id, ]); }); it('can edit a task', function (): void { $record = Task::factory()->for($this->team)->create(); livewire(ManageTasks::class) ->callAction(TestAction::make('edit')->table($record), data: [ 'title' => 'Updated Task', ]) ->assertHasNoActionErrors(); expect($record->refresh()->title)->toBe('Updated Task'); }); it('can delete a task', function (): void { $record = Task::factory()->for($this->team)->create(); livewire(ManageTasks::class) ->callAction(TestAction::make('delete')->table($record)); $this->assertSoftDeleted($record); }); it('validates title is required on create', function (): void { livewire(ManageTasks::class) ->callAction('create', data: [ 'title' => null, ]) ->assertHasActionErrors(['title' => 'required']); }); it('has `:dataset` filter', function (string $filter): void { livewire(ManageTasks::class) ->assertTableFilterExists($filter); })->with(['assigned_to_me', 'assignees', 'creation_source', 'trashed']); it('sets creator_id and team_id via observer when creating a task', function (): void { livewire(ManageTasks::class) ->callAction('create', data: [ 'title' => 'Observer Test Task', ]) ->assertHasNoActionErrors(); $task = Task::query()->where('title', 'Observer Test Task')->first(); expect($task->creator_id)->toBe($this->user->id) ->and($task->team_id)->toBe($this->team->id); }); it('authorizes team member to view and update own team task', function (): void { $record = Task::factory()->for($this->team)->create(); expect($this->user->can('view', $record))->toBeTrue() ->and($this->user->can('update', $record))->toBeTrue() ->and($this->user->can('delete', $record))->toBeTrue(); }); it('denies non-team-member from viewing another team task', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $this->actingAs($otherUser); $record = Task::factory()->for($otherTeam)->create(); $this->actingAs($this->user); expect($this->user->can('view', $record))->toBeFalse() ->and($this->user->can('update', $record))->toBeFalse() ->and($this->user->can('delete', $record))->toBeFalse(); }); ================================================ FILE: tests/Feature/HealthChecks/HealthServiceProviderTest.php ================================================ set('app.health_checks_enabled', false); $provider = new HealthServiceProvider(app()); $provider->boot(); expect(Health::registeredChecks())->toBeEmpty(); }); it('registers health checks when enabled', function () { Health::clearChecks(); config()->set('app.health_checks_enabled', true); $provider = new HealthServiceProvider(app()); $provider->boot(); $checkClasses = collect(Health::registeredChecks()) ->map(fn ($check) => $check::class); expect($checkClasses) ->toContain(DatabaseCheck::class) ->toContain(RedisCheck::class) ->toContain(HorizonCheck::class); }); ================================================ FILE: tests/Feature/ImportWizard/Commands/CleanupImportsCommandTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->team = $this->user->currentTeam; $this->imports = []; File::cleanDirectory(storage_path('app/imports')); }); afterEach(function (): void { foreach ($this->imports as $import) { ImportStore::load($import->id)?->destroy(); $import->delete(); } }); function createTestImport(object $context, ImportStatus $status, string $updatedAt): Import { $import = Import::create([ 'team_id' => (string) $context->team->id, 'user_id' => (string) $context->user->id, 'entity_type' => ImportEntityType::People, 'file_name' => 'test.csv', 'status' => $status, 'total_rows' => 0, 'headers' => [], ]); $import->updated_at = $updatedAt; $import->saveQuietly(); $store = ImportStore::create($import->id); $context->imports[] = $import; return $import; } it('deletes completed import files older than completed-hours threshold', function (): void { $import = createTestImport($this, ImportStatus::Completed, now()->subHours(3)->toIso8601String()); $storePath = storage_path("app/imports/{$import->id}"); expect(File::isDirectory($storePath))->toBeTrue(); $this->artisan('import:cleanup') ->expectsOutputToContain('Cleaned up 1 import(s)') ->assertExitCode(0); expect(File::isDirectory($storePath))->toBeFalse(); expect(Import::find($import->id))->not->toBeNull(); }); it('preserves recently completed import files', function (): void { $import = createTestImport($this, ImportStatus::Completed, now()->subMinutes(30)->toIso8601String()); $this->artisan('import:cleanup') ->expectsOutputToContain('Cleaned up 0 import(s)') ->assertExitCode(0); $storePath = storage_path("app/imports/{$import->id}"); expect(File::isDirectory($storePath))->toBeTrue(); expect(Import::find($import->id))->not->toBeNull(); }); it('deletes abandoned imports older than hours threshold', function (): void { $import = createTestImport($this, ImportStatus::Mapping, now()->subHours(25)->toIso8601String()); $storePath = storage_path("app/imports/{$import->id}"); $this->artisan('import:cleanup') ->expectsOutputToContain('Cleaned up 1 import(s)') ->assertExitCode(0); expect(File::isDirectory($storePath))->toBeFalse(); expect(Import::find($import->id))->toBeNull(); }); it('preserves active in-progress imports', function (): void { $import = createTestImport($this, ImportStatus::Mapping, now()->subHours(2)->toIso8601String()); $this->artisan('import:cleanup') ->expectsOutputToContain('Cleaned up 0 import(s)') ->assertExitCode(0); $storePath = storage_path("app/imports/{$import->id}"); expect(File::isDirectory($storePath))->toBeTrue(); expect(Import::find($import->id))->not->toBeNull(); }); it('deletes orphaned directories without DB records', function (): void { $path = storage_path('app/imports/orphaned-dir'); File::ensureDirectoryExists($path); $this->artisan('import:cleanup') ->expectsOutputToContain('Cleaned up 1 import(s)') ->assertExitCode(0); expect(File::isDirectory($path))->toBeFalse(); }); it('respects custom hours option', function (): void { $import = createTestImport($this, ImportStatus::Reviewing, now()->subHours(5)->toIso8601String()); $this->artisan('import:cleanup --hours=48') ->expectsOutputToContain('Cleaned up 0 import(s)') ->assertExitCode(0); $storePath = storage_path("app/imports/{$import->id}"); expect(File::isDirectory($storePath))->toBeTrue(); expect(Import::find($import->id))->not->toBeNull(); }); ================================================ FILE: tests/Feature/ImportWizard/Components/MultiValueInputTest.php ================================================ '', 'placeholder' => 'Add value...', 'disabled' => false, 'inputType' => 'text', 'borderless' => false, 'errors' => [], 'eventName' => 'input', ], $overrides))->render(); } // ─── Value Parsing ─────────────────────────────────────────────────────────── it('parses comma-separated values into Alpine array', function (): void { $html = renderMultiValueInput([ 'value' => 'alice@test.com, bob@test.com', ]); expect($html) ->toContain('alice@test.com') ->toContain('bob@test.com'); }); it('renders single value without comma', function (): void { $html = renderMultiValueInput([ 'value' => 'only@one.com', ]); expect($html)->toContain('only@one.com'); }); it('filters out empty and whitespace-only values', function (): void { $html = renderMultiValueInput([ 'value' => 'real@test.com, , , , valid@test.com', ]); expect($html) ->toContain('real@test.com') ->toContain('valid@test.com'); }); it('handles null value gracefully', function (): void { $html = renderMultiValueInput([ 'value' => null, ]); expect($html)->toContain('data-multi-value-input'); }); it('renders empty state with placeholder', function (): void { $html = renderMultiValueInput([ 'placeholder' => 'Add email...', ]); expect($html)->toContain('Add email...'); }); // ─── Input Types & Link Prefixes ───────────────────────────────────────────── it('sets mailto link prefix for email input type', function (): void { $html = renderMultiValueInput(['inputType' => 'email']); expect($html) ->toContain("linkPrefix: 'mailto:'") ->toContain('inputmode="email"'); }); it('sets tel link prefix for phone input type', function (): void { $html = renderMultiValueInput(['inputType' => 'tel']); expect($html) ->toContain("linkPrefix: 'tel:'") ->toContain('inputmode="tel"'); }); it('sets empty link prefix for url input type', function (): void { $html = renderMultiValueInput(['inputType' => 'url']); expect($html) ->toContain("linkPrefix: ''") ->toContain('inputmode="url"'); }); it('sets null link prefix for text input type', function (): void { $html = renderMultiValueInput(['inputType' => 'text']); expect($html) ->toContain('linkPrefix: null') ->toContain('inputmode="text"'); }); // ─── Component States ──────────────────────────────────────────────────────── it('renders disabled state', function (): void { $html = renderMultiValueInput(['disabled' => true]); expect($html)->toContain('isDisabled: true'); }); it('renders enabled state by default', function (): void { $html = renderMultiValueInput(['disabled' => false]); expect($html)->toContain('isDisabled: false'); }); it('renders bordered style by default', function (): void { $html = renderMultiValueInput(['borderless' => false]); expect($html)->toContain('border border-gray-200'); }); it('renders borderless style when specified', function (): void { $html = renderMultiValueInput(['borderless' => true]); expect($html)->toContain('border-0 bg-transparent'); }); it('uses custom event name for change emission', function (): void { $html = renderMultiValueInput(['eventName' => 'multi-value-change']); expect($html)->toContain("eventName: 'multi-value-change'"); }); // ─── Error Rendering ───────────────────────────────────────────────────────── it('initializes errors from props', function (): void { $html = renderMultiValueInput([ 'value' => 'good@test.com, bad-value', 'errors' => ['bad-value' => 'Invalid format'], ]); expect($html) ->toContain('good@test.com') ->toContain('bad-value') ->toContain('Invalid format'); }); it('initializes multiple errors from props', function (): void { $html = renderMultiValueInput([ 'value' => 'ok@test.com, bad1, bad2', 'errors' => [ 'bad1' => 'Error one', 'bad2' => 'Error two', ], ]); expect($html) ->toContain('Error one') ->toContain('Error two'); }); it('initializes empty errors as empty array', function (): void { $html = renderMultiValueInput(['errors' => []]); expect($html)->toContain('errors: []'); }); // ─── x-teleport & Root Element Resolution ──────────────────────────────────── it('locates root element via $refs.trigger.closest() getter', function (): void { $html = renderMultiValueInput(); expect($html) ->toContain("this.\$refs.trigger?.closest('[data-multi-value-input]')"); }); it('dispatches events on rootEl instead of $dispatch or _rootEl', function (): void { $html = renderMultiValueInput(); expect($html) ->toContain('this.rootEl?.dispatchEvent') ->not->toContain('this.$dispatch(') ->not->toContain('this._rootEl'); }); it('teleports panel to body', function (): void { $html = renderMultiValueInput(); expect($html)->toContain('x-teleport="body"'); }); it('listens for update-errors CustomEvent on root element', function (): void { $html = renderMultiValueInput(); expect($html)->toContain('x-on:update-errors="errors = $event.detail.errors || {}"'); }); // ─── DOM Ordering & Sortable ───────────────────────────────────────────────── it('uses composite keys for x-for to prevent order mismatch with sortable', function (): void { $html = renderMultiValueInput([ 'value' => 'a, b, c', ]); expect($html)->toContain('`${value}-${index}`'); }); it('includes sortable directives on values list', function (): void { $html = renderMultiValueInput(); expect($html) ->toContain('x-sortable') ->toContain('x-sortable-handle') ->toContain('reorderValues($event)'); }); // ─── Livewire Decoupling ───────────────────────────────────────────────────── it('has no Livewire event coupling', function (): void { $html = renderMultiValueInput(); expect($html) ->not->toContain('Livewire.on') ->not->toContain('$wire') ->not->toContain('validation-updated') ->not->toContain('uniqueId'); }); // ─── Accessibility ─────────────────────────────────────────────────────────── it('has proper accessibility attributes', function (): void { $html = renderMultiValueInput(); expect($html) ->toContain('aria-haspopup="dialog"') ->toContain('role="dialog"') ->toContain('aria-label="Manage values"') ->toContain('aria-label="Add new value"') ->toContain('aria-label="Add value"'); }); // ─── Panel Structure ───────────────────────────────────────────────────────── it('renders add input with correct placeholder', function (): void { $html = renderMultiValueInput(['placeholder' => 'Add tag...']); expect($html)->toContain('placeholder="Add tag..."'); }); it('renders delete buttons bound to deleteValue', function (): void { $html = renderMultiValueInput(); expect($html)->toContain('deleteValue(value)'); }); it('renders add button bound to addValue', function (): void { $html = renderMultiValueInput(); expect($html) ->toContain('addValue()') ->toContain('Add') ->toContain('aria-label="Add value"'); }); // ─── Lifecycle ─────────────────────────────────────────────────────────────── it('registers document click listener on init', function (): void { $html = renderMultiValueInput(); expect($html)->toContain("document.addEventListener('click', this.documentClickListener)"); }); it('removes document click listener on destroy', function (): void { $html = renderMultiValueInput(); expect($html)->toContain("document.removeEventListener('click', this.documentClickListener)"); }); ================================================ FILE: tests/Feature/ImportWizard/Components/SelectMenuInvalidOptionsTest.php ================================================ [ ['value' => 'invalid_status', 'label' => 'invalid_status', 'invalid' => true], ['value' => 'active', 'label' => 'Active'], ['value' => 'inactive', 'label' => 'Inactive'], ], 'value' => 'invalid_status', 'multiple' => false, ])->render(); expect($html) ->toContain('invalid_status') ->toContain('Active'); }); it('renders invalid options with badge styling', function (): void { $html = View::make('import-wizard-new::components.select-menu', [ 'options' => [ ['value' => 'bad', 'label' => 'bad', 'invalid' => true], ['value' => 'a', 'label' => 'Option A'], ['value' => 'b', 'label' => 'Option B'], ], 'value' => 'bad', 'multiple' => false, ])->render(); expect($html) ->toContain('bad') ->toContain('Option A'); }); it('handles multiple values with some invalid in multi-select mode', function (): void { $html = View::make('import-wizard-new::components.select-menu', [ 'options' => [ ['value' => 'purple', 'label' => 'purple', 'invalid' => true], ['value' => 'orange', 'label' => 'orange', 'invalid' => true], ['value' => 'red', 'label' => 'Red'], ['value' => 'blue', 'label' => 'Blue'], ], 'value' => ['purple', 'orange', 'red'], 'multiple' => true, ])->render(); expect($html) ->toContain('purple') ->toContain('orange') ->toContain('Red'); }); it('works with only valid options', function (): void { $html = View::make('import-wizard-new::components.select-menu', [ 'options' => [ ['value' => 'yes', 'label' => 'Yes'], ['value' => 'no', 'label' => 'No'], ], 'value' => 'yes', 'multiple' => false, ])->render(); expect($html) ->toContain('Yes') ->toContain('No'); }); ================================================ FILE: tests/Feature/ImportWizard/Jobs/ExecuteImportJobTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); afterEach(function (): void { if (isset($this->import)) { ImportStore::load($this->import->id)?->destroy(); $this->import->delete(); } }); function createImportReadyStore( object $context, array $headers, array $rows, array $mappings, ImportEntityType $entityType = ImportEntityType::People, ): array { $import = Import::create([ 'team_id' => (string) $context->team->id, 'user_id' => (string) $context->user->id, 'entity_type' => $entityType, 'file_name' => 'test.csv', 'status' => ImportStatus::Importing, 'total_rows' => count($rows), 'headers' => $headers, 'column_mappings' => collect($mappings)->map(fn (ColumnData $m) => $m->toArray())->all(), ]); $store = ImportStore::create($import->id); $store->query()->insert($rows); $context->import = $import; $context->store = $store; return [$import, $store]; } function runImportJob(object $context): void { $job = new ExecuteImportJob( importId: $context->import->id, teamId: (string) $context->team->id, ); $job->handle(); } if (! function_exists('makeRow')) { /** @param array $overrides */ function makeRow(int $rowNumber, array $rawData, array $overrides = []): array { return array_merge([ 'row_number' => $rowNumber, 'raw_data' => json_encode($rawData), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ], $overrides); } } it('creates new People records for rows with match_action=Create', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John Doe'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Jane Smith'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $initialCount = People::where('team_id', $this->team->id)->count(); runImportJob($this); $newPeople = People::where('team_id', $this->team->id)->get(); expect($newPeople)->toHaveCount($initialCount + 2) ->and($newPeople->pluck('name')->toArray())->toContain('John Doe', 'Jane Smith'); $john = People::where('team_id', $this->team->id)->where('name', 'John Doe')->first(); expect($john->creation_source)->toBe(CreationSource::IMPORT) ->and((string) $john->team_id)->toBe((string) $this->team->id); }); it('creates new Company records for rows with match_action=Create', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Acme Corp'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ], ImportEntityType::Company); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'Acme Corp')->first(); expect($company)->not->toBeNull() ->and($company->creation_source)->toBe(CreationSource::IMPORT); }); it('sets custom field values on created records', function (): void { createImportReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'john@test.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull(); $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); if ($emailField) { $cfValue = CustomFieldValue::query() ->where('custom_field_id', $emailField->id) ->where('entity_id', $person->id) ->first(); expect($cfValue)->not->toBeNull(); } }); it('resolves multiple custom field values via batch JSON query', function (): void { $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); if ($emailField === null) { $this->markTestSkipped('No emails custom field configured'); } $existingPeople = []; $emails = ['alice@test.com', 'bob@test.com', 'carol@test.com', 'dave@test.com', 'eve@test.com']; foreach ($emails as $email) { $person = People::factory()->create([ 'name' => "Person {$email}", 'team_id' => $this->team->id, ]); CustomFieldValue::create([ 'custom_field_id' => $emailField->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'json_value' => [$email], ]); $existingPeople[$email] = $person; } $rows = []; foreach ($emails as $i => $email) { $rows[] = makeRow($i + 2, ['Name' => "Updated {$email}", 'Email' => $email], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $existingPeople[$email]->id, ]); } createImportReadyStore($this, ['Name', 'Email'], $rows, [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); expect($import->updated_rows)->toBe(5) ->and($import->failed_rows)->toBe(0); foreach ($emails as $email) { $person = $existingPeople[$email]->refresh(); expect($person->name)->toBe("Updated {$email}"); } }); it('updates existing People records for rows with match_action=Update', function (): void { $person = People::factory()->create([ 'name' => 'Old Name', 'team_id' => $this->team->id, ]); createImportReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'New Name'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $person->refresh(); expect($person->name)->toBe('New Name'); }); it('preserves existing data when updating with partial fields', function (): void { $person = People::factory()->create([ 'name' => 'Original Name', 'team_id' => $this->team->id, 'creator_id' => $this->user->id, ]); createImportReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'Updated Name'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $person->refresh(); expect($person->name)->toBe('Updated Name') ->and((string) $person->creator_id)->toBe((string) $this->user->id) ->and((string) $person->team_id)->toBe((string) $this->team->id); }); it('skips rows with match_action=Skip', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Ghost'], ['match_action' => RowMatchAction::Skip->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $initialCount = People::where('team_id', $this->team->id)->count(); runImportJob($this); expect(People::where('team_id', $this->team->id)->count())->toBe($initialCount); }); it('creates company relationship on People record via entity link', function (): void { $company = Company::factory()->create([ 'name' => 'Acme Corp', 'team_id' => $this->team->id, ]); $relationships = json_encode([ ['relationship' => 'company', 'action' => 'update', 'id' => (string) $company->id, 'name' => null], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'Acme Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull() ->and((string) $person->company_id)->toBe((string) $company->id); }); it('uses corrected values over raw values', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Jhon'], [ 'corrections' => json_encode(['Name' => 'John']), 'match_action' => RowMatchAction::Create->value, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull(); expect(People::where('team_id', $this->team->id)->where('name', 'Jhon')->exists())->toBeFalse(); }); it('skips individual values marked as skipped', function (): void { createImportReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'bad-email'], [ 'skipped' => json_encode(['Email' => true]), 'match_action' => RowMatchAction::Create->value, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull(); }); it('sets store status to Completed on success', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); }); it('skips rows with null match_action without crashing', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Good Person'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Null Action'], ['match_action' => null]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); expect($import->created_rows)->toBe(1) ->and($import->skipped_rows)->toBe(1) ->and($import->failed_rows)->toBe(0); }); it('stores results with counts in meta', function (): void { $person = People::factory()->create([ 'name' => 'Existing', 'team_id' => $this->team->id, ]); createImportReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => '', 'Name' => 'New Person'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['ID' => (string) $person->id, 'Name' => 'Updated'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), makeRow(4, ['ID' => '99999', 'Name' => 'Ghost'], ['match_action' => RowMatchAction::Skip->value]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1) ->and($import->updated_rows)->toBe(1) ->and($import->skipped_rows)->toBe(1); }); it('sets store status to Failed on exception', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ], ImportEntityType::People); DB::table('imports')->where('id', $this->import->id)->update(['entity_type' => 'nonexistent']); try { runImportJob($this); } catch (Throwable) { } $import = $this->import->fresh(); if ($import !== null) { expect($import->status->value)->toBeIn([ImportStatus::Failed->value, ImportStatus::Importing->value]); } }); it('handles empty import where all rows are skipped', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Ghost'], ['match_action' => RowMatchAction::Skip->value]), makeRow(3, ['Name' => 'Phantom'], ['match_action' => RowMatchAction::Skip->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); expect($import->created_rows)->toBe(0) ->and($import->updated_rows)->toBe(0) ->and($import->skipped_rows)->toBe(2); }); it('processes rows in chunks without issues', function (): void { $rows = []; for ($i = 2; $i <= 51; $i++) { $rows[] = makeRow($i, ['Name' => "Person {$i}"], ['match_action' => RowMatchAction::Create->value]); } createImportReadyStore($this, ['Name'], $rows, [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); expect($import->created_rows)->toBe(50); }); it('auto-creates company when entity link value is unresolved', function (): void { $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => 'New Corp', 'behavior' => MatchBehavior::Create->value], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'New Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull(); $newCompany = Company::where('team_id', $this->team->id)->where('name', 'New Corp')->first(); expect($newCompany)->not->toBeNull() ->and((string) $person->company_id)->toBe((string) $newCompany->id); }); it('deduplicates auto-created companies across multiple rows', function (): void { $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => 'Same Corp', 'behavior' => MatchBehavior::Create->value], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'Alice', 'Company' => 'Same Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), makeRow(3, ['Name' => 'Bob', 'Company' => 'Same Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), makeRow(4, ['Name' => 'Carol', 'Company' => 'Same Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); runImportJob($this); $companies = Company::where('team_id', $this->team->id)->where('name', 'Same Corp')->get(); expect($companies)->toHaveCount(1); $people = People::where('team_id', $this->team->id)->whereIn('name', ['Alice', 'Bob', 'Carol'])->get(); expect($people)->toHaveCount(3); $people->each(function ($person) use ($companies): void { expect((string) $person->company_id)->toBe((string) $companies->first()->id); }); }); it('skips auto-creation for entity links with only MatchOnly matchers', function (): void { $relationships = json_encode([ ['relationship' => 'opportunities', 'action' => 'create', 'id' => null, 'name' => 'Big Deal', 'behavior' => MatchBehavior::MatchOnly->value], ]); createImportReadyStore($this, ['Title', 'Opportunity'], [ makeRow(2, ['Title' => 'Follow up', 'Opportunity' => 'Big Deal'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toEntityLink(source: 'Opportunity', matcherKey: 'id', entityLinkKey: 'opportunities'), ], ImportEntityType::Task); $initialOpportunityCount = Opportunity::where('team_id', $this->team->id)->count(); runImportJob($this); expect(Opportunity::where('team_id', $this->team->id)->count())->toBe($initialOpportunityCount); }); it('calls store() for MorphToMany entity links after record save', function (): void { $company = Company::factory()->create([ 'name' => 'Linked Corp', 'team_id' => $this->team->id, ]); $relationships = json_encode([ ['relationship' => 'companies', 'action' => 'update', 'id' => (string) $company->id, 'name' => null], ]); createImportReadyStore($this, ['Title', 'Company'], [ makeRow(2, ['Title' => 'Follow up', 'Company' => 'Linked Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'companies'), ], ImportEntityType::Task); runImportJob($this); $task = Task::where('team_id', $this->team->id)->where('title', 'Follow up')->first(); expect($task)->not->toBeNull(); $linkedCompanies = $task->companies()->pluck('companies.id')->map(fn ($id) => (string) $id)->all(); expect($linkedCompanies)->toContain((string) $company->id); }); it('auto-created records have correct team and creation source', function (): void { $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => 'Auto Corp', 'behavior' => MatchBehavior::Create->value], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'Jane', 'Company' => 'Auto Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); runImportJob($this); $autoCreatedCompany = Company::where('team_id', $this->team->id)->where('name', 'Auto Corp')->first(); expect($autoCreatedCompany)->not->toBeNull() ->and($autoCreatedCompany->creation_source)->toBe(CreationSource::IMPORT) ->and((string) $autoCreatedCompany->team_id)->toBe((string) $this->team->id) ->and((string) $autoCreatedCompany->creator_id)->toBe((string) $this->user->id); }); it('skips Update row when matched record no longer exists', function (): void { createImportReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => '99999', 'Name' => 'Ghost'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => '99999', ]), makeRow(3, ['ID' => '', 'Name' => 'New Person'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->skipped_rows)->toBe(1) ->and($import->created_rows)->toBe(1); }); it('processes row with multiple entity links', function (): void { $company = Company::factory()->create(['name' => 'Multi Corp', 'team_id' => $this->team->id]); $person = People::factory()->create(['name' => 'Contact Person', 'team_id' => $this->team->id]); $relationships = json_encode([ ['relationship' => 'companies', 'action' => 'update', 'id' => (string) $company->id, 'name' => null], ['relationship' => 'people', 'action' => 'update', 'id' => (string) $person->id, 'name' => null], ]); createImportReadyStore($this, ['Title', 'Company', 'Contact'], [ makeRow(2, ['Title' => 'Multi-link task', 'Company' => 'Multi Corp', 'Contact' => 'Contact Person'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'companies'), ColumnData::toEntityLink(source: 'Contact', matcherKey: 'name', entityLinkKey: 'people'), ], ImportEntityType::Task); runImportJob($this); $task = Task::where('team_id', $this->team->id)->where('title', 'Multi-link task')->first(); expect($task)->not->toBeNull(); expect($task->companies()->pluck('companies.id')->map(fn ($id) => (string) $id)->all()) ->toContain((string) $company->id); expect($task->people()->pluck('people.id')->map(fn ($id) => (string) $id)->all()) ->toContain((string) $person->id); }); it('handles nonexistent import gracefully', function (): void { $job = new ExecuteImportJob('nonexistent-id', (string) $this->team->id); try { $job->handle(); expect(false)->toBeTrue('Expected exception was not thrown'); } catch (ModelNotFoundException $e) { expect($e->getModel())->toBe(Import::class); } }); it('filters out unexpected attributes from CSV data before saving', function (): void { createImportReadyStore($this, ['Name', 'Malicious'], [ makeRow(2, ['Name' => 'Safe Person', 'Malicious' => 'hacked'], [ 'match_action' => RowMatchAction::Create->value, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Malicious', target: 'is_admin'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'Safe Person')->first(); expect($person)->not->toBeNull(); $raw = DB::table('people')->where('id', $person->id)->first(); expect($raw)->not->toHaveProperty('is_admin', 'hacked'); }); it('persists failed row details in store metadata', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Good Person'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Good Person 2'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(2) ->and($import->failedRows)->toBeEmpty(); }); it('sends success notification to user on import completion', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John Doe'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Jane Smith'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $notifications = $this->user->notifications()->get(); expect($notifications)->toHaveCount(1); $notification = $notifications->first(); expect($notification->data['title'])->toBe('Import of People completed') ->and($notification->data['viewData']['results']['created'])->toBe(2) ->and($notification->data['viewData']['results']['failed'])->toBe(0); }); it('includes result counts in completion notification body', function (): void { $person = People::factory()->create([ 'name' => 'Existing', 'team_id' => $this->team->id, ]); createImportReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => '', 'Name' => 'New Person'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['ID' => (string) $person->id, 'Name' => 'Updated'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), makeRow(4, ['ID' => '', 'Name' => 'Ghost'], ['match_action' => RowMatchAction::Skip->value]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $notification = $this->user->notifications()->first(); expect($notification)->not->toBeNull() ->and($notification->data['viewData']['results']['created'])->toBe(1) ->and($notification->data['viewData']['results']['updated'])->toBe(1) ->and($notification->data['viewData']['results']['skipped'])->toBe(1) ->and($notification->data['viewData']['results']['failed'])->toBe(0); }); it('records failed rows with row number and error message', function (): void { createImportReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => '', 'Name' => 'Valid Person'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['ID' => '99999', 'Name' => 'Ghost Person'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => '99999', ]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1) ->and($import->skipped_rows)->toBe(1) ->and($import->failedRows)->toBeEmpty(); }); it('handles Japanese characters in name fields', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => '田中太郎'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => '佐藤花子'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); expect(People::where('team_id', $this->team->id)->where('name', '田中太郎')->exists())->toBeTrue() ->and(People::where('team_id', $this->team->id)->where('name', '佐藤花子')->exists())->toBeTrue(); }); it('handles Arabic characters in name fields', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'محمد أحمد'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'محمد أحمد')->first(); expect($person)->not->toBeNull() ->and($person->name)->toBe('محمد أحمد'); }); it('handles emoji characters in name fields', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'Test User 🚀'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'Test User 🚀')->first(); expect($person)->not->toBeNull() ->and($person->name)->toBe('Test User 🚀'); }); it('handles accented Latin characters in name fields', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'José García'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'François Müller'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); expect(People::where('team_id', $this->team->id)->where('name', 'José García')->exists())->toBeTrue() ->and(People::where('team_id', $this->team->id)->where('name', 'François Müller')->exists())->toBeTrue(); }); it('handles international data with entity link auto-creation', function (): void { $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => '株式会社テスト', 'behavior' => MatchBehavior::Create->value], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => '田中太郎', 'Company' => '株式会社テスト'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', '田中太郎')->first(); expect($person)->not->toBeNull(); $company = Company::where('team_id', $this->team->id)->where('name', '株式会社テスト')->first(); expect($company)->not->toBeNull() ->and((string) $person->company_id)->toBe((string) $company->id); }); it('persists results to Import model on completion', function (): void { $headers = ['Name', 'Email']; $rows = [ makeRow(2, ['Name' => 'John', 'Email' => 'john@test.com'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Jane', 'Email' => 'jane@test.com'], ['match_action' => RowMatchAction::Create->value]), ]; $mappings = [ ColumnData::toField('Name', 'name'), ColumnData::toField('Email', 'email'), ]; [$import, $store] = createImportReadyStore($this, $headers, $rows, $mappings); runImportJob($this); $import->refresh(); expect($import->status)->toBe(ImportStatus::Completed) ->and($import->completed_at)->not->toBeNull() ->and($import->created_rows)->toBe(2) ->and($import->updated_rows)->toBe(0) ->and($import->skipped_rows)->toBe(0) ->and($import->failed_rows)->toBe(0); }); it('processes 1000 row create import', function (): void { $rows = []; for ($i = 2; $i <= 1001; $i++) { $rows[] = makeRow($i, ['Name' => "Person {$i}"], ['match_action' => RowMatchAction::Create->value]); } createImportReadyStore($this, ['Name'], $rows, [ ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Completed); expect($import->created_rows)->toBe(1000) ->and($import->failed_rows)->toBe(0); })->group('slow'); it('processes 1000 row mixed operations import', function (): void { $existingPeople = People::factory()->count(100)->create([ 'team_id' => $this->team->id, ]); $rows = []; $rowNumber = 2; foreach ($existingPeople as $person) { $rows[] = makeRow($rowNumber++, ['ID' => (string) $person->id, 'Name' => "Updated {$person->name}"], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]); } for ($i = 0; $i < 50; $i++) { $rows[] = makeRow($rowNumber++, ['ID' => (string) (900000 + $i), 'Name' => "Ghost {$i}"], [ 'match_action' => RowMatchAction::Skip->value, ]); } for ($i = 0; $i < 850; $i++) { $rows[] = makeRow($rowNumber++, ['ID' => '', 'Name' => "New Person {$i}"], [ 'match_action' => RowMatchAction::Create->value, ]); } createImportReadyStore($this, ['ID', 'Name'], $rows, [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(850) ->and($import->updated_rows)->toBe(100) ->and($import->skipped_rows)->toBe(50) ->and($import->failed_rows)->toBe(0) ->and($import->status)->toBe(ImportStatus::Completed); })->group('slow'); it('marks import as Failed when job exhausts retries via failed() handler', function (): void { createImportReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $job = new ExecuteImportJob( importId: $this->import->id, teamId: (string) $this->team->id, ); $job->failed(new RuntimeException('Queue worker gave up')); $import = $this->import->fresh(); expect($import->status)->toBe(ImportStatus::Failed); }); it('processes 1000 rows with entity link relationships and deduplication', function (): void { $companyNames = []; for ($i = 0; $i < 20; $i++) { $companyNames[] = "Company {$i}"; } $rows = []; for ($i = 2; $i <= 1001; $i++) { $companyName = $companyNames[($i - 2) % count($companyNames)]; $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => $companyName, 'behavior' => MatchBehavior::Create->value], ]); $rows[] = makeRow($i, ['Name' => "Person {$i}", 'Company' => $companyName], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]); } createImportReadyStore($this, ['Name', 'Company'], $rows, [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1000) ->and($import->failed_rows)->toBe(0) ->and($import->status)->toBe(ImportStatus::Completed); $companies = Company::where('team_id', $this->team->id) ->whereIn('name', $companyNames) ->get(); expect($companies)->toHaveCount(20); })->group('slow'); // --- Custom Field Import Tests --- function createTestCustomField(object $context, string $code, string $type, string $entityType = 'people', array $options = []): CustomField { $cf = CustomField::forceCreate([ 'tenant_id' => $context->team->id, 'code' => $code, 'name' => ucfirst(str_replace('_', ' ', $code)), 'type' => $type, 'entity_type' => $entityType, 'sort_order' => 1, 'active' => true, 'system_defined' => false, 'validation_rules' => [], 'settings' => new CustomFieldSettingsData, ]); foreach ($options as $i => $optionName) { $cf->options()->forceCreate([ 'custom_field_id' => $cf->id, 'tenant_id' => $context->team->id, 'name' => $optionName, 'sort_order' => $i + 1, ]); } return $cf->fresh(); } function getTestCustomFieldValue(object $context, string $entityId, string $customFieldId): ?CustomFieldValue { return CustomFieldValue::query() ->withoutGlobalScopes() ->where('tenant_id', $context->team->id) ->where('entity_id', $entityId) ->where('custom_field_id', $customFieldId) ->first(); } it('imports text custom field value', function (): void { $cf = createTestCustomField($this, 'website_notes', 'text'); createImportReadyStore($this, ['Name', 'Notes'], [ makeRow(2, ['Name' => 'John', 'Notes' => 'Some important text'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Notes', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->text_value)->toBe('Some important text'); }); it('imports number custom field as integer', function (): void { $cf = createTestCustomField($this, 'employee_count', 'number'); createImportReadyStore($this, ['Name', 'Employees'], [ makeRow(2, ['Name' => 'Acme', 'Employees' => '42'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Employees', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'Acme')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->integer_value)->toBe(42); }); it('imports currency custom field with point decimal format', function (): void { $cf = createTestCustomField($this, 'revenue', 'currency'); createImportReadyStore($this, ['Name', 'Revenue'], [ makeRow(2, ['Name' => 'Acme', 'Revenue' => '1234.56'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Revenue', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'Acme')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->float_value)->toBe(1234.56); }); it('imports currency custom field with comma decimal format', function (): void { $cf = createTestCustomField($this, 'revenue_eu', 'currency'); createImportReadyStore($this, ['Name', 'Revenue'], [ makeRow(2, ['Name' => 'Acme', 'Revenue' => '1.234,56'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), (new ColumnData( source: 'Revenue', target: "custom_fields_{$cf->code}", numberFormat: NumberFormat::COMMA, )), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'Acme')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->float_value)->toBe(1234.56); }); it('imports date custom field with ISO format', function (): void { $cf = createTestCustomField($this, 'start_date', 'date'); createImportReadyStore($this, ['Name', 'Start'], [ makeRow(2, ['Name' => 'John', 'Start' => '2024-05-15'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Start', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->date_value->format('Y-m-d'))->toBe('2024-05-15'); }); it('imports date custom field with European format', function (): void { $cf = createTestCustomField($this, 'start_date_eu', 'date'); createImportReadyStore($this, ['Name', 'Start'], [ makeRow(2, ['Name' => 'John', 'Start' => '15/05/2024'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), (new ColumnData( source: 'Start', target: "custom_fields_{$cf->code}", dateFormat: DateFormat::EUROPEAN, )), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->date_value->format('Y-m-d'))->toBe('2024-05-15'); }); it('imports date custom field with American format', function (): void { $cf = createTestCustomField($this, 'start_date_us', 'date'); createImportReadyStore($this, ['Name', 'Start'], [ makeRow(2, ['Name' => 'John', 'Start' => '05/15/2024'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), (new ColumnData( source: 'Start', target: "custom_fields_{$cf->code}", dateFormat: DateFormat::AMERICAN, )), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->date_value->format('Y-m-d'))->toBe('2024-05-15'); }); it('imports datetime custom field with ISO format including time', function (): void { $cf = createTestCustomField($this, 'meeting_at', 'date-time'); createImportReadyStore($this, ['Name', 'Meeting'], [ makeRow(2, ['Name' => 'John', 'Meeting' => '2024-05-15 14:30:00'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Meeting', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->datetime_value->format('Y-m-d H:i:s'))->toBe('2024-05-15 14:30:00'); }); it('imports datetime custom field with European format including time', function (): void { $cf = createTestCustomField($this, 'meeting_at_eu', 'date-time'); createImportReadyStore($this, ['Name', 'Meeting'], [ makeRow(2, ['Name' => 'John', 'Meeting' => '15/05/2024 14:30'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), (new ColumnData( source: 'Meeting', target: "custom_fields_{$cf->code}", dateFormat: DateFormat::EUROPEAN, )), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->datetime_value->format('Y-m-d H:i'))->toBe('2024-05-15 14:30'); }); it('imports boolean custom field with truthy values', function (): void { $cf = createTestCustomField($this, 'is_vip', 'checkbox'); createImportReadyStore($this, ['Name', 'VIP'], [ makeRow(2, ['Name' => 'John', 'VIP' => '1'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'VIP', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->boolean_value)->toBeTrue(); }); it('imports select custom field with option name resolved to ID', function (): void { $cf = createTestCustomField($this, 'priority', 'select', 'people', ['Low', 'Medium', 'High']); $mediumOption = $cf->options->firstWhere('name', 'Medium'); createImportReadyStore($this, ['Name', 'Priority'], [ makeRow(2, ['Name' => 'John', 'Priority' => 'Medium'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Priority', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->string_value)->toBe((string) $mediumOption->id); }); it('imports multi-select custom field with option names resolved to IDs', function (): void { $cf = createTestCustomField($this, 'tags_field', 'multi-select', 'people', ['Urgent', 'Follow-up', 'VIP']); $urgentOption = $cf->options->firstWhere('name', 'Urgent'); $vipOption = $cf->options->firstWhere('name', 'VIP'); createImportReadyStore($this, ['Name', 'Tags'], [ makeRow(2, ['Name' => 'John', 'Tags' => 'Urgent, VIP'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Tags', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = $cfv->json_value; expect($jsonValue)->toContain((string) $urgentOption->id) ->toContain((string) $vipOption->id); }); it('imports tags-input custom field with comma-separated values', function (): void { $cf = createTestCustomField($this, 'labels', 'tags-input'); createImportReadyStore($this, ['Name', 'Labels'], [ makeRow(2, ['Name' => 'John', 'Labels' => 'tag1, tag2, tag3'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Labels', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = $cfv->json_value; expect($jsonValue)->toContain('tag1') ->toContain('tag2') ->toContain('tag3'); }); it('skips blank custom field values without creating custom_field_values row', function (): void { $cf = createTestCustomField($this, 'optional_notes', 'text'); createImportReadyStore($this, ['Name', 'Notes'], [ makeRow(2, ['Name' => 'John', 'Notes' => ''], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Notes', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); expect($person)->not->toBeNull(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->toBeNull(); }); it('updates existing custom field value on record update', function (): void { $cf = createTestCustomField($this, 'note_field', 'text'); $person = People::factory()->create([ 'name' => 'John', 'team_id' => $this->team->id, ]); CustomFieldValue::forceCreate([ 'custom_field_id' => $cf->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'text_value' => 'old value', ]); createImportReadyStore($this, ['ID', 'Name', 'Notes'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'John', 'Notes' => 'new value'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Notes', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->text_value)->toBe('new value'); }); it('imports email custom field with comma-separated addresses as array', function (): void { $cf = createTestCustomField($this, 'contact_emails', 'email'); createImportReadyStore($this, ['Name', 'Emails'], [ makeRow(2, ['Name' => 'John', 'Emails' => 'a@b.com, c@d.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Emails', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = collect($cfv->json_value)->all(); expect($jsonValue)->toBeArray() ->toContain('a@b.com') ->toContain('c@d.com'); }); it('imports select custom field with case-insensitive option name', function (): void { $cf = createTestCustomField($this, 'priority_ci', 'select', 'people', ['Low', 'Medium', 'High']); $mediumOption = $cf->options->firstWhere('name', 'Medium'); createImportReadyStore($this, ['Name', 'Priority'], [ makeRow(2, ['Name' => 'John', 'Priority' => 'medium'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Priority', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->string_value)->toBe((string) $mediumOption->id); }); it('imports select custom field with value already being an option ID', function (): void { $cf = createTestCustomField($this, 'priority_id', 'select', 'people', ['Low', 'Medium', 'High']); $mediumOption = $cf->options->firstWhere('name', 'Medium'); createImportReadyStore($this, ['Name', 'Priority'], [ makeRow(2, ['Name' => 'John', 'Priority' => (string) $mediumOption->id], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Priority', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->string_value)->toBe((string) $mediumOption->id); }); it('imports multi-select custom field with mixed option names resolved to IDs', function (): void { $cf = createTestCustomField($this, 'categories', 'multi-select', 'people', ['Alpha', 'Beta', 'Gamma']); $alphaOption = $cf->options->firstWhere('name', 'Alpha'); $gammaOption = $cf->options->firstWhere('name', 'Gamma'); createImportReadyStore($this, ['Name', 'Categories'], [ makeRow(2, ['Name' => 'John', 'Categories' => 'Alpha, Gamma'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Categories', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = collect($cfv->json_value)->all(); expect($jsonValue)->toBeArray() ->toContain((string) $alphaOption->id) ->toContain((string) $gammaOption->id) ->not->toContain('Alpha') ->not->toContain('Gamma'); }); // --- Missing Custom Field Type Tests --- it('imports phone custom field with comma-separated numbers as array', function (): void { $cf = createTestCustomField($this, 'phones', 'phone'); createImportReadyStore($this, ['Name', 'Phones'], [ makeRow(2, ['Name' => 'John', 'Phones' => '+1-555-0101, +44-20-7946-0958'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Phones', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = collect($cfv->json_value)->all(); expect($jsonValue)->toBeArray() ->toContain('+1-555-0101') ->toContain('+44-20-7946-0958'); }); it('imports link custom field with URL value', function (): void { $cf = createTestCustomField($this, 'website', 'link'); createImportReadyStore($this, ['Name', 'Website'], [ makeRow(2, ['Name' => 'John', 'Website' => 'https://example.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Website', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = collect($cfv->json_value)->all(); expect($jsonValue)->toContain('https://example.com'); }); it('imports toggle custom field with truthy values', function (): void { $cf = createTestCustomField($this, 'is_active', 'toggle'); createImportReadyStore($this, ['Name', 'Active'], [ makeRow(2, ['Name' => 'John', 'Active' => 'yes'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Active', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->boolean_value)->toBeTrue(); }); it('imports toggle custom field with falsy values', function (): void { $cf = createTestCustomField($this, 'opted_out', 'toggle'); createImportReadyStore($this, ['Name', 'OptedOut'], [ makeRow(2, ['Name' => 'John', 'OptedOut' => '0'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'OptedOut', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->boolean_value)->toBeFalse(); }); it('imports textarea custom field value', function (): void { $cf = createTestCustomField($this, 'bio', 'textarea'); createImportReadyStore($this, ['Name', 'Bio'], [ makeRow(2, ['Name' => 'John', 'Bio' => 'A long biography text that spans multiple lines conceptually.'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Bio', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->text_value)->toBe('A long biography text that spans multiple lines conceptually.'); }); it('imports rich-editor custom field value as text', function (): void { $cf = createTestCustomField($this, 'detailed_notes', 'rich-editor'); createImportReadyStore($this, ['Name', 'Notes'], [ makeRow(2, ['Name' => 'John', 'Notes' => '

Bold statement

'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Notes', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->text_value)->toBe('

Bold statement

'); }); it('imports markdown-editor custom field value as text', function (): void { $cf = createTestCustomField($this, 'readme', 'markdown-editor'); createImportReadyStore($this, ['Name', 'Readme'], [ makeRow(2, ['Name' => 'John', 'Readme' => '# Heading\n\nSome **bold** text'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Readme', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->text_value)->toBe('# Heading\n\nSome **bold** text'); }); it('imports checkbox-list custom field with option names resolved to IDs', function (): void { $cf = createTestCustomField($this, 'interests', 'checkbox-list', 'people', ['Sports', 'Music', 'Tech']); $sportsOption = $cf->options->firstWhere('name', 'Sports'); $techOption = $cf->options->firstWhere('name', 'Tech'); createImportReadyStore($this, ['Name', 'Interests'], [ makeRow(2, ['Name' => 'John', 'Interests' => 'Sports, Tech'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Interests', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull(); $jsonValue = collect($cfv->json_value)->all(); expect($jsonValue)->toBeArray() ->toContain((string) $sportsOption->id) ->toContain((string) $techOption->id); }); it('imports radio custom field with option name resolved to ID', function (): void { $cf = createTestCustomField($this, 'size', 'radio', 'people', ['Small', 'Medium', 'Large']); $mediumOption = $cf->options->firstWhere('name', 'Medium'); createImportReadyStore($this, ['Name', 'Size'], [ makeRow(2, ['Name' => 'John', 'Size' => 'Medium'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Size', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->string_value)->toBe((string) $mediumOption->id); }); it('imports toggle-buttons custom field with option name resolved to ID', function (): void { $cf = createTestCustomField($this, 'urgency', 'toggle-buttons', 'people', ['Low', 'Normal', 'Urgent']); $urgentOption = $cf->options->firstWhere('name', 'Urgent'); createImportReadyStore($this, ['Name', 'Urgency'], [ makeRow(2, ['Name' => 'John', 'Urgency' => 'Urgent'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Urgency', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->string_value)->toBe((string) $urgentOption->id); }); it('imports color-picker custom field value as text', function (): void { $cf = createTestCustomField($this, 'brand_color', 'color-picker'); createImportReadyStore($this, ['Name', 'Color'], [ makeRow(2, ['Name' => 'John', 'Color' => '#ff5733'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Color', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'John')->first(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and($cfv->text_value)->toBe('#ff5733'); }); // --- Entity-Specific Importer Tests --- it('imports company with account_owner resolved by email via entity link', function (): void { $owner = User::factory()->create(); $this->team->users()->attach($owner, ['role' => 'editor']); $relationships = json_encode([ ['relationship' => 'account_owner', 'action' => 'update', 'id' => (string) $owner->id, 'name' => null], ]); createImportReadyStore($this, ['Name', 'Owner Email'], [ makeRow(2, ['Name' => 'Test Corp', 'Owner Email' => $owner->email], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Owner Email', matcherKey: 'email', entityLinkKey: 'account_owner'), ], ImportEntityType::Company); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'Test Corp')->first(); expect($company)->not->toBeNull() ->and((string) $company->account_owner_id)->toBe((string) $owner->id); }); it('imports company with unmatched account_owner email skipping silently', function (): void { createImportReadyStore($this, ['Name', 'Owner Email'], [ makeRow(2, ['Name' => 'Test Corp', 'Owner Email' => 'nonexistent@example.com'], [ 'match_action' => RowMatchAction::Create->value, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Owner Email', matcherKey: 'email', entityLinkKey: 'account_owner'), ], ImportEntityType::Company); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'Test Corp')->first(); expect($company)->not->toBeNull() ->and($company->account_owner_id)->toBeNull(); }); it('imports company with account_owner resolved for team owner', function (): void { $relationships = json_encode([ ['relationship' => 'account_owner', 'action' => 'update', 'id' => (string) $this->user->id, 'name' => null], ]); createImportReadyStore($this, ['Name', 'Owner Email'], [ makeRow(2, ['Name' => 'Owner Corp', 'Owner Email' => $this->user->email], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Owner Email', matcherKey: 'email', entityLinkKey: 'account_owner'), ], ImportEntityType::Company); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'Owner Corp')->first(); expect($company)->not->toBeNull() ->and((string) $company->account_owner_id)->toBe((string) $this->user->id); }); it('imports task with assignee resolved by email via entity link', function (): void { $assignee = User::factory()->create(); $this->team->users()->attach($assignee, ['role' => 'editor']); $relationships = json_encode([ ['relationship' => 'assignees', 'action' => 'update', 'id' => (string) $assignee->id, 'name' => null], ]); createImportReadyStore($this, ['Title', 'Assignee Email'], [ makeRow(2, ['Title' => 'Test Task', 'Assignee Email' => $assignee->email], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toEntityLink(source: 'Assignee Email', matcherKey: 'email', entityLinkKey: 'assignees'), ], ImportEntityType::Task); runImportJob($this); $task = Task::where('team_id', $this->team->id)->where('title', 'Test Task')->first(); expect($task)->not->toBeNull(); $assigneeIds = $task->assignees()->pluck('users.id')->map(fn ($id) => (string) $id)->all(); expect($assigneeIds)->toContain((string) $assignee->id); }); it('imports task with unmatched assignee email skipping silently', function (): void { createImportReadyStore($this, ['Title', 'Assignee Email'], [ makeRow(2, ['Title' => 'Orphan Task', 'Assignee Email' => 'ghost@nowhere.com'], [ 'match_action' => RowMatchAction::Create->value, ]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toEntityLink(source: 'Assignee Email', matcherKey: 'email', entityLinkKey: 'assignees'), ], ImportEntityType::Task); runImportJob($this); $task = Task::where('team_id', $this->team->id)->where('title', 'Orphan Task')->first(); expect($task)->not->toBeNull() ->and($task->assignees()->count())->toBe(0); }); it('imports opportunity with company and contact entity links', function (): void { $company = Company::factory()->create(['name' => 'Deal Corp', 'team_id' => $this->team->id]); $contact = People::factory()->create(['name' => 'Deal Contact', 'team_id' => $this->team->id]); $relationships = json_encode([ ['relationship' => 'company', 'action' => 'update', 'id' => (string) $company->id, 'name' => null], ['relationship' => 'contact', 'action' => 'update', 'id' => (string) $contact->id, 'name' => null], ]); createImportReadyStore($this, ['Name', 'Company', 'Contact'], [ makeRow(2, ['Name' => 'Big Deal', 'Company' => 'Deal Corp', 'Contact' => 'Deal Contact'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ColumnData::toEntityLink(source: 'Contact', matcherKey: 'name', entityLinkKey: 'contact'), ], ImportEntityType::Opportunity); runImportJob($this); $opportunity = Opportunity::where('team_id', $this->team->id)->where('name', 'Big Deal')->first(); expect($opportunity)->not->toBeNull() ->and((string) $opportunity->company_id)->toBe((string) $company->id) ->and((string) $opportunity->contact_id)->toBe((string) $contact->id); }); it('imports note with polymorphic entity links to company and person', function (): void { $company = Company::factory()->create(['name' => 'Note Corp', 'team_id' => $this->team->id]); $person = People::factory()->create(['name' => 'Note Person', 'team_id' => $this->team->id]); $relationships = json_encode([ ['relationship' => 'companies', 'action' => 'update', 'id' => (string) $company->id, 'name' => null], ['relationship' => 'people', 'action' => 'update', 'id' => (string) $person->id, 'name' => null], ]); createImportReadyStore($this, ['Title', 'Company', 'Person'], [ makeRow(2, ['Title' => 'Meeting Notes', 'Company' => 'Note Corp', 'Person' => 'Note Person'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'companies'), ColumnData::toEntityLink(source: 'Person', matcherKey: 'name', entityLinkKey: 'people'), ], ImportEntityType::Note); runImportJob($this); $note = Note::where('team_id', $this->team->id)->where('title', 'Meeting Notes')->first(); expect($note)->not->toBeNull(); expect($note->companies()->pluck('companies.id')->map(fn ($id) => (string) $id)->all()) ->toContain((string) $company->id); expect($note->people()->pluck('people.id')->map(fn ($id) => (string) $id)->all()) ->toContain((string) $person->id); }); it('imports note with title field only', function (): void { createImportReadyStore($this, ['Title'], [ makeRow(2, ['Title' => 'Quick note'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ], ImportEntityType::Note); runImportJob($this); $note = Note::where('team_id', $this->team->id)->where('title', 'Quick note')->first(); expect($note)->not->toBeNull() ->and($note->creation_source)->toBe(CreationSource::IMPORT); }); it('imports task with custom field values for select fields', function (): void { $statusCf = createTestCustomField($this, 'task_status', 'select', 'task', ['To do', 'In progress', 'Done']); $priorityCf = createTestCustomField($this, 'task_priority', 'select', 'task', ['Low', 'Medium', 'High']); $inProgressOption = $statusCf->options->firstWhere('name', 'In progress'); $highOption = $priorityCf->options->firstWhere('name', 'High'); createImportReadyStore($this, ['Title', 'Status', 'Priority'], [ makeRow(2, ['Title' => 'Urgent Task', 'Status' => 'In progress', 'Priority' => 'High'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Title', target: 'title'), ColumnData::toField(source: 'Status', target: "custom_fields_{$statusCf->code}"), ColumnData::toField(source: 'Priority', target: "custom_fields_{$priorityCf->code}"), ], ImportEntityType::Task); runImportJob($this); $task = Task::where('team_id', $this->team->id)->where('title', 'Urgent Task')->first(); expect($task)->not->toBeNull(); $statusCfv = getTestCustomFieldValue($this, (string) $task->id, (string) $statusCf->id); expect($statusCfv)->not->toBeNull() ->and($statusCfv->string_value)->toBe((string) $inProgressOption->id); $priorityCfv = getTestCustomFieldValue($this, (string) $task->id, (string) $priorityCf->id); expect($priorityCfv)->not->toBeNull() ->and($priorityCfv->string_value)->toBe((string) $highOption->id); }); it('imports company with custom field values for toggle and link', function (): void { $icpCf = createTestCustomField($this, 'is_icp', 'toggle', 'company'); $linkedinCf = createTestCustomField($this, 'linkedin_url', 'link', 'company'); createImportReadyStore($this, ['Name', 'ICP', 'LinkedIn'], [ makeRow(2, ['Name' => 'Great Corp', 'ICP' => 'true', 'LinkedIn' => 'https://linkedin.com/company/great'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'ICP', target: "custom_fields_{$icpCf->code}"), ColumnData::toField(source: 'LinkedIn', target: "custom_fields_{$linkedinCf->code}"), ], ImportEntityType::Company); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'Great Corp')->first(); expect($company)->not->toBeNull(); $icpCfv = getTestCustomFieldValue($this, (string) $company->id, (string) $icpCf->id); expect($icpCfv)->not->toBeNull() ->and($icpCfv->boolean_value)->toBeTrue(); $linkedinCfv = getTestCustomFieldValue($this, (string) $company->id, (string) $linkedinCf->id); expect($linkedinCfv)->not->toBeNull() ->and(collect($linkedinCfv->json_value)->all())->toContain('https://linkedin.com/company/great'); }); // --- Intra-Import Dedup Tests --- it('deduplicates Create rows with same matchable email value', function (): void { createImportReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'Lay', 'Email' => 'same@acme.com'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Ray', 'Email' => 'same@acme.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1) ->and($import->updated_rows)->toBe(1) ->and($import->failed_rows)->toBe(0); $people = People::where('team_id', $this->team->id)->whereIn('name', ['Lay', 'Ray'])->get(); expect($people)->toHaveCount(1) ->and($people->first()->name)->toBe('Ray'); $row3 = $this->store->query()->where('row_number', 3)->first(); expect($row3->match_action)->toBe(RowMatchAction::Update); }); it('does not dedup Create rows with different matchable values', function (): void { createImportReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'Alice', 'Email' => 'alice@acme.com'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Bob', 'Email' => 'bob@acme.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(2) ->and($import->updated_rows)->toBe(0); $people = People::where('team_id', $this->team->id)->whereIn('name', ['Alice', 'Bob'])->get(); expect($people)->toHaveCount(2); }); it('deduplicates Create rows with multi-value matchable field', function (): void { createImportReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'First', 'Email' => 'shared@acme.com, extra@acme.com'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Second', 'Email' => 'shared@acme.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1) ->and($import->updated_rows)->toBe(1) ->and($import->failed_rows)->toBe(0); $people = People::where('team_id', $this->team->id)->whereIn('name', ['First', 'Second'])->get(); expect($people)->toHaveCount(1) ->and($people->first()->name)->toBe('Second'); }); it('deduplicates company Create rows by domain', function (): void { createImportReadyStore($this, ['Name', 'Domain'], [ makeRow(2, ['Name' => 'Acme Inc', 'Domain' => 'acme.com'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Acme Corp', 'Domain' => 'acme.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Domain', target: 'custom_fields_domains'), ], ImportEntityType::Company); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1) ->and($import->updated_rows)->toBe(1) ->and($import->failed_rows)->toBe(0); $companies = Company::where('team_id', $this->team->id)->whereIn('name', ['Acme Inc', 'Acme Corp'])->get(); expect($companies)->toHaveCount(1) ->and($companies->first()->name)->toBe('Acme Corp'); }); // --- Multi-Choice Merge Tests --- it('merges multi-choice custom field values during update', function (): void { $cf = createTestCustomField($this, 'merge_emails', 'email'); $person = People::factory()->create([ 'name' => 'Merge Test', 'team_id' => $this->team->id, ]); CustomFieldValue::create([ 'custom_field_id' => $cf->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'json_value' => ['old@work.com'], ]); createImportReadyStore($this, ['ID', 'Name', 'Email'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'Merge Test', 'Email' => 'new@work.com'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->updated_rows)->toBe(1) ->and($import->failed_rows)->toBe(0); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and(collect($cfv->json_value)->all())->toBe(['old@work.com', 'new@work.com']); }); it('merges multi-choice custom field values during dedup', function (): void { $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); if ($emailField === null) { $this->markTestSkipped('No emails custom field configured'); } createImportReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'Dedup A', 'Email' => 'a@test.com'], ['match_action' => RowMatchAction::Create->value]), makeRow(3, ['Name' => 'Dedup B', 'Email' => 'a@test.com'], ['match_action' => RowMatchAction::Create->value]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->created_rows)->toBe(1) ->and($import->updated_rows)->toBe(1); $person = People::where('team_id', $this->team->id)->where('name', 'Dedup B')->first(); expect($person)->not->toBeNull(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $emailField->id); expect($cfv)->not->toBeNull() ->and(collect($cfv->json_value)->all())->toBe(['a@test.com']); }); it('does not duplicate existing multi-choice values during merge', function (): void { $cf = createTestCustomField($this, 'dedup_emails', 'email'); $person = People::factory()->create([ 'name' => 'Dedup Merge', 'team_id' => $this->team->id, ]); CustomFieldValue::create([ 'custom_field_id' => $cf->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'json_value' => ['shared@work.com'], ]); createImportReadyStore($this, ['ID', 'Name', 'Email'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'Dedup Merge', 'Email' => 'shared@work.com, new@work.com'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => (string) $person->id, ]), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: "custom_fields_{$cf->code}"), ]); runImportJob($this); $import = $this->import->fresh(); expect($import->updated_rows)->toBe(1) ->and($import->failed_rows)->toBe(0); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $cf->id); expect($cfv)->not->toBeNull() ->and(collect($cfv->json_value)->all())->toBe(['shared@work.com', 'new@work.com']); }); it('populates matching custom field when auto-creating person via email MatchOrCreate', function (): void { $relationships = json_encode([ ['relationship' => 'contact', 'action' => 'create', 'id' => null, 'name' => 'john@example.com', 'behavior' => MatchBehavior::MatchOrCreate->value, 'matchField' => 'custom_fields_emails'], ]); createImportReadyStore($this, ['Name', 'Contact'], [ makeRow(2, ['Name' => 'Test Opportunity', 'Contact' => 'john@example.com'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Contact', matcherKey: 'custom_fields_emails', entityLinkKey: 'contact'), ], ImportEntityType::Opportunity); runImportJob($this); $person = People::where('team_id', $this->team->id)->where('name', 'john@example.com')->first(); expect($person)->not->toBeNull(); $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); expect($emailField)->not->toBeNull(); $cfv = getTestCustomFieldValue($this, (string) $person->id, (string) $emailField->id); expect($cfv)->not->toBeNull() ->and($cfv->json_value)->toBeInstanceOf(Collection::class) ->and($cfv->json_value->all())->toBe(['john@example.com']); }); it('populates matching custom field when auto-creating company via domain MatchOrCreate', function (): void { $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => 'example.com', 'behavior' => MatchBehavior::MatchOrCreate->value, 'matchField' => 'custom_fields_domains'], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John Doe', 'Company' => 'example.com'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'custom_fields_domains', entityLinkKey: 'company'), ]); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'example.com')->first(); expect($company)->not->toBeNull(); $domainField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'company') ->where('code', 'domains') ->first(); expect($domainField)->not->toBeNull(); $cfv = getTestCustomFieldValue($this, (string) $company->id, (string) $domainField->id); expect($cfv)->not->toBeNull() ->and($cfv->json_value)->toBeInstanceOf(Collection::class) ->and($cfv->json_value->all())->toBe(['example.com']); }); it('does not populate custom field when auto-creating via name matcher', function (): void { $relationships = json_encode([ ['relationship' => 'company', 'action' => 'create', 'id' => null, 'name' => 'New Corp', 'behavior' => MatchBehavior::Create->value, 'matchField' => 'name'], ]); createImportReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John Doe', 'Company' => 'New Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); $cfCountBefore = DB::table(config('custom-fields.database.table_names.custom_field_values'))->count(); runImportJob($this); $company = Company::where('team_id', $this->team->id)->where('name', 'New Corp')->first(); expect($company)->not->toBeNull(); $cfCountAfter = DB::table(config('custom-fields.database.table_names.custom_field_values'))->count(); expect($cfCountAfter)->toBe($cfCountBefore); }); it('deduplicates auto-created records while still populating matching custom field', function (): void { $relationships = json_encode([ ['relationship' => 'contact', 'action' => 'create', 'id' => null, 'name' => 'jane@example.com', 'behavior' => MatchBehavior::MatchOrCreate->value, 'matchField' => 'custom_fields_emails'], ]); createImportReadyStore($this, ['Name', 'Contact'], [ makeRow(2, ['Name' => 'Opp One', 'Contact' => 'jane@example.com'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), makeRow(3, ['Name' => 'Opp Two', 'Contact' => 'jane@example.com'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Contact', matcherKey: 'custom_fields_emails', entityLinkKey: 'contact'), ], ImportEntityType::Opportunity); runImportJob($this); $people = People::where('team_id', $this->team->id)->where('name', 'jane@example.com')->get(); expect($people)->toHaveCount(1); $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); $cfv = getTestCustomFieldValue($this, (string) $people->first()->id, (string) $emailField->id); expect($cfv)->not->toBeNull() ->and($cfv->json_value->all())->toBe(['jane@example.com']); }); it('does not auto-create record for custom field entity link', function (): void { $recordCf = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('type', 'record') ->first(); if ($recordCf === null) { $this->markTestSkipped('No record-type custom field configured for people'); } $companyCountBefore = Company::where('team_id', $this->team->id)->count(); $relationships = json_encode([ ['relationship' => "cf_{$recordCf->code}", 'action' => 'create', 'id' => null, 'name' => 'Nonexistent Corp', 'behavior' => MatchBehavior::MatchOrCreate->value], ]); createImportReadyStore($this, ['Name', 'Related Company'], [ makeRow(2, ['Name' => 'Test Person', 'Related Company' => 'Nonexistent Corp'], [ 'match_action' => RowMatchAction::Create->value, 'relationships' => $relationships, ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Related Company', matcherKey: 'name', entityLinkKey: "cf_{$recordCf->code}"), ]); runImportJob($this); $companyCountAfter = Company::where('team_id', $this->team->id)->count(); expect($companyCountAfter)->toBe($companyCountBefore); }); ================================================ FILE: tests/Feature/ImportWizard/Jobs/ResolveMatchesJobTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); afterEach(function (): void { if (isset($this->import)) { ImportStore::load($this->import->id)?->destroy(); $this->import->delete(); } }); function createStoreForMatchResolution( object $context, array $headers, array $rows, array $mappings, ): array { $import = Import::create([ 'team_id' => (string) $context->team->id, 'user_id' => (string) $context->user->id, 'entity_type' => ImportEntityType::People, 'file_name' => 'test.csv', 'status' => ImportStatus::Reviewing, 'total_rows' => count($rows), 'headers' => $headers, 'column_mappings' => collect($mappings)->map(fn (ColumnData $m) => $m->toArray())->all(), ]); $store = ImportStore::create($import->id); $store->query()->insert($rows); $context->import = $import; $context->store = $store; return [$import, $store]; } function makeMatchRow(int $rowNumber, array $rawData, array $overrides = []): array { return [ 'row_number' => $rowNumber, 'raw_data' => json_encode($rawData), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ...$overrides, ]; } it('resolves all rows as Create when no match field mapped', function (): void { createStoreForMatchResolution($this, ['Name'], [ makeMatchRow(2, ['Name' => 'John']), makeMatchRow(3, ['Name' => 'Jane']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $rows = $this->store->query()->get(); expect($rows)->toHaveCount(2) ->and($rows->every(fn ($row) => $row->match_action === RowMatchAction::Create))->toBeTrue(); }); it('resolves Update when email matches existing record', function (): void { $person = People::factory()->create([ 'name' => 'Existing Person', 'team_id' => $this->team->id, ]); $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); if ($emailField) { CustomFieldValue::create([ 'custom_field_id' => $emailField->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'json_value' => ['existing@test.com'], ]); } createStoreForMatchResolution($this, ['Name', 'Email'], [ makeMatchRow(2, ['Name' => 'John', 'Email' => 'existing@test.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); if ($emailField) { expect($row->match_action)->toBe(RowMatchAction::Update) ->and($row->matched_id)->toBe((string) $person->id); } else { expect($row->match_action)->toBe(RowMatchAction::Create); } }); it('resolves Skip when id does not match existing record', function (): void { createStoreForMatchResolution($this, ['ID', 'Name'], [ makeMatchRow(2, ['ID' => '99999', 'Name' => 'Ghost']), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Skip); }); it('does not clear relationships column', function (): void { $companyMatch = RelationshipMatch::create('company', 'Acme Corp'); createStoreForMatchResolution($this, ['Name'], [ makeMatchRow(2, ['Name' => 'John'], [ 'relationships' => json_encode([$companyMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->relationship)->toBe('company'); }); it('resets previous match resolutions when re-resolving', function (): void { createStoreForMatchResolution($this, ['Name'], [ makeMatchRow(2, ['Name' => 'John'], [ 'match_action' => RowMatchAction::Update->value, 'matched_id' => '999', ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Create) ->and($row->matched_id)->toBeNull(); }); it('marks unmatched rows as Create when mixed matched and empty values', function (): void { $person = People::factory()->create([ 'name' => 'Existing', 'team_id' => $this->team->id, ]); createStoreForMatchResolution($this, ['ID', 'Name'], [ makeMatchRow(2, ['ID' => (string) $person->id, 'Name' => 'Updated'], []), makeMatchRow(3, ['ID' => '', 'Name' => 'New Person'], []), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $matched = $this->store->query()->where('row_number', 2)->first(); $unmatched = $this->store->query()->where('row_number', 3)->first(); expect($matched->match_action)->toBe(RowMatchAction::Update) ->and($matched->matched_id)->toBe((string) $person->id) ->and($unmatched->match_action)->toBe(RowMatchAction::Skip); }); it('resolves Update when CSV email column contains comma-separated values matching existing record', function (): void { $person = People::factory()->create([ 'name' => 'Existing Person', 'team_id' => $this->team->id, ]); $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); if (! $emailField) { $this->markTestSkipped('No email custom field seeded for team'); } CustomFieldValue::create([ 'custom_field_id' => $emailField->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'json_value' => ['existing@test.com', 'other@test.com'], ]); createStoreForMatchResolution($this, ['Name', 'Email'], [ makeMatchRow(2, ['Name' => 'John', 'Email' => 'existing@test.com, new@test.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); (new ResolveMatchesJob($this->import->id, (string) $this->team->id))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Update) ->and($row->matched_id)->toBe((string) $person->id); }); it('handles missing import gracefully', function (): void { (new ResolveMatchesJob('nonexistent-id', (string) $this->team->id))->handle(); })->throws(ModelNotFoundException::class); ================================================ FILE: tests/Feature/ImportWizard/Jobs/ValidateColumnJobTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); afterEach(function (): void { if (isset($this->import)) { ImportStore::load($this->import->id)?->destroy(); $this->import->delete(); } }); function createValidationStore( object $context, array $headers, array $rows, array $mappings, ImportEntityType $entityType = ImportEntityType::People, ): array { $import = Import::create([ 'team_id' => (string) $context->team->id, 'user_id' => (string) $context->user->id, 'entity_type' => $entityType, 'file_name' => 'test.csv', 'status' => ImportStatus::Reviewing, 'total_rows' => count($rows), 'headers' => $headers, 'column_mappings' => collect($mappings)->map(fn (ColumnData $m) => $m->toArray())->all(), ]); $store = ImportStore::create($import->id); $store->query()->insert($rows); $context->import = $import; $context->store = $store; return [$import, $store]; } function makeValidationRow(int $rowNumber, array $rawData, array $overrides = []): array { return array_merge([ 'row_number' => $rowNumber, 'raw_data' => json_encode($rawData), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ], $overrides); } it('writes RelationshipMatch create for Create entity links', function (): void { $column = ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company'], [ makeValidationRow(2, ['Name' => 'John', 'Company' => 'Acme Corp']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->relationship)->toBe('company') ->and($row->relationships[0]->isCreate())->toBeTrue() ->and($row->relationships[0]->name)->toBe('Acme Corp'); }); it('writes RelationshipMatch existing when resolved to existing record', function (): void { $company = Company::factory()->create([ 'name' => 'Acme Corp', 'team_id' => $this->team->id, ]); $column = ColumnData::toEntityLink(source: 'Company ID', matcherKey: 'id', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company ID'], [ makeValidationRow(2, ['Name' => 'John', 'Company ID' => (string) $company->id]), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->relationship)->toBe('company') ->and($row->relationships[0]->isExisting())->toBeTrue() ->and($row->relationships[0]->id)->toBe((string) $company->id); }); it('skips relationship for MatchOnly when no match found', function (): void { $column = ColumnData::toEntityLink(source: 'Company ID', matcherKey: 'id', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company ID'], [ makeValidationRow(2, ['Name' => 'John', 'Company ID' => '99999']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->toBeNull(); }); it('writes validation errors for unresolvable account owner entity link', function (): void { $column = ColumnData::toEntityLink(source: 'Owner Email', matcherKey: 'email', entityLinkKey: 'account_owner'); createValidationStore($this, ['Name', 'Owner Email'], [ makeValidationRow(1, ['Name' => 'Acme', 'Owner Email' => 'nonexistent@example.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ], ImportEntityType::Company); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 1)->first(); expect($row->hasValidationError('Owner Email'))->toBeTrue(); }); it('writes validation errors for entity link column with invalid id', function (): void { $column = ColumnData::toEntityLink(source: 'Company ID', matcherKey: 'id', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company ID'], [ makeValidationRow(1, ['Name' => 'John', 'Company ID' => '99999']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 1)->first(); expect($row->hasValidationError('Company ID'))->toBeTrue(); }); it('clears validation for corrected date fields', function (): void { $column = ColumnData::toField(source: 'Due Date', target: 'due_date'); $column->importField = new ImportField( key: 'due_date', label: 'Due Date', rules: ['nullable', 'date'], type: FieldDataType::DATE, ); createValidationStore($this, ['Name', 'Due Date'], [ makeValidationRow(1, ['Name' => 'Task 1', 'Due Date' => 'not-a-date'], [ 'validation' => json_encode(['Due Date' => 'Invalid date format']), 'corrections' => json_encode(['Due Date' => '2024-01-15']), ]), makeValidationRow(2, ['Name' => 'Task 2', 'Due Date' => 'also-invalid'], [ 'validation' => json_encode(['Due Date' => 'Invalid date format']), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ], ImportEntityType::Task); (new ValidateColumnJob($this->import->id, $column))->handle(); $correctedRow = $this->store->query()->where('row_number', 1)->first(); $uncorrectedRow = $this->store->query()->where('row_number', 2)->first(); expect($correctedRow->hasValidationError('Due Date'))->toBeFalse(); expect($uncorrectedRow->hasValidationError('Due Date'))->toBeTrue(); }); it('skips validation when import does not exist', function (): void { $column = ColumnData::toField(source: 'Name', target: 'name'); $job = new ValidateColumnJob('nonexistent-import-id', $column); try { $job->handle(); expect(false)->toBeTrue('Expected exception was not thrown'); } catch (ModelNotFoundException $e) { expect($e->getModel())->toBe(Import::class); } }); it('skips validation when all values are empty', function (): void { $column = ColumnData::toField(source: 'Owner Email', target: 'account_owner_email'); createValidationStore($this, ['Name', 'Owner Email'], [ makeValidationRow(1, ['Name' => 'Acme', 'Owner Email' => '']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ], ImportEntityType::Company); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 1)->first(); expect($row->validation)->toBeNull(); }); it('appends to existing relationships array without overwriting', function (): void { $column = ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'); $existingRelationship = [ 'relationship' => 'contact', 'action' => 'create', 'name' => 'Jane Doe', ]; createValidationStore($this, ['Name', 'Company'], [ makeValidationRow(2, ['Name' => 'John', 'Company' => 'Acme Corp'], [ 'relationships' => json_encode([$existingRelationship]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->toHaveCount(2) ->and($row->relationships[0]->relationship)->toBe('contact') ->and($row->relationships[1]->relationship)->toBe('company'); }); it('validates color picker hex format', function (): void { $column = ColumnData::toField(source: 'Color', target: 'custom_fields_brand_color'); $column->importField = new ImportField( key: 'custom_fields_brand_color', label: 'Brand Color', rules: ['regex:/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/'], isCustomField: true, type: FieldDataType::STRING, ); createValidationStore($this, ['Name', 'Color'], [ makeValidationRow(1, ['Name' => 'John', 'Color' => 'not-a-color']), makeValidationRow(2, ['Name' => 'Jane', 'Color' => '#ff5733']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $invalidRow = $this->store->query()->where('row_number', 1)->first(); $validRow = $this->store->query()->where('row_number', 2)->first(); expect($invalidRow->hasValidationError('Color'))->toBeTrue() ->and($validRow->hasValidationError('Color'))->toBeFalse(); }); // --- Entity Link Format Validation Tests --- function ensureCustomFieldExists(object $context, string $code, string $type, string $entityType = 'people'): CustomField { $existing = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $context->team->id) ->where('entity_type', $entityType) ->where('code', $code) ->first(); if ($existing !== null) { return $existing; } return CustomField::forceCreate([ 'tenant_id' => $context->team->id, 'code' => $code, 'name' => ucfirst(str_replace('_', ' ', $code)), 'type' => $type, 'entity_type' => $entityType, 'sort_order' => 1, 'active' => true, 'system_defined' => false, 'validation_rules' => [], 'settings' => new CustomFieldSettingsData, ]); } it('rejects invalid domain format in entity link and prevents relationship creation', function (): void { ensureCustomFieldExists($this, 'domains', 'link', 'company'); $column = ColumnData::toEntityLink(source: 'Company', matcherKey: 'custom_fields_domains', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company'], [ makeValidationRow(2, ['Name' => 'John', 'Company' => 'GlobalHealth Inc']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->hasValidationError('Company'))->toBeTrue() ->and($row->relationships)->toBeNull(); }); it('accepts valid domain format in entity link and creates relationship', function (): void { ensureCustomFieldExists($this, 'domains', 'link', 'company'); $column = ColumnData::toEntityLink(source: 'Company', matcherKey: 'custom_fields_domains', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company'], [ makeValidationRow(2, ['Name' => 'John', 'Company' => 'globalhealth.io']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->isCreate())->toBeTrue() ->and($row->relationships[0]->name)->toBe('globalhealth.io'); }); it('rejects invalid email format in entity link', function (): void { ensureCustomFieldExists($this, 'emails', 'email'); $column = ColumnData::toEntityLink(source: 'Contact', matcherKey: 'custom_fields_emails', entityLinkKey: 'contact'); createValidationStore($this, ['Name', 'Contact'], [ makeValidationRow(2, ['Name' => 'Deal', 'Contact' => 'not-an-email']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ], ImportEntityType::Opportunity); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->hasValidationError('Contact'))->toBeTrue() ->and($row->relationships)->toBeNull(); }); it('accepts valid email format in entity link and creates relationship', function (): void { ensureCustomFieldExists($this, 'emails', 'email'); $column = ColumnData::toEntityLink(source: 'Contact', matcherKey: 'custom_fields_emails', entityLinkKey: 'contact'); createValidationStore($this, ['Name', 'Contact'], [ makeValidationRow(2, ['Name' => 'Deal', 'Contact' => 'john@example.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ], ImportEntityType::Opportunity); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->isCreate())->toBeTrue() ->and($row->relationships[0]->name)->toBe('john@example.com'); }); it('skips format validation for name matcher on entity link', function (): void { $column = ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'); createValidationStore($this, ['Name', 'Company'], [ makeValidationRow(2, ['Name' => 'John', 'Company' => 'Acme Corp']), ], [ ColumnData::toField(source: 'Name', target: 'name'), $column, ]); (new ValidateColumnJob($this->import->id, $column))->handle(); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->hasValidationError('Company'))->toBeFalse() ->and($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1); }); ================================================ FILE: tests/Feature/ImportWizard/Livewire/ImportWizardTest.php ================================================ except([TeamCreated::class]); Bus::fake(); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->createdStoreIds = []; }); afterEach(function (): void { foreach ($this->createdStoreIds as $storeId) { ImportStore::load($storeId)?->destroy(); Import::find($storeId)?->delete(); } }); function mountImportWizard(object $context, ?string $returnUrl = null): Testable { return Livewire::test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, 'returnUrl' => $returnUrl, ]); } function createFullTestStore(object $context): ImportStore { $import = Import::create([ 'team_id' => (string) $context->team->id, 'user_id' => (string) $context->user->id, 'entity_type' => ImportEntityType::People, 'file_name' => 'test.csv', 'status' => ImportStatus::Reviewing, 'total_rows' => 1, 'headers' => ['Name', 'Email'], ]); $import->setColumnMappings([ ColumnData::toField(source: 'Name', target: 'name'), ]); $store = ImportStore::create($import->id); $store->query()->insert([ 'row_number' => 2, 'raw_data' => json_encode(['Name' => 'John', 'Email' => 'john@test.com']), ]); $context->createdStoreIds[] = $store->id(); return $store; } function markStoreAsDestroyed(object $context, ImportStore $store): void { $context->createdStoreIds = array_filter( $context->createdStoreIds, fn (string $id): bool => $id !== $store->id(), ); } it('mounts at step 1 (Upload)', function (): void { $component = mountImportWizard($this); $component->assertOk(); expect($component->get('currentStep'))->toBe(1); }); it('onUploadCompleted advances to step 2 with store data', function (): void { $store = createFullTestStore($this); $component = mountImportWizard($this); $component->call('onUploadCompleted', $store->id(), 5, 3); expect($component->get('currentStep'))->toBe(2) ->and($component->get('storeId'))->toBe($store->id()) ->and($component->get('rowCount'))->toBe(5) ->and($component->get('columnCount'))->toBe(3); }); it('goBack caps at step 1', function (): void { $component = mountImportWizard($this); $component->call('goBack'); expect($component->get('currentStep'))->toBe(1); }); it('goToStep ignores forward navigation', function (): void { $store = createFullTestStore($this); $component = mountImportWizard($this); $component->set('storeId', $store->id()); $component->set('currentStep', 2); $component->call('goToStep', 3); expect($component->get('currentStep'))->toBe(2); }); it('goToStep navigates to completed step', function (): void { $store = createFullTestStore($this); $component = mountImportWizard($this); $component->set('storeId', $store->id()); $component->set('currentStep', 3); $component->call('goToStep', 2); expect($component->get('currentStep'))->toBe(2); }); it('cancelImport destroys store and redirects', function (): void { $store = createFullTestStore($this); $returnUrl = '/dashboard'; $component = mountImportWizard($this, $returnUrl); $component->set('storeId', $store->id()); $component->call('cancelImport'); $component->assertRedirect($returnUrl); expect(ImportStore::load($store->id()))->toBeNull(); markStoreAsDestroyed($this, $store); }); it('startOver resets to step 1', function (): void { $store = createFullTestStore($this); $component = mountImportWizard($this); $component->set('storeId', $store->id()); $component->set('currentStep', 2); $component->set('rowCount', 10); $component->set('columnCount', 5); $component->call('startOver'); expect($component->get('currentStep'))->toBe(1) ->and($component->get('storeId'))->toBeNull() ->and($component->get('rowCount'))->toBe(0) ->and($component->get('columnCount'))->toBe(0); expect(ImportStore::load($store->id()))->toBeNull(); markStoreAsDestroyed($this, $store); }); it('getStepTitle returns correct title for Upload step', function (): void { $component = mountImportWizard($this); $component->call('getStepTitle')->assertReturned('Upload CSV'); }); it('getStepTitle returns correct title for Map step', function (): void { $store = createFullTestStore($this); $component = mountImportWizard($this); $component->call('onUploadCompleted', $store->id(), 1, 2); $component->call('getStepTitle')->assertReturned('Map Columns'); }); it('getStepDescription returns correct description per step', function (): void { $component = mountImportWizard($this); $component->call('getStepDescription') ->assertReturned('Upload your CSV file to import People'); }); it('restores to mapping step when store status is Mapping', function (): void { $store = createFullTestStore($this); $import = Import::find($store->id()); $import->update(['status' => ImportStatus::Mapping]); $component = Livewire::withQueryParams(['import' => $store->id()]) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('currentStep'))->toBe(2) ->and($component->get('storeId'))->toBe($store->id()) ->and($component->get('rowCount'))->toBe(1) ->and($component->get('columnCount'))->toBe(2); }); it('restores to review step when store status is Reviewing', function (): void { $store = createFullTestStore($this); $import = Import::find($store->id()); $import->update(['status' => ImportStatus::Reviewing]); $component = Livewire::withQueryParams(['import' => $store->id()]) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('currentStep'))->toBe(3) ->and($component->get('storeId'))->toBe($store->id()); }); it('restores to preview step with locked navigation when store status is Completed', function (): void { $store = createFullTestStore($this); $import = Import::find($store->id()); $import->update(['status' => ImportStatus::Completed]); $component = Livewire::withQueryParams(['import' => $store->id()]) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('currentStep'))->toBe(4) ->and($component->get('storeId'))->toBe($store->id()) ->and($component->get('importStarted'))->toBeTrue(); }); it('blocks navigation when import has started', function (): void { $store = createFullTestStore($this); $import = Import::find($store->id()); $import->update(['status' => ImportStatus::Importing]); $component = Livewire::withQueryParams(['import' => $store->id()]) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('importStarted'))->toBeTrue(); $component->call('goToStep', 2); expect($component->get('currentStep'))->toBe(4); $component->call('goBack'); expect($component->get('currentStep'))->toBe(4); }); it('allows backward navigation during validation', function (): void { $store = createFullTestStore($this); $component = Livewire::withQueryParams(['import' => $store->id()]) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('currentStep'))->toBe(3); $component->call('goBack'); expect($component->get('currentStep'))->toBe(2); }); it('resets storeId when store not found', function (): void { $component = Livewire::withQueryParams(['import' => 'nonexistent-id']) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('currentStep'))->toBe(1) ->and($component->get('storeId'))->toBeNull(); }); it('rejects path traversal storeId values', function (string $maliciousId): void { expect(ImportStore::load($maliciousId))->toBeNull(); })->with([ '../../etc/passwd', '../../../secret', 'valid-but-has-slashes/nested', '', 'short', str_repeat('A', 27), ]); it('resets storeId when store belongs to different team', function (): void { $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $import = Import::create([ 'team_id' => (string) $otherTeam->id, 'user_id' => (string) $otherUser->id, 'entity_type' => ImportEntityType::People, 'file_name' => 'test.csv', 'status' => ImportStatus::Mapping, 'total_rows' => 1, 'headers' => ['Name', 'Email'], ]); $store = ImportStore::create($import->id); $component = Livewire::withQueryParams(['import' => $store->id()]) ->test(ImportWizard::class, [ 'entityType' => ImportEntityType::People, ]); expect($component->get('currentStep'))->toBe(1) ->and($component->get('storeId'))->toBeNull(); $store->destroy(); $import->delete(); }); ================================================ FILE: tests/Feature/ImportWizard/Livewire/MappingStepTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->import = Import::create([ 'team_id' => (string) $this->team->id, 'user_id' => (string) $this->user->id, 'entity_type' => ImportEntityType::People, 'file_name' => 'test.csv', 'status' => ImportStatus::Mapping, 'total_rows' => 0, 'headers' => [], ]); $this->store = ImportStore::create($this->import->id); }); afterEach(function (): void { $this->store->destroy(); $this->import->delete(); }); function createStoreWithHeaders(object $context, array $headers, array $rows = []): void { $context->import->update(['headers' => $headers]); if ($rows === []) { $rowData = array_combine($headers, array_fill(0, count($headers), 'sample')); $rows = [$rowData]; } foreach ($rows as $index => $row) { $context->store->query()->insert([ 'row_number' => $index + 2, 'raw_data' => json_encode($row), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ]); } $context->import->update(['total_rows' => count($rows)]); } function mountMappingStep(object $context): Testable { return Livewire::test(MappingStep::class, [ 'storeId' => $context->store->id(), 'entityType' => ImportEntityType::People, ]); } it('renders with correct headers from store', function (): void { createStoreWithHeaders($this, ['Name', 'Phone', 'Notes']); $component = mountMappingStep($this); $component->assertOk(); }); it('auto-maps Name header to name field on mount', function (): void { createStoreWithHeaders($this, ['Name', 'Phone']); $component = mountMappingStep($this); $columns = $component->get('columns'); expect($columns)->toHaveKey('Name') ->and($columns['Name']['target'])->toBe('name') ->and($columns['Name']['entityLink'])->toBeNull(); }); it('auto-maps Company header to company entity link', function (): void { createStoreWithHeaders($this, ['Name', 'Company'], [ ['Name' => 'John', 'Company' => 'Acme Inc'], ]); $component = mountMappingStep($this); $columns = $component->get('columns'); expect($columns)->toHaveKey('Company') ->and($columns['Company']['entityLink'])->toBe('company'); }); it('mapToField updates column mapping', function (): void { createStoreWithHeaders($this, ['Full Name', 'Notes']); $component = mountMappingStep($this); $component->call('mapToField', 'Full Name', 'name'); $columns = $component->get('columns'); expect($columns)->toHaveKey('Full Name') ->and($columns['Full Name']['target'])->toBe('name'); }); it('mapToField with empty target removes mapping', function (): void { createStoreWithHeaders($this, ['Name', 'Notes']); $component = mountMappingStep($this); expect($component->get('columns'))->toHaveKey('Name'); $component->call('mapToField', 'Name', ''); expect($component->get('columns'))->not->toHaveKey('Name'); }); it('mapToField rejects duplicate target', function (): void { createStoreWithHeaders($this, ['Col A', 'Col B']); $component = mountMappingStep($this); $component->call('mapToField', 'Col A', 'name'); $component->call('mapToField', 'Col B', 'name'); $columns = $component->get('columns'); expect($columns['Col A']['target'])->toBe('name') ->and($columns)->not->toHaveKey('Col B'); }); it('mapToEntityLink creates entity link mapping', function (): void { createStoreWithHeaders($this, ['Name', 'Org']); $component = mountMappingStep($this); $component->call('mapToEntityLink', 'Org', 'name', 'company'); $columns = $component->get('columns'); expect($columns)->toHaveKey('Org') ->and($columns['Org']['entityLink'])->toBe('company') ->and($columns['Org']['target'])->toBe('name'); }); it('unmapColumn removes mapping', function (): void { createStoreWithHeaders($this, ['Name', 'Notes']); $component = mountMappingStep($this); expect($component->get('columns'))->toHaveKey('Name'); $component->call('unmapColumn', 'Name'); expect($component->get('columns'))->not->toHaveKey('Name'); }); it('canProceed returns false when required field is unmapped', function (): void { createStoreWithHeaders($this, ['Notes', 'Phone']); $component = mountMappingStep($this); $component->call('unmapColumn', 'Notes'); $component->call('unmapColumn', 'Phone'); $component->call('canProceed') ->assertReturned(false); }); it('canProceed returns true when all required fields are mapped', function (): void { createStoreWithHeaders($this, ['Name', 'Notes']); $component = mountMappingStep($this); $component->call('mapToField', 'Name', 'name'); $component->call('canProceed') ->assertReturned(true); }); it('continue action saves mappings to store', function (): void { createStoreWithHeaders($this, ['Name', 'Notes']); $component = mountMappingStep($this); $component->call('mapToField', 'Name', 'name'); $component->callAction('continue'); $freshImport = $this->import->fresh(); $savedMappings = $freshImport->columnMappings(); expect($savedMappings)->toHaveCount(1) ->and($savedMappings->first()->source)->toBe('Name') ->and($savedMappings->first()->target)->toBe('name'); }); it('continue action sets status to Reviewing', function (): void { createStoreWithHeaders($this, ['Name']); $component = mountMappingStep($this); $component->call('mapToField', 'Name', 'name'); $component->callAction('continue'); $freshImport = $this->import->fresh(); expect($freshImport->status)->toBe(ImportStatus::Reviewing); }); it('continue action dispatches completed event', function (): void { createStoreWithHeaders($this, ['Name']); $component = mountMappingStep($this); $component->call('mapToField', 'Name', 'name'); $component->callAction('continue'); $component->assertDispatched('completed'); }); it('continue action is disabled when required fields are unmapped', function (): void { createStoreWithHeaders($this, ['Notes', 'Phone']); $component = mountMappingStep($this); $component->call('unmapColumn', 'Notes'); $component->call('unmapColumn', 'Phone'); $component->assertActionDisabled('continue'); }); it('previewValues returns sample values from SQLite', function (): void { createStoreWithHeaders($this, ['Name', 'Email'], [ ['Name' => 'John', 'Email' => 'john@test.com'], ['Name' => 'Jane', 'Email' => 'jane@test.com'], ]); $component = mountMappingStep($this); $component->call('previewValues', 'Name') ->assertReturned(['John', 'Jane']); }); ================================================ FILE: tests/Feature/ImportWizard/Livewire/PreviewStepTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); afterEach(function (): void { if (isset($this->store)) { $this->store->destroy(); } if (isset($this->import)) { $this->import->delete(); } }); function createPreviewReadyStore( object $context, array $headers, array $rows, array $mappings, ImportEntityType $entityType = ImportEntityType::People, ): ImportStore { $import = Import::create([ 'team_id' => (string) $context->team->id, 'user_id' => (string) $context->user->id, 'entity_type' => $entityType, 'file_name' => 'test.csv', 'status' => ImportStatus::Reviewing, 'total_rows' => count($rows), 'headers' => $headers, 'column_mappings' => collect($mappings)->map(fn (ColumnData $m) => $m->toArray())->all(), ]); $store = ImportStore::create($import->id); $store->query()->insert($rows); (new MatchResolver($store, $import, $import->getImporter()))->resolve(); $context->import = $import; $context->store = $store; return $store; } function mountPreviewStep(object $context): Testable { return Livewire::test(PreviewStep::class, [ 'storeId' => $context->store->id(), 'entityType' => ImportEntityType::People, ]); } if (! function_exists('makeRow')) { /** @param array $overrides */ function makeRow(int $rowNumber, array $rawData, array $overrides = []): array { return array_merge([ 'row_number' => $rowNumber, 'raw_data' => json_encode($rawData), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ], $overrides); } } it('mounts and renders with summary data', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), makeRow(3, ['Name' => 'Jane']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->assertOk() ->assertSee('People') ->assertSee('Start Import'); }); it('resolves all rows as Create when only name is mapped', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), makeRow(3, ['Name' => 'Jane']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); mountPreviewStep($this); $rows = $this->store->query()->get(); expect($rows)->toHaveCount(2) ->and($rows->every(fn ($row) => $row->match_action === RowMatchAction::Create))->toBeTrue(); }); it('resolves rows as Update when email matches existing record', function (): void { $person = People::factory()->create([ 'name' => 'Existing Person', 'team_id' => $this->team->id, ]); $emailField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->id) ->where('entity_type', 'people') ->where('code', 'emails') ->first(); if ($emailField) { CustomFieldValue::create([ 'custom_field_id' => $emailField->id, 'entity_type' => 'people', 'entity_id' => $person->id, 'tenant_id' => $this->team->id, 'json_value' => ['existing@test.com'], ]); } createPreviewReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'existing@test.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); if ($emailField) { expect($row->match_action)->toBe(RowMatchAction::Update) ->and($row->matched_id)->toBe((string) $person->id); } else { expect($row->match_action)->toBe(RowMatchAction::Create); } }); it('resolves rows as Create when email does not match existing record', function (): void { createPreviewReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'nonexistent@test.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Create); }); it('resolves rows as Skip when id does not match existing record', function (): void { createPreviewReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => '99999', 'Name' => 'Ghost']), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Skip); }); it('resolves rows as Update when id matches existing record', function (): void { $person = People::factory()->create([ 'name' => 'Existing Person', 'team_id' => $this->team->id, ]); createPreviewReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'Updated Name']), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Update) ->and($row->matched_id)->toBe((string) $person->id); }); it('renders entity link relationships from pre-populated data', function (): void { $companyMatch = RelationshipMatch::create('company', 'Acme Corp'); createPreviewReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'Acme Corp'], [ 'relationships' => json_encode([$companyMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->relationship)->toBe('company') ->and($row->relationships[0]->isCreate())->toBeTrue() ->and($row->relationships[0]->name)->toBe('Acme Corp'); }); it('handles rows with no entity link relationships', function (): void { createPreviewReadyStore($this, ['Name', 'Company ID'], [ makeRow(2, ['Name' => 'John', 'Company ID' => '99999']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company ID', matcherKey: 'id', entityLinkKey: 'company'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->toBeNull(); }); it('renders existing entity link relationships from pre-populated data', function (): void { $company = Company::factory()->create([ 'name' => 'Acme Corp', 'team_id' => $this->team->id, ]); $companyMatch = RelationshipMatch::existing('company', (string) $company->id); createPreviewReadyStore($this, ['Name', 'Company ID'], [ makeRow(2, ['Name' => 'John', 'Company ID' => (string) $company->id], [ 'relationships' => json_encode([$companyMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company ID', matcherKey: 'id', entityLinkKey: 'company'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull() ->and($row->relationships)->toHaveCount(1) ->and($row->relationships[0]->relationship)->toBe('company') ->and($row->relationships[0]->isExisting())->toBeTrue() ->and($row->relationships[0]->id)->toBe((string) $company->id); }); it('resolves rows with validation errors through normal match resolution', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John'], ['validation' => json_encode(['Name' => 'Name is required'])]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Create); }); it('createCount returns correct count', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), makeRow(3, ['Name' => 'Jane']), makeRow(4, ['Name' => 'Bob']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); expect($component->get('createCount'))->toBe(3); }); it('updateCount returns correct count', function (): void { $person = People::factory()->create([ 'name' => 'Existing', 'team_id' => $this->team->id, ]); createPreviewReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => (string) $person->id, 'Name' => 'Updated']), makeRow(3, ['ID' => '99999', 'Name' => 'Ghost']), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); expect($component->get('updateCount'))->toBe(1); }); it('skipCount returns correct count', function (): void { createPreviewReadyStore($this, ['ID', 'Name'], [ makeRow(2, ['ID' => '99999', 'Name' => 'Ghost']), ], [ ColumnData::toField(source: 'ID', target: 'id'), ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); expect($component->get('skipCount'))->toBe(1); }); it('errorCount returns count of rows with validation errors', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John'], ['validation' => json_encode(['Name' => 'Error'])]), makeRow(3, ['Name' => 'Jane']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); expect($component->get('errorCount'))->toBe(1); }); it('startImport dispatches ExecuteImportJob and sets status to Importing', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->call('startImport'); Bus::assertBatched(function ($batch) { return $batch->jobs->count() === 1 && $batch->jobs->first() instanceof ExecuteImportJob; }); $freshImport = $this->import->fresh(); expect($freshImport->status)->toBe(ImportStatus::Importing); }); it('startImport proceeds even when rows have validation errors', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John'], ['validation' => json_encode(['Name' => 'Error'])]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->call('startImport'); Bus::assertBatched(function ($batch) { return $batch->jobs->count() === 1 && $batch->jobs->first() instanceof ExecuteImportJob; }); }); it('startImport sets batchId for progress tracking', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->call('startImport'); expect($component->get('batchId'))->not->toBeNull(); }); it('isImporting returns true while batch is running', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->call('startImport'); expect($component->get('isImporting'))->toBeTrue(); }); it('does not skip rows with validation errors that are covered by per-value skips', function (): void { createPreviewReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'bad-email'], [ 'validation' => json_encode(['$.Email' => 'Invalid email']), 'skipped' => json_encode(['$.Email' => true]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); $component = mountPreviewStep($this); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->match_action)->toBe(RowMatchAction::Create); }); it('previewRows returns paginated rows', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), makeRow(3, ['Name' => 'Jane']), makeRow(4, ['Name' => 'Bob']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $previewRows = $component->get('previewRows'); expect($previewRows)->toBeInstanceOf(LengthAwarePaginator::class) ->and($previewRows->total())->toBe(3) ->and($previewRows->items())->toHaveCount(3); }); it('columns returns mapped column data', function (): void { createPreviewReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'john@test.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); $component = mountPreviewStep($this); $columns = $component->get('columns'); expect($columns)->toHaveCount(2) ->and($columns->first()->source)->toBe('Name') ->and($columns->last()->source)->toBe('Email'); }); it('relationshipTabs returns entity link tabs', function (): void { $companyMatch = RelationshipMatch::create('company', 'Acme'); createPreviewReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'Acme'], [ 'relationships' => json_encode([$companyMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); $component = mountPreviewStep($this); $tabs = $component->get('relationshipTabs'); expect($tabs)->toHaveCount(1) ->and($tabs[0]['key'])->toBe('company') ->and($tabs[0]['label'])->toBe('Company'); }); it('relationshipTabs returns empty when no entity links mapped', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); expect($component->get('relationshipTabs'))->toBeEmpty(); }); it('relationshipSummary aggregates by entity link key', function (): void { $acmeMatch = RelationshipMatch::create('company', 'Acme Corp'); $newCorpMatch = RelationshipMatch::create('company', 'New Corp'); createPreviewReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'Acme Corp'], [ 'relationships' => json_encode([$acmeMatch->toArray()]), ]), makeRow(3, ['Name' => 'Jane', 'Company' => 'Acme Corp'], [ 'relationships' => json_encode([$acmeMatch->toArray()]), ]), makeRow(4, ['Name' => 'Bob', 'Company' => 'New Corp'], [ 'relationships' => json_encode([$newCorpMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); $component = mountPreviewStep($this); $component->call('setActiveTab', 'company'); $summary = $component->get('relationshipSummary'); $createEntries = collect($summary->items())->where('action', 'create'); $totalCreated = $createEntries->sum('count'); expect($totalCreated)->toBe(3); }); it('relationshipSummary returns empty on all tab', function (): void { $companyMatch = RelationshipMatch::create('company', 'Acme'); createPreviewReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'Acme'], [ 'relationships' => json_encode([$companyMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); $component = mountPreviewStep($this); expect($component->get('relationshipSummary'))->toBeEmpty(); }); it('setActiveTab changes tab and resets page', function (): void { $companyMatch = RelationshipMatch::create('company', 'Acme'); createPreviewReadyStore($this, ['Name', 'Company'], [ makeRow(2, ['Name' => 'John', 'Company' => 'Acme'], [ 'relationships' => json_encode([$companyMatch->toArray()]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toEntityLink(source: 'Company', matcherKey: 'name', entityLinkKey: 'company'), ]); $component = mountPreviewStep($this); expect($component->get('activeTab'))->toBe('all'); $component->call('setActiveTab', 'company'); expect($component->get('activeTab'))->toBe('company'); $component->call('setActiveTab', 'all'); expect($component->get('activeTab'))->toBe('all'); }); it('renders preview data table with row values', function (): void { createPreviewReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'john@test.com']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); $component = mountPreviewStep($this); $component->assertOk() ->assertSee('People') ->assertSee('John') ->assertSee('john@test.com') ->assertSee('will be created'); }); it('renders skipped and invalid cells as empty', function (): void { createPreviewReadyStore($this, ['Name', 'Email'], [ makeRow(2, ['Name' => 'John', 'Email' => 'bad'], [ 'validation' => json_encode(['Email' => 'Invalid']), 'skipped' => json_encode(['Name' => true]), ]), ], [ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Email', target: 'custom_fields_emails'), ]); $component = mountPreviewStep($this); $component->assertOk() ->assertDontSee('John') ->assertDontSee('bad'); }); it('checkImportProgress detects completion', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $this->import->update([ 'status' => ImportStatus::Completed, 'created_rows' => 1, 'updated_rows' => 0, 'skipped_rows' => 0, 'failed_rows' => 0, ]); $component->set('batchId', 'fake-batch-id'); $component->call('checkImportProgress'); expect($component->get('isCompleted'))->toBeTrue(); }); it('startImport is a no-op when batchId is already set', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->set('batchId', 'existing-batch-id'); $component->call('startImport'); Bus::assertNothingBatched(); }); it('startImport is a no-op when already completed', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $component = mountPreviewStep($this); $component->set('isCompleted', true); $component->call('startImport'); Bus::assertNothingBatched(); }); it('startImport is a no-op when status is already Importing', function (): void { Bus::fake(); createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $this->import->update(['status' => ImportStatus::Importing]); $component = mountPreviewStep($this); $component->call('startImport'); Bus::assertNothingBatched(); }); it('downloadFailedRows action is visible when there are failed rows', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $this->import->update([ 'status' => ImportStatus::Completed, 'created_rows' => 0, 'updated_rows' => 0, 'skipped_rows' => 0, 'failed_rows' => 1, ]); $component = mountPreviewStep($this); $component->assertSee('Download Failed Rows'); }); it('downloadFailedRows action is hidden when there are no failed rows', function (): void { createPreviewReadyStore($this, ['Name'], [ makeRow(2, ['Name' => 'John']), ], [ ColumnData::toField(source: 'Name', target: 'name'), ]); $this->import->update([ 'status' => ImportStatus::Completed, 'created_rows' => 1, 'updated_rows' => 0, 'skipped_rows' => 0, 'failed_rows' => 0, ]); $component = mountPreviewStep($this); $component->assertDontSee('Download Failed Rows'); }); ================================================ FILE: tests/Feature/ImportWizard/Livewire/ReviewStepTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->import = Import::create([ 'team_id' => (string) $this->team->id, 'user_id' => (string) $this->user->id, 'entity_type' => ImportEntityType::People, 'file_name' => 'test.csv', 'status' => ImportStatus::Reviewing, 'total_rows' => 2, 'headers' => ['Name', 'Emails'], 'column_mappings' => collect([ ColumnData::toField(source: 'Name', target: 'name'), ColumnData::toField(source: 'Emails', target: 'custom_fields_emails'), ])->map(fn (ColumnData $m) => $m->toArray())->all(), ]); $this->store = ImportStore::create($this->import->id); $this->store->query()->insert([ [ 'row_number' => 2, 'raw_data' => json_encode(['Name' => 'John', 'Emails' => 'john@test.com']), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ], [ 'row_number' => 3, 'raw_data' => json_encode(['Name' => 'Jane', 'Emails' => 'jane@test.com, admin@test.com']), 'validation' => null, 'corrections' => null, 'skipped' => null, 'match_action' => null, 'matched_id' => null, 'relationships' => null, ], ]); Cache::forget("import-{$this->import->id}-validation"); }); afterEach(function (): void { $this->store->destroy(); $this->import->delete(); }); function mountReviewStep(object $context): Testable { Bus::fake(); return Livewire::test(ReviewStep::class, [ 'storeId' => $context->store->id(), 'entityType' => ImportEntityType::People, ]); } it('renders with correct columns', function (): void { $component = mountReviewStep($this); $component->assertOk(); $columns = $component->get('columns'); expect($columns)->toHaveCount(2) ->and($columns->pluck('source')->all())->toBe(['Name', 'Emails']); }); it('selects first column by default on mount', function (): void { $component = mountReviewStep($this); expect($component->get('selectedColumn.source'))->toBe('Name'); }); it('changes selected column via selectColumn', function (): void { $component = mountReviewStep($this); $component->call('selectColumn', 'Emails'); expect($component->get('selectedColumn.source'))->toBe('Emails'); }); it('stores text correction in SQLite via updateMappedValue', function (): void { $component = mountReviewStep($this); $component->call('updateMappedValue', 'John', 'Johnny'); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->corrections->get('Name'))->toBe('Johnny'); }); it('stores validation error for invalid text correction', function (): void { $component = mountReviewStep($this); $component->call('selectColumn', 'Emails'); $component->call('updateMappedValue', 'john@test.com', 'not-an-email'); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->corrections->get('Emails'))->toBe('not-an-email') ->and($row->validation->get('Emails'))->not->toBeNull(); }); it('returns empty errors for valid emails in multi-value field', function (): void { $component = mountReviewStep($this); $component->call('selectColumn', 'Emails'); $component ->call('updateMappedValue', 'john@test.com', 'valid@test.com, another@test.com') ->assertReturned([]); }); it('returns per-item errors for invalid emails in multi-value field', function (): void { $component = mountReviewStep($this); $component->call('selectColumn', 'Emails'); $component ->call('updateMappedValue', 'john@test.com', 'valid@test.com, not-an-email') ->assertReturned(fn (array $errors) => isset($errors['not-an-email']) && ! isset($errors['valid@test.com'])); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->corrections->get('Emails'))->toBe('valid@test.com, not-an-email') ->and($row->validation->get('Emails'))->not->toBeNull(); }); it('marks value as skipped via skipValue', function (): void { $component = mountReviewStep($this); $component->call('skipValue', 'John'); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->skipped->get('Name'))->toBeTrue(); }); it('removes skip flag via unskipValue', function (): void { $component = mountReviewStep($this); $component->call('skipValue', 'John'); $component->call('unskipValue', 'John'); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->skipped?->get('Name'))->toBeNull(); }); it('removes correction and re-validates raw value via undoCorrection', function (): void { $component = mountReviewStep($this); $component->call('updateMappedValue', 'John', 'Johnny'); $component->call('undoCorrection', 'John'); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->corrections?->get('Name'))->toBeNull(); }); it('setFilter changes filter and resets pagination', function (): void { $component = mountReviewStep($this); $component->call('setFilter', 'needs_review'); expect($component->get('filter'))->toBe(ReviewFilter::NeedsReview); }); it('clearFilters resets search and filter', function (): void { $component = mountReviewStep($this); $component->set('search', 'John'); $component->call('setFilter', 'needs_review'); $component->call('clearFilters'); expect($component->get('search'))->toBe('') ->and($component->get('filter'))->toBe(ReviewFilter::All); }); it('setSortField changes sort', function (): void { $component = mountReviewStep($this); $component->call('setSortField', 'raw_value'); expect($component->get('sortField'))->toBe(SortField::Value); }); it('setSortDirection changes direction', function (): void { $component = mountReviewStep($this); $component->call('setSortDirection', 'asc'); expect($component->get('sortDirection'))->toBe(SortDirection::Asc); }); it('updatedSearch applies and component renders without error', function (): void { $component = mountReviewStep($this); $component->set('search', 'John'); $component->assertOk(); expect($component->get('search'))->toBe('John'); }); it('columnErrorStatuses reflects validation state', function (): void { $jsonPath = '$.Name'; $this->store->connection()->statement(" UPDATE import_rows SET validation = json_set(COALESCE(validation, '{}'), ?, ?) WHERE json_extract(raw_data, ?) = ? ", [$jsonPath, 'Required field', $jsonPath, 'John']); $component = mountReviewStep($this); $statuses = $component->get('columnErrorStatuses'); expect($statuses['Name'])->toBeTrue(); }); it('dispatches completed event when continueToPreview is called', function (): void { $component = mountReviewStep($this); $component->set('batchIds', []); $component->call('continueToPreview') ->assertDispatched('completed'); }); it('does not dispatch completed while validation batches are still running', function (): void { $component = mountReviewStep($this); $component->set('batchIds', ['Name' => 'fake-batch-id']); $component->call('continueToPreview') ->assertNotDispatched('completed'); }); it('dispatches completed even when unresolved validation errors exist', function (): void { $jsonPath = '$.Name'; $this->store->connection()->statement(" UPDATE import_rows SET validation = json_set(COALESCE(validation, '{}'), ?, ?) WHERE json_extract(raw_data, ?) = ? ", [$jsonPath, 'Required field', $jsonPath, 'John']); $component = mountReviewStep($this); $component->set('batchIds', []); $component->call('continueToPreview') ->assertDispatched('completed'); }); it('dispatches ResolveMatchesJob batch on mount', function (): void { $component = mountReviewStep($this); Bus::assertBatched(function ($batch) { return $batch->jobs->contains(fn ($job) => $job instanceof ResolveMatchesJob); }); }); it('includes __match_resolution key in batchIds', function (): void { $component = mountReviewStep($this); expect($component->get('batchIds'))->toHaveKey('__match_resolution'); }); it('allows continueToPreview while only match resolution is running', function (): void { $component = mountReviewStep($this); $component->set('batchIds', ['__match_resolution' => 'fake-batch-id']); $component->call('continueToPreview') ->assertDispatched('completed'); $cachedBatchId = Cache::get("import-{$this->store->id()}-match-resolution-batch"); expect($cachedBatchId)->toBe('fake-batch-id'); }); it('clears relationships column on mount', function (): void { $this->store->connection()->statement(" UPDATE import_rows SET relationships = '[{\"relationship\":\"company\",\"action\":\"create\",\"name\":\"Stale\"}]' "); $row = $this->store->query()->where('row_number', 2)->first(); expect($row->relationships)->not->toBeNull(); mountReviewStep($this); $freshRow = $this->store->query()->where('row_number', 2)->first(); expect($freshRow->relationships)->toBeNull(); }); it('skips dispatching batches when cache hash matches', function (): void { mountReviewStep($this); Bus::assertBatched(fn () => true); Bus::fake(); mountReviewStep($this); Bus::assertNothingBatched(); }); it('dispatches new batches when mappings hash changes', function (): void { mountReviewStep($this); Bus::assertBatched(fn () => true); $this->import->update([ 'column_mappings' => collect([ ColumnData::toField(source: 'Name', target: 'name'), ])->map(fn (ColumnData $m) => $m->toArray())->all(), ]); Bus::fake(); mountReviewStep($this); Bus::assertBatched(fn () => true); }); ================================================ FILE: tests/Feature/ImportWizard/Livewire/UploadStepTest.php ================================================ createWithContent($name, $content); } beforeEach(function (): void { Event::fake()->except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->createdStoreIds = []; }); afterEach(function (): void { foreach ($this->createdStoreIds as $storeId) { ImportStore::load($storeId)?->destroy(); } }); function mountUploadStep(object $context, ?string $storeId = null): Testable { return Livewire::test(UploadStep::class, [ 'entityType' => ImportEntityType::People, 'storeId' => $storeId, ]); } // ─── Mount ────────────────────────────────────────────────────────────────── it('renders upload form on mount', function (): void { $component = mountUploadStep($this); $component->assertOk(); expect($component->get('isParsed'))->toBeFalse() ->and($component->get('headers'))->toBe([]) ->and($component->get('rowCount'))->toBe(0); }); // ─── File Parsing ─────────────────────────────────────────────────────────── it('parses valid CSV and shows preview', function (): void { $csv = makeCsvFile("Name,Email,Phone\nJohn,john@test.com,555-1234\nJane,jane@test.com,555-5678\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); expect($component->get('isParsed'))->toBeTrue() ->and($component->get('headers'))->toBe(['Name', 'Email', 'Phone']) ->and($component->get('rowCount'))->toBe(2); }); it('rejects non-CSV file type', function (): void { $file = UploadedFile::fake()->create('report.pdf', 100, 'application/pdf'); $component = mountUploadStep($this); $component->set('uploadedFile', $file); $component->assertHasErrors(['uploadedFile']); }); it('rejects empty CSV with no headers', function (): void { $csv = makeCsvFile(''); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); $component->assertHasErrors(['uploadedFile' => 'CSV file is empty']); }); it('rejects CSV with headers but no data rows', function (): void { $csv = makeCsvFile("Name,Email,Phone\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); $component->assertHasErrors(['uploadedFile' => 'CSV file has no data rows']); }); it('fills blank headers with Column_N', function (): void { $csv = makeCsvFile("Name,,Email\nJohn,value,john@test.com\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); expect($component->get('isParsed'))->toBeTrue() ->and($component->get('headers'))->toBe(['Name', 'Column_2', 'Email']); }); it('rejects duplicate column headers', function (): void { $csv = makeCsvFile("Name,Name,Email\nJohn,Doe,john@test.com\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); $component->assertHasErrors(['uploadedFile' => 'Duplicate column names found.']); }); it('normalizes rows with fewer columns than headers', function (): void { $csv = makeCsvFile("Name,Email,Phone\nJohn\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); expect($component->get('isParsed'))->toBeTrue() ->and($component->get('rowCount'))->toBe(1); }); // ─── Continue to Mapping ──────────────────────────────────────────────────── it('continueToMapping creates ImportStore with rows', function (): void { $csv = makeCsvFile("Name,Email\nJohn,john@test.com\nJane,jane@test.com\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); $component->call('continueToMapping'); $component->assertDispatched('completed', function (string $event, array $params): bool { $this->createdStoreIds[] = $params['storeId']; $import = Import::find($params['storeId']); $store = ImportStore::load($params['storeId']); expect($import)->not->toBeNull() ->and($store)->not->toBeNull() ->and($import->headers)->toBe(['Name', 'Email']) ->and($import->total_rows)->toBe(2) ->and($import->status)->toBe(ImportStatus::Mapping); $rows = $store->query()->get(); expect($rows)->toHaveCount(2); $firstRow = $rows->first(); expect($firstRow->raw_data->get('Name'))->toBe('John') ->and($firstRow->raw_data->get('Email'))->toBe('john@test.com'); return true; }); }); it('continueToMapping dispatches completed event with correct params', function (): void { $csv = makeCsvFile("Name,Email,Phone\nJohn,john@test.com,555\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); $component->call('continueToMapping'); $component->assertDispatched('completed', function (string $event, array $params): bool { $this->createdStoreIds[] = $params['storeId']; expect($params['rowCount'])->toBe(1) ->and($params['columnCount'])->toBe(3) ->and($params['storeId'])->toBeString()->not->toBeEmpty(); return true; }); }); it('continueToMapping fails when file is missing', function (): void { $component = mountUploadStep($this); $component->set('isParsed', true); $component->call('continueToMapping'); $component->assertHasErrors(['uploadedFile' => 'File no longer available. Please re-upload.']); expect($component->get('isParsed'))->toBeFalse(); }); // ─── Remove File ──────────────────────────────────────────────────────────── it('removeFile resets state', function (): void { $csv = makeCsvFile("Name,Email\nJohn,john@test.com\n"); $component = mountUploadStep($this); $component->set('uploadedFile', $csv); expect($component->get('isParsed'))->toBeTrue(); $component->call('removeFile'); expect($component->get('isParsed'))->toBeFalse() ->and($component->get('headers'))->toBe([]) ->and($component->get('rowCount'))->toBe(0); }); ================================================ FILE: tests/Feature/ImportWizard/Support/EntityLinkResolverTest.php ================================================ user = User::factory()->withTeam()->create(); $this->team = $this->user->currentTeam; }); it('resolves team member by email via pivot', function (): void { $member = User::factory()->create(); $this->team->users()->attach($member, ['role' => 'editor']); $resolver = new EntityLinkResolver($this->team->id); $link = EntityLink::belongsTo('account_owner', User::class) ->matchableFields([MatchableField::email('email')]) ->foreignKey('account_owner_id'); $matcher = MatchableField::email('email'); $result = $resolver->batchResolve($link, $matcher, [$member->email]); expect($result[$member->email])->toBe($member->id); }); it('resolves team owner by email', function (): void { $resolver = new EntityLinkResolver($this->team->id); $link = EntityLink::belongsTo('account_owner', User::class) ->matchableFields([MatchableField::email('email')]) ->foreignKey('account_owner_id'); $matcher = MatchableField::email('email'); $result = $resolver->batchResolve($link, $matcher, [$this->user->email]); expect($result[$this->user->email])->toBe($this->user->id); }); it('resolves team member by ID', function (): void { $member = User::factory()->create(); $this->team->users()->attach($member, ['role' => 'editor']); $resolver = new EntityLinkResolver($this->team->id); $link = EntityLink::belongsTo('account_owner', User::class) ->matchableFields([MatchableField::id()]) ->foreignKey('account_owner_id'); $matcher = MatchableField::id(); $result = $resolver->batchResolve($link, $matcher, [$member->id]); expect($result[$member->id])->toBe($member->id); }); it('returns null for non-team-member email', function (): void { $stranger = User::factory()->create(); $resolver = new EntityLinkResolver($this->team->id); $link = EntityLink::belongsTo('account_owner', User::class) ->matchableFields([MatchableField::email('email')]) ->foreignKey('account_owner_id'); $matcher = MatchableField::email('email'); $result = $resolver->batchResolve($link, $matcher, [$stranger->email]); expect($result[$stranger->email])->toBeNull(); }); it('resolves multiple team members in batch', function (): void { $member1 = User::factory()->create(); $member2 = User::factory()->create(); $this->team->users()->attach($member1, ['role' => 'editor']); $this->team->users()->attach($member2, ['role' => 'editor']); $resolver = new EntityLinkResolver($this->team->id); $link = EntityLink::belongsTo('account_owner', User::class) ->matchableFields([MatchableField::email('email')]) ->foreignKey('account_owner_id'); $matcher = MatchableField::email('email'); $result = $resolver->batchResolve($link, $matcher, [$member1->email, $member2->email]); expect($result[$member1->email])->toBe($member1->id) ->and($result[$member2->email])->toBe($member2->id); }); ================================================ FILE: tests/Feature/ImportWizard/Validation/ColumnValidatorTest.php ================================================ importField = new ImportField( key: 'test', label: 'Test', rules: $rules, type: $type, acceptsArbitraryValues: $arbitrary, options: $options, ); return $column; } // ─── Text Validation ──────────────────────────────────────────────────────── it('passes valid text with no rules', function (): void { $column = makeColumnData(FieldDataType::STRING); $validator = new ColumnValidator; expect($validator->validate($column, 'hello world'))->toBeNull(); }); it('rejects invalid email in text field with email rule', function (): void { $column = makeColumnData(FieldDataType::STRING, rules: ['email', 'max:254']); $validator = new ColumnValidator; $error = $validator->validate($column, 'not-an-email'); expect($error) ->toBeInstanceOf(ValidationError::class) ->getMessage()->not->toBeNull(); }); // ─── Multi-Choice Arbitrary ───────────────────────────────────────────────── it('passes all valid emails in multi-choice arbitrary field', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, rules: ['email', 'max:254'], arbitrary: true, ); $validator = new ColumnValidator; expect($validator->validate($column, 'alice@test.com, bob@test.com'))->toBeNull(); }); it('returns per-item errors for invalid emails in multi-choice arbitrary field', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, rules: ['email', 'max:254'], arbitrary: true, ); $validator = new ColumnValidator; $error = $validator->validate($column, 'valid@test.com, not-an-email, another-bad'); expect($error) ->toBeInstanceOf(ValidationError::class) ->hasItemErrors()->toBeTrue(); $itemErrors = $error->getItemErrors(); expect($itemErrors) ->toHaveKey('not-an-email') ->toHaveKey('another-bad') ->not->toHaveKey('valid@test.com'); }); it('filters out empty items from trailing commas', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, rules: ['email', 'max:254'], arbitrary: true, ); $validator = new ColumnValidator; expect($validator->validate($column, 'valid@test.com, , ,'))->toBeNull(); }); it('passes multi-choice arbitrary with no rules', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, rules: [], arbitrary: true, ); $validator = new ColumnValidator; expect($validator->validate($column, 'anything, goes, here'))->toBeNull(); }); // ─── Multi-Choice Predefined ──────────────────────────────────────────────── it('passes all valid options in multi-choice predefined field', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, options: [ ['label' => 'Red', 'value' => 'red'], ['label' => 'Blue', 'value' => 'blue'], ], ); $validator = new ColumnValidator; expect($validator->validate($column, 'red, blue'))->toBeNull(); }); it('returns per-item errors for invalid options in multi-choice predefined field', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, options: [ ['label' => 'Red', 'value' => 'red'], ['label' => 'Blue', 'value' => 'blue'], ], ); $validator = new ColumnValidator; $error = $validator->validate($column, 'red, green, purple'); expect($error) ->toBeInstanceOf(ValidationError::class) ->hasItemErrors()->toBeTrue(); $itemErrors = $error->getItemErrors(); expect($itemErrors) ->toHaveKey('green') ->toHaveKey('purple') ->not->toHaveKey('red'); expect($itemErrors['green'])->toBe('Not a valid option'); }); // ─── Single-Choice Predefined ─────────────────────────────────────────────── it('passes valid option in single-choice predefined field', function (): void { $column = makeColumnData( FieldDataType::SINGLE_CHOICE, options: [ ['label' => 'Active', 'value' => 'active'], ['label' => 'Inactive', 'value' => 'inactive'], ], ); $validator = new ColumnValidator; expect($validator->validate($column, 'active'))->toBeNull(); }); it('rejects invalid option in single-choice predefined field', function (): void { $column = makeColumnData( FieldDataType::SINGLE_CHOICE, options: [ ['label' => 'Active', 'value' => 'active'], ['label' => 'Inactive', 'value' => 'inactive'], ], ); $validator = new ColumnValidator; $error = $validator->validate($column, 'unknown'); expect($error) ->toBeInstanceOf(ValidationError::class) ->getMessage()->toContain('Invalid choice'); }); // ─── Date Validation ──────────────────────────────────────────────────────── it('passes valid ISO date', function (): void { $column = makeColumnData(FieldDataType::DATE); $validator = new ColumnValidator; expect($validator->validate($column, '2024-05-15'))->toBeNull(); }); it('rejects invalid date format', function (): void { $column = makeColumnData(FieldDataType::DATE); $validator = new ColumnValidator; $error = $validator->validate($column, 'not-a-date'); expect($error) ->toBeInstanceOf(ValidationError::class) ->getMessage()->toContain('Invalid date format'); }); it('validates date with custom European format', function (): void { $column = makeColumnData(FieldDataType::DATE); $column = $column->withDateFormat(DateFormat::EUROPEAN); $validator = new ColumnValidator; expect($validator->validate($column, '15/05/2024'))->toBeNull(); expect($validator->validate($column, '2024-05-15')) ->toBeInstanceOf(ValidationError::class) ->getMessage()->toContain('European'); }); it('validates date with custom American format', function (): void { $column = makeColumnData(FieldDataType::DATE); $column = $column->withDateFormat(DateFormat::AMERICAN); $validator = new ColumnValidator; expect($validator->validate($column, '05/15/2024'))->toBeNull(); }); // ─── Number Validation ───────────────────────────────────────────────────── it('passes valid number with point format', function (): void { $column = makeColumnData(FieldDataType::FLOAT); $validator = new ColumnValidator; expect($validator->validate($column, '1234.56'))->toBeNull(); }); it('rejects invalid number value', function (): void { $column = makeColumnData(FieldDataType::FLOAT); $validator = new ColumnValidator; $error = $validator->validate($column, 'not-a-number'); expect($error) ->toBeInstanceOf(ValidationError::class) ->getMessage()->toContain('Invalid number format'); }); it('validates number with custom comma format', function (): void { $column = makeColumnData(FieldDataType::FLOAT); $column = $column->withNumberFormat(NumberFormat::COMMA); $validator = new ColumnValidator; expect($validator->validate($column, '1.234,56'))->toBeNull(); expect($validator->validate($column, 'abc')) ->toBeInstanceOf(ValidationError::class) ->getMessage()->toContain('Comma'); }); // ─── Edge Cases ──────────────────────────────────────────────────────────── it('strips required and nullable from preview rules', function (): void { $column = makeColumnData(FieldDataType::STRING, rules: ['required', 'email', 'nullable']); $validator = new ColumnValidator; expect($validator->validate($column, 'valid@test.com'))->toBeNull(); expect($validator->validate($column, 'not-an-email')) ->toBeInstanceOf(ValidationError::class); }); it('returns valid for text with only required/nullable rules', function (): void { $column = makeColumnData(FieldDataType::STRING, rules: ['required', 'nullable']); $validator = new ColumnValidator; expect($validator->validate($column, 'anything'))->toBeNull(); }); it('returns valid for multi-choice arbitrary with only required rule', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, rules: ['required'], arbitrary: true, ); $validator = new ColumnValidator; expect($validator->validate($column, 'anything, goes'))->toBeNull(); }); it('formats choice error message with truncation for many options', function (): void { $options = []; for ($i = 1; $i <= 7; $i++) { $options[] = ['label' => "Option {$i}", 'value' => "opt{$i}"]; } $column = makeColumnData(FieldDataType::SINGLE_CHOICE, options: $options); $validator = new ColumnValidator; $error = $validator->validate($column, 'invalid'); expect($error)->toBeInstanceOf(ValidationError::class); $message = $error->getMessage(); expect($message) ->toContain('opt1') ->toContain('opt5') ->not->toContain('opt6') ->toContain('...'); }); it('formats choice error message without truncation for few options', function (): void { $options = [ ['label' => 'A', 'value' => 'a'], ['label' => 'B', 'value' => 'b'], ['label' => 'C', 'value' => 'c'], ]; $column = makeColumnData(FieldDataType::SINGLE_CHOICE, options: $options); $validator = new ColumnValidator; $error = $validator->validate($column, 'invalid'); $message = $error->getMessage(); expect($message) ->toContain('a') ->toContain('b') ->toContain('c') ->not->toContain('...'); }); it('validates single choice case-insensitively', function (): void { $column = makeColumnData( FieldDataType::SINGLE_CHOICE, options: [ ['label' => 'Active', 'value' => 'active'], ['label' => 'Inactive', 'value' => 'inactive'], ], ); $validator = new ColumnValidator; expect($validator->validate($column, 'Active'))->toBeNull() ->and($validator->validate($column, 'ACTIVE'))->toBeNull() ->and($validator->validate($column, 'active'))->toBeNull(); }); it('validates multi-choice predefined case-insensitively', function (): void { $column = makeColumnData( FieldDataType::MULTI_CHOICE, options: [ ['label' => 'Red', 'value' => 'red'], ['label' => 'Blue', 'value' => 'blue'], ], ); $validator = new ColumnValidator; expect($validator->validate($column, 'Red, BLUE'))->toBeNull() ->and($validator->validate($column, 'RED, blue'))->toBeNull(); }); it('formats choice error message with exactly 5 options without ellipsis', function (): void { $options = []; for ($i = 1; $i <= 5; $i++) { $options[] = ['label' => "Option {$i}", 'value' => "opt{$i}"]; } $column = makeColumnData(FieldDataType::SINGLE_CHOICE, options: $options); $validator = new ColumnValidator; $error = $validator->validate($column, 'invalid'); expect($error->getMessage())->not->toContain('...'); }); ================================================ FILE: tests/Feature/ImportWizard/Validation/EntityLinkValidatorTest.php ================================================ except([TeamCreated::class]); $this->user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); $this->companyLink = new EntityLink( key: 'company', source: EntityLinkSource::Relationship, targetEntity: 'company', targetModelClass: Company::class, ); }); it('returns no validation errors for Create matcher', function (): void { Company::factory()->create([ 'name' => 'Acme Corp', 'team_id' => $this->team->id, ]); $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::name(); $error = $validator->validate($this->companyLink, $matcher, 'Nonexistent Company'); expect($error)->toBeNull(); }); it('batch validates with no errors for Create matcher', function (): void { Company::factory()->create([ 'name' => 'Acme Corp', 'team_id' => $this->team->id, ]); $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::name(); $results = $validator->batchValidate($this->companyLink, $matcher, ['Nonexistent', 'Acme Corp', 'Another']); expect($results)->toBe([ 'Nonexistent' => null, 'Acme Corp' => null, 'Another' => null, ]); }); it('returns validation error for MatchOnly matcher when record not found', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); $error = $validator->validate($this->companyLink, $matcher, '99999'); expect($error)->not->toBeNull() ->and($error)->toContain('99999'); }); it('returns null for empty value', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); expect($validator->validate($this->companyLink, $matcher, ''))->toBeNull(); expect($validator->validate($this->companyLink, $matcher, null))->toBeNull(); expect($validator->validate($this->companyLink, $matcher, ' '))->toBeNull(); }); it('returns null for existing record found by id', function (): void { $company = Company::factory()->create(['team_id' => $this->team->id]); $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); expect($validator->validate($this->companyLink, $matcher, (string) $company->id))->toBeNull(); }); it('batch validates with mixed found and not found records', function (): void { $company = Company::factory()->create(['team_id' => $this->team->id]); $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); $results = $validator->batchValidate( $this->companyLink, $matcher, [(string) $company->id, '99999'], ); expect($results[(string) $company->id])->toBeNull() ->and($results['99999'])->not->toBeNull() ->and($results['99999'])->toContain('99999'); }); it('batch validates with empty values returns null for empty', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); $results = $validator->batchValidate($this->companyLink, $matcher, ['', ' ']); expect($results)->toBe(['' => null, ' ' => null]); }); it('batch validates returns early with empty array after trimming', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); $results = $validator->batchValidate($this->companyLink, $matcher, ['']); expect($results)->toBe(['' => null]); }); it('getResolvedId returns null for empty value', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); expect($validator->getResolvedId($this->companyLink, $matcher, ''))->toBeNull(); expect($validator->getResolvedId($this->companyLink, $matcher, null))->toBeNull(); }); it('getResolvedId resolves existing record', function (): void { $company = Company::factory()->create(['team_id' => $this->team->id]); $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); $id = $validator->getResolvedId($this->companyLink, $matcher, (string) $company->id); expect($id)->toBe($company->id); }); it('builds error message with entity link label and matcher info', function (): void { $link = new EntityLink( key: 'company', source: EntityLinkSource::Relationship, targetEntity: 'company', targetModelClass: Company::class, label: 'Company', ); $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); $error = $validator->validate($link, $matcher, '99999'); expect($error) ->toContain('Company') ->toContain('99999') ->toContain('Record ID'); }); it('getResolvedId returns null for whitespace-only value', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); expect($validator->getResolvedId($this->companyLink, $matcher, ' '))->toBeNull(); }); it('getResolvedId returns null for non-existing record', function (): void { $validator = new EntityLinkValidator((string) $this->team->id); $matcher = MatchableField::id(); expect($validator->getResolvedId($this->companyLink, $matcher, '99999'))->toBeNull(); }); it('validateFromColumn returns null for field mapping column', function (): void { $column = ColumnData::toField(source: 'Name', target: 'name'); $importer = new CompanyImporter((string) $this->team->id); $validator = new EntityLinkValidator((string) $this->team->id); expect($validator->validateFromColumn($column, $importer, 'test'))->toBeNull(); }); it('validateFromColumn validates entity link column', function (): void { $column = ColumnData::toEntityLink( source: 'Company', matcherKey: 'id', entityLinkKey: 'company', ); $column->entityLinkField = new EntityLink( key: 'company', source: EntityLinkSource::Relationship, targetEntity: 'company', targetModelClass: Company::class, matchableFields: [MatchableField::id()], ); $importer = new CompanyImporter((string) $this->team->id); $validator = new EntityLinkValidator((string) $this->team->id); $error = $validator->validateFromColumn($column, $importer, '99999'); expect($error)->not->toBeNull() ->and($error)->toContain('99999'); }); it('batchValidateFromColumn returns null for field mapping column', function (): void { $column = ColumnData::toField(source: 'Name', target: 'name'); $importer = new CompanyImporter((string) $this->team->id); $validator = new EntityLinkValidator((string) $this->team->id); $results = $validator->batchValidateFromColumn($column, $importer, ['test1', 'test2']); expect($results)->toBe(['test1' => null, 'test2' => null]); }); it('batchValidateFromColumn validates entity link column', function (): void { $company = Company::factory()->create(['team_id' => $this->team->id]); $column = ColumnData::toEntityLink( source: 'Company', matcherKey: 'id', entityLinkKey: 'company', ); $column->entityLinkField = new EntityLink( key: 'company', source: EntityLinkSource::Relationship, targetEntity: 'company', targetModelClass: Company::class, matchableFields: [MatchableField::id()], ); $importer = new CompanyImporter((string) $this->team->id); $validator = new EntityLinkValidator((string) $this->team->id); $results = $validator->batchValidateFromColumn($column, $importer, [(string) $company->id, '99999']); expect($results[(string) $company->id])->toBeNull() ->and($results['99999'])->not->toBeNull(); }); ================================================ FILE: tests/Feature/Mcp/CompanyToolsTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); afterEach(function () { Company::clearBootedModels(); }); it('can get a company by ID', function (): void { $company = Company::factory()->for($this->team)->create(['name' => 'Acme Corp']); RelaticleServer::actingAs($this->user) ->tool(GetCompanyTool::class, ['id' => $company->id]) ->assertOk() ->assertSee('Acme Corp'); }); describe('team scoping', function () { beforeEach(function () { // Apply team scope as SetApiTeamContext middleware does in production Company::addGlobalScope(new TeamScope); }); it('scopes companies to current team', function (): void { $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => Team::factory()->create()->id, 'name' => 'Other Team Corp', ])); $ownCompany = Company::factory()->for($this->team)->create(['name' => 'Own Team Corp']); RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class) ->assertOk() ->assertSee('Own Team Corp') ->assertDontSee('Other Team Corp'); }); it('cannot update a company from another team', function (): void { $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $otherCompany->id, 'name' => 'Hacked', ]) ->assertHasErrors(['not found']); }); it('cannot delete a company from another team', function (): void { $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(DeleteCompanyTool::class, [ 'id' => $otherCompany->id, ]) ->assertHasErrors(['not found']); }); it('cannot get a company from another team', function (): void { $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(GetCompanyTool::class, [ 'id' => $otherCompany->id, ]) ->assertHasErrors(['not found']); }); it('excludes soft-deleted companies from list', function (): void { $deleted = Company::factory()->for($this->team)->create(['name' => 'Deleted Corp']); $deleted->delete(); $active = Company::factory()->for($this->team)->create(['name' => 'Active Corp']); RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class) ->assertOk() ->assertSee('Active Corp') ->assertDontSee('Deleted Corp'); }); }); describe('pagination', function () { it('can paginate companies via MCP tool', function (): void { Company::factory(3)->for($this->team)->create(); $page1 = RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class, [ 'per_page' => 2, 'page' => 1, ]); $page1->assertOk(); $page2 = RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class, [ 'per_page' => 2, 'page' => 2, ]); $page2->assertOk(); }); it('includes pagination metadata in list responses', function (): void { Company::factory(3)->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class, [ 'per_page' => 2, 'page' => 1, ]) ->assertOk() ->assertSee('"meta"') ->assertSee('"current_page": 1') ->assertSee('"per_page": 2'); }); }); describe('custom fields serialization', function () { it('returns empty custom_fields as object not array', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(GetCompanyTool::class, ['id' => $company->id]) ->assertOk() ->assertSee('"custom_fields": {}'); }); }); describe('validation', function () { it('rejects empty name on create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, []) ->assertHasErrors(['name']); }); it('rejects name exceeding 255 characters', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => str_repeat('a', 256), ]) ->assertHasErrors(['name']); }); it('sets creation source to MCP', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Source Test Corp', ]) ->assertOk(); $company = Company::query()->where('name', 'Source Test Corp')->first(); expect($company->creation_source)->toBe(CreationSource::MCP); }); }); ================================================ FILE: tests/Feature/Mcp/CrmSummaryResourceTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('returns CRM summary with record counts', function (): void { Company::factory()->for($this->team)->count(3)->create(); People::factory()->for($this->team)->count(5)->create(); Opportunity::factory()->for($this->team)->count(2)->create(); $response = RelaticleServer::actingAs($this->user) ->resource(CrmSummaryResource::class); $response->assertOk() ->assertSee('"companies"') ->assertSee('"people"') ->assertSee('"opportunities"') ->assertSee('"tasks"') ->assertSee('"notes"'); }); it('includes opportunity pipeline breakdown', function (): void { $opp = Opportunity::factory()->for($this->team)->create(); $stageField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->getKey()) ->where('entity_type', 'opportunity') ->where('code', 'stage') ->first(); if ($stageField) { $opp->saveCustomFieldValue($stageField, 'Proposal'); } $response = RelaticleServer::actingAs($this->user) ->resource(CrmSummaryResource::class); $response->assertOk() ->assertSee('by_stage') ->assertSee('total_pipeline_value'); }); it('includes task overdue and due this week counts', function (): void { Task::factory()->for($this->team)->create(); $response = RelaticleServer::actingAs($this->user) ->resource(CrmSummaryResource::class); $response->assertOk() ->assertSee('"overdue"') ->assertSee('"due_this_week"'); }); ================================================ FILE: tests/Feature/Mcp/Filters/CustomFieldFilterTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); $this->actingAs($this->user); Opportunity::addGlobalScope(new TeamScope); }); afterEach(function (): void { Opportunity::clearBootedModels(); }); it('filters by custom field equality', function (): void { $opportunity1 = Opportunity::factory()->for($this->team)->create(['name' => 'Deal A']); $opportunity2 = Opportunity::factory()->for($this->team)->create(['name' => 'Deal B']); $stageField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->getKey()) ->where('entity_type', 'opportunity') ->where('code', 'stage') ->first(); expect($stageField)->not->toBeNull('Stage custom field must exist for this test'); $opportunity1->saveCustomFieldValue($stageField, 'Proposal'); $opportunity2->saveCustomFieldValue($stageField, 'Prospecting'); $request = new Request([ 'filter' => [ 'custom_fields' => [ 'stage' => ['eq' => 'Proposal'], ], ], ]); $results = QueryBuilder::for(Opportunity::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::custom('custom_fields', new CustomFieldFilter('opportunity')), ) ->get(); expect($results)->toHaveCount(1) ->and($results->first()->name)->toBe('Deal A'); }); it('filters by currency field with gte operator', function (): void { $opportunity1 = Opportunity::factory()->for($this->team)->create(['name' => 'Big Deal']); $opportunity2 = Opportunity::factory()->for($this->team)->create(['name' => 'Small Deal']); $amountField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->getKey()) ->where('entity_type', 'opportunity') ->where('code', 'amount') ->first(); expect($amountField)->not->toBeNull('Amount custom field must exist for this test'); $opportunity1->saveCustomFieldValue($amountField, 100000); $opportunity2->saveCustomFieldValue($amountField, 5000); $request = new Request([ 'filter' => [ 'custom_fields' => [ 'amount' => ['gte' => 50000], ], ], ]); $results = QueryBuilder::for(Opportunity::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::custom('custom_fields', new CustomFieldFilter('opportunity')), ) ->get(); expect($results)->toHaveCount(1) ->and($results->first()->name)->toBe('Big Deal'); }); it('silently ignores unknown field codes', function (): void { $countBefore = Opportunity::query()->count(); Opportunity::factory()->for($this->team)->create(); $request = new Request([ 'filter' => [ 'custom_fields' => [ 'nonexistent_field' => ['eq' => 'test'], ], ], ]); $results = QueryBuilder::for(Opportunity::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::custom('custom_fields', new CustomFieldFilter('opportunity')), ) ->get(); expect($results)->toHaveCount($countBefore + 1); }); it('rejects more than 10 filter conditions', function (): void { $filters = []; for ($i = 0; $i < 11; $i++) { $filters["field_{$i}"] = ['eq' => 'test']; } $request = new Request([ 'filter' => ['custom_fields' => $filters], ]); QueryBuilder::for(Opportunity::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::custom('custom_fields', new CustomFieldFilter('opportunity')), ) ->get(); })->throws(HttpException::class); it('handles empty filter object as no-op', function (): void { $countBefore = Opportunity::query()->count(); Opportunity::factory()->for($this->team)->count(3)->create(); $request = new Request([ 'filter' => [ 'custom_fields' => [], ], ]); $results = QueryBuilder::for(Opportunity::query()->withCustomFieldValues(), $request) ->allowedFilters( AllowedFilter::custom('custom_fields', new CustomFieldFilter('opportunity')), ) ->get(); expect($results)->toHaveCount($countBefore + 3); }); ================================================ FILE: tests/Feature/Mcp/Filters/CustomFieldSortTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); $this->actingAs($this->user); Opportunity::addGlobalScope(new TeamScope); }); afterEach(function (): void { Opportunity::clearBootedModels(); }); it('sorts opportunities by custom field value ascending', function (): void { $opp1 = Opportunity::factory()->for($this->team)->create(['name' => 'A']); $opp2 = Opportunity::factory()->for($this->team)->create(['name' => 'B']); $amountField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->getKey()) ->where('entity_type', 'opportunity') ->where('code', 'amount') ->first(); expect($amountField)->not->toBeNull(); $opp1->saveCustomFieldValue($amountField, 50000); $opp2->saveCustomFieldValue($amountField, 100000); $request = new Request(['sort' => 'amount']); $results = QueryBuilder::for( Opportunity::query()->where('team_id', $this->team->getKey())->withCustomFieldValues(), $request, ) ->allowedSorts( AllowedSort::custom('amount', new CustomFieldSort('opportunity')), ) ->get(); $names = $results->pluck('name')->values(); $indexA = $names->search('A'); $indexB = $names->search('B'); expect($indexA)->toBeLessThan($indexB); }); it('sorts opportunities by custom field value descending', function (): void { $opp1 = Opportunity::factory()->for($this->team)->create(['name' => 'A']); $opp2 = Opportunity::factory()->for($this->team)->create(['name' => 'B']); $amountField = CustomField::query() ->withoutGlobalScopes() ->where('tenant_id', $this->team->getKey()) ->where('entity_type', 'opportunity') ->where('code', 'amount') ->first(); expect($amountField)->not->toBeNull(); $opp1->saveCustomFieldValue($amountField, 50000); $opp2->saveCustomFieldValue($amountField, 100000); $request = new Request(['sort' => '-amount']); $results = QueryBuilder::for( Opportunity::query()->where('team_id', $this->team->getKey())->withCustomFieldValues(), $request, ) ->allowedSorts( AllowedSort::custom('amount', new CustomFieldSort('opportunity')), ) ->get(); $names = $results->pluck('name')->values(); $indexA = $names->search('A'); $indexB = $names->search('B'); expect($indexB)->toBeLessThan($indexA); }); ================================================ FILE: tests/Feature/Mcp/McpToolFeaturesTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); // --------------------------------------------------------------------------- // ListTasksTool: assigned_to_me filter // --------------------------------------------------------------------------- describe('ListTasksTool assigned_to_me', function () { it('filters tasks assigned to the current user', function (): void { $assignedTask = Task::factory()->for($this->team)->create(['title' => 'Assigned Task']); $assignedTask->assignees()->attach($this->user); $unassignedTask = Task::factory()->for($this->team)->create(['title' => 'Unassigned Task']); RelaticleServer::actingAs($this->user) ->tool(ListTasksTool::class, [ 'assigned_to_me' => true, ]) ->assertOk() ->assertSee('Assigned Task') ->assertDontSee('Unassigned Task'); }); it('returns all tasks when assigned_to_me is not set', function (): void { $assignedTask = Task::factory()->for($this->team)->create(['title' => 'Assigned Task']); $assignedTask->assignees()->attach($this->user); Task::factory()->for($this->team)->create(['title' => 'Unassigned Task']); RelaticleServer::actingAs($this->user) ->tool(ListTasksTool::class) ->assertOk() ->assertSee('Assigned Task') ->assertSee('Unassigned Task'); }); }); // --------------------------------------------------------------------------- // ListNotesTool: notable_type / notable_id filtering // --------------------------------------------------------------------------- describe('ListNotesTool notable filtering', function () { it('filters notes by notable_type company', function (): void { $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(); $companyNote = Note::factory()->for($this->team)->create(['title' => 'Company Note']); $companyNote->companies()->attach($company); $personNote = Note::factory()->for($this->team)->create(['title' => 'Person Note']); $personNote->people()->attach($person); RelaticleServer::actingAs($this->user) ->tool(ListNotesTool::class, [ 'notable_type' => 'company', ]) ->assertOk() ->assertSee('Company Note') ->assertDontSee('Person Note'); }); it('filters notes by notable_type people', function (): void { $company = Company::factory()->for($this->team)->create(); $person = People::factory()->for($this->team)->create(); $companyNote = Note::factory()->for($this->team)->create(['title' => 'Company Note']); $companyNote->companies()->attach($company); $personNote = Note::factory()->for($this->team)->create(['title' => 'Person Note']); $personNote->people()->attach($person); RelaticleServer::actingAs($this->user) ->tool(ListNotesTool::class, [ 'notable_type' => 'people', ]) ->assertOk() ->assertSee('Person Note') ->assertDontSee('Company Note'); }); it('filters notes by notable_id', function (): void { $company1 = Company::factory()->for($this->team)->create(); $company2 = Company::factory()->for($this->team)->create(); $note1 = Note::factory()->for($this->team)->create(['title' => 'Note For Company 1']); $note1->companies()->attach($company1); $note2 = Note::factory()->for($this->team)->create(['title' => 'Note For Company 2']); $note2->companies()->attach($company2); RelaticleServer::actingAs($this->user) ->tool(ListNotesTool::class, [ 'notable_id' => $company1->id, ]) ->assertOk() ->assertSee('Note For Company 1') ->assertDontSee('Note For Company 2'); }); it('filters notes by notable_type and notable_id combined', function (): void { $company = Company::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(); $companyNote = Note::factory()->for($this->team)->create(['title' => 'Specific Company Note']); $companyNote->companies()->attach($company); $opportunityNote = Note::factory()->for($this->team)->create(['title' => 'Opportunity Note']); $opportunityNote->opportunities()->attach($opportunity); RelaticleServer::actingAs($this->user) ->tool(ListNotesTool::class, [ 'notable_type' => 'company', 'notable_id' => $company->id, ]) ->assertOk() ->assertSee('Specific Company Note') ->assertDontSee('Opportunity Note'); }); }); // --------------------------------------------------------------------------- // creation_source = MCP for all entities // --------------------------------------------------------------------------- describe('creation_source is MCP', function () { it('sets creation_source to MCP for companies', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, ['name' => 'MCP Source Company']) ->assertOk(); $company = Company::query()->where('name', 'MCP Source Company')->first(); expect($company->creation_source)->toBe(CreationSource::MCP); }); it('sets creation_source to MCP for people', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, ['name' => 'MCP Source Person']) ->assertOk(); $person = People::query()->where('name', 'MCP Source Person')->first(); expect($person->creation_source)->toBe(CreationSource::MCP); }); it('sets creation_source to MCP for opportunities', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, ['name' => 'MCP Source Deal']) ->assertOk(); $opportunity = Opportunity::query()->where('name', 'MCP Source Deal')->first(); expect($opportunity->creation_source)->toBe(CreationSource::MCP); }); it('sets creation_source to MCP for tasks', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, ['title' => 'MCP Source Task']) ->assertOk(); $task = Task::query()->where('title', 'MCP Source Task')->first(); expect($task->creation_source)->toBe(CreationSource::MCP); }); it('sets creation_source to MCP for notes', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, ['title' => 'MCP Source Note']) ->assertOk(); $note = Note::query()->where('title', 'MCP Source Note')->first(); expect($note->creation_source)->toBe(CreationSource::MCP); }); }); // --------------------------------------------------------------------------- // Required-field validation for all entities // --------------------------------------------------------------------------- describe('required-field validation', function () { it('rejects empty name on company create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, []) ->assertHasErrors(['name']); }); it('rejects empty name on people create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, []) ->assertHasErrors(['name']); }); it('rejects empty name on opportunity create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, []) ->assertHasErrors(['name']); }); it('rejects empty title on task create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, []) ->assertHasErrors(['title']); }); it('rejects empty title on note create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, []) ->assertHasErrors(['title']); }); it('rejects name exceeding 255 characters for people', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, ['name' => str_repeat('a', 256)]) ->assertHasErrors(['name']); }); it('rejects name exceeding 255 characters for opportunity', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, ['name' => str_repeat('a', 256)]) ->assertHasErrors(['name']); }); it('rejects title exceeding 255 characters for task', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, ['title' => str_repeat('a', 256)]) ->assertHasErrors(['title']); }); it('rejects title exceeding 255 characters for note', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, ['title' => str_repeat('a', 256)]) ->assertHasErrors(['title']); }); }); // --------------------------------------------------------------------------- // Custom field create/update tests for all entities // --------------------------------------------------------------------------- describe('custom field create via MCP', function () { beforeEach(function () { $entityTypes = ['company', 'people', 'opportunity', 'task', 'note']; foreach ($entityTypes as $entityType) { $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => $entityType, 'name' => "MCP Test Section for {$entityType}", 'code' => "mcp_test_{$entityType}", 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => $entityType, 'code' => 'cf_website', 'name' => 'Website', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); } }); it('creates company with custom fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'CF Test Company', 'custom_fields' => ['cf_website' => 'https://example.com'], ]) ->assertOk() ->assertSee('CF Test Company'); $company = Company::query()->where('name', 'CF Test Company')->first(); expect($company)->not->toBeNull(); }); it('creates person with custom fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, [ 'name' => 'CF Test Person', 'custom_fields' => ['cf_website' => 'https://example.com'], ]) ->assertOk() ->assertSee('CF Test Person'); $person = People::query()->where('name', 'CF Test Person')->first(); expect($person)->not->toBeNull(); }); it('creates opportunity with custom fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, [ 'name' => 'CF Test Deal', 'custom_fields' => ['cf_website' => 'https://example.com'], ]) ->assertOk() ->assertSee('CF Test Deal'); $opportunity = Opportunity::query()->where('name', 'CF Test Deal')->first(); expect($opportunity)->not->toBeNull(); }); it('creates task with custom fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, [ 'title' => 'CF Test Task', 'custom_fields' => ['cf_website' => 'https://example.com'], ]) ->assertOk() ->assertSee('CF Test Task'); $task = Task::query()->where('title', 'CF Test Task')->first(); expect($task)->not->toBeNull(); }); it('creates note with custom fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, [ 'title' => 'CF Test Note', 'custom_fields' => ['cf_website' => 'https://example.com'], ]) ->assertOk() ->assertSee('CF Test Note'); $note = Note::query()->where('title', 'CF Test Note')->first(); expect($note)->not->toBeNull(); }); }); describe('custom field update via MCP', function () { beforeEach(function () { $entityTypes = ['company', 'people', 'opportunity', 'task', 'note']; foreach ($entityTypes as $entityType) { $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => $entityType, 'name' => "MCP Update Section for {$entityType}", 'code' => "mcp_update_{$entityType}", 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => $entityType, 'code' => 'cf_notes', 'name' => 'Notes', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); } }); it('updates company with custom fields', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'custom_fields' => ['cf_notes' => 'Updated via MCP'], ]) ->assertOk(); }); it('updates person with custom fields', function (): void { $person = People::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdatePeopleTool::class, [ 'id' => $person->id, 'custom_fields' => ['cf_notes' => 'Updated via MCP'], ]) ->assertOk(); }); it('updates opportunity with custom fields', function (): void { $opportunity = Opportunity::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateOpportunityTool::class, [ 'id' => $opportunity->id, 'custom_fields' => ['cf_notes' => 'Updated via MCP'], ]) ->assertOk(); }); it('updates task with custom fields', function (): void { $task = Task::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateTaskTool::class, [ 'id' => $task->id, 'custom_fields' => ['cf_notes' => 'Updated via MCP'], ]) ->assertOk(); }); it('updates note with custom fields', function (): void { $note = Note::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateNoteTool::class, [ 'id' => $note->id, 'custom_fields' => ['cf_notes' => 'Updated via MCP'], ]) ->assertOk(); }); }); // --------------------------------------------------------------------------- // BUG-02: Partial custom_fields update must preserve omitted fields // --------------------------------------------------------------------------- describe('partial custom_fields update preserves omitted fields', function () { beforeEach(function () { $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'company', 'name' => 'Partial Update Section', 'code' => 'partial_update', 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'company', 'code' => 'cf_alpha', 'name' => 'Alpha', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'company', 'code' => 'cf_beta', 'name' => 'Beta', 'type' => 'text', 'sort_order' => 2, 'active' => true, 'validation_rules' => [], ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'company', 'code' => 'cf_links', 'name' => 'Links', 'type' => 'link', 'sort_order' => 3, 'active' => true, 'validation_rules' => [], ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'company', 'code' => 'cf_flag', 'name' => 'Flag', 'type' => 'toggle', 'sort_order' => 4, 'active' => true, 'validation_rules' => [], ]); }); it('preserves omitted text fields when updating a subset', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Partial Test Corp', 'custom_fields' => ['cf_alpha' => 'original-alpha', 'cf_beta' => 'original-beta'], ]) ->assertOk(); $company = Company::query()->where('name', 'Partial Test Corp')->firstOrFail(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'custom_fields' => ['cf_alpha' => 'updated-alpha'], ]) ->assertOk() ->assertSee('updated-alpha') ->assertSee('original-beta'); }); it('preserves omitted link fields when updating other fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Link Preserve Corp', 'custom_fields' => [ 'cf_alpha' => 'some-text', 'cf_links' => ['https://example.com', 'https://other.com'], ], ]) ->assertOk(); $company = Company::query()->where('name', 'Link Preserve Corp')->firstOrFail(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'custom_fields' => ['cf_alpha' => 'changed-text'], ]) ->assertOk() ->assertSee('changed-text') ->assertSee('example.com') ->assertSee('other.com'); }); it('preserves omitted toggle fields when updating other fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Toggle Preserve Corp', 'custom_fields' => ['cf_flag' => true, 'cf_alpha' => 'keep-me'], ]) ->assertOk(); $company = Company::query()->where('name', 'Toggle Preserve Corp')->firstOrFail(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'custom_fields' => ['cf_alpha' => 'updated'], ]) ->assertOk() ->assertSee('updated') ->assertSee('true'); }); it('preserves all custom fields when updating only core fields', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Core Update Corp', 'custom_fields' => ['cf_alpha' => 'keep-me', 'cf_beta' => 'keep-me-too'], ]) ->assertOk(); $company = Company::query()->where('name', 'Core Update Corp')->firstOrFail(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'name' => 'Renamed Corp', ]) ->assertOk() ->assertSee('keep-me') ->assertSee('keep-me-too'); }); it('can explicitly set a custom field to null without wiping others', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Null Test Corp', 'custom_fields' => ['cf_alpha' => 'has-value', 'cf_beta' => 'also-has-value'], ]) ->assertOk(); $company = Company::query()->where('name', 'Null Test Corp')->firstOrFail(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'custom_fields' => ['cf_alpha' => null], ]) ->assertOk() ->assertSee('also-has-value'); }); }); // --------------------------------------------------------------------------- // Unknown custom field key rejection // --------------------------------------------------------------------------- describe('unknown custom field key rejection', function () { beforeEach(function () { $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => 'company', 'name' => 'Unknown Key Test Section', 'code' => 'unknown_key_test', 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'company', 'code' => 'valid_field', 'name' => 'Valid Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); }); it('rejects unknown custom field key on create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Unknown Key Company', 'custom_fields' => ['jobTitle' => 'VP of Engineering'], ]) ->assertHasErrors(['Unknown custom field keys: jobTitle']); }); it('rejects unknown custom field key on update', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'custom_fields' => ['nonexistent' => 'some value'], ]) ->assertHasErrors(['Unknown custom field keys: nonexistent']); }); it('rejects unknown key while accepting valid key in same request', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Mixed Keys Company', 'custom_fields' => [ 'valid_field' => 'good value', 'invalid_field' => 'bad value', ], ]) ->assertHasErrors(['Unknown custom field keys: invalid_field']); }); }); // --------------------------------------------------------------------------- // Custom field validation rejection tests (invalid type: string to number field) // --------------------------------------------------------------------------- describe('custom field validation rejection', function () { beforeEach(function () { $entityTypes = ['company', 'people', 'opportunity', 'task', 'note']; foreach ($entityTypes as $entityType) { $section = CustomFieldSection::create([ 'tenant_id' => $this->team->id, 'entity_type' => $entityType, 'name' => "Number Section for {$entityType}", 'code' => "number_{$entityType}", 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $this->team->id, 'custom_field_section_id' => $section->id, 'entity_type' => $entityType, 'code' => 'cf_amount', 'name' => 'Amount', 'type' => 'number', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); } }); it('rejects non-numeric custom field value on company create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'Bad CF Company', 'custom_fields' => ['cf_amount' => 'not_a_number'], ]) ->assertHasErrors(['cf amount']); }); it('rejects non-numeric custom field value on people create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, [ 'name' => 'Bad CF Person', 'custom_fields' => ['cf_amount' => 'not_a_number'], ]) ->assertHasErrors(['cf amount']); }); it('rejects non-numeric custom field value on opportunity create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, [ 'name' => 'Bad CF Deal', 'custom_fields' => ['cf_amount' => 'not_a_number'], ]) ->assertHasErrors(['cf amount']); }); it('rejects non-numeric custom field value on task create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, [ 'title' => 'Bad CF Task', 'custom_fields' => ['cf_amount' => 'not_a_number'], ]) ->assertHasErrors(['cf amount']); }); it('rejects non-numeric custom field value on note create', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, [ 'title' => 'Bad CF Note', 'custom_fields' => ['cf_amount' => 'not_a_number'], ]) ->assertHasErrors(['cf amount']); }); }); // --------------------------------------------------------------------------- // Relationship includes: sensitive field filtering // --------------------------------------------------------------------------- describe('relationship includes filter sensitive fields', function () { it('does not leak sensitive user fields in GetCompanyTool creator include', function (): void { $company = Company::factory()->for($this->team)->create([ 'creator_id' => $this->user->id, ]); RelaticleServer::actingAs($this->user) ->tool(GetCompanyTool::class, [ 'id' => $company->id, 'include' => ['creator'], ]) ->assertOk() ->assertSee($this->user->name) ->assertDontSee('email_verified_at') ->assertDontSee('two_factor_confirmed_at') ->assertDontSee('current_team_id') ->assertDontSee('profile_photo_path') ->assertDontSee('password'); }); it('does not leak sensitive fields in ListCompaniesTool with creator include', function (): void { Company::factory()->for($this->team)->create([ 'creator_id' => $this->user->id, ]); RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class, [ 'include' => ['creator'], ]) ->assertOk() ->assertSee($this->user->name) ->assertDontSee('email_verified_at') ->assertDontSee('two_factor_confirmed_at') ->assertDontSee('current_team_id') ->assertDontSee('profile_photo_path') ->assertDontSee('password'); }); it('serializes related people through resource in GetCompanyTool', function (): void { $company = Company::factory()->for($this->team)->create(); People::factory()->for($this->team)->create([ 'name' => 'Included Person', 'company_id' => $company->id, ]); RelaticleServer::actingAs($this->user) ->tool(GetCompanyTool::class, [ 'id' => $company->id, 'include' => ['people'], ]) ->assertOk() ->assertSee('Included Person') ->assertDontSee('team_id') ->assertDontSee('creator_id') ->assertDontSee('deleted_at'); }); }); // --------------------------------------------------------------------------- // Detach tools: team-scoped validation // --------------------------------------------------------------------------- describe('detach tools reject cross-team entity IDs', function () { it('rejects company from another team when detaching from task', function (): void { $task = Task::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); RelaticleServer::actingAs($this->user) ->tool(DetachTaskFromEntitiesTool::class, [ 'id' => $task->id, 'company_ids' => [$otherCompany->id], ]) ->assertHasErrors(['company_ids.0']); }); it('rejects company from another team when detaching from note', function (): void { $note = Note::factory()->for($this->team)->create(); $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); RelaticleServer::actingAs($this->user) ->tool(DetachNoteFromEntitiesTool::class, [ 'id' => $note->id, 'company_ids' => [$otherCompany->id], ]) ->assertHasErrors(['company_ids.0']); }); }); ================================================ FILE: tests/Feature/Mcp/NoteToolsTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); afterEach(function () { Note::clearBootedModels(); }); it('can create a note linked to a company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, [ 'title' => 'Meeting Notes', 'company_ids' => [$company->id], ]) ->assertOk() ->assertSee('Meeting Notes'); $note = Note::query()->where('title', 'Meeting Notes')->firstOrFail(); expect($note->companies)->toHaveCount(1) ->and($note->companies->first()->id)->toBe($company->id); }); it('can update a note to link to an opportunity', function (): void { $note = Note::factory()->for($this->team)->create(); $opportunity = Opportunity::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateNoteTool::class, [ 'id' => $note->id, 'opportunity_ids' => [$opportunity->id], ]) ->assertOk(); expect($note->refresh()->opportunities)->toHaveCount(1); }); it('can detach all companies from a note via empty array', function (): void { $note = Note::factory()->for($this->team)->create(); $company = Company::factory()->for($this->team)->create(); $note->companies()->attach($company); RelaticleServer::actingAs($this->user) ->tool(UpdateNoteTool::class, [ 'id' => $note->id, 'company_ids' => [], ]) ->assertOk(); expect($note->refresh()->companies)->toHaveCount(0); }); it('can get a note by ID', function (): void { $note = Note::factory()->for($this->team)->create(['title' => 'Meeting Notes']); RelaticleServer::actingAs($this->user) ->tool(GetNoteTool::class, ['id' => $note->id]) ->assertOk() ->assertSee('Meeting Notes'); }); it('can update a note via MCP tool', function (): void { $note = Note::factory()->for($this->team)->create(['title' => 'Old Note']); RelaticleServer::actingAs($this->user) ->tool(UpdateNoteTool::class, [ 'id' => $note->id, 'title' => 'New Note', ]) ->assertOk() ->assertSee('New Note'); expect($note->refresh()->title)->toBe('New Note'); }); it('can delete a note via MCP tool', function (): void { $note = Note::factory()->for($this->team)->create(['title' => 'Delete Me']); RelaticleServer::actingAs($this->user) ->tool(DeleteNoteTool::class, [ 'id' => $note->id, ]) ->assertOk() ->assertSee('has been deleted'); expect($note->refresh()->trashed())->toBeTrue(); }); it('can attach a note to a company', function (): void { $note = Note::factory()->for($this->team)->create(); $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(AttachNoteToEntitiesTool::class, [ 'id' => $note->id, 'company_ids' => [$company->id], ]) ->assertOk(); expect($note->refresh()->companies)->toHaveCount(1); }); it('can detach a note from a company', function (): void { $note = Note::factory()->for($this->team)->create(); $company = Company::factory()->for($this->team)->create(); $note->companies()->attach($company); RelaticleServer::actingAs($this->user) ->tool(DetachNoteFromEntitiesTool::class, [ 'id' => $note->id, 'company_ids' => [$company->id], ]) ->assertOk(); expect($note->refresh()->companies)->toHaveCount(0); }); it('attach does not remove existing links', function (): void { $note = Note::factory()->for($this->team)->create(); $company1 = Company::factory()->for($this->team)->create(); $company2 = Company::factory()->for($this->team)->create(); $note->companies()->attach($company1); RelaticleServer::actingAs($this->user) ->tool(AttachNoteToEntitiesTool::class, [ 'id' => $note->id, 'company_ids' => [$company2->id], ]) ->assertOk(); expect($note->refresh()->companies)->toHaveCount(2); }); describe('team scoping', function () { beforeEach(function () { Note::addGlobalScope(new TeamScope); }); it('scopes notes to current team', function (): void { $otherNote = Note::withoutEvents(fn () => Note::factory()->create([ 'team_id' => Team::factory()->create()->id, 'title' => 'Other Team Note', ])); $ownNote = Note::factory()->for($this->team)->create(['title' => 'Own Team Note']); RelaticleServer::actingAs($this->user) ->tool(ListNotesTool::class) ->assertOk() ->assertSee('Own Team Note') ->assertDontSee('Other Team Note'); }); it('cannot update a note from another team', function (): void { $otherNote = Note::withoutEvents(fn () => Note::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(UpdateNoteTool::class, [ 'id' => $otherNote->id, 'title' => 'Hacked', ]) ->assertHasErrors(['not found']); }); it('cannot delete a note from another team', function (): void { $otherNote = Note::withoutEvents(fn () => Note::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(DeleteNoteTool::class, [ 'id' => $otherNote->id, ]) ->assertHasErrors(['not found']); }); it('cannot get a note from another team', function (): void { $otherNote = Note::withoutEvents(fn () => Note::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(GetNoteTool::class, [ 'id' => $otherNote->id, ]) ->assertHasErrors(['not found']); }); }); ================================================ FILE: tests/Feature/Mcp/OpportunityToolsTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); afterEach(function () { Opportunity::clearBootedModels(); }); it('can get an opportunity by ID', function (): void { $opportunity = Opportunity::factory()->for($this->team)->create(['name' => 'Big Deal']); RelaticleServer::actingAs($this->user) ->tool(GetOpportunityTool::class, ['id' => $opportunity->id]) ->assertOk() ->assertSee('Big Deal'); }); it('can update an opportunity via MCP tool', function (): void { $opportunity = Opportunity::factory()->for($this->team)->create(['name' => 'Old Deal']); RelaticleServer::actingAs($this->user) ->tool(UpdateOpportunityTool::class, [ 'id' => $opportunity->id, 'name' => 'New Deal', ]) ->assertOk() ->assertSee('New Deal'); expect($opportunity->refresh()->name)->toBe('New Deal'); }); it('can delete an opportunity via MCP tool', function (): void { $opportunity = Opportunity::factory()->for($this->team)->create(['name' => 'Closing Deal']); RelaticleServer::actingAs($this->user) ->tool(DeleteOpportunityTool::class, [ 'id' => $opportunity->id, ]) ->assertOk() ->assertSee('has been deleted'); expect($opportunity->refresh()->trashed())->toBeTrue(); }); it('can filter opportunities by contact_id', function (): void { $person = People::factory()->for($this->team)->create(); $matchingOpp = Opportunity::factory()->for($this->team)->create([ 'contact_id' => $person->id, ]); $otherOpp = Opportunity::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(ListOpportunitiesTool::class, [ 'contact_id' => $person->id, ]) ->assertOk() ->assertSee($matchingOpp->name) ->assertDontSee($otherOpp->name); }); describe('team scoping', function () { beforeEach(function () { Opportunity::addGlobalScope(new TeamScope); }); it('scopes opportunities to current team', function (): void { $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create([ 'team_id' => Team::factory()->create()->id, 'name' => 'Other Team Deal', ])); $ownOpportunity = Opportunity::factory()->for($this->team)->create(['name' => 'Own Team Deal']); RelaticleServer::actingAs($this->user) ->tool(ListOpportunitiesTool::class) ->assertOk() ->assertSee('Own Team Deal') ->assertDontSee('Other Team Deal'); }); it('cannot update an opportunity from another team', function (): void { $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(UpdateOpportunityTool::class, [ 'id' => $otherOpportunity->id, 'name' => 'Hacked', ]) ->assertHasErrors(['not found']); }); it('cannot delete an opportunity from another team', function (): void { $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(DeleteOpportunityTool::class, [ 'id' => $otherOpportunity->id, ]) ->assertHasErrors(['not found']); }); it('cannot get an opportunity from another team', function (): void { $otherOpportunity = Opportunity::withoutEvents(fn () => Opportunity::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(GetOpportunityTool::class, [ 'id' => $otherOpportunity->id, ]) ->assertHasErrors(['not found']); }); it('rejects company_id from another team when creating opportunity', function (): void { $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, [ 'name' => 'Test Deal', 'company_id' => $otherCompany->id, ]) ->assertHasErrors(); }); }); ================================================ FILE: tests/Feature/Mcp/PeopleToolsTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); afterEach(function () { People::clearBootedModels(); }); it('can get a person by ID', function (): void { $person = People::factory()->for($this->team)->create(['name' => 'Jane Doe']); RelaticleServer::actingAs($this->user) ->tool(GetPeopleTool::class, ['id' => $person->id]) ->assertOk() ->assertSee('Jane Doe'); }); it('can update a person via MCP tool', function (): void { $person = People::factory()->for($this->team)->create(['name' => 'Old Name']); RelaticleServer::actingAs($this->user) ->tool(UpdatePeopleTool::class, [ 'id' => $person->id, 'name' => 'New Name', ]) ->assertOk() ->assertSee('New Name'); expect($person->refresh()->name)->toBe('New Name'); }); it('can delete a person via MCP tool', function (): void { $person = People::factory()->for($this->team)->create(['name' => 'Jane Doe']); RelaticleServer::actingAs($this->user) ->tool(DeletePeopleTool::class, [ 'id' => $person->id, ]) ->assertOk() ->assertSee('has been deleted'); expect($person->refresh()->trashed())->toBeTrue(); }); describe('team scoping', function () { beforeEach(function () { People::addGlobalScope(new TeamScope); }); it('scopes people to current team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create([ 'name' => 'Other Team Person', ])); $ownPerson = People::factory()->for($this->team)->create(['name' => 'Own Team Person']); RelaticleServer::actingAs($this->user) ->tool(ListPeopleTool::class) ->assertOk() ->assertSee('Own Team Person') ->assertDontSee('Other Team Person'); }); it('cannot update a person from another team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); RelaticleServer::actingAs($this->user) ->tool(UpdatePeopleTool::class, [ 'id' => $otherPerson->id, 'name' => 'Hacked', ]) ->assertHasErrors(['not found']); }); it('cannot delete a person from another team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); RelaticleServer::actingAs($this->user) ->tool(DeletePeopleTool::class, [ 'id' => $otherPerson->id, ]) ->assertHasErrors(['not found']); }); it('cannot get a person from another team', function (): void { $otherPerson = People::withoutEvents(fn () => People::factory()->for(Team::factory())->create()); RelaticleServer::actingAs($this->user) ->tool(GetPeopleTool::class, [ 'id' => $otherPerson->id, ]) ->assertHasErrors(['not found']); }); it('rejects company_id from another team when creating person', function (): void { $otherTeam = Team::factory()->create(); $otherCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherTeam->id, ])); RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, [ 'name' => 'Test Person', 'company_id' => $otherCompany->id, ]) ->assertHasErrors(); }); }); ================================================ FILE: tests/Feature/Mcp/RelaticleServerTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('can list companies via MCP tool', function (): void { Company::factory(3)->for($this->team)->create(); $response = RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class); $response->assertOk(); }); it('can create a company via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, [ 'name' => 'MCP Test Corp', ]); $response->assertOk() ->assertSee('MCP Test Corp'); $this->assertDatabaseHas('companies', [ 'name' => 'MCP Test Corp', 'team_id' => $this->team->id, ]); }); it('can update a company via MCP tool', function (): void { $company = Company::factory()->for($this->team)->create(['name' => 'Old Name']); $response = RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'name' => 'New Name', ]); $response->assertOk() ->assertSee('New Name'); expect($company->refresh()->name)->toBe('New Name'); }); it('can delete a company via MCP tool', function (): void { $company = Company::factory()->for($this->team)->create(); $response = RelaticleServer::actingAs($this->user) ->tool(DeleteCompanyTool::class, [ 'id' => $company->id, ]); $response->assertOk() ->assertSee('has been deleted'); expect($company->refresh()->trashed())->toBeTrue(); }); it('can list people via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(ListPeopleTool::class); $response->assertOk(); }); it('can create a person via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, [ 'name' => 'John Doe', ]); $response->assertOk() ->assertSee('John Doe'); }); it('can list opportunities via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(ListOpportunitiesTool::class); $response->assertOk(); }); it('can create an opportunity via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, [ 'name' => 'Big Deal', ]); $response->assertOk() ->assertSee('Big Deal'); }); it('can list tasks via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(ListTasksTool::class); $response->assertOk(); }); it('can create a task via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, [ 'title' => 'Follow up call', ]); $response->assertOk() ->assertSee('Follow up call'); }); it('can list notes via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(ListNotesTool::class); $response->assertOk(); }); it('can create a note via MCP tool', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreateNoteTool::class, [ 'title' => 'Meeting notes', ]); $response->assertOk() ->assertSee('Meeting notes'); }); it('can read the company schema resource', function (): void { $response = RelaticleServer::actingAs($this->user) ->resource(CompanySchemaResource::class); $response->assertOk() ->assertSee('company') ->assertSee('custom_fields'); }); it('validates company_id exists when creating a person via MCP', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreatePeopleTool::class, [ 'name' => 'Test Person', 'company_id' => 'non-existent-id', ]); $response->assertHasErrors(['company id']); }); it('validates company_id exists when updating a person via MCP', function (): void { $person = People::factory()->for($this->team)->create(); $response = RelaticleServer::actingAs($this->user) ->tool(UpdatePeopleTool::class, [ 'id' => $person->id, 'company_id' => 'non-existent-id', ]); $response->assertHasErrors(['company id']); }); it('validates company_id and contact_id exist when creating opportunity via MCP', function (): void { $response = RelaticleServer::actingAs($this->user) ->tool(CreateOpportunityTool::class, [ 'name' => 'Test Deal', 'company_id' => 'non-existent-id', 'contact_id' => 'non-existent-id', ]); $response->assertHasErrors(['company id', 'contact id']); }); it('can filter companies by name via MCP search param', function (): void { Company::factory()->for($this->team)->create(['name' => 'Acme Corp']); Company::factory()->for($this->team)->create(['name' => 'Beta Inc']); $response = RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class, [ 'search' => 'Acme', ]); $response->assertOk() ->assertSee('Acme Corp') ->assertDontSee('Beta Inc'); }); it('can read the CRM overview prompt', function (): void { $response = RelaticleServer::actingAs($this->user) ->prompt(CrmOverviewPrompt::class); $response->assertOk() ->assertSee('CRM Overview'); }); it('returns error when updating non-existent company', function (): void { RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => 'non-existent-id', 'name' => 'Ghost', ]) ->assertHasErrors(['not found']); }); it('returns error when deleting non-existent company', function (): void { RelaticleServer::actingAs($this->user) ->tool(DeleteCompanyTool::class, [ 'id' => 'non-existent-id', ]) ->assertHasErrors(['not found']); }); ================================================ FILE: tests/Feature/Mcp/SchemaResourcesTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); }); it('returns valid company schema with correct fields', function (): void { RelaticleServer::actingAs($this->user) ->resource(CompanySchemaResource::class) ->assertOk() ->assertSee('"entity"') ->assertSee('company') ->assertSee('"name"') ->assertSee('"relationships"') ->assertSee('"custom_fields"'); }); it('returns valid people schema with correct fields', function (): void { RelaticleServer::actingAs($this->user) ->resource(PeopleSchemaResource::class) ->assertOk() ->assertSee('people') ->assertSee('"name"') ->assertSee('"company_id"'); }); it('returns valid opportunity schema with correct fields', function (): void { RelaticleServer::actingAs($this->user) ->resource(OpportunitySchemaResource::class) ->assertOk() ->assertSee('opportunity') ->assertSee('"company_id"') ->assertSee('"contact_id"'); }); it('returns valid task schema with correct fields', function (): void { RelaticleServer::actingAs($this->user) ->resource(TaskSchemaResource::class) ->assertOk() ->assertSee('task') ->assertSee('"title"'); }); it('returns valid note schema with correct fields', function (): void { RelaticleServer::actingAs($this->user) ->resource(NoteSchemaResource::class) ->assertOk() ->assertSee('note') ->assertSee('"title"'); }); it('includes custom fields in schema when they exist', function (): void { $team = $this->user->personalTeam(); $section = CustomFieldSection::create([ 'tenant_id' => $team->id, 'entity_type' => 'company', 'name' => 'Test Section', 'code' => 'test_section', 'type' => 'section', 'sort_order' => 1, 'active' => true, ]); CustomField::create([ 'tenant_id' => $team->id, 'custom_field_section_id' => $section->id, 'entity_type' => 'company', 'code' => 'test_field', 'name' => 'Test Field', 'type' => 'text', 'sort_order' => 1, 'active' => true, 'validation_rules' => [], ]); RelaticleServer::actingAs($this->user) ->resource(CompanySchemaResource::class) ->assertOk() ->assertSee('test_field') ->assertSee('Test Field'); }); ================================================ FILE: tests/Feature/Mcp/TaskToolsTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); afterEach(function () { Task::clearBootedModels(); }); it('can create a task with assignees and company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(CreateTaskTool::class, [ 'title' => 'Follow Up', 'company_ids' => [$company->id], 'assignee_ids' => [$this->user->id], ]) ->assertOk() ->assertSee('Follow Up'); $task = Task::query()->where('title', 'Follow Up')->firstOrFail(); expect($task->companies)->toHaveCount(1) ->and($task->assignees)->toHaveCount(1) ->and($task->assignees->first()->id)->toBe($this->user->id); }); it('can update task assignees', function (): void { $task = Task::factory()->for($this->team)->create(); $member = User::factory()->create(); $this->team->users()->attach($member); RelaticleServer::actingAs($this->user) ->tool(UpdateTaskTool::class, [ 'id' => $task->id, 'assignee_ids' => [$member->id], ]) ->assertOk(); expect($task->refresh()->assignees)->toHaveCount(1) ->and($task->assignees->first()->id)->toBe($member->id); }); it('can get a task by ID', function (): void { $task = Task::factory()->for($this->team)->create(['title' => 'Follow Up Call']); RelaticleServer::actingAs($this->user) ->tool(GetTaskTool::class, ['id' => $task->id]) ->assertOk() ->assertSee('Follow Up Call'); }); it('can update a task via MCP tool', function (): void { $task = Task::factory()->for($this->team)->create(['title' => 'Old Task']); RelaticleServer::actingAs($this->user) ->tool(UpdateTaskTool::class, [ 'id' => $task->id, 'title' => 'New Task', ]) ->assertOk() ->assertSee('New Task'); expect($task->refresh()->title)->toBe('New Task'); }); it('can delete a task via MCP tool', function (): void { $task = Task::factory()->for($this->team)->create(['title' => 'Delete Me']); RelaticleServer::actingAs($this->user) ->tool(DeleteTaskTool::class, [ 'id' => $task->id, ]) ->assertOk() ->assertSee('has been deleted'); expect($task->refresh()->trashed())->toBeTrue(); }); it('can attach assignees to a task', function (): void { $task = Task::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(AttachTaskToEntitiesTool::class, [ 'id' => $task->id, 'assignee_ids' => [$this->user->id], ]) ->assertOk(); expect($task->refresh()->assignees)->toHaveCount(1); }); it('can filter tasks by company_id', function (): void { $company = Company::factory()->for($this->team)->create(); $linkedTask = Task::factory()->for($this->team)->create(['title' => 'Linked Task']); $linkedTask->companies()->attach($company); $unlinkedTask = Task::factory()->for($this->team)->create(['title' => 'Unlinked Task']); RelaticleServer::actingAs($this->user) ->tool(ListTasksTool::class, [ 'company_id' => $company->id, ]) ->assertOk() ->assertSee('Linked Task') ->assertDontSee('Unlinked Task'); }); describe('team scoping', function () { beforeEach(function () { Task::addGlobalScope(new TeamScope); }); it('scopes tasks to current team', function (): void { $otherTask = Task::withoutEvents(fn () => Task::factory()->create([ 'team_id' => Team::factory()->create()->id, 'title' => 'Other Team Task', ])); $ownTask = Task::factory()->for($this->team)->create(['title' => 'Own Team Task']); RelaticleServer::actingAs($this->user) ->tool(ListTasksTool::class) ->assertOk() ->assertSee('Own Team Task') ->assertDontSee('Other Team Task'); }); it('cannot update a task from another team', function (): void { $otherTask = Task::withoutEvents(fn () => Task::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(UpdateTaskTool::class, [ 'id' => $otherTask->id, 'title' => 'Hacked', ]) ->assertHasErrors(['not found']); }); it('cannot delete a task from another team', function (): void { $otherTask = Task::withoutEvents(fn () => Task::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(DeleteTaskTool::class, [ 'id' => $otherTask->id, ]) ->assertHasErrors(['not found']); }); it('cannot get a task from another team', function (): void { $otherTask = Task::withoutEvents(fn () => Task::factory()->create([ 'team_id' => Team::factory()->create()->id, ])); RelaticleServer::actingAs($this->user) ->tool(GetTaskTool::class, [ 'id' => $otherTask->id, ]) ->assertHasErrors(['not found']); }); }); ================================================ FILE: tests/Feature/Mcp/TokenAbilitiesMcpTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); describe('read-only token', function (): void { beforeEach(function (): void { $token = $this->user->createToken('test', ['read']); $this->user->withAccessToken($token->accessToken); }); it('can list companies', function (): void { RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class) ->assertOk(); }); it('cannot create a company', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, ['name' => 'Blocked']); })->throws(MissingAbilityException::class); it('cannot update a company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'name' => 'Blocked', ]); })->throws(MissingAbilityException::class); it('cannot delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(DeleteCompanyTool::class, [ 'id' => $company->id, ]); })->throws(MissingAbilityException::class); }); describe('create-only token', function (): void { beforeEach(function (): void { $token = $this->user->createToken('test', ['create']); $this->user->withAccessToken($token->accessToken); }); it('cannot list companies', function (): void { RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class); })->throws(MissingAbilityException::class); it('can create a company', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, ['name' => 'Allowed Corp']) ->assertOk(); }); it('cannot delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(DeleteCompanyTool::class, [ 'id' => $company->id, ]); })->throws(MissingAbilityException::class); }); describe('wildcard token', function (): void { beforeEach(function (): void { $token = $this->user->createToken('test', ['*']); $this->user->withAccessToken($token->accessToken); }); it('can list companies', function (): void { RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class) ->assertOk(); }); it('can create a company', function (): void { RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, ['name' => 'Wildcard Corp']) ->assertOk(); }); it('can update a company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(UpdateCompanyTool::class, [ 'id' => $company->id, 'name' => 'Updated', ]) ->assertOk(); }); it('can delete a company', function (): void { $company = Company::factory()->for($this->team)->create(); RelaticleServer::actingAs($this->user) ->tool(DeleteCompanyTool::class, [ 'id' => $company->id, ]) ->assertOk(); }); }); describe('no token (session auth)', function (): void { it('allows all operations without a token', function (): void { RelaticleServer::actingAs($this->user) ->tool(ListCompaniesTool::class) ->assertOk(); RelaticleServer::actingAs($this->user) ->tool(CreateCompanyTool::class, ['name' => 'Session Corp']) ->assertOk(); }); }); ================================================ FILE: tests/Feature/Mcp/WhoAmiToolTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); $this->team = $this->user->personalTeam(); }); it('returns current user info', function (): void { RelaticleServer::actingAs($this->user) ->tool(WhoAmiTool::class) ->assertOk() ->assertSee($this->user->name) ->assertSee($this->user->email); }); it('returns current team info', function (): void { RelaticleServer::actingAs($this->user) ->tool(WhoAmiTool::class) ->assertOk() ->assertSee($this->team->name); }); it('returns team members', function (): void { $member = User::factory()->create(); $this->team->users()->attach($member); RelaticleServer::actingAs($this->user) ->tool(WhoAmiTool::class) ->assertOk() ->assertSee($this->user->name) ->assertSee($member->name) ->assertSee($member->email); }); it('returns wildcard abilities when no token', function (): void { RelaticleServer::actingAs($this->user) ->tool(WhoAmiTool::class) ->assertOk() ->assertSee('"*"'); }); describe('token abilities', function (): void { it('requires read ability', function (): void { $token = $this->user->createToken('test', ['create']); $this->user->withAccessToken($token->accessToken); RelaticleServer::actingAs($this->user) ->tool(WhoAmiTool::class); })->throws(MissingAbilityException::class); it('allows read-only token', function (): void { $token = $this->user->createToken('test', ['read']); $this->user->withAccessToken($token->accessToken); RelaticleServer::actingAs($this->user) ->tool(WhoAmiTool::class) ->assertOk(); }); }); ================================================ FILE: tests/Feature/Migrations/UlidMigrationTest.php ================================================ withTeam()->create(); expect($user->id)->toBeString() ->and(strlen($user->id))->toBe(26); }); it('uses ULID for team primary key', function (): void { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; expect($team->id)->toBeString() ->and(strlen($team->id))->toBe(26); }); it('uses ULID for company primary key', function (): void { $user = User::factory()->withTeam()->create(); $company = Company::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); expect($company->id)->toBeString() ->and(strlen($company->id))->toBe(26); }); it('uses ULID for people primary key', function (): void { $user = User::factory()->withTeam()->create(); $person = People::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); expect($person->id)->toBeString() ->and(strlen($person->id))->toBe(26); }); it('uses ULID for opportunity primary key', function (): void { $user = User::factory()->withTeam()->create(); $opportunity = Opportunity::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); expect($opportunity->id)->toBeString() ->and(strlen($opportunity->id))->toBe(26); }); it('uses ULID for task primary key', function (): void { $user = User::factory()->withTeam()->create(); $task = Task::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); expect($task->id)->toBeString() ->and(strlen($task->id))->toBe(26); }); it('uses ULID for note primary key', function (): void { $user = User::factory()->withTeam()->create(); $note = Note::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); expect($note->id)->toBeString() ->and(strlen($note->id))->toBe(26); }); it('maintains user-team relationship', function (): void { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; expect($team->user_id)->toBe($user->id) ->and($user->current_team_id)->toBe($team->id); }); it('maintains team-user pivot relationship', function (): void { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; // Attach user to team via pivot table $team->users()->attach($user, ['role' => 'admin']); // Refresh relationships $user->refresh(); $team->refresh(); expect($user->teams)->toHaveCount(1) ->and($user->teams->first()->id)->toBe($team->id) ->and($team->users)->toHaveCount(1) ->and($team->users->first()->id)->toBe($user->id); }); it('maintains company foreign key relationships', function (): void { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $company = Company::factory()->create([ 'team_id' => $team->id, 'creator_id' => $user->id, 'account_owner_id' => $user->id, ]); expect($company->team_id)->toBe($team->id) ->and($company->creator_id)->toBe($user->id) ->and($company->account_owner_id)->toBe($user->id) ->and($company->team->id)->toBe($team->id) ->and($company->creator->id)->toBe($user->id) ->and($company->accountOwner->id)->toBe($user->id); }); it('maintains people-company relationship', function (): void { $user = User::factory()->withTeam()->create(); $company = Company::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $person = People::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, 'company_id' => $company->id, ]); expect($person->company_id)->toBe($company->id) ->and($person->company->id)->toBe($company->id) ->and($company->people)->toHaveCount(1) ->and($company->people->first()->id)->toBe($person->id); }); it('maintains opportunity relationships', function (): void { $user = User::factory()->withTeam()->create(); $company = Company::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $person = People::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, 'company_id' => $company->id, ]); $opportunity = Opportunity::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, 'company_id' => $company->id, 'contact_id' => $person->id, ]); expect($opportunity->company_id)->toBe($company->id) ->and($opportunity->contact_id)->toBe($person->id) ->and($opportunity->company->id)->toBe($company->id) ->and($opportunity->contact->id)->toBe($person->id); }); it('maintains task-user pivot relationship', function (): void { $user = User::factory()->withTeam()->create(); $task = Task::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $task->assignees()->attach($user); expect($task->assignees)->toHaveCount(1) ->and($task->assignees->first()->id)->toBe($user->id); }); it('maintains taskables polymorphic relationship', function (): void { $user = User::factory()->withTeam()->create(); $company = Company::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $task = Task::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $task->companies()->attach($company); expect($task->companies)->toHaveCount(1) ->and($task->companies->first()->id)->toBe($company->id) ->and($company->tasks)->toHaveCount(1) ->and($company->tasks->first()->id)->toBe($task->id); }); it('maintains noteables polymorphic relationship', function (): void { $user = User::factory()->withTeam()->create(); $company = Company::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $note = Note::factory()->create([ 'team_id' => $user->currentTeam->id, 'creator_id' => $user->id, ]); $note->companies()->attach($company); expect($note->companies)->toHaveCount(1) ->and($note->companies->first()->id)->toBe($company->id) ->and($company->notes)->toHaveCount(1) ->and($company->notes->first()->id)->toBe($note->id); }); it('has correct column types for primary keys', function (): void { $tables = ['users', 'teams', 'companies', 'people', 'opportunities', 'tasks', 'notes']; foreach ($tables as $table) { $columnType = Schema::getColumnType($table, 'id'); expect(in_array($columnType, ['string', 'char', 'varchar', 'bpchar', 'text'], true)) ->toBeTrue("Expected {$table}.id to be string type, got {$columnType}"); } }); it('has correct column types for foreign keys', function (): void { $foreignKeys = [ 'companies' => ['team_id', 'creator_id', 'account_owner_id'], 'people' => ['team_id', 'creator_id', 'company_id'], 'opportunities' => ['team_id', 'creator_id', 'company_id', 'contact_id'], 'tasks' => ['team_id', 'creator_id'], 'notes' => ['team_id', 'creator_id'], 'users' => ['current_team_id'], 'teams' => ['user_id'], ]; foreach ($foreignKeys as $table => $columns) { foreach ($columns as $column) { if (Schema::hasColumn($table, $column)) { $columnType = Schema::getColumnType($table, $column); expect(in_array($columnType, ['string', 'char', 'varchar', 'bpchar', 'text'], true)) ->toBeTrue("Expected {$table}.{$column} to be string type, got {$columnType}"); } } } }); it('has integer primary key for pivot tables', function (): void { $pivotTables = ['team_user', 'task_user', 'taskables', 'noteables']; foreach ($pivotTables as $table) { if (Schema::hasTable($table) && Schema::hasColumn($table, 'id')) { $columnType = Schema::getColumnType($table, 'id'); // Pivot tables can have either int or string id depending on database expect(in_array($columnType, ['integer', 'bigint', 'int4', 'int8', 'string', 'char', 'varchar', 'bpchar', 'text'], true)) ->toBeTrue("Unexpected column type for {$table}.id: {$columnType}"); } } }); }); ================================================ FILE: tests/Feature/Models/Scopes/TeamScopeTest.php ================================================ withTeam()->create(); $team = $user->currentTeam; Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $team->id, 'account_owner_id' => $user->id, ])); Company::addGlobalScope(new TeamScope); expect(Company::query()->count())->toBe(0); }); it('scopes results to the authenticated user current team', function (): void { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $ownCompany = Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $team->id, 'account_owner_id' => $user->id, ])); $otherUser = User::factory()->withTeam()->create(); Company::withoutEvents(fn () => Company::factory()->create([ 'team_id' => $otherUser->currentTeam->id, 'account_owner_id' => $otherUser->id, ])); $this->actingAs($user); Company::addGlobalScope(new TeamScope); $results = Company::query()->get(); expect($results)->toHaveCount(1) ->and($results->first()->id)->toBe($ownCompany->id); }); ================================================ FILE: tests/Feature/Onboarding/CreateTeamOnboardingTest.php ================================================ create(); $this->actingAs($user); livewire(CreateTeam::class) ->assertSuccessful() ->assertSee('Create your workspace'); }); it('creates a team with name and auto-generated slug', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Acme Corp', ]) ->call('register') ->assertHasNoFormErrors(); $team = Team::query()->where('name', 'Acme Corp')->first(); expect($team)->not->toBeNull() ->and($team->slug)->toBe('acme-corp'); }); it('creates a team with a custom slug', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Acme Corp', 'slug' => 'my-workspace', ]) ->call('register') ->assertHasNoFormErrors(); $team = Team::query()->where('name', 'Acme Corp')->first(); expect($team)->not->toBeNull() ->and($team->slug)->toBe('my-workspace'); }); it('validates slug format', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Acme Corp', 'slug' => 'INVALID SLUG!!', ]) ->call('register') ->assertHasFormErrors(['slug']); }); it('validates slug uniqueness', function (): void { $existingUser = User::factory()->create(); Team::factory()->create(['slug' => 'taken-slug', 'user_id' => $existingUser->id]); $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Acme Corp', 'slug' => 'taken-slug', ]) ->call('register') ->assertHasFormErrors(['slug']); }); it('requires a team name', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => '', ]) ->call('register') ->assertHasFormErrors(['name']); }); it('marks first team as personal team', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'My First Team', ]) ->call('register') ->assertHasNoFormErrors(); $team = $user->fresh()->ownedTeams->first(); expect($team->personal_team)->toBeTrue(); }); it('marks subsequent teams as non-personal', function (): void { $user = User::factory()->withPersonalTeam()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Second Team', ]) ->call('register') ->assertHasNoFormErrors(); $secondTeam = $user->fresh()->ownedTeams()->where('name', 'Second Team')->first(); expect($secondTeam->personal_team)->toBeFalse(); }); it('redirects to companies index after team creation', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Redirect Team', ]) ->call('register') ->assertHasNoFormErrors() ->assertRedirect(CompanyResource::getUrl('index', ['tenant' => $user->fresh()->currentTeam])); }); it('seeds demo data when first team is created', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Seed Test Team', ]) ->call('register') ->assertHasNoFormErrors(); $team = $user->fresh()->personalTeam(); expect($team)->not->toBeNull() ->and(Company::where('team_id', $team->id)->count())->toBe(4) ->and(People::where('team_id', $team->id)->count())->toBe(4) ->and(Opportunity::where('team_id', $team->id)->count())->toBe(4) ->and(Task::where('team_id', $team->id)->count())->toBe(4) ->and(Note::where('team_id', $team->id)->count())->toBe(5); }); it('creates all custom fields for the first team', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Custom Fields Team', ]) ->call('register') ->assertHasNoFormErrors(); $team = $user->fresh()->personalTeam(); $fields = CustomField::withoutGlobalScopes() ->where('tenant_id', $team->id) ->get() ->groupBy('entity_type'); expect($fields->get('company'))->toHaveCount(3) ->and($fields->get('people'))->toHaveCount(4) ->and($fields->get('opportunity'))->toHaveCount(3) ->and($fields->get('task'))->toHaveCount(4) ->and($fields->get('note'))->toHaveCount(1); }); it('seeds people linked to their correct companies', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Link Test Team', ]) ->call('register'); $team = $user->fresh()->personalTeam(); $companies = Company::where('team_id', $team->id)->pluck('id', 'name'); $people = People::where('team_id', $team->id)->get(); $expectedMapping = [ 'Tim Cook' => 'Apple', 'Brian Chesky' => 'Airbnb', 'Dylan Field' => 'Figma', 'Ivan Zhao' => 'Notion', ]; foreach ($people as $person) { $expectedCompany = $expectedMapping[$person->name]; expect($person->company_id)->toBe($companies[$expectedCompany]); } }); it('seeds tasks and opportunities with board positions', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Board Test Team', ]) ->call('register'); $team = $user->fresh()->personalTeam(); $tasks = Task::where('team_id', $team->id)->get(); $taskPositions = $tasks->pluck('order_column'); expect($tasks)->toHaveCount(4) ->and($taskPositions->every(fn ($v) => $v !== null))->toBeTrue() ->and($taskPositions->unique())->toHaveCount(4); $opportunities = Opportunity::where('team_id', $team->id)->get(); $opportunityPositions = $opportunities->pluck('order_column'); expect($opportunities)->toHaveCount(4) ->and($opportunityPositions->every(fn ($v) => $v !== null))->toBeTrue() ->and($opportunityPositions->unique())->toHaveCount(4); }); it('seeds custom field values correctly', function (): void { $user = User::factory()->create(); $this->actingAs($user); livewire(CreateTeam::class) ->fillForm([ 'name' => 'Values Test Team', ]) ->call('register'); $team = $user->fresh()->personalTeam(); $apple = Company::where('team_id', $team->id)->where('name', 'Apple')->first(); $companyFields = CustomField::withoutGlobalScopes() ->where('tenant_id', $team->id) ->forEntity(Company::class) ->pluck('id', 'code'); $appleValues = CustomFieldValue::withoutGlobalScopes() ->where('entity_id', $apple->id) ->where('entity_type', $apple->getMorphClass()) ->get() ->keyBy('custom_field_id'); expect($appleValues[$companyFields['domains']]->json_value)->toContain('https://apple.com') ->and($appleValues[$companyFields['icp']]->boolean_value)->toBeTrue() ->and($appleValues[$companyFields['linkedin']]->json_value)->toContain('https://www.linkedin.com/company/apple'); }); ================================================ FILE: tests/Feature/PersonalAccessToken/TeamIdImmutabilityTest.php ================================================ withTeam()->create(); $team = $user->currentTeam; $token = $user->tokens()->create([ 'name' => 'Test Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], ]); expect($token->team_id)->toBeNull(); $token->update(['team_id' => $team->id]); expect($token->fresh()->team_id)->toBe($team->id); }); test('team_id cannot be changed once set', function () { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $otherTeam = Team::factory()->create(); $token = $user->tokens()->create([ 'name' => 'Test Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], 'team_id' => $team->id, ]); $token->update(['team_id' => $otherTeam->id]); })->throws(LogicException::class, 'The team_id attribute cannot be changed after it has been set.'); test('team_id cannot be set to null once set', function () { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $token = $user->tokens()->create([ 'name' => 'Test Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], 'team_id' => $team->id, ]); $token->update(['team_id' => null]); })->throws(LogicException::class, 'The team_id attribute cannot be changed after it has been set.'); test('creating event allows token with valid team_id', function () { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $token = $user->tokens()->create([ 'name' => 'Valid Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], 'team_id' => $team->id, ]); expect($token->team_id)->toBe($team->id); }); test('creating event allows token with null team_id', function () { $user = User::factory()->withTeam()->create(); $token = $user->tokens()->create([ 'name' => 'No Team Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], ]); expect($token->team_id)->toBeNull(); }); test('creating event rejects token with team_id for another users team', function () { $user = User::factory()->withTeam()->create(); $otherUser = User::factory()->withTeam()->create(); $otherTeam = $otherUser->currentTeam; $user->tokens()->create([ 'name' => 'Stolen Team Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], 'team_id' => $otherTeam->id, ]); })->throws(HttpException::class); test('cascade deletes tokens when team is deleted', function () { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $user->tokens()->create([ 'name' => 'Team Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], 'team_id' => $team->id, ]); expect($user->tokens()->count())->toBe(1); $team->forceDelete(); expect($user->tokens()->count())->toBe(0); }); test('other attributes can still be updated when team_id is set', function () { $user = User::factory()->withTeam()->create(); $team = $user->currentTeam; $token = $user->tokens()->create([ 'name' => 'Test Token', 'token' => hash('sha256', Str::random(40)), 'abilities' => ['*'], 'team_id' => $team->id, ]); $token->update(['name' => 'Updated Token']); expect($token->fresh()) ->name->toBe('Updated Token') ->team_id->toBe($team->id); }); ================================================ FILE: tests/Feature/Profile/AvatarServiceTest.php ================================================ avatarService = new AvatarService( cache: new Repository(new ArrayStore), cacheTtl: 3600, defaultTextColor: '#FFFFFF', defaultBgColor: '#3182CE', backgroundColors: ['#FF5733', '#33FF57', '#3357FF'] ); }); function extractInitialsFromSvg(string $dataUrl): string { $base64 = str_replace('data:image/svg+xml;base64,', '', $dataUrl); $svg = base64_decode($base64); preg_match('/]*>\s*(\S+)\s*<\/text>/s', $svg, $matches); return trim($matches[1] ?? ''); } it('handles edge cases in name analysis via generateAuto output', function () { $emptyAvatar = $this->avatarService->generateAuto(''); expect($emptyAvatar)->toStartWith('data:image/svg+xml;base64,'); $singleCharAvatar = $this->avatarService->generateAuto('A'); expect($singleCharAvatar)->toStartWith('data:image/svg+xml;base64,'); expect($emptyAvatar)->not->toBe($singleCharAvatar); }); it('produces visually distinct avatars for different name types', function () { $vowelHeavy = $this->avatarService->generateAuto('Aoi Ueo'); $consonantHeavy = $this->avatarService->generateAuto('Brynhildr Skjeggestad'); expect($vowelHeavy)->not->toBe($consonantHeavy); $withRareLetters = $this->avatarService->generateAuto('Xavi Quintanilla Jimenez'); $ordinary = $this->avatarService->generateAuto('Daniel Anderson'); expect($withRareLetters)->not->toBe($ordinary); }); it('generates different background colors for different names', function () { $avatar1 = $this->avatarService->generateAuto('John Smith'); $avatar2 = $this->avatarService->generateAuto('Jane Doe'); expect($avatar1)->not->toBe($avatar2); $avatar3 = $this->avatarService->generateAuto('John Smith'); expect($avatar1)->toBe($avatar3); }); it('correctly extracts initials from names', function () { expect(extractInitialsFromSvg($this->avatarService->generate('John Smith')))->toBe('JS'); expect(extractInitialsFromSvg($this->avatarService->generate('John Smith', initialCount: 1)))->toBe('J'); expect(extractInitialsFromSvg($this->avatarService->generate('John')))->toBe('JO'); expect(extractInitialsFromSvg($this->avatarService->generate('O\'Connor')))->toBe('OC'); expect(extractInitialsFromSvg($this->avatarService->generate('Jean-Claude')))->toBe('JC'); }); it('correctly handles names with special characters and symbols', function () { expect(extractInitialsFromSvg($this->avatarService->generate('Jo.hn Smith')))->toBe('JS'); expect(extractInitialsFromSvg($this->avatarService->generate('Dr. John Smith')))->toBe('DS'); expect(extractInitialsFromSvg($this->avatarService->generate('John_Smith')))->toBe('JS'); expect(extractInitialsFromSvg($this->avatarService->generate('John_Do_e')))->toBe('JE'); expect(extractInitialsFromSvg($this->avatarService->generate('Jo.hn d_oe')))->toBe('JO'); expect(extractInitialsFromSvg($this->avatarService->generate('Jo.hn.d_oe')))->toBe('JO'); expect(extractInitialsFromSvg($this->avatarService->generate('John+Smith')))->toBe('JO'); expect(extractInitialsFromSvg($this->avatarService->generate('John@Smith')))->toBe('JO'); expect(extractInitialsFromSvg($this->avatarService->generate('J.o-h_n S.m-i_t.h')))->toBe('JI'); expect(extractInitialsFromSvg($this->avatarService->generate('...John...Smith...')))->toBe('JS'); }); it('validates colors properly', function () { expect($this->avatarService->validateColor('#123456'))->toBeTrue(); expect($this->avatarService->validateColor('#abc'))->toBeTrue(); expect($this->avatarService->validateColor('rgb(10, 20, 30)'))->toBeTrue(); expect($this->avatarService->validateColor('rgba(10, 20, 30, 0.5)'))->toBeTrue(); expect($this->avatarService->validateColor('invalid'))->toBeFalse(); expect($this->avatarService->validateColor(null))->toBeFalse(); }); ================================================ FILE: tests/Feature/Profile/BrowserSessionsTest.php ================================================ actingAs(User::factory()->withTeam()->socialOnly()->create()); Livewire::test(LogoutOtherBrowserSessions::class) ->call('logoutOtherBrowserSessions', null) ->assertSuccessful(); }); test('password user can log out other sessions with correct password', function () { $this->actingAs(User::factory()->withTeam()->create()); Livewire::test(LogoutOtherBrowserSessions::class) ->call('logoutOtherBrowserSessions', 'password') ->assertSuccessful(); }); test('password user cannot log out other sessions with wrong password', function () { $this->actingAs(User::factory()->withTeam()->create()); Livewire::test(LogoutOtherBrowserSessions::class) ->call('logoutOtherBrowserSessions', 'wrong-password') ->assertHasErrors(['password']); }); test('password user cannot log out other sessions without password', function () { $this->actingAs(User::factory()->withTeam()->create()); Livewire::test(LogoutOtherBrowserSessions::class) ->call('logoutOtherBrowserSessions', null) ->assertHasErrors(['password']); }); test('browser sessions component renders correctly', function () { $this->actingAs(User::factory()->withTeam()->create()); Livewire::test(LogoutOtherBrowserSessions::class) ->assertSuccessful() ->assertSee('Browser Sessions'); }); ================================================ FILE: tests/Feature/Profile/DeleteAccountTest.php ================================================ actingAs($user = User::factory()->withTeam()->socialOnly()->create()); Livewire::test(DeleteAccount::class) ->call('deleteAccount') ->assertRedirect(); expect($user->fresh())->toBeNull(); }); test('password user can delete account with correct password', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(DeleteAccount::class) ->call('deleteAccount', 'password') ->assertRedirect(); expect($user->fresh())->toBeNull(); }); test('password user cannot delete account with wrong password', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(DeleteAccount::class) ->call('deleteAccount', 'wrong-password') ->assertHasErrors(['password']); expect($user->fresh())->not->toBeNull(); }); test('password user cannot delete account without password', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(DeleteAccount::class) ->call('deleteAccount') ->assertHasErrors(['password']); expect($user->fresh())->not->toBeNull(); }); test('delete account component renders correctly', function () { $this->actingAs(User::factory()->withTeam()->create()); Livewire::test(DeleteAccount::class) ->assertSuccessful() ->assertSee('Delete Account'); }); ================================================ FILE: tests/Feature/Profile/GitHubServiceTest.php ================================================ service = new GitHubService; // Clear any cached values before each test Cache::forget('github_stars_Relaticle_relaticle'); }); it('gets stars count from GitHub API', function () { // Mock HTTP response Http::fake([ 'api.github.com/repos/Relaticle/relaticle' => Http::response([ 'stargazers_count' => 125, ], 200), ]); // Call the service $result = $this->service->getStarsCount('Relaticle', 'relaticle'); // Assert the result expect($result)->toBe(125); // Verify the HTTP request was made Http::assertSent(function ($request) { return $request->url() === 'https://api.github.com/repos/Relaticle/relaticle' && $request->hasHeader('Accept', 'application/vnd.github.v3+json'); }); }); it('uses cached stars count on subsequent calls', function () { // Mock HTTP response Http::fake([ 'api.github.com/repos/Relaticle/relaticle' => Http::response([ 'stargazers_count' => 125, ], 200), ]); // First call should hit the API $firstResult = $this->service->getStarsCount('Relaticle', 'relaticle'); expect($firstResult)->toBe(125); // Verify the API was called Http::assertSentCount(1); // Second call should use the cache and not hit the API again $secondResult = $this->service->getStarsCount('Relaticle', 'relaticle'); expect($secondResult)->toBe(125); // Still only 1 call total Http::assertSentCount(1); }); it('returns 0 when API call fails', function () { // Mock HTTP failure response Http::fake([ 'api.github.com/repos/Relaticle/relaticle' => Http::response(null, 500), ]); // Call the service $result = $this->service->getStarsCount(); // Should return 0 on failure expect($result)->toBe(0); }); it('returns 0 when API throws exception', function () { // Mock HTTP exception Http::fake(function () { throw new Exception('Network error'); }); // Call the service $result = $this->service->getStarsCount(); // Should return 0 on exception expect($result)->toBe(0); }); it('formats small numbers as plain numbers', function () { // Mock HTTP response Http::fake([ 'api.github.com/repos/Relaticle/relaticle' => Http::response([ 'stargazers_count' => 42, ], 200), ]); // Call the service $result = $this->service->getFormattedStarsCount('Relaticle', 'relaticle'); // For small numbers, should return as is expect($result)->toBe('42'); }); it('uses abbreviation for large star counts', function () { // Mock HTTP response with large value Http::fake([ 'api.github.com/repos/Relaticle/relaticle' => Http::response([ 'stargazers_count' => 12500, ], 200), ]); // Call the service $result = $this->service->getFormattedStarsCount('Relaticle', 'relaticle'); // Should be abbreviated expect($result)->toBe('12.5K'); }); it('returns int even when cache contains string value', function () { // Simulate cache containing a string (as might happen from serialization) Cache::put('github_stars_Relaticle_relaticle', '125', now()->addMinutes(15)); $result = $this->service->getStarsCount('Relaticle', 'relaticle'); expect($result)->toBe(125)->toBeInt(); }); ================================================ FILE: tests/Feature/Profile/UpdatePasswordTest.php ================================================ withTeam()->create(); $this->actingAs($user); Livewire::test(UpdatePasswordComponent::class) ->assertSuccessful() ->assertSee('Update Password'); }); test('password can be updated', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdatePasswordComponent::class) ->fillForm([ 'currentPassword' => 'password', 'password' => 'new-password', 'password_confirmation' => 'new-password', ]) ->call('updatePassword') ->assertHasNoFormErrors() ->assertNotified(); expect(Hash::check('new-password', $user->fresh()->password))->toBeTrue(); }); test('current password must be correct', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdatePasswordComponent::class) ->fillForm([ 'currentPassword' => 'wrong-password', 'password' => 'new-password', 'password_confirmation' => 'new-password', ]) ->call('updatePassword') ->assertHasFormErrors(['currentPassword']); expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); }); test('new passwords must match', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdatePasswordComponent::class) ->fillForm([ 'currentPassword' => 'password', 'password' => 'new-password', 'password_confirmation' => 'wrong-password', ]) ->call('updatePassword') ->assertHasFormErrors(['password']); expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); }); test('social user sees set password form without current password field', function () { $this->actingAs(User::factory()->withTeam()->socialOnly()->create()); Livewire::test(UpdatePasswordComponent::class) ->assertSuccessful() ->assertSee('Set Password') ->assertDontSee('Current Password'); }); test('social user can set a password', function () { $this->actingAs($user = User::factory()->withTeam()->socialOnly()->create()); Livewire::test(UpdatePasswordComponent::class) ->fillForm([ 'password' => 'new-password', 'password_confirmation' => 'new-password', ]) ->call('updatePassword') ->assertHasNoFormErrors() ->assertNotified(); expect(Hash::check('new-password', $user->fresh()->password))->toBeTrue(); }); test('social user who set a password then sees update password form', function () { $user = User::factory()->withTeam()->socialOnly()->create(); $user->forceFill(['password' => Hash::make('my-password')])->save(); $this->actingAs($user); Livewire::test(UpdatePasswordComponent::class) ->assertSuccessful() ->assertSee('Update Password') ->assertSee('Current Password'); }); ================================================ FILE: tests/Feature/Profile/UpdateUserProfileInformationTest.php ================================================ action = new UpdateUserProfileInformation; $this->user = User::factory()->create([ 'name' => 'John Doe', 'email' => 'john@example.com', 'email_verified_at' => now(), ]); }); describe('profile component functionality', function () { test('profile information component renders correctly', function () { $user = User::factory()->withTeam()->create([ 'name' => 'Test User', 'email' => 'test@example.com', ]); $this->actingAs($user); Livewire::test(UpdateProfileInformationComponent::class) ->assertSuccessful() ->assertSee('Profile Information') ->assertFormSet([ 'name' => 'Test User', 'email' => 'test@example.com', ]); }); test('can update name without changing email', function () { $user = User::factory()->withTeam()->create([ 'email' => 'stable@example.com', 'email_verified_at' => now(), ]); $this->actingAs($user); Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => 'Updated Name', 'email' => 'stable@example.com', ]) ->call('updateProfile') ->assertHasNoFormErrors() ->assertNotified(); expect($user->fresh()) ->name->toBe('Updated Name') ->email->toBe('stable@example.com') ->email_verified_at->not->toBeNull(); }); }); describe('email change verification', function () { beforeEach(function () { Notification::fake(); $this->verifiedUser = User::factory()->withTeam()->create([ 'email' => 'original@example.com', 'email_verified_at' => now(), ]); $this->actingAs($this->verifiedUser); }); test('email change does not update email immediately', function () { Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => $this->verifiedUser->name, 'email' => 'new@example.com', ]) ->call('updateProfile') ->assertHasNoFormErrors() ->assertNotified(); expect($this->verifiedUser->fresh()) ->email->toBe('original@example.com') ->email_verified_at->not->toBeNull(); }); test('email change sends verification to new email', function () { Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => $this->verifiedUser->name, 'email' => 'new@example.com', ]) ->call('updateProfile') ->assertHasNoFormErrors(); Notification::assertSentOnDemand(VerifyEmailChange::class); }); test('email change sends notice to old email with block link', function () { Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => $this->verifiedUser->name, 'email' => 'new@example.com', ]) ->call('updateProfile') ->assertHasNoFormErrors(); Notification::assertSentTo($this->verifiedUser, NoticeOfEmailChangeRequest::class); }); test('same email does not trigger verification', function () { Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => 'New Name', 'email' => 'original@example.com', ]) ->call('updateProfile') ->assertHasNoFormErrors(); Notification::assertNotSentTo($this->verifiedUser, NoticeOfEmailChangeRequest::class); Notification::assertSentOnDemandTimes(VerifyEmailChange::class, 0); }); test('email change resets form email to current value', function () { Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => $this->verifiedUser->name, 'email' => 'new@example.com', ]) ->call('updateProfile') ->assertFormSet([ 'email' => 'original@example.com', ]); }); test('name change is saved even when email change is deferred', function () { Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => 'Updated Name', 'email' => 'new@example.com', ]) ->call('updateProfile') ->assertHasNoFormErrors() ->assertNotified(); expect($this->verifiedUser->fresh()) ->name->toBe('Updated Name') ->email->toBe('original@example.com'); }); }); describe('photo upload', function () { beforeEach(fn () => Storage::fake('public')); test('can upload valid photo', function ($format) { $photo = UploadedFile::fake()->image("avatar.{$format}", 300, 300); // Store the file first (simulating what Filament does) $photoPath = $photo->storePublicly('profile-photos', ['disk' => 'public']); $this->action->update($this->user, [ 'name' => $this->user->name, 'email' => $this->user->email, 'profile_photo_path' => $photoPath, ]); $user = $this->user->fresh(); expect($user->profile_photo_path)->toBe($photoPath) ->and(Storage::disk('public')->exists($user->profile_photo_path))->toBeTrue(); })->with(['jpg', 'jpeg', 'png']); test('handles photo with email change', function () { Notification::fake(); $photo = UploadedFile::fake()->image('avatar.png', 400, 400); // Store the file first (simulating what Filament does) $photoPath = $photo->storePublicly('profile-photos', ['disk' => 'public']); $this->action->update($this->user, [ 'name' => 'Photo User', 'email' => 'photouser@example.com', 'profile_photo_path' => $photoPath, ]); expect($this->user->fresh()) ->name->toBe('Photo User') ->email->toBe('photouser@example.com') ->email_verified_at->toBeNull() ->profile_photo_path->toBe($photoPath); Notification::assertSentTo($this->user, VerifyEmail::class); }); test('can delete profile photo', function () { Storage::fake('public'); // First set a photo $photo = UploadedFile::fake()->image('avatar.png', 300, 300); $photoPath = $photo->storePublicly('profile-photos', ['disk' => 'public']); $this->action->update($this->user, [ 'name' => $this->user->name, 'email' => $this->user->email, 'profile_photo_path' => $photoPath, ]); expect($this->user->fresh()->profile_photo_path)->toBe($photoPath); // Then delete it $this->action->update($this->user, [ 'name' => $this->user->name, 'email' => $this->user->email, 'profile_photo_path' => null, ]); expect($this->user->fresh()->profile_photo_path)->toBeNull(); }); test('can update profile through livewire component with photo', function () { Storage::fake('public'); $user = User::factory()->withTeam()->create([ 'email' => 'photo-test@example.com', ]); $this->actingAs($user); $photo = UploadedFile::fake()->image('avatar.jpg', 200, 200); Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => 'Updated Name', 'email' => 'photo-test@example.com', 'profile_photo_path' => $photo, ]) ->call('updateProfile') ->assertHasNoFormErrors() ->assertNotified(); expect($user->fresh()) ->name->toBe('Updated Name') ->email->toBe('photo-test@example.com') ->profile_photo_path->not->toBeNull(); }); }); describe('validation', function () { test('validates required fields through livewire component', function () { $user = User::factory()->withTeam()->create(); $this->actingAs($user); Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => '', 'email' => 'invalid-email', ]) ->call('updateProfile') ->assertHasFormErrors(['name', 'email']); }); test('rejects duplicate email through livewire component', function () { User::factory()->create(['email' => 'existing@example.com']); $user = User::factory()->withTeam()->create(); $this->actingAs($user); Livewire::test(UpdateProfileInformationComponent::class) ->fillForm([ 'name' => 'Valid Name', 'email' => 'existing@example.com', ]) ->call('updateProfile') ->assertHasFormErrors(['email']); }); }); ================================================ FILE: tests/Feature/Public/PublicPagesTest.php ================================================ get('/'); $response->assertStatus(200); $response->assertSee('Relaticle'); }); it('displays the GitHub stars count', function () { Http::fake([ 'api.github.com/repos/Relaticle/relaticle' => Http::response([ 'stargazers_count' => 125, ], 200), ]); $response = $this->get('/'); $response->assertStatus(200); $response->assertSee('125'); }); }); describe('Legal pages', function () { it('displays the terms of service page with product-specific content', function () { $response = $this->get('/terms-of-service'); $response->assertStatus(200); $response->assertSee('Terms of Service'); $response->assertSee('Relaticle'); $response->assertDontSee('word usage'); $response->assertDontSee('Basic" plan'); }); it('displays the privacy policy page with product-specific content', function () { $response = $this->get('/privacy-policy'); $response->assertStatus(200); $response->assertSee('Privacy Policy'); $response->assertSee('Relaticle'); $response->assertDontSee('registered mail'); }); }); describe('Documentation pages', function () { it('displays the documentation index', function () { $response = $this->get('/docs'); $response->assertStatus(200); $response->assertSee('Documentation'); }); it('displays the getting started guide', function () { $response = $this->get('/docs/getting-started'); $response->assertStatus(200); $response->assertSee('Getting Started'); }); it('displays the import guide', function () { $response = $this->get('/docs/import'); $response->assertStatus(200); $response->assertSee('Import Guide'); }); it('displays the developer guide', function () { $response = $this->get('/docs/developer'); $response->assertStatus(200); $response->assertSee('Developer Guide'); }); it('displays the self-hosting guide', function () { $response = $this->get('/docs/self-hosting'); $response->assertStatus(200); $response->assertSee('Self-Hosting Guide'); }); it('displays the MCP guide', function () { $response = $this->get('/docs/mcp'); $response->assertStatus(200); $response->assertSee('MCP Server'); }); it('shows edit on GitHub link on documentation pages', function () { $response = $this->get('/docs/getting-started'); $response->assertStatus(200); $response->assertSee('Edit this page on GitHub'); }); it('returns 404 for non-existent documentation page', function () { $response = $this->get('/docs/non-existent-page'); $response->assertStatus(404); }); it('can search documentation and returns results', function () { $response = $this->get('/docs/search?query=import'); $response->assertStatus(200); $response->assertSee('Import'); }); }); describe('Pricing page', function () { it('displays the pricing page', function () { $response = $this->get('/pricing'); $response->assertStatus(200); $response->assertSee('No per-seat pricing'); }); }); describe('Authentication redirects', function () { it('redirects login to app panel', function () { $response = $this->get('/login'); $response->assertRedirect(url()->getAppUrl('login')); }); it('redirects register to app panel', function () { $response = $this->get('/register'); $response->assertRedirect(url()->getAppUrl('register')); }); it('redirects forgot password to app panel', function () { $response = $this->get('/forgot-password'); $response->assertRedirect(url()->getAppUrl('forgot-password')); }); it('redirects dashboard to app panel', function () { $response = $this->get('/dashboard'); $response->assertRedirect(url()->getAppUrl()); }); }); describe('Community redirects', function () { it('redirects to discord', function () { config(['services.discord.invite_url' => 'https://discord.gg/example']); $response = $this->get('/discord'); $response->assertRedirect('https://discord.gg/example'); }); }); describe('Social authentication routes', function () { it('throttles authentication redirect attempts', function () { // Make 10 requests (the limit) for ($i = 0; $i < 10; $i++) { $this->get('/auth/redirect/github'); } // The 11th request should be throttled $response = $this->get('/auth/redirect/github'); $response->assertStatus(429); // Too Many Requests }); it('accepts github as a provider for redirect', function () { $response = $this->get('/auth/redirect/github'); $response->assertStatus(302); // Redirect to GitHub }); it('accepts google as a provider for redirect', function () { $response = $this->get('/auth/redirect/google'); $response->assertStatus(302); // Redirect to Google }); }); describe('Error handling', function () { it('returns 404 for non-existent routes', function () { $response = $this->get('/non-existent-page'); $response->assertStatus(404); }); }); describe('Response meta', function () { it('returns proper content type', function () { $response = $this->get('/'); $response->assertHeader('Content-Type'); $response->assertSuccessful(); }); }); ================================================ FILE: tests/Feature/Routing/AppPanelRoutingTest.php ================================================ getDomains())->toBeEmpty() ->and($panel->getPath())->toBe(config('app.app_panel_path', 'app')); }); it('serves login page at the panel path', function () { $panelPath = config('app.app_panel_path', 'app'); $this->get("/{$panelPath}/login")->assertOk(); }); }); describe('getAppUrl macro - path mode', function () { beforeEach(function () { config([ 'app.app_panel_domain' => null, 'app.app_panel_path' => 'app', 'app.url' => 'https://example.com', ]); }); it('returns path-based URL with default path', function () { expect(url()->getAppUrl('login'))->toBe('https://example.com/app/login') ->and(url()->getAppUrl())->toBe('https://example.com/app'); }); it('handles custom panel path', function () { config(['app.app_panel_path' => 'crm']); expect(url()->getAppUrl('login'))->toBe('https://example.com/crm/login'); }); it('handles port in APP_URL for Docker deployments', function () { config(['app.url' => 'http://localhost:8080']); expect(url()->getAppUrl('login'))->toBe('http://localhost:8080/app/login'); }); it('handles IP address with port', function () { config(['app.url' => 'http://192.168.1.100:8080']); expect(url()->getAppUrl('dashboard'))->toBe('http://192.168.1.100:8080/app/dashboard'); }); it('handles nested path segments', function () { expect(url()->getAppUrl('teams/1/companies'))->toBe('https://example.com/app/teams/1/companies'); }); it('handles path with leading slash', function () { expect(url()->getAppUrl('/login'))->toBe('https://example.com/app/login'); }); it('handles http scheme', function () { config(['app.url' => 'http://example.com']); expect(url()->getAppUrl('login'))->toBe('http://example.com/app/login'); }); it('strips trailing slash from APP_URL', function () { config(['app.url' => 'https://example.com/']); expect(url()->getAppUrl('login'))->toBe('https://example.com/app/login'); }); }); describe('getAppUrl macro - domain mode', function () { beforeEach(function () { config([ 'app.app_panel_domain' => 'app.example.com', 'app.url' => 'https://example.com', ]); }); it('returns domain-based URL when APP_PANEL_DOMAIN is set', function () { expect(url()->getAppUrl('login'))->toBe('https://app.example.com/login') ->and(url()->getAppUrl())->toBe('https://app.example.com'); }); it('uses scheme from APP_URL', function () { config([ 'app.app_panel_domain' => 'crm.example.com', 'app.url' => 'http://example.com', ]); expect(url()->getAppUrl('login'))->toBe('http://crm.example.com/login'); }); it('handles nested path segments', function () { expect(url()->getAppUrl('teams/1/companies'))->toBe('https://app.example.com/teams/1/companies'); }); it('handles path with leading slash', function () { expect(url()->getAppUrl('/login'))->toBe('https://app.example.com/login'); }); it('preserves port from APP_URL', function () { config([ 'app.app_panel_domain' => 'app.localhost', 'app.url' => 'http://localhost:8080', ]); expect(url()->getAppUrl('login'))->toBe('http://app.localhost:8080/login') ->and(url()->getAppUrl())->toBe('http://app.localhost:8080'); }); }); describe('getPublicUrl macro', function () { it('returns APP_URL based URL', function () { config(['app.url' => 'https://example.com']); expect(url()->getPublicUrl('about'))->toBe('https://example.com/about'); }); it('returns clean base URL when path is empty', function () { config(['app.url' => 'https://example.com']); expect(url()->getPublicUrl())->toBe('https://example.com'); }); it('preserves port in URL', function () { config(['app.url' => 'http://localhost:8080']); expect(url()->getPublicUrl('about'))->toBe('http://localhost:8080/about'); }); it('is not affected by app panel domain config', function () { config([ 'app.app_panel_domain' => 'app.example.com', 'app.url' => 'https://example.com', ]); expect(url()->getPublicUrl('about'))->toBe('https://example.com/about'); }); }); ================================================ FILE: tests/Feature/Routing/SubdomainRoutingTest.php ================================================ user = User::factory()->withPersonalTeam()->create(); }); describe('API routing - default path mode', function () { it('serves API at /api/v1 prefix', function (): void { Sanctum::actingAs($this->user); $this->getJson('/api/v1/companies')->assertOk(); }); it('does not serve API at root /v1 prefix', function (): void { Sanctum::actingAs($this->user); $this->getJson('/v1/companies')->assertNotFound(); }); }); describe('API routing - subdomain mode', function () { it('serves root JSON info on API subdomain', function (): void { config(['app.api_domain' => 'api.example.com']); Route::domain('api.example.com') ->middleware('api') ->group(base_path('routes/api.php')); $response = $this->get('http://api.example.com/'); $response->assertOk(); $json = $response->json(); expect($json)->toHaveKeys(['name', 'version', 'docs']); expect($json['name'])->toBe('Relaticle API'); expect($json['version'])->toBe('v1'); }); it('serves API resources on subdomain at /v1 prefix', function (): void { config(['app.api_domain' => 'api.example.com']); Route::domain('api.example.com') ->middleware('api') ->group(base_path('routes/api.php')); Sanctum::actingAs($this->user); $this->getJson('http://api.example.com/v1/companies')->assertOk(); }); }); describe('Scribe config matches API route prefixes', function () { it('uses api/v1 prefix when no API_DOMAIN is set', function (): void { config(['app.api_domain' => null]); $prefixes = require base_path('config/scribe.php'); $prefix = $prefixes['routes'][0]['match']['prefixes'][0]; expect($prefix)->toBe('api/v1/*'); }); it('uses v1 prefix when API_DOMAIN is set', function (): void { config(['app.api_domain' => 'api.example.com']); $prefixes = require base_path('config/scribe.php'); $prefix = $prefixes['routes'][0]['match']['prefixes'][0]; expect($prefix)->toBe('v1/*'); }); }); describe('MCP routing - default path mode', function () { it('serves MCP at /mcp path', function (): void { $this->get('/mcp')->assertStatus(405); }); }); describe('MCP routing - subdomain mode', function () { it('returns JSON info on MCP subdomain root', function (): void { config(['app.mcp_domain' => 'mcp.example.com']); Route::domain('mcp.example.com')->group(function (): void { Route::get('/', fn () => response()->json([ 'name' => 'Relaticle MCP Server', 'version' => '1.0.0', 'docs' => url('/docs/mcp'), ])); }); $response = $this->get('http://mcp.example.com/'); $response->assertOk(); $json = $response->json(); expect($json)->toHaveKeys(['name', 'version', 'docs']); expect($json['name'])->toBe('Relaticle MCP Server'); }); }); ================================================ FILE: tests/Feature/SystemAdmin/ActivationRateWidgetTest.php ================================================ admin = SystemAdministrator::factory()->create(); $this->actingAs($this->admin, 'sysadmin'); Filament::setCurrentPanel('sysadmin'); $this->teamOwner = User::factory()->withTeam()->create(); $this->team = $this->teamOwner->currentTeam; }); it('can render the activation rate widget', function () { livewire(ActivationRateWidget::class) ->assertOk(); }); it('counts activated users who created records manually', function () { $users = User::factory(3)->withTeam()->create([ 'created_at' => now()->subDays(5), ]); Company::withoutEvents(fn () => Company::factory() ->for($this->team) ->create([ 'creator_id' => $users[0]->id, 'creation_source' => CreationSource::WEB, 'created_at' => now()->subDays(4), ])); Note::withoutEvents(fn () => Note::factory() ->for($this->team) ->create([ 'creator_id' => $users[1]->id, 'created_at' => now()->subDays(3), ])); livewire(ActivationRateWidget::class) ->assertSee('Activated Users') ->assertSee('2'); }); it('excludes system-created records from activation count', function () { $user = User::factory()->withTeam()->create([ 'created_at' => now()->subDays(5), ]); Company::withoutEvents(fn () => Company::factory() ->for($this->team) ->create([ 'creator_id' => $user->id, 'creation_source' => CreationSource::SYSTEM, 'created_at' => now()->subDays(4), ])); livewire(ActivationRateWidget::class) ->assertSee('Activated Users') ->assertSee('0'); }); ================================================ FILE: tests/Feature/SystemAdmin/SystemAdminResourceTest.php ================================================ admin = SystemAdministrator::factory()->create(); $this->actingAs($this->admin, 'sysadmin'); Filament::setCurrentPanel('sysadmin'); $this->teamOwner = User::factory()->withTeam()->create(); $this->team = $this->teamOwner->currentTeam; }); it('can render the users list page', function () { $users = User::factory(3)->withTeam()->create(); livewire(ListUsers::class) ->assertOk() ->assertCanSeeTableRecords($users); }); it('can render the teams list page', function () { $teams = Team::factory(3)->create(); livewire(ListTeams::class) ->assertOk() ->assertCanSeeTableRecords($teams); }); it('can render the companies list page', function () { $companies = Company::withoutEvents(fn () => Company::factory(3) ->for($this->team) ->create(['creator_id' => $this->teamOwner->id])); livewire(ListCompanies::class) ->assertOk() ->assertCanSeeTableRecords($companies); }); it('can render the people list page', function () { $people = People::withoutEvents(fn () => People::factory(3) ->for($this->team) ->create()); livewire(ListPeople::class) ->assertOk() ->assertCanSeeTableRecords($people); }); it('can render the tasks list page', function () { $tasks = Task::withoutEvents(fn () => Task::factory(3) ->for($this->team) ->create(['creator_id' => $this->teamOwner->id])); livewire(ListTasks::class) ->assertOk() ->assertCanSeeTableRecords($tasks); }); it('can render the notes list page', function () { $notes = Note::withoutEvents(fn () => Note::factory(3) ->for($this->team) ->create()); livewire(ListNotes::class) ->assertOk() ->assertCanSeeTableRecords($notes); }); it('can render the opportunities list page', function () { $opportunities = Opportunity::withoutEvents(fn () => Opportunity::factory(3) ->for($this->team) ->create()); livewire(ListOpportunities::class) ->assertOk() ->assertCanSeeTableRecords($opportunities); }); it('can render the imports list page', function () { $imports = collect(range(1, 3))->map(fn () => Import::create([ 'team_id' => $this->team->id, 'user_id' => $this->teamOwner->id, 'entity_type' => ImportEntityType::Company, 'file_name' => 'test.csv', 'status' => ImportStatus::Completed, 'total_rows' => 10, 'created_rows' => 8, 'failed_rows' => 2, 'headers' => ['name', 'email'], 'column_mappings' => [], ])); livewire(ListImports::class) ->assertOk() ->assertCanSeeTableRecords($imports); }); it('has trashed filter on soft-deletable resources', function (string $listPageClass) { livewire($listPageClass) ->assertTableFilterExists('trashed'); })->with([ 'companies' => ListCompanies::class, 'people' => ListPeople::class, 'tasks' => ListTasks::class, 'notes' => ListNotes::class, 'opportunities' => ListOpportunities::class, ]); ================================================ FILE: tests/Feature/SystemAdmin/SystemAdminSecurityTest.php ================================================ create(); $user = User::factory()->create(); expect($admin->canAccessPanel(Filament::getPanel('app')))->toBeFalse() ->and($user->canAccessPanel(Filament::getPanel('sysadmin')))->toBeFalse(); $this->actingAs($admin, 'sysadmin'); $this->assertAuthenticatedAs($admin, 'sysadmin'); $this->assertGuest('web'); }); it('enforces role-based authorization', function () { $superAdmin = SystemAdministrator::factory()->create([ 'role' => SystemAdministratorRole::SuperAdministrator, ]); $otherAdmin = SystemAdministrator::factory()->create([ 'role' => SystemAdministratorRole::SuperAdministrator, ]); $this->actingAs($superAdmin, 'sysadmin'); expect(auth('sysadmin')->user()->can('create', SystemAdministrator::class))->toBeTrue() ->and(auth('sysadmin')->user()->can('viewAny', SystemAdministrator::class))->toBeTrue() ->and(auth('sysadmin')->user()->can('update', $otherAdmin))->toBeTrue() ->and(auth('sysadmin')->user()->can('delete', $otherAdmin))->toBeTrue() ->and(auth('sysadmin')->user()->can('delete', $superAdmin))->toBeFalse(); }); it('redirects unauthenticated visitors to sysadmin login', function (string $route) { $this->get($route)->assertRedirect('/sysadmin/login'); })->with([ 'dashboard' => '/sysadmin', 'companies' => '/sysadmin/companies', 'imports' => '/sysadmin/imports', 'users' => '/sysadmin/users', 'teams' => '/sysadmin/teams', 'system-administrators' => '/sysadmin/system-administrators', ]); it('blocks regular app users from accessing sysadmin panel', function (string $route) { $user = User::factory()->create(); $this->actingAs($user, 'web') ->get($route) ->assertRedirect('/sysadmin/login'); })->with([ 'dashboard' => '/sysadmin', 'companies' => '/sysadmin/companies', 'users' => '/sysadmin/users', ]); it('blocks unverified sysadmin from accessing panel routes', function () { $unverifiedAdmin = SystemAdministrator::factory()->unverified()->create(); $this->actingAs($unverifiedAdmin, 'sysadmin') ->get('/sysadmin') ->assertForbidden(); }); it('allows verified sysadmin to access panel routes', function () { $admin = SystemAdministrator::factory()->create(); $this->actingAs($admin, 'sysadmin') ->get('/sysadmin/system-administrators') ->assertOk(); }); }); ================================================ FILE: tests/Feature/SystemAdmin/UserRetentionChartWidgetTest.php ================================================ admin = SystemAdministrator::factory()->create(); $this->actingAs($this->admin, 'sysadmin'); Filament::setCurrentPanel('sysadmin'); $this->teamOwner = User::factory()->withTeam()->create(); $this->team = $this->teamOwner->currentTeam; }); it('can render the user retention chart widget', function () { livewire(UserRetentionChartWidget::class) ->assertOk(); }); it('classifies new active vs returning users correctly', function () { $this->travelTo(now()->startOfWeek()->addDays(3)); $newUser = User::factory()->withTeam()->create([ 'created_at' => now()->subDays(2), ]); Company::withoutEvents(fn () => Company::factory() ->for($this->team) ->create([ 'creator_id' => $newUser->id, 'creation_source' => CreationSource::WEB, 'created_at' => now()->subDay(), ])); $returningUser = User::factory()->withTeam()->create([ 'created_at' => now()->subDays(30), ]); Company::withoutEvents(fn () => Company::factory() ->for($this->team) ->create([ 'creator_id' => $returningUser->id, 'creation_source' => CreationSource::WEB, 'created_at' => now()->subDay(), ])); $component = livewire(UserRetentionChartWidget::class)->assertOk(); $chartData = invade($component->instance())->getData(); $datasetsByLabel = collect($chartData['datasets'])->keyBy('label'); $newActiveData = $datasetsByLabel['New Active']['data'] ?? []; $returningData = $datasetsByLabel['Returning']['data'] ?? []; expect(array_sum($newActiveData))->toBe(1) ->and(array_sum($returningData))->toBe(1); }); ================================================ FILE: tests/Feature/Teams/AcceptTeamInvitationTest.php ================================================ withPersonalTeam()->create(); $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => $user->email, 'role' => 'editor', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->actingAs($user) ->get($acceptUrl) ->assertRedirect(config('fortify.home')); expect($team->fresh()->hasUser($user))->toBeTrue(); expect(TeamInvitation::find($invitation->id))->toBeNull(); expect($user->fresh()->current_team_id)->toBe($team->id); }); test('expired invitation shows friendly expired page', function () { $user = User::factory()->withPersonalTeam()->create(); $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->expired()->create([ 'team_id' => $team->id, 'email' => $user->email, ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->actingAs($user) ->get($acceptUrl) ->assertOk() ->assertViewIs('teams.invitation-expired'); expect($team->fresh()->hasUser($user))->toBeFalse(); }); test('null expires_at is treated as expired', function () { $user = User::factory()->withPersonalTeam()->create(); $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->withoutExpiry()->create([ 'team_id' => $team->id, 'email' => $user->email, ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->actingAs($user) ->get($acceptUrl) ->assertOk() ->assertViewIs('teams.invitation-expired'); }); test('invitation with wrong email is rejected', function () { $invitedUser = User::factory()->withPersonalTeam()->create(['email' => 'invited@example.com']); $wrongUser = User::factory()->withPersonalTeam()->create(['email' => 'wrong@example.com']); $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'invited@example.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->actingAs($wrongUser) ->get($acceptUrl) ->assertForbidden(); expect($team->fresh()->hasUser($wrongUser))->toBeFalse(); }); test('invitation with invalid signature is rejected', function () { $user = User::factory()->withPersonalTeam()->create(); $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => $user->email, ]); $this->actingAs($user) ->get("/team-invitations/{$invitation->id}?signature=invalid") ->assertForbidden(); }); test('accepting invitation deletes the invitation record', function () { $user = User::factory()->withPersonalTeam()->create(); $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => $user->email, 'role' => 'admin', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->actingAs($user)->get($acceptUrl); expect(TeamInvitation::count())->toBe(0); }); ================================================ FILE: tests/Feature/Teams/CreateTeamTest.php ================================================ actingAs($user = User::factory()->withPersonalTeam()->create()); Livewire::test(CreateTeamForm::class) ->set(['state' => ['name' => 'Test Team', 'slug' => 'test-team']]) ->call('createTeam'); expect($user->fresh()->ownedTeams)->toHaveCount(2); expect($user->fresh()->ownedTeams()->where('name', 'Test Team')->exists())->toBeTrue(); }); test('reserved slug is rejected on team creation', function () { $this->actingAs(User::factory()->withPersonalTeam()->create()); Livewire::test(CreateTeamForm::class) ->set(['state' => ['name' => 'Admin Team', 'slug' => 'admin']]) ->call('createTeam') ->assertHasErrors('slug'); }); test('non-personal teams do not get demo data seeded', function (): void { Event::fake()->except([ 'eloquent.creating: App\\Models\\Team', TeamCreated::class, ]); $this->actingAs($user = User::factory()->withPersonalTeam()->create()); Livewire::test(CreateTeamForm::class) ->set(['state' => ['name' => 'Work Team', 'slug' => 'work-team']]) ->call('createTeam'); $workTeam = $user->fresh()->ownedTeams()->where('name', 'Work Team')->first(); expect($workTeam)->not->toBeNull() ->and($workTeam->personal_team)->toBeFalse(); expect(Company::where('team_id', $workTeam->id)->count())->toBe(0) ->and(People::where('team_id', $workTeam->id)->count())->toBe(0) ->and(Opportunity::where('team_id', $workTeam->id)->count())->toBe(0) ->and(Task::where('team_id', $workTeam->id)->count())->toBe(0) ->and(Note::where('team_id', $workTeam->id)->count())->toBe(0); }); ================================================ FILE: tests/Feature/Teams/DeleteTeamTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); $user->ownedTeams()->save($team = Team::factory()->make([ 'personal_team' => false, ])); $team->users()->attach( $otherUser = User::factory()->create(), ['role' => 'test-role'] ); Livewire::test(DeleteTeamForm::class, ['team' => $team->fresh()]) ->call('deleteTeam'); expect($team->fresh())->toBeNull(); expect($otherUser->fresh()->teams)->toHaveCount(0); }); test('personal teams cant be deleted', function () { $this->actingAs($user = User::factory()->withPersonalTeam()->create()); Livewire::test(DeleteTeamForm::class, ['team' => $user->personalTeam()]) ->call('deleteTeam') ->assertHasErrors(['team']); expect($user->personalTeam()->fresh())->not->toBeNull(); }); ================================================ FILE: tests/Feature/Teams/InvitationUxTest.php ================================================ create(['name' => 'Acme Corp']); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'newuser@example.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->get($acceptUrl) ->assertRedirect(Filament::getRegistrationUrl()); }); test('guest with existing account clicking invitation link is redirected to login page', function () { $team = Team::factory()->create(['name' => 'Acme Corp']); User::factory()->create(['email' => 'existing@example.com']); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'existing@example.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->get($acceptUrl) ->assertRedirect(Filament::getLoginUrl()); }); test('guest clicking invitation link sees team name and sign-up link on login page', function () { $team = Team::factory()->create(['name' => 'Acme Corp']); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'newuser@example.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->get($acceptUrl); $this->get(route('filament.app.auth.login')) ->assertSee('Acme Corp') ->assertSee('sign up', escape: false); }); test('login page without invitation shows default subheading unchanged', function () { $this->get(route('filament.app.auth.login')) ->assertSee('sign up', escape: false) ->assertDontSee('invited to join'); }); test('guest clicking invitation link sees team name and sign-in link on register page', function () { $team = Team::factory()->create(['name' => 'Acme Corp']); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'newuser@example.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->get($acceptUrl) ->assertRedirect(Filament::getRegistrationUrl()); $this->get(route('filament.app.auth.register')) ->assertSee('Acme Corp') ->assertSee('sign in', escape: false); }); test('register page without invitation shows default subheading unchanged', function () { $this->get(route('filament.app.auth.register')) ->assertSee('sign in', escape: false) ->assertDontSee('invited to join'); }); test('user registering via invitation link gets auto-verified email', function () { $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'newuser@gmail.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); // Simulate guest hitting invite link (sets url.intended in session) $this->get($acceptUrl); // Register via Filament's Livewire component livewire(Register::class) ->fillForm([ 'name' => 'New User', 'email' => 'newuser@gmail.com', 'password' => 'password', 'passwordConfirmation' => 'password', ]) ->call('register') ->assertHasNoFormErrors(); $user = User::where('email', 'newuser@gmail.com')->first(); expect($user)->not->toBeNull(); expect($user->hasVerifiedEmail())->toBeTrue(); }); test('user registering without invitation link does not get auto-verified', function () { livewire(Register::class) ->fillForm([ 'name' => 'Normal User', 'email' => 'normaluser@gmail.com', 'password' => 'password', 'passwordConfirmation' => 'password', ]) ->call('register') ->assertHasNoFormErrors(); $user = User::where('email', 'normaluser@gmail.com')->first(); expect($user)->not->toBeNull(); expect($user->hasVerifiedEmail())->toBeFalse(); }); test('user registering with different email than invitation does not get auto-verified', function () { $team = Team::factory()->create(); $invitation = TeamInvitation::factory()->create([ 'team_id' => $team->id, 'email' => 'invited@gmail.com', ]); $acceptUrl = URL::signedRoute('team-invitations.accept', ['invitation' => $invitation]); $this->get($acceptUrl); livewire(Register::class) ->fillForm([ 'name' => 'Different User', 'email' => 'different@gmail.com', 'password' => 'password', 'passwordConfirmation' => 'password', ]) ->call('register') ->assertHasNoFormErrors(); $user = User::where('email', 'different@gmail.com')->first(); expect($user)->not->toBeNull(); expect($user->hasVerifiedEmail())->toBeFalse(); }); ================================================ FILE: tests/Feature/Teams/InviteTeamMemberTest.php ================================================ user = User::factory()->withTeam()->create(); $this->actingAs($this->user); $this->team = $this->user->currentTeam; Filament::setTenant($this->team); }); test('team members can be invited to team', function () { livewire(AddTeamMember::class, ['team' => $this->team]) ->fillForm([ 'email' => 'test@example.com', 'role' => 'admin', ]) ->call('addTeamMember', $this->team); expect($this->team->fresh()->teamInvitations)->toHaveCount(1); $invitation = $this->team->fresh()->teamInvitations->first(); expect($invitation->email)->toBe('test@example.com') ->and($invitation->role)->toBe('admin') ->and($invitation->expires_at)->not->toBeNull() ->and($invitation->expires_at->isFuture())->toBeTrue(); }); test('invitation expires_at is set based on config', function () { config(['jetstream.invitation_expiry_days' => 14]); livewire(AddTeamMember::class, ['team' => $this->team]) ->fillForm([ 'email' => 'test@example.com', 'role' => 'editor', ]) ->call('addTeamMember', $this->team); $invitation = $this->team->fresh()->teamInvitations->first(); expect((int) round($invitation->expires_at->diffInDays(now(), absolute: true)))->toBe(14); }); test('team member invitations can be cancelled', function () { livewire(AddTeamMember::class, ['team' => $this->team]) ->fillForm([ 'email' => 'test@example.com', 'role' => 'admin', ]) ->call('addTeamMember', $this->team); expect($this->team->fresh()->teamInvitations)->toHaveCount(1); $invitation = $this->team->fresh()->teamInvitations->first(); livewire(PendingTeamInvitations::class, ['team' => $this->team]) ->callAction(TestAction::make('cancelTeamInvitation')->table($invitation)); expect($this->team->fresh()->teamInvitations)->toHaveCount(0); }); ================================================ FILE: tests/Feature/Teams/LeaveTeamTest.php ================================================ withTeam()->create(); $user->currentTeam->users()->attach( $otherUser = User::factory()->create(), ['role' => 'admin'] ); $this->actingAs($otherUser); Livewire::test(TeamMemberManager::class, ['team' => $user->currentTeam]) ->call('leaveTeam'); expect($user->currentTeam->fresh()->users)->toHaveCount(0); }); test('team owners cant leave their own team', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(TeamMemberManager::class, ['team' => $user->currentTeam]) ->call('leaveTeam') ->assertHasErrors(['team']); expect($user->currentTeam->fresh())->not->toBeNull(); }); ================================================ FILE: tests/Feature/Teams/ManageTeamInvitationsTest.php ================================================ expiresIn(3)->make(); expect($invitation->isExpired())->toBeFalse(); }); test('invitation with past expires_at is expired', function () { $invitation = TeamInvitation::factory()->expired()->make(); expect($invitation->isExpired())->toBeTrue(); }); test('invitation with null expires_at is expired', function () { $invitation = TeamInvitation::factory()->withoutExpiry()->make(); expect($invitation->isExpired())->toBeTrue(); }); test('invitation expiring exactly now is expired', function () { $invitation = TeamInvitation::factory()->make([ 'expires_at' => now(), ]); $this->travel(1)->seconds(); expect($invitation->isExpired())->toBeTrue(); }); // --- Extend invitation --- test('team owner can extend an invitation', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $invitation = TeamInvitation::factory()->expired()->create([ 'team_id' => $user->currentTeam->id, ]); expect($invitation->isExpired())->toBeTrue(); livewire(PendingTeamInvitations::class, ['team' => $user->currentTeam]) ->callAction(TestAction::make('extendTeamInvitation')->table($invitation)); $invitation->refresh(); expect($invitation->isExpired())->toBeFalse() ->and($invitation->expires_at->isFuture())->toBeTrue(); }); // --- Copy invite link --- test('team owner can copy invite link', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $invitation = TeamInvitation::factory()->create([ 'team_id' => $user->currentTeam->id, ]); livewire(PendingTeamInvitations::class, ['team' => $user->currentTeam]) ->callAction(TestAction::make('copyInviteLink')->table($invitation)) ->assertNotified(); }); // --- Pending invitations table --- test('pending invitations table shows invitations', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $invitation = TeamInvitation::factory()->create([ 'team_id' => $user->currentTeam->id, 'email' => 'pending@example.com', ]); livewire(PendingTeamInvitations::class, ['team' => $user->currentTeam]) ->assertCanSeeTableRecords([$invitation]); }); // --- Cleanup command --- test('cleanup command purges old expired invitations', function () { TeamInvitation::factory()->create([ 'expires_at' => now()->subDays(31), ]); TeamInvitation::factory()->create([ 'expires_at' => now()->subDays(40), ]); TeamInvitation::factory()->create([ 'expires_at' => now()->addDay(), ]); $this->artisan(CleanupExpiredInvitationsCommand::class) ->expectsOutputToContain('Purged 2 expired invitation(s)') ->assertExitCode(0); expect(TeamInvitation::count())->toBe(1); }); test('cleanup command skips recently expired invitations', function () { TeamInvitation::factory()->create([ 'expires_at' => now()->subDays(5), ]); $this->artisan(CleanupExpiredInvitationsCommand::class) ->expectsOutputToContain('Purged 0 expired invitation(s)') ->assertExitCode(0); expect(TeamInvitation::count())->toBe(1); }); test('cleanup command handles empty table', function () { $this->artisan(CleanupExpiredInvitationsCommand::class) ->expectsOutputToContain('Purged 0 expired invitation(s)') ->assertExitCode(0); }); ================================================ FILE: tests/Feature/Teams/RemoveTeamMemberTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); $user->currentTeam->users()->attach( $otherUser = User::factory()->create(), ['role' => 'admin'] ); Livewire::test(TeamMemberManager::class, ['team' => $user->currentTeam]) ->set('teamMemberIdBeingRemoved', $otherUser->id) ->call('removeTeamMember'); expect($user->currentTeam->fresh()->users)->toHaveCount(0); }); test('only team owner can remove team members', function () { $user = User::factory()->withTeam()->create(); $user->currentTeam->users()->attach( $otherUser = User::factory()->create(), ['role' => 'admin'] ); $this->actingAs($otherUser); Livewire::test(TeamMemberManager::class, ['team' => $user->currentTeam]) ->set('teamMemberIdBeingRemoved', $user->id) ->call('removeTeamMember') ->assertStatus(403); }); ================================================ FILE: tests/Feature/Teams/TeamModelTest.php ================================================ create(); $people = People::factory()->create([ 'team_id' => $team->id, ]); expect($team->people->first())->toBeInstanceOf(People::class) ->and($team->people()->firstWhere('id', $people->id)?->id)->toBe($people->id); }); test('team has many companies', function () { $team = Team::factory()->create(); $company = Company::factory()->create([ 'team_id' => $team->id, ]); expect($team->companies->first())->toBeInstanceOf(Company::class) ->and($team->companies()->firstWhere('id', $company->id)?->id)->toBe($company->id); }); test('team has many tasks', function () { $team = Team::factory()->create(); $task = Task::factory()->create([ 'team_id' => $team->id, ]); $teamTask = $team->tasks()->firstWhere('id', $task->id); expect($teamTask)->toBeInstanceOf(Task::class) ->and($teamTask?->id)->toBe($task->id); }); test('team has many opportunities', function () { $team = Team::factory()->create(); $opportunity = Opportunity::factory()->create([ 'team_id' => $team->id, ]); $teamOpportunity = $team->opportunities()->firstWhere('id', $opportunity->id); expect($teamOpportunity)->toBeInstanceOf(Opportunity::class) ->and($teamOpportunity?->id)->toBe($opportunity->id); }); test('team has many notes', function () { $team = Team::factory()->create(); $note = Note::factory()->create([ 'team_id' => $team->id, ]); $teamNote = $team->notes()->firstWhere('id', $note->id); expect($teamNote)->toBeInstanceOf(Note::class) ->and($teamNote?->id)->toBe($note->id); }); test('team is personal team', function () { $personalTeam = Team::factory()->create([ 'personal_team' => true, ]); $regularTeam = Team::factory()->create([ 'personal_team' => false, ]); expect($personalTeam->isPersonalTeam())->toBeTrue() ->and($regularTeam->isPersonalTeam())->toBeFalse(); }); test('team has avatar', function () { $team = Team::factory()->create([ 'name' => 'Test Team', ]); expect($team->getFilamentAvatarUrl())->not->toBeNull(); }); test('team events are dispatched', function () { Event::fake(); $team = Team::factory()->create([ 'name' => 'Test Team', 'slug' => 'test-team', ]); $team->update([ 'name' => 'Updated Team', ]); $team->delete(); Event::assertDispatched(TeamCreated::class); Event::assertDispatched(TeamUpdated::class); Event::assertDispatched(TeamDeleted::class); }); test('slug is generated from name on creation', function () { Event::fake()->except( fn (string $event) => str_starts_with($event, 'eloquent.') ); $user = User::factory()->create(); $team = Team::query()->create([ 'name' => 'Acme Corp', 'user_id' => $user->id, 'personal_team' => true, ]); expect($team->slug)->toBe('acme-corp'); }); test('unique slug is generated when duplicate name exists', function () { Event::fake()->except( fn (string $event) => str_starts_with($event, 'eloquent.') ); $user = User::factory()->create(); Team::query()->create(['name' => 'Acme Corp', 'user_id' => $user->id, 'personal_team' => true]); $second = Team::query()->create(['name' => 'Acme Corp', 'user_id' => $user->id, 'personal_team' => false]); $third = Team::query()->create(['name' => 'Acme Corp', 'user_id' => $user->id, 'personal_team' => false]); expect($second->slug)->toBe('acme-corp-1') ->and($third->slug)->toBe('acme-corp-2'); }); test('special characters are handled in slug generation', function () { Event::fake()->except( fn (string $event) => str_starts_with($event, 'eloquent.') ); $user = User::factory()->create(); $team = Team::query()->create([ 'name' => 'Héllo Wörld & Friends!', 'user_id' => $user->id, 'personal_team' => true, ]); expect($team->slug)->toBe('hello-world-friends'); }); test('explicitly provided slug is not overwritten', function () { Event::fake()->except( fn (string $event) => str_starts_with($event, 'eloquent.') ); $user = User::factory()->create(); $team = Team::query()->create([ 'name' => 'My Team', 'slug' => 'custom-slug', 'user_id' => $user->id, 'personal_team' => true, ]); expect($team->slug)->toBe('custom-slug'); }); test('random slug is generated when name has no alphanumeric characters', function () { Event::fake()->except( fn (string $event) => str_starts_with($event, 'eloquent.') ); $user = User::factory()->create(); $team = Team::query()->create([ 'name' => '!!!***', 'user_id' => $user->id, 'personal_team' => true, ]); expect($team->slug)->not->toBeEmpty() ->and($team->slug)->toHaveLength(8); }); test('slug is stable when name is updated', function () { $team = Team::factory()->create([ 'name' => 'Original Name', 'slug' => 'original-name', ]); $team->update(['name' => 'Updated Name']); expect($team->fresh()->slug)->toBe('original-name'); }); test('auto-generated slug from reserved name gets suffixed', function () { Event::fake()->except( fn (string $event) => str_starts_with($event, 'eloquent.') ); $user = User::factory()->create(); $team = Team::query()->create([ 'name' => 'Admin', 'user_id' => $user->id, 'personal_team' => true, ]); expect($team->slug)->not->toBe('admin') ->and($team->slug)->toStartWith('admin-'); }); test('reserved slugs cover all top-level route segments', function () { $routes = Route::getRoutes(); $excludedPrefixes = ['livewire', 'sanctum', 'filament', 'app', '__clockwork', 'clockwork', 'laravel-login-link-login', '_boost']; $firstSegments = collect($routes->getRoutes()) ->map(fn ($route) => explode('/', trim($route->uri(), '/'))[0] ?? '') ->filter(fn (string $segment) => $segment !== '' && ! str_starts_with($segment, '{')) ->reject(fn (string $segment) => in_array($segment, $excludedPrefixes, true) || str_starts_with($segment, 'livewire-')) ->unique() ->values(); $missing = $firstSegments->reject( fn (string $segment) => in_array($segment, Team::RESERVED_SLUGS, true) ); expect($missing->toArray())->toBeEmpty( 'These route segments are missing from Team::RESERVED_SLUGS: '.$missing->implode(', ') ); }); ================================================ FILE: tests/Feature/Teams/UpdateTeamMemberRoleTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); $user->currentTeam->users()->attach( $otherUser = User::factory()->create(), ['role' => 'admin'] ); Livewire::test(TeamMemberManager::class, ['team' => $user->currentTeam]) ->set('managingRoleFor', $otherUser) ->set('currentRole', 'editor') ->call('updateRole'); expect($otherUser->fresh()->hasTeamRole( $user->currentTeam->fresh(), 'editor' ))->toBeTrue(); }); test('only team owner can update team member roles', function () { $user = User::factory()->withTeam()->create(); $user->currentTeam->users()->attach( $otherUser = User::factory()->create(), ['role' => 'admin'] ); $this->actingAs($otherUser); Livewire::test(TeamMemberManager::class, ['team' => $user->currentTeam]) ->set('managingRoleFor', $otherUser) ->set('currentRole', 'editor') ->call('updateRole') ->assertStatus(403); expect($otherUser->fresh()->hasTeamRole( $user->currentTeam->fresh(), 'admin' ))->toBeTrue(); }); ================================================ FILE: tests/Feature/Teams/UpdateTeamNameTest.php ================================================ actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'New Name', 'slug' => 'new-name']) ->call('updateTeamName', $user->currentTeam) ->assertHasNoFormErrors(); $team = $user->currentTeam->fresh(); expect($team->name)->toBe('New Name') ->and($team->slug)->toBe('new-name'); }); test('slug is required', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Test Team', 'slug' => '']) ->call('updateTeamName', $user->currentTeam) ->assertHasFormErrors(['slug' => 'required']); }); test('slug must be at least 3 characters', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Test Team', 'slug' => 'ab']) ->call('updateTeamName', $user->currentTeam) ->assertHasFormErrors(['slug']); }); test('slug must match valid format', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Test Team', 'slug' => 'Invalid Slug!']) ->call('updateTeamName', $user->currentTeam) ->assertHasFormErrors(['slug']); }); test('reserved slug is rejected on team update', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Admin', 'slug' => 'admin']) ->call('updateTeamName', $user->currentTeam) ->assertHasFormErrors(['slug']); }); test('slug must be unique across teams', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Team::factory()->create(['slug' => 'taken-slug']); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Test Team', 'slug' => 'taken-slug']) ->call('updateTeamName', $user->currentTeam) ->assertHasFormErrors(['slug']); }); test('team can keep its own slug on update', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $currentSlug = $user->currentTeam->slug; Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Different Name', 'slug' => $currentSlug]) ->call('updateTeamName', $user->currentTeam) ->assertHasNoFormErrors() ->assertNotified(); }); test('slug change triggers redirect', function () { $this->actingAs($user = User::factory()->withTeam()->create()); Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'New Name', 'slug' => 'completely-new-slug']) ->call('updateTeamName', $user->currentTeam) ->assertHasNoFormErrors() ->assertRedirect(); }); test('same slug does not trigger redirect', function () { $this->actingAs($user = User::factory()->withTeam()->create()); $currentSlug = $user->currentTeam->slug; Livewire::test(UpdateTeamName::class, ['team' => $user->currentTeam]) ->fillForm(['name' => 'Different Name', 'slug' => $currentSlug]) ->call('updateTeamName', $user->currentTeam) ->assertHasNoFormErrors() ->assertNotified() ->assertNoRedirect(); }); ================================================ FILE: tests/Feature/ValidTeamSlugTest.php ================================================ $slug], ['slug' => [new ValidTeamSlug]], ); expect($validator->fails())->toBeTrue() ->and($validator->errors()->first('slug'))->toBe('The slug must be at least 3 characters.'); })->with([ 'ab', 'a', ]); it('rejects invalid slug format', function (string $slug) { $validator = Validator::make( ['slug' => $slug], ['slug' => [new ValidTeamSlug]], ); expect($validator->fails())->toBeTrue() ->and($validator->errors()->first('slug'))->toBe('The slug may only contain lowercase letters, numbers, and hyphens.'); })->with([ 'has spaces', 'has@special', 'HAS-UPPERCASE', 'has_underscore', '-starts-with-hyphen', 'ends-with-hyphen-', ]); it('rejects reserved slugs', function (string $slug) { $validator = Validator::make( ['slug' => $slug], ['slug' => [new ValidTeamSlug]], ); expect($validator->fails())->toBeTrue() ->and($validator->errors()->first('slug'))->toBe('The slug is reserved and cannot be used.'); })->with([ 'login', 'admin', 'settings', 'api', 'billing', 'teams', 'dashboard', 'companies', 'people', 'tasks', ]); it('allows valid non-reserved slugs', function (string $slug) { $validator = Validator::make( ['slug' => $slug], ['slug' => [new ValidTeamSlug]], ); expect($validator->passes())->toBeTrue(); })->with([ 'acme-corp', 'my-team', 'relaticle', 'team123', ]); it('allows reserved slug when it matches the ignored value', function () { $validator = Validator::make( ['slug' => 'admin'], ['slug' => [new ValidTeamSlug(ignoreValue: 'admin')]], ); expect($validator->passes())->toBeTrue(); }); it('still rejects different reserved slug even with ignored value', function () { $validator = Validator::make( ['slug' => 'login'], ['slug' => [new ValidTeamSlug(ignoreValue: 'admin')]], ); expect($validator->fails())->toBeTrue(); }); ================================================ FILE: tests/Pest.php ================================================ Testing section */ use Illuminate\Foundation\Testing\RefreshDatabase; use Livewire\Features\SupportTesting\Testable; use Livewire\Livewire; use Pest\Browser\Playwright\Playwright; use Tests\TestCase; pest()->extend(TestCase::class) ->use(RefreshDatabase::class) ->in('Feature', 'Smoke', 'Browser'); if (class_exists(Playwright::class)) { Playwright::setTimeout(30_000); } /** * Livewire testing helper - replacement for pest-plugin-livewire. * * @param class-string $component * @param array $params */ function livewire(string $component, array $params = []): Testable { return Livewire::test($component, $params); } ================================================ FILE: tests/Smoke/RouteTest.php ================================================ getStatusCode(), "Response returned a server error [{$this->getStatusCode()}]." ); return $this; }); routeTesting('smoke: all GET routes return non-500 response') ->setUp(function (): void { $user = User::factory()->withTeam()->create(); $this->actingAs($user); }) ->ignoreRoutesWithMissingBindings() ->exclude([ '__clockwork*', 'clockwork*', 'livewire-*', 'sanctum/csrf-cookie', 'auth/redirect/*', 'auth/callback/*', 'email/verify/*', 'email-verification/verify/*', 'filament/exports/*/download', 'filament/imports/*/failed-rows/download', 'team-invitations/*', 'password-reset/*', 'reset-password/*', 'discord', 'user/confirm-password', 'up', 'docs/api*', 'api/*', ]) ->assertNotServerError(); ================================================ FILE: tests/TestCase.php ================================================